diff --git a/.gn b/.gn index 083902e..cf571d7 100644 --- a/.gn +++ b/.gn
@@ -171,8 +171,6 @@ "//sandbox/linux:*", # 13 errors "//sandbox/win:*", # 7 errors - "//third_party/breakpad:*", # 34 errors - "//third_party/ced/*", "//third_party/crashpad/crashpad/client:*", # 1 error "//third_party/crashpad/crashpad/compat:*", # 2 errors "//third_party/crashpad/crashpad/snapshot:*", # 1 error
diff --git a/DEPS b/DEPS index b8ef076b3..18600e7 100644 --- a/DEPS +++ b/DEPS
@@ -199,7 +199,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': 'aa14b751ec92c01b908c1c44f184bc168005f690', + 'skia_revision': 'e2c0504c27a280a63db4453abf457b3b00739f03', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -250,7 +250,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': 'd3befe1c72999805bc3960d29780cd8f505a180d', + 'freetype_revision': '0636dc8af1e502c343b126b50f3a0dbec8f3fc26', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -270,7 +270,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': '5b022f3c5e699895f195deb0c7b27f86a3110b18', + 'catapult_revision': '73a0597ed6870d9061816c371710ff190520b1b4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -278,7 +278,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'f5d9ca20659a2d80f3d85178c85fb83b8c4cda53', + 'devtools_frontend_revision': '6f9ad8fe398c5a2a8b17ac5edd1a7dba75442781', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -318,7 +318,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': 'f2a003d4e94cbb529d638e9a1b8a551c9f3371ab', + 'dawn_revision': '040f140e5f3b4c6fa82835185b8d9e42a628bfd6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -529,7 +529,7 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '4faef1e913cdf5b882d0323455b43e310a87dd65', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '838c3cf0cb326bb54f7a8fac148023c8327cfe02', 'condition': 'checkout_ios', }, @@ -905,7 +905,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4783d047106eb917cb27a9b6ef3fe85767af0dfd', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0e2aee7e979635b6086975009e21bacd6c6c2e64', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1270,7 +1270,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b998b78079b8d83e83cce03d5033ac7611d5d204', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '52852a8ec96d2db2a97fffd2ea9a62e58d65845d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1578,7 +1578,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@df0912e564b3e549923d57294132e26f676b009b', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e8537ae5c80ccb9971796ac5d49a8a2c78a1faac', 'condition': 'checkout_src_internal', },
diff --git a/WATCHLISTS b/WATCHLISTS index bef36c9..42db1c9 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -624,6 +624,7 @@ 'data_use_measurement|'\ 'lazy_load|'\ 'lite_video|'\ + 'memories|'\ 'navigation_predictor|'\ 'net/nqe|'\ 'optimization_guide|'\
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc index 9e838273..a92b9af8 100644 --- a/ash/app_list/views/app_list_view_unittest.cc +++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -2603,6 +2603,33 @@ EXPECT_FALSE(contents_view()->expand_arrow_view()->GetVisible()); } +// Tests the expand arrow view opacity updtes correctly when transitioning +// between various app list view states. +TEST_F(AppListViewTest, ExpandArrowViewVisibilityTest) { + Initialize(false /*is_tablet_mode*/); + Show(); + + view_->SetState(ash::AppListViewState::kClosed); + // Expand arrow should not be visible when app list view state is closed. + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 0.0f); + // Expand arrow view should be visible for peeking launcher. + view_->SetState(ash::AppListViewState::kPeeking); + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 1.0f); + // Expand arrow view should not be visible for half launcher when showing + // embedded assistant. + contents_view()->ShowEmbeddedAssistantUI(true); + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 0.0f); + // Expand arrow should become visible when hiding the assistant view. + contents_view()->ShowEmbeddedAssistantUI(false); + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 1.0f); + // Typing text in the search box should hide the expand arrow view. + SetTextInSearchBox("https://youtu.be/dQw4w9WgXcQ"); + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 0.0f); + // Pressing escape should show the expand arrow view again. + view_->AcceleratorPressed(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE)); + ASSERT_EQ(contents_view()->expand_arrow_view()->layer()->opacity(), 1.0f); +} + // Tests that search box is not visible when showing embedded Assistant UI. TEST_F(AppListViewTest, SearchBoxViewNotVisibleInEmbeddedAssistantUI) { Initialize(false /*is_tablet_mode*/);
diff --git a/ash/app_list/views/contents_view.cc b/ash/app_list/views/contents_view.cc index 898b9c4d..18df5d0 100644 --- a/ash/app_list/views/contents_view.cc +++ b/ash/app_list/views/contents_view.cc
@@ -330,7 +330,7 @@ } void ContentsView::ShowEmbeddedAssistantUI(bool show) { - expand_arrow_view_->SetVisible(!show); + SetExpandArrowViewVisibility(!show); const int assistant_page = GetPageIndexForState(AppListState::kStateEmbeddedAssistant); @@ -754,11 +754,13 @@ const bool closing = target_view_state == AppListViewState::kClosed; animate_opacity(duration, GetSearchBoxView(), !closing /*target_visibility*/); - // Fade in or out the expand arrow. - const bool target_arrow_visibility = - target_page == AppListState::kStateApps && !closing && - !app_list_view_->is_side_shelf(); - animate_opacity(duration, expand_arrow_view_, target_arrow_visibility); + // Fade in or out the expand arrow. Embedded Assistant hides the expand arrow + // and should not set its opacity to 0. + const bool expand_arrow_target_opacity = + (target_page == AppListState::kStateEmbeddedAssistant || + target_page == AppListState::kStateApps) && + !closing && !app_list_view_->is_side_shelf(); + animate_opacity(duration, expand_arrow_view_, expand_arrow_target_opacity); // Animates layer's vertical position (using transform animation). // |layer| - The layer to transform.
diff --git a/ash/clipboard/views/clipboard_history_bitmap_item_view.cc b/ash/clipboard/views/clipboard_history_bitmap_item_view.cc index c29227b..2fba5460 100644 --- a/ash/clipboard/views/clipboard_history_bitmap_item_view.cc +++ b/ash/clipboard/views/clipboard_history_bitmap_item_view.cc
@@ -9,7 +9,6 @@ #include "ash/clipboard/clipboard_history_util.h" #include "ash/clipboard/views/clipboard_history_delete_button.h" #include "ash/clipboard/views/clipboard_history_view_constants.h" -#include "ash/public/cpp/rounded_image_view.h" #include "ash/style/ash_color_provider.h" #include "ash/style/scoped_light_mode_as_default.h" #include "base/time/time.h" @@ -44,15 +43,14 @@ // An ImageView which reacts to updates from ClipboardHistoryResourceManager by // fading out the old image, and fading in the new image. Used when HTML is done // rendering. Only expected to transition once in its lifetime. -class FadeImageView : public RoundedImageView, +class FadeImageView : public views::ImageView, public ui::ImplicitAnimationObserver, public ClipboardHistoryResourceManager::Observer { public: FadeImageView(const ClipboardHistoryItem* clipboard_history_item, const ClipboardHistoryResourceManager* resource_manager, base::RepeatingClosure update_callback) - : RoundedImageView(ClipboardHistoryViews::kImageRoundedCornerRadius, - RoundedImageView::Alignment::kCenter), + : views::ImageView(), resource_manager_(resource_manager), clipboard_history_item_(*clipboard_history_item), update_callback_(update_callback) { @@ -201,6 +199,17 @@ } void OnBoundsChanged(const gfx::Rect& previous_bounds) override { + // Create rounded corners around the contents area through the clip path + // instead of layer clip. Because we have to avoid using any layer here. + // Note that the menu's container does not cut the children's layers outside + // of the container's bounds. As a result, if menu items have their own + // layers, the part beyond the container's bounds is still visible when the + // context menu is in overflow. + const SkRect local_bounds = gfx::RectToSkRect(GetContentsBounds()); + const SkScalar radius = + SkIntToScalar(ClipboardHistoryViews::kImageRoundedCornerRadius); + SetClipPath(SkPath::RRect(local_bounds, radius, radius)); + UpdateImageViewSize(); } @@ -217,13 +226,7 @@ AshColorProvider::ControlsLayerType::kHairlineBorderColor)); } - std::unique_ptr<RoundedImageView> BuildImageView() { - // `BuildImageView()` achieves the image's rounded corners through - // RoundedImageView instead of layer. Because the menu's container does not - // cut the children's layers outside of the container's bounds. As a result, - // if menu items have their own layers, the part beyond the container's - // bounds is still visible when the context menu is in overflow. - + std::unique_ptr<views::ImageView> BuildImageView() { const auto* clipboard_history_item = container_->clipboard_history_item(); switch (container_->data_format_) { case ui::ClipboardInternalFormat::kHtml: @@ -232,9 +235,7 @@ base::BindRepeating(&BitmapContentsView::UpdateImageViewSize, weak_ptr_factory_.GetWeakPtr())); case ui::ClipboardInternalFormat::kBitmap: { - auto image_view = std::make_unique<RoundedImageView>( - ClipboardHistoryViews::kImageRoundedCornerRadius, - RoundedImageView::Alignment::kCenter); + auto image_view = std::make_unique<views::ImageView>(); gfx::ImageSkia bitmap_image = gfx::ImageSkia::CreateFrom1xBitmap( clipboard_history_item->data().bitmap()); image_view->SetImage(bitmap_image); @@ -247,7 +248,7 @@ } void UpdateImageViewSize() { - const gfx::Size image_size = image_view_->original_image().size(); + const gfx::Size image_size = image_view_->GetImage().size(); gfx::Rect contents_bounds = GetContentsBounds(); const float width_ratio = @@ -275,13 +276,13 @@ DCHECK_GT(scaling_up_ratio, 0.f); - image_view_->SetImage(image_view_->original_image(), - gfx::Size(image_size.width() / scaling_up_ratio, - image_size.height() / scaling_up_ratio)); + image_view_->SetImageSize( + gfx::Size(image_size.width() / scaling_up_ratio, + image_size.height() / scaling_up_ratio)); } ClipboardHistoryBitmapItemView* const container_; - RoundedImageView* image_view_ = nullptr; + views::ImageView* image_view_ = nullptr; // Helps to place a border above `image_view_`. views::View* border_container_view_ = nullptr;
diff --git a/ash/frame/default_frame_header_unittest.cc b/ash/frame/default_frame_header_unittest.cc index 3b81b44..1299e199 100644 --- a/ash/frame/default_frame_header_unittest.cc +++ b/ash/frame/default_frame_header_unittest.cc
@@ -16,11 +16,13 @@ #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/frame/caption_buttons/frame_back_button.h" #include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" +#include "chromeos/ui/frame/frame_header.h" #include "ui/aura/window.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/gfx/animation/animation_test_api.h" #include "ui/gfx/color_utils.h" #include "ui/views/test/test_views.h" +#include "ui/views/view_utils.h" #include "ui/views/widget/widget.h" #include "ui/views/window/non_client_view.h" #include "ui/wm/core/window_util.h" @@ -192,8 +194,8 @@ auto* frame_view = NonClientFrameViewAsh::Get(win0.get()); auto* animating_layer_holding_view = frame_view->children()[0]; - EXPECT_TRUE(!std::strcmp(animating_layer_holding_view->GetClassName(), - "FrameAnimatorView")); + EXPECT_TRUE(views::IsViewClass<chromeos::FrameHeader::FrameAnimatorView>( + animating_layer_holding_view)); ASSERT_TRUE(animating_layer_holding_view->layer()); ASSERT_GT(animating_layer_holding_view->layer()->parent()->children().size(), 2u); @@ -227,8 +229,8 @@ auto* frame_view_0 = NonClientFrameViewAsh::Get(win_0.get()); auto* animating_layer_holding_view_0 = frame_view_0->children()[0]; - EXPECT_TRUE(!std::strcmp(animating_layer_holding_view_0->GetClassName(), - "FrameAnimatorView")); + EXPECT_TRUE(views::IsViewClass<chromeos::FrameHeader::FrameAnimatorView>( + animating_layer_holding_view_0)); size_t original_layers_count_0 = animating_layer_holding_view_0->layer()->parent()->children().size(); @@ -237,8 +239,8 @@ frame_view_1->AddChildView(std::make_unique<views::View>()); auto* animating_layer_holding_view_1 = frame_view_1->children()[0]; - EXPECT_TRUE(!std::strcmp(animating_layer_holding_view_1->GetClassName(), - "FrameAnimatorView")); + EXPECT_TRUE(views::IsViewClass<chromeos::FrameHeader::FrameAnimatorView>( + animating_layer_holding_view_1)); size_t original_layers_count_1 = animating_layer_holding_view_1->layer()->parent()->children().size();
diff --git a/ash/system/holding_space/holding_space_tray_icon.cc b/ash/system/holding_space/holding_space_tray_icon.cc index 62548545..4cdbd717 100644 --- a/ash/system/holding_space/holding_space_tray_icon.cc +++ b/ash/system/holding_space/holding_space_tray_icon.cc
@@ -248,6 +248,10 @@ } } +void HoldingSpaceTrayIcon::OnShellDestroying() { + shell_observer_.Reset(); +} + void HoldingSpaceTrayIcon::OnShelfAlignmentChanged( aura::Window* root_window, ShelfAlignment old_alignment) {
diff --git a/ash/system/holding_space/holding_space_tray_icon.h b/ash/system/holding_space/holding_space_tray_icon.h index 240ed1e..f12acb4 100644 --- a/ash/system/holding_space/holding_space_tray_icon.h +++ b/ash/system/holding_space/holding_space_tray_icon.h
@@ -66,6 +66,7 @@ gfx::Size CalculatePreferredSize() const override; // ShellObserver: + void OnShellDestroying() override; void OnShelfAlignmentChanged(aura::Window* root_window, ShelfAlignment old_alignment) override;
diff --git a/base/allocator/allocator.gni b/base/allocator/allocator.gni index 6fb6d239..bcf216e3 100644 --- a/base/allocator/allocator.gni +++ b/base/allocator/allocator.gni
@@ -9,11 +9,11 @@ _is_using_sanitizers = is_asan || is_hwasan || is_lsan || is_tsan || is_msan # - Windows: shims don't work for component builds and debug CRT is not -# compatible, see below. On x86, there are some memory regresions. +# compatible, see below. # - Android: symbol wrapping is not universal for component builds. # - Chromecast on Android: causes issues with crash reporting, see b/178423326. _disable_partition_alloc = - (is_win && (is_component_build || is_debug || target_cpu == "x86")) || + (is_win && (is_component_build || is_debug)) || (is_android && is_component_build) || (is_android && is_chromecast) _is_partition_alloc_platform = is_android || is_win
diff --git a/base/android/java/src/org/chromium/base/IntentUtils.java b/base/android/java/src/org/chromium/base/IntentUtils.java index 1c93969..48fddcb 100644 --- a/base/android/java/src/org/chromium/base/IntentUtils.java +++ b/base/android/java/src/org/chromium/base/IntentUtils.java
@@ -500,7 +500,7 @@ public static int getPendingIntentMutabilityFlag(boolean mutable) { if (!mutable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return ApiHelperForM.getPendingIntentImmutableFlag(); - } else if (mutable && Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { + } else if (mutable && BuildInfo.isAtLeastS()) { return FLAG_MUTABLE; } return 0;
diff --git a/base/android/java_handler_thread.cc b/base/android/java_handler_thread.cc index ecbbc0e..19a5a7b2 100644 --- a/base/android/java_handler_thread.cc +++ b/base/android/java_handler_thread.cc
@@ -90,7 +90,11 @@ if (name_) PlatformThread::SetName(name_); + thread_id_ = base::PlatformThread::CurrentId(); state_ = std::make_unique<State>(); +#if DCHECK_IS_ON() + initialized_ = true; +#endif Init(); reinterpret_cast<base::WaitableEvent*>(event)->Signal(); } @@ -130,6 +134,13 @@ return Java_JavaHandlerThread_getUncaughtExceptionIfAny(env, java_thread_); } +PlatformThreadId JavaHandlerThread::GetThreadId() const { +#if DCHECK_IS_ON() + DCHECK(initialized_); +#endif + return thread_id_; +} + void JavaHandlerThread::StopOnThread() { DCHECK(task_runner()->BelongsToCurrentThread()); DCHECK(state_);
diff --git a/base/android/java_handler_thread.h b/base/android/java_handler_thread.h index aee6d4b..45bf2a5b 100644 --- a/base/android/java_handler_thread.h +++ b/base/android/java_handler_thread.h
@@ -10,6 +10,7 @@ #include <memory> #include "base/android/scoped_java_ref.h" +#include "base/dcheck_is_on.h" #include "base/single_thread_task_runner.h" #include "base/task/sequence_manager/sequence_manager.h" #include "base/task/sequence_manager/task_queue.h" @@ -67,6 +68,10 @@ // Called from this thread. ScopedJavaLocalRef<jthrowable> GetUncaughtExceptionIfAny(); + // Returns the thread ID. Should not be called before the first Start*() + // call. This method is thread-safe. + PlatformThreadId GetThreadId() const; + protected: // Struct exists so JavaHandlerThread destructor can intentionally leak in an // abort scenario. @@ -99,7 +104,11 @@ void QuitThreadSafely(); const char* name_; + base::PlatformThreadId thread_id_{}; ScopedJavaGlobalRef<jobject> java_thread_; +#if DCHECK_IS_ON() + bool initialized_ = false; +#endif }; } // namespace android
diff --git a/base/fuchsia/service_provider_impl.cc b/base/fuchsia/service_provider_impl.cc index d015557a..8c94aa7 100644 --- a/base/fuchsia/service_provider_impl.cc +++ b/base/fuchsia/service_provider_impl.cc
@@ -8,7 +8,6 @@ #include <utility> namespace base { -namespace fuchsia { // static std::unique_ptr<ServiceProviderImpl> @@ -49,5 +48,4 @@ std::move(on_last_client_disconnected_).Run(); } -} // namespace fuchsia } // namespace base
diff --git a/base/fuchsia/service_provider_impl.h b/base/fuchsia/service_provider_impl.h index a997a56f..7eb8941 100644 --- a/base/fuchsia/service_provider_impl.h +++ b/base/fuchsia/service_provider_impl.h
@@ -22,7 +22,6 @@ } // namespace sys namespace base { -namespace fuchsia { // Implementation of the legacy sys.ServiceProvider interface which delegates // requests to an underlying fuchsia.io.Directory of services. @@ -63,7 +62,6 @@ DISALLOW_COPY_AND_ASSIGN(ServiceProviderImpl); }; -} // namespace fuchsia } // namespace base #endif // BASE_FUCHSIA_SERVICE_PROVIDER_IMPL_H_
diff --git a/base/fuchsia/service_provider_impl_unittest.cc b/base/fuchsia/service_provider_impl_unittest.cc index e6f0ed6..cf46626 100644 --- a/base/fuchsia/service_provider_impl_unittest.cc +++ b/base/fuchsia/service_provider_impl_unittest.cc
@@ -17,7 +17,6 @@ #include "testing/gtest/include/gtest/gtest.h" namespace base { -namespace fuchsia { class ServiceProviderImplTest : public testing::Test { public: @@ -92,5 +91,4 @@ VerifyTestInterface(&stub, ZX_ERR_PEER_CLOSED); } -} // namespace fuchsia } // namespace base
diff --git a/base/task/current_thread.cc b/base/task/current_thread.cc index 068c4f8..bc57201 100644 --- a/base/task/current_thread.cc +++ b/base/task/current_thread.cc
@@ -76,6 +76,18 @@ current_->RemoveTaskObserver(task_observer); } +void CurrentThread::AddTaskTimeObserver( + sequence_manager::TaskTimeObserver* task_observer) { + DCHECK(current_->IsBoundToCurrentThread()); + current_->AddTaskTimeObserver(task_observer); +} + +void CurrentThread::RemoveTaskTimeObserver( + sequence_manager::TaskTimeObserver* task_observer) { + DCHECK(current_->IsBoundToCurrentThread()); + current_->RemoveTaskTimeObserver(task_observer); +} + void CurrentThread::SetAddQueueTimeToTasks(bool enable) { DCHECK(current_->IsBoundToCurrentThread()); current_->SetAddQueueTimeToTasks(enable);
diff --git a/base/task/current_thread.h b/base/task/current_thread.h index 52c2dbe..3f64b403 100644 --- a/base/task/current_thread.h +++ b/base/task/current_thread.h
@@ -14,6 +14,7 @@ #include "base/message_loop/message_pump_for_ui.h" #include "base/pending_task.h" #include "base/single_thread_task_runner.h" +#include "base/task/sequence_manager/task_time_observer.h" #include "base/task/task_observer.h" #include "build/build_config.h" @@ -118,6 +119,10 @@ void AddTaskObserver(TaskObserver* task_observer); void RemoveTaskObserver(TaskObserver* task_observer); + void AddTaskTimeObserver(sequence_manager::TaskTimeObserver* task_observer); + void RemoveTaskTimeObserver( + sequence_manager::TaskTimeObserver* task_observer); + // When this functionality is enabled, the queue time will be recorded for // posted tasks. void SetAddQueueTimeToTasks(bool enable);
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc index 95324e71..cab812ff 100644 --- a/base/task/sequence_manager/sequence_manager_impl.cc +++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -854,13 +854,17 @@ } } + bool has_valid_start = + task_timing.state() != TaskQueue::TaskTiming::State::NotStarted; TimeRecordingPolicy recording_policy = ShouldRecordTaskTiming(executing_task->task_queue); // Record end time ASAP to avoid bias due to the overhead of observers. - if (recording_policy == TimeRecordingPolicy::DoRecord) + if (recording_policy == TimeRecordingPolicy::DoRecord && has_valid_start) { task_timing.RecordTaskEnd(time_after_task); + } - if (task_timing.has_wall_time() && main_thread_only().nesting_depth == 0) { + if (has_valid_start && task_timing.has_wall_time() && + main_thread_only().nesting_depth == 0) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("sequence_manager"), "SequenceManager.DidProcessTaskTimeObservers"); for (auto& observer : main_thread_only().task_time_observers) {
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index be333b60..d03476b3 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -3097,7 +3097,9 @@ if (defined(invoker.name)) { # Create size info files for targets that care about size # (have proguard enabled). - if (_proguard_enabled) { + _include_size_info = + defined(invoker.include_size_info) && invoker.include_size_info + if (_include_size_info || _proguard_enabled) { _size_info_target = "${target_name}__size_info" create_size_info_files(_size_info_target) { name = "${invoker.name}.apk" @@ -3481,6 +3483,7 @@ "expected_libs_and_assets_base", "generate_buildconfig_java", "generate_final_jni", + "include_size_info", "input_jars_paths", "use_modern_linker", "jacoco_never_instrument", @@ -3778,6 +3781,10 @@ android_apk(target_name) { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) testonly = true + + # Enables the test_runner to find the source file location of a test + # after it is ran. + include_size_info = true deps = [ "//testing/android/broker:broker_java" ] if (defined(invoker.deps)) { deps += invoker.deps
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 5b014e3..6006661 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1617,6 +1617,11 @@ "-Wno-non-c-typedef-for-linkage", ] + if (llvm_force_head_revision) { + # TODO(https://crbug.com/1174192): Clean up. + cflags += [ "-Wno-error=array-bounds" ] + } + cflags_c += [ # TODO(https://crbug.com/995993): Clean up and enable. "-Wno-implicit-fallthrough",
diff --git a/build/linux/sysroot_scripts/sysroot-creator.sh b/build/linux/sysroot_scripts/sysroot-creator.sh index f1370b2..fda3de4 100644 --- a/build/linux/sysroot_scripts/sysroot-creator.sh +++ b/build/linux/sysroot_scripts/sysroot-creator.sh
@@ -399,13 +399,6 @@ mkdir -p ${INSTALL_ROOT}/usr/lib/pkgconfig mv ${INSTALL_ROOT}/usr/lib/${arch}-${os}/pkgconfig/* \ ${INSTALL_ROOT}/usr/lib/pkgconfig - - # Temporary workaround for invalid implicit conversion from void* in pipewire. - # This is already fixed upstream in [1], so this can be removed once it rolls - # into Debian. - # [1] https://github.com/PipeWire/pipewire/commit/371da358d1580dc06218d18a12a99611cac39e4e - local pipewire_utils_h="${INSTALL_ROOT}/usr/include/pipewire/utils.h" - sed -i 's/malloc/(struct spa_pod*)malloc/' "${pipewire_utils_h}" }
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 8c2e802..347e1332 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -3484,8 +3484,6 @@ "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java", "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java", "java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java", "java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java", "java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java", ]
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index d1c200c..596c4def 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -52,7 +52,6 @@ "java/res/drawable-hdpi/diners_card.png", "java/res/drawable-hdpi/down_arrow.png", "java/res/drawable-hdpi/google_logo.png", - "java/res/drawable-hdpi/google_play.png", "java/res/drawable-hdpi/help_outline.png", "java/res/drawable-hdpi/ic_account_child_20dp.png", "java/res/drawable-hdpi/ic_chrome.png", @@ -110,8 +109,6 @@ "java/res/drawable-hdpi/shortcut_newtab.png", "java/res/drawable-hdpi/spinner.png", "java/res/drawable-hdpi/spinner_white.png", - "java/res/drawable-hdpi/star_gray.png", - "java/res/drawable-hdpi/star_green.png", "java/res/drawable-hdpi/tab_strip_fade.png", "java/res/drawable-hdpi/tab_strip_fade_for_model_selector.png", "java/res/drawable-hdpi/tabswitcher_border_frame.9.png", @@ -184,7 +181,6 @@ "java/res/drawable-mdpi/diners_card.png", "java/res/drawable-mdpi/down_arrow.png", "java/res/drawable-mdpi/google_logo.png", - "java/res/drawable-mdpi/google_play.png", "java/res/drawable-mdpi/help_outline.png", "java/res/drawable-mdpi/ic_account_child_20dp.png", "java/res/drawable-mdpi/ic_chrome.png", @@ -242,8 +238,6 @@ "java/res/drawable-mdpi/shortcut_newtab.png", "java/res/drawable-mdpi/spinner.png", "java/res/drawable-mdpi/spinner_white.png", - "java/res/drawable-mdpi/star_gray.png", - "java/res/drawable-mdpi/star_green.png", "java/res/drawable-mdpi/tab_strip_fade.png", "java/res/drawable-mdpi/tab_strip_fade_for_model_selector.png", "java/res/drawable-mdpi/tabswitcher_border_frame.9.png", @@ -304,7 +298,6 @@ "java/res/drawable-xhdpi/diners_card.png", "java/res/drawable-xhdpi/down_arrow.png", "java/res/drawable-xhdpi/google_logo.png", - "java/res/drawable-xhdpi/google_play.png", "java/res/drawable-xhdpi/help_outline.png", "java/res/drawable-xhdpi/ic_account_child_20dp.png", "java/res/drawable-xhdpi/ic_chrome.png", @@ -362,8 +355,6 @@ "java/res/drawable-xhdpi/shortcut_newtab.png", "java/res/drawable-xhdpi/spinner.png", "java/res/drawable-xhdpi/spinner_white.png", - "java/res/drawable-xhdpi/star_gray.png", - "java/res/drawable-xhdpi/star_green.png", "java/res/drawable-xhdpi/tab_strip_fade.png", "java/res/drawable-xhdpi/tab_strip_fade_for_model_selector.png", "java/res/drawable-xhdpi/tabswitcher_border_frame.9.png", @@ -403,7 +394,6 @@ "java/res/drawable-xxhdpi/diners_card.png", "java/res/drawable-xxhdpi/down_arrow.png", "java/res/drawable-xxhdpi/google_logo.png", - "java/res/drawable-xxhdpi/google_play.png", "java/res/drawable-xxhdpi/help_outline.png", "java/res/drawable-xxhdpi/ic_account_child_20dp.png", "java/res/drawable-xxhdpi/ic_chrome.png", @@ -460,8 +450,6 @@ "java/res/drawable-xxhdpi/shortcut_newtab.png", "java/res/drawable-xxhdpi/spinner.png", "java/res/drawable-xxhdpi/spinner_white.png", - "java/res/drawable-xxhdpi/star_gray.png", - "java/res/drawable-xxhdpi/star_green.png", "java/res/drawable-xxhdpi/tab_strip_fade.png", "java/res/drawable-xxhdpi/tab_strip_fade_for_model_selector.png", "java/res/drawable-xxhdpi/tabswitcher_border_frame.9.png", @@ -501,7 +489,6 @@ "java/res/drawable-xxxhdpi/diners_card.png", "java/res/drawable-xxxhdpi/down_arrow.png", "java/res/drawable-xxxhdpi/google_logo.png", - "java/res/drawable-xxxhdpi/google_play.png", "java/res/drawable-xxxhdpi/help_outline.png", "java/res/drawable-xxxhdpi/ic_account_child_20dp.png", "java/res/drawable-xxxhdpi/ic_chrome.png", @@ -555,8 +542,6 @@ "java/res/drawable-xxxhdpi/shortcut_newtab.png", "java/res/drawable-xxxhdpi/spinner.png", "java/res/drawable-xxxhdpi/spinner_white.png", - "java/res/drawable-xxxhdpi/star_gray.png", - "java/res/drawable-xxxhdpi/star_green.png", "java/res/drawable-xxxhdpi/tab_strip_fade.png", "java/res/drawable-xxxhdpi/tab_strip_fade_for_model_selector.png", "java/res/drawable-xxxhdpi/tabswitcher_border_frame.9.png", @@ -674,7 +659,6 @@ "java/res/drawable/modern_toolbar_text_box_background_with_primary_color.xml", "java/res/drawable/popup_bg_bottom_tinted.xml", "java/res/drawable/qr_code.xml", - "java/res/drawable/rating_bar.xml", "java/res/drawable/screenshot.xml", "java/res/drawable/search_sogou.xml", "java/res/drawable/send_tab.xml", @@ -708,7 +692,6 @@ "java/res/layout/account_divider_preference.xml", "java/res/layout/account_management_account_row.xml", "java/res/layout/add_languages_main.xml", - "java/res/layout/add_to_homescreen_dialog.xml", "java/res/layout/add_to_menu_dialog.xml", "java/res/layout/add_to_menu_dialog_item.xml", "java/res/layout/assistant_voice_search_consent_ui.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index ad89a94..f7f6a991 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1469,10 +1469,6 @@ "java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java", "java/src/org/chromium/chrome/browser/webapps/WebappLocator.java", "java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogView.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java", - "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinder.java", "java/src/org/chromium/chrome/browser/webauth/AuthenticatorFactory.java", "java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java", "java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index 418a6010a..7b913651 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -245,7 +245,4 @@ "junit/src/org/chromium/chrome/browser/webapps/WebappIntentUtilsTest.java", "junit/src/org/chromium/chrome/browser/webapps/WebappLauncherActivityTest.java", "junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java", - "junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogViewTest.java", - "junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediatorTest.java", - "junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinderTest.java", ]
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 8422714..4f1e4beec 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -604,6 +604,7 @@ "javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java", "javatests/src/org/chromium/chrome/browser/video/VideoTest.java", "javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java", + "javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTestRule.java", "javatests/src/org/chromium/chrome/browser/webapps/WebApkCurrentPageVerifierTest.java", @@ -621,7 +622,6 @@ "javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenIconTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java", "javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java", - "javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java", "javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java", "javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java", "javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java",
diff --git a/chrome/android/features/start_surface/internal/BUILD.gn b/chrome/android/features/start_surface/internal/BUILD.gn index 7b0f543..b4355e62 100644 --- a/chrome/android/features/start_surface/internal/BUILD.gn +++ b/chrome/android/features/start_surface/internal/BUILD.gn
@@ -62,7 +62,6 @@ "java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java", "java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java", "java/src/org/chromium/chrome/features/start_surface/StartSurfaceProperties.java", - "java/src/org/chromium/chrome/features/start_surface/StartSurfaceStackLayout.java", "java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java", ]
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java index 03ab0d1..b7c06f2c4 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinder.java
@@ -6,7 +6,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SECONDARY_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; import android.view.View; @@ -23,8 +22,6 @@ updateVisibility(viewHolder, model); } else if (IS_SHOWING_OVERVIEW == propertyKey) { updateVisibility(viewHolder, model); - } else if (IS_SHOWING_STACK_TAB_SWITCHER == propertyKey) { - updateVisibility(viewHolder, model); } else if (TOP_MARGIN == propertyKey) { setTopBarHeight(viewHolder, model.get(TOP_MARGIN)); } @@ -32,9 +29,8 @@ private static void updateVisibility( TasksSurfaceViewBinder.ViewHolder viewHolder, PropertyModel model) { - boolean isShowing = model.get(IS_SHOWING_OVERVIEW) - && model.get(IS_SECONDARY_SURFACE_VISIBLE) - && !model.get(IS_SHOWING_STACK_TAB_SWITCHER); + boolean isShowing = + model.get(IS_SHOWING_OVERVIEW) && model.get(IS_SECONDARY_SURFACE_VISIBLE); if (isShowing && viewHolder.tasksSurfaceView.getParent() == null) { viewHolder.parentView.addView(viewHolder.tasksSurfaceView); setTopBarHeight(viewHolder, model.get(TOP_MARGIN));
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index a512350..b99be602 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -125,7 +125,6 @@ : null, mSurfaceMode, mActivity, mActivity.getBrowserControlsManager(), this::isActivityFinishingOrDestroyed, excludeMVTiles, - StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue(), startSurfaceOneshotSupplier, hadWarmStart); // Show feed loading image. @@ -137,11 +136,6 @@ startSurfaceOneshotSupplier.set(this); } - boolean isShowingTabSwitcher() { - assert StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled(); - return mStartSurfaceMediator.isShowingTabSwitcher(); - } - // Implements StartSurface. @Override public void initialize() { @@ -385,10 +379,7 @@ PropertyModel propertyModel = new PropertyModel(TasksSurfaceProperties.ALL_KEYS); mStartSurfaceMediator.setSecondaryTasksSurfacePropertyModel(propertyModel); mSecondaryTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface( - mActivity, mScrimCoordinator, propertyModel, - StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled() - ? TabSwitcherType.NONE - : TabSwitcherType.GRID, + mActivity, mScrimCoordinator, propertyModel, TabSwitcherType.GRID, mParentTabSupplier, false, false); if (mIsInitializedWithNative) { mSecondaryTasksSurface.onFinishNativeInitialization(
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java index 5291383..3e15775 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java
@@ -6,11 +6,9 @@ import android.content.Context; -import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; @@ -21,12 +19,7 @@ /** StartSurfaceDelegate. */ public class StartSurfaceDelegate { public static Layout createStartSurfaceLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, - ObservableSupplier<BrowserControlsStateProvider> browserControlsStateProviderSupplier) { - if (StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled()) { - return new StartSurfaceStackLayout(context, updateHost, renderHost, startSurface, - browserControlsStateProviderSupplier); - } + LayoutRenderHost renderHost, StartSurface startSurface) { return new StartSurfaceLayout(context, updateHost, renderHost, startSurface); }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 23acb3db..7b03c79 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -26,7 +26,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_EXPLORE_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SECONDARY_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.RESET_FEED_SURFACE_SCROLL_POSITION; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; @@ -149,7 +148,6 @@ private BrowserControlsStateProvider.Observer mBrowserControlsObserver; private ActivityStateChecker mActivityStateChecker; private boolean mExcludeMVTiles; - private boolean mShowStackTabSwitcher; private OneshotSupplier<StartSurface> mStartSurfaceSupplier; /** * Whether a pending observer needed be added to the normal TabModel after the TabModel is @@ -176,8 +174,7 @@ @SurfaceMode int surfaceMode, Context context, BrowserControlsStateProvider browserControlsStateProvider, ActivityStateChecker activityStateChecker, boolean excludeMVTiles, - boolean showStackTabSwitcher, OneshotSupplier<StartSurface> startSurfaceSupplier, - boolean hadWarmStart) { + OneshotSupplier<StartSurface> startSurfaceSupplier, boolean hadWarmStart) { mController = controller; mTabModelSelector = tabModelSelector; mPropertyModel = propertyModel; @@ -187,7 +184,6 @@ mBrowserControlsStateProvider = browserControlsStateProvider; mActivityStateChecker = activityStateChecker; mExcludeMVTiles = excludeMVTiles; - mShowStackTabSwitcher = showStackTabSwitcher; mStartSurfaceSupplier = startSurfaceSupplier; mHadWarmStart = hadWarmStart; @@ -482,8 +478,6 @@ // setStartSurfaceStateInternal. private void setOverviewStateInternal() { if (mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) { - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, false); - setExploreSurfaceVisibility(!mIsIncognito && mFeedSurfaceCreator != null); boolean hasNormalTab; if (CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START) @@ -511,8 +505,6 @@ mPendingObserver = true; } } else if (mStartSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER) { - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, mShowStackTabSwitcher); - setTabCarouselVisibility(false); setMVTilesVisibility(false); setFakeBoxVisibility(false); @@ -549,8 +541,8 @@ } if (isShownState(mStartSurfaceState)) { - setIncognitoModeDescriptionVisibility(mIsIncognito - && (mTabModelSelector.getModel(true).getCount() <= 0 || mShowStackTabSwitcher)); + setIncognitoModeDescriptionVisibility( + mIsIncognito && (mTabModelSelector.getModel(true).getCount() <= 0)); } } @@ -747,7 +739,7 @@ public void onClick(View v) { assert mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE; - if (mSecondaryTasksSurfacePropertyModel == null && !mShowStackTabSwitcher) { + if (mSecondaryTasksSurfacePropertyModel == null) { mSecondaryTasksSurfaceController = mSecondaryTasksSurfaceInitializer.initialize(); assert mSecondaryTasksSurfacePropertyModel != null; } @@ -939,7 +931,7 @@ ? StartSurfaceState.SHOWN_HOMEPAGE : mPreviousStartSurfaceState; } else if (mStartSurfaceState == StartSurfaceState.SHOWING_START) { - if (mTabModelSelector.isIncognitoSelected() && !mShowStackTabSwitcher) { + if (mTabModelSelector.isIncognitoSelected()) { return StartSurfaceState.SHOWN_TABSWITCHER; } return StartSurfaceState.SHOWN_HOMEPAGE;
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceStackLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceStackLayout.java deleted file mode 100644 index 304cf61..0000000 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceStackLayout.java +++ /dev/null
@@ -1,75 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.features.start_surface; - -import android.content.Context; - -import org.chromium.base.supplier.ObservableSupplier; -import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; -import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; -import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; -import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout; -import org.chromium.chrome.browser.layouts.EventFilter; - -/** Layout wraps {@link StackLayout} to display the single start surface on top. */ -public class StartSurfaceStackLayout extends StackLayout { - private final StartSurfaceCoordinator mCoordinator; - private final StartSurface.Controller mController; - private boolean mIsInitialized; - - public StartSurfaceStackLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, - ObservableSupplier<BrowserControlsStateProvider> browserControlsStateProviderSupplier) { - super(context, updateHost, renderHost, browserControlsStateProviderSupplier); - - mCoordinator = (StartSurfaceCoordinator) startSurface; - mCoordinator.setOnTabSelectingListener(this::onTabSelecting); - mController = mCoordinator.getController(); - } - - @Override - public void onFinishNativeInitialization() { - if (mIsInitialized) return; - mIsInitialized = true; - - super.onFinishNativeInitialization(); - super.initWithNative(); - mCoordinator.initWithNative(); - } - - @Override - public void show(long time, boolean animate) { - // Lazy initialization if needed. - mCoordinator.initialize(); - - mController.showOverview(false); - if (!mIsInitialized) { - return; - } - super.show(time, animate); - } - - @Override - public void startHiding(int nextId, boolean hintAtTabSelection) { - mController.hideOverview(false); - super.startHiding(nextId, hintAtTabSelection); - } - - @Override - public boolean onBackPressed() { - if (mCoordinator.isShowingTabSwitcher()) { - if (super.onBackPressed()) return true; - } - return mController.onBackPressed(); - } - - @Override - protected EventFilter getEventFilter() { - if (mCoordinator.isShowingTabSwitcher()) { - return super.getEventFilter(); - } - return null; - } -}
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java index 736c1a87..0e292466 100644 --- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java +++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinder.java
@@ -6,7 +6,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.BOTTOM_BAR_HEIGHT; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; import android.animation.ObjectAnimator; @@ -39,8 +38,6 @@ public static void bind(PropertyModel model, ViewHolder viewHolder, PropertyKey propertyKey) { if (IS_SHOWING_OVERVIEW == propertyKey) { updateLayoutAndVisibility(viewHolder, model); - } else if (IS_SHOWING_STACK_TAB_SWITCHER == propertyKey) { - updateLayoutAndVisibility(viewHolder, model); } else if (BOTTOM_BAR_HEIGHT == propertyKey) { setBottomBarHeight(viewHolder, model.get(BOTTOM_BAR_HEIGHT)); } else if (TOP_MARGIN == propertyKey) { @@ -49,8 +46,7 @@ } private static void updateLayoutAndVisibility(ViewHolder viewHolder, PropertyModel model) { - boolean isShowing = - model.get(IS_SHOWING_OVERVIEW) && !model.get(IS_SHOWING_STACK_TAB_SWITCHER); + boolean isShowing = model.get(IS_SHOWING_OVERVIEW); if (isShowing && viewHolder.tasksSurfaceView.getParent() == null) { viewHolder.parentView.addView(viewHolder.tasksSurfaceView); MarginLayoutParams layoutParams =
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index 123e1bd..433839c 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -93,7 +93,6 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.homepage.HomepageManager; -import org.chromium.chrome.browser.omnibox.UrlBar; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.suggestions.SiteSuggestion; @@ -122,7 +121,6 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.R; import org.chromium.chrome.test.util.ChromeRenderTestRule; -import org.chromium.chrome.test.util.OmniboxTestUtils; import org.chromium.chrome.test.util.OverviewModeBehaviorWatcher; import org.chromium.chrome.test.util.ViewUtils; import org.chromium.chrome.test.util.browser.Features; @@ -498,8 +496,6 @@ Assert.assertEquals("single", StartSurfaceConfiguration.START_SURFACE_VARIATION.getValue()); Assert.assertTrue(ReturnToChromeExperimentsUtil.shouldShowTabSwitcher(-1)); Assert.assertTrue(StartSurfaceConfiguration.START_SURFACE_LAST_ACTIVE_TAB_ONLY.getValue()); - Assert.assertFalse( - StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()); mActivityTestRule.waitForActivityNativeInitializationComplete(); @@ -763,44 +759,6 @@ } @Test - @MediumTest - @Feature({"RenderTest"}) - @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) - // clang-format off - @EnableFeatures({ChromeFeatureList.OMNIBOX_SEARCH_ENGINE_LOGO, - ChromeFeatureList.TAB_SWITCHER_ON_RETURN + "<Study,", - ChromeFeatureList.START_SURFACE_ANDROID + "<Study"}) - @CommandLineFlags.Add({ChromeSwitches.DISABLE_NATIVE_INITIALIZATION, - "force-fieldtrials=Study/Group", - IMMEDIATE_RETURN_PARAMS + - "/start_surface_variation/single" + - "/exclude_mv_tiles/true" + - "/show_last_active_tab_only/true" + - "/show_stack_tab_switcher/true"}) - @DisableIf.Build(message = "Flaky. See https://crbug.com/1170054", - sdk_is_less_than = Build.VERSION_CODES.O) - public void renderSingleAsHomepageV2_PageInfoIconShown() - throws IOException { - // clang-format on - startMainActivityFromLauncher(); - Assert.assertTrue(CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START)); - CriteriaHelper.pollUiThread( - () -> mActivityTestRule.getActivity().getLayoutManager().overviewVisible()); - - startAndWaitNativeInitialization(); - waitForTabModel(); - - // Click on the search box. Omnibox should show up. - onView(withId(R.id.search_box_text)).perform(click()); - UrlBar urlBar = (UrlBar) mActivityTestRule.getActivity().findViewById(R.id.url_bar); - OmniboxTestUtils.waitForFocusAndKeyboardActive(urlBar, true); - - View surface = mActivityTestRule.getActivity().findViewById(R.id.location_bar); - ChromeRenderTestRule.sanitize(surface); - mRenderTestRule.render(surface, "singleV2_omniboxClickedShowLogo"); - } - - @Test @SmallTest @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) @EnableFeatures({ChromeFeatureList.TAB_SWITCHER_ON_RETURN + "<Study,",
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java index ddf2e381..f7f1aede 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/SecondaryTasksSurfaceViewBinderTest.java
@@ -11,7 +11,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SECONDARY_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; import android.view.View; @@ -67,7 +66,6 @@ public void testSetVisibilityAfterShowingOverview() { assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); assertFalse(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); assertNull(mTasksSurfaceView.getParent()); mPropertyModel.set(IS_SHOWING_OVERVIEW, true); @@ -93,7 +91,6 @@ public void testSetVisibilityBeforeShowingOverview() { assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); assertFalse(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); assertNull(mTasksSurfaceView.getParent()); mPropertyModel.set(IS_SECONDARY_SURFACE_VISIBLE, true); @@ -116,42 +113,9 @@ @Test @UiThreadTest @SmallTest - public void testSetVisibilityAfterShowingStackTabSwitcher() { - assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); - assertFalse(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); - assertNull(mTasksSurfaceView.getParent()); - - mPropertyModel.set(IS_SHOWING_OVERVIEW, true); - assertNull(mTasksSurfaceView.getParent()); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, true); - mPropertyModel.set(IS_SECONDARY_SURFACE_VISIBLE, true); - assertNull(mTasksSurfaceView.getParent()); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - - mPropertyModel.set(IS_SECONDARY_SURFACE_VISIBLE, false); - assertNull(mTasksSurfaceView.getParent()); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, false); - mPropertyModel.set(IS_SECONDARY_SURFACE_VISIBLE, true); - assertNotNull(mTasksSurfaceView.getParent()); - assertEquals(mTasksSurfaceView.getVisibility(), View.VISIBLE); - - mPropertyModel.set(IS_SHOWING_OVERVIEW, false); - assertNotNull(mTasksSurfaceView.getParent()); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - } - - @Test - @UiThreadTest - @SmallTest public void testSetVisibilityWithTopMargin() { assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); assertFalse(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); assertNull(mTasksSurfaceView.getParent()); mPropertyModel.set(TOP_MARGIN, 20); @@ -180,7 +144,6 @@ public void testSetTopMargin() { assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); assertFalse(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); // Setting the top margin shouldn't cause a NullPointerException when the layout params are // null, since this should be handled in the *ViewBinder.
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java index 60e8983a..a042b90 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceNoTabsTest.java
@@ -8,11 +8,9 @@ import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -142,41 +140,6 @@ @Feature({"StartSurface"}) // clang-format off @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" + - "/show_last_active_tab_only/true/show_stack_tab_switcher/true" + - "/open_ntp_instead_of_start/true"}) - public void testShow_SingleAsHomepage_V2_NoTabs() { - // clang-format on - CriteriaHelper.pollUiThread( - () - -> mActivityTestRule.getActivity().getLayoutManager() != null - && mActivityTestRule.getActivity().getLayoutManager().overviewVisible()); - - onView(withId(R.id.primary_tasks_surface_view)).check(matches(isDisplayed())); - onView(withId(R.id.search_box_text)).check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.mv_tiles_container)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.tab_switcher_title)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.carousel_tab_switcher_container)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.single_tab_view)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.tasks_surface_body)) - .check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.trendy_terms_recycler_view)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.incognito_switch)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.more_tabs)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(R.id.start_tab_switcher_button)).check(matches(not(isEnabled()))); - } - - @Test - @MediumTest - @Feature({"StartSurface"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" + "/show_last_active_tab_only/true/open_ntp_instead_of_start/true"}) public void testShow_SingleAsHomepage_SingleTabSwitcher_NoTabs() { // clang-format on
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java index 3a8ce03..f0afce5a 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.features.start_surface; import static android.os.Build.VERSION_CODES.M; -import static android.os.Build.VERSION_CODES.N; import static android.os.Build.VERSION_CODES.P; import static androidx.test.espresso.Espresso.onView; @@ -25,7 +24,6 @@ import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; @@ -95,7 +93,6 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.ChromeTabbedActivity; -import org.chromium.chrome.browser.compositor.layouts.phone.StackLayout; import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator; import org.chromium.chrome.browser.feed.FeedSurfaceMediator; import org.chromium.chrome.browser.feed.shared.FeedFeatures; @@ -110,7 +107,6 @@ import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; -import org.chromium.chrome.browser.toolbar.top.ToolbarPhone; import org.chromium.chrome.start_surface.R; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; @@ -122,7 +118,6 @@ import org.chromium.components.browser_ui.bottomsheet.BottomSheetTestSupport; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.content_public.browser.test.util.TouchCommon; import org.chromium.ui.test.util.UiRestriction; import java.io.IOException; @@ -684,75 +679,6 @@ @Test @MediumTest @Feature({"StartSurface"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" + - "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) - @DisabledTest(message = "https://crbug.com/1139467") - public void testShow_SingleAsHomepage_V2() { - // clang-format on - if (!mImmediateReturn) { - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); - } - CriteriaHelper.pollUiThread( - () - -> mActivityTestRule.getActivity().getLayoutManager() != null - && mActivityTestRule.getActivity().getLayoutManager().overviewVisible()); - - onView(withId(R.id.primary_tasks_surface_view)).check(matches(isDisplayed())); - onView(withId(R.id.search_box_text)).check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.mv_tiles_container)) - .check(matches(withEffectiveVisibility(GONE))); - onView(withId(org.chromium.chrome.tab_ui.R.id.tab_switcher_title)) - .check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.carousel_tab_switcher_container)) - .check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.single_tab_view)) - .check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.tasks_surface_body)) - .check(matches(isDisplayed())); - onView(withId(org.chromium.chrome.tab_ui.R.id.trendy_terms_recycler_view)) - .check(matches(withEffectiveVisibility(GONE))); - - onView(withId(org.chromium.chrome.tab_ui.R.id.incognito_switch)) - .check(matches(withEffectiveVisibility(GONE))); - - // Note that onView(R.id.more_tabs).perform(click()) can not be used since it requires 90 - // percent of the view's area is displayed to the users. However, this view has negative - // margin which makes the percentage is less than 90. - // TODO(crbug.com/1025296): Investigate whether this would be a problem for real users. - try { - TestThreadUtils.runOnUiThreadBlocking( - () - -> mActivityTestRule.getActivity() - .findViewById(org.chromium.chrome.tab_ui.R.id.more_tabs) - .performClick()); - } catch (ExecutionException e) { - fail("Failed to tap 'more tabs' " + e.toString()); - } - waitForView(withId(R.id.primary_tasks_surface_view), VIEW_GONE); - assertThat(mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(), - instanceOf(StackLayout.class)); - - pressBack(); - onView(withId(R.id.primary_tasks_surface_view)); - - if (isInstantReturn() - && (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP - && Build.VERSION.SDK_INT < Build.VERSION_CODES.O)) { - // TODO(crbug.com/1092642): Fix androidx.test.espresso.PerformException issue when - // performing a single click on position: 0. See code below. - return; - } - - OverviewModeBehaviorWatcher hideWatcher = - TabUiTestHelper.createOverviewHideWatcher(mActivityTestRule.getActivity()); - onView(withId(org.chromium.chrome.tab_ui.R.id.single_tab_view)).perform(click()); - hideWatcher.waitForBehavior(); - } - - @Test - @MediumTest - @Feature({"StartSurface"}) @CommandLineFlags.Add({BASE_PARAMS + "/single"}) public void testShow_SingleAsTabSwitcher() { if (mImmediateReturn) { @@ -797,90 +723,6 @@ @MediumTest @Feature({"StartSurface"}) // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" + - "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) - @DisabledTest(message = "https://crbug.com/1164485") - public void testShow_SingleAsTabSwitcher_V2() { - // clang-format on - if (mImmediateReturn) { - CriteriaHelper.pollUiThread( - () - -> mActivityTestRule.getActivity().getLayoutManager() != null - && mActivityTestRule.getActivity() - .getLayoutManager() - .overviewVisible()); - waitForTabModel(); - // Single surface is shown as homepage. Exit in order to get into tab switcher later. - pressBack(); - } - if (isInstantReturn()) { - // TODO(crbug.com/1076274): fix toolbar to avoid wrongly focusing on the toolbar - // omnibox. - return; - } - - TabUiTestHelper.enterTabSwitcher(mActivityTestRule.getActivity()); - waitForView(withId(R.id.primary_tasks_surface_view), VIEW_GONE); - assertThat(mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout(), - instanceOf(StackLayout.class)); - - OverviewModeBehaviorWatcher hideWatcher = - TabUiTestHelper.createOverviewHideWatcher(mActivityTestRule.getActivity()); - // Simulate click roughly at the center of the screen so as to select the only tab. - TouchCommon.singleClickView( - mActivityTestRule.getActivity().getCompositorViewHolder().getCompositorView()); - hideWatcher.waitForBehavior(); - } - - @Test - @MediumTest - @Feature({"StartSurface"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" - + "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) - public void testShow_SingleAsHomepageV2_FromResumeShowStart() throws Exception { - // clang-format on - if (!mImmediateReturn) { - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); - } - - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - CriteriaHelper.pollUiThread( - () -> cta.getLayoutManager() != null && cta.getLayoutManager().overviewVisible()); - waitForTabModel(); - TestThreadUtils.runOnUiThreadBlocking( - () -> { cta.getTabModelSelector().getModel(false).closeAllTabs(); }); - TabUiTestHelper.verifyTabModelTabCount(cta, 0, 0); - assertTrue(cta.getLayoutManager().overviewVisible()); - TestThreadUtils.runOnUiThreadBlocking( - () -> cta.getTabCreator(true /*incognito*/).launchNTP()); - TabUiTestHelper.verifyTabModelTabCount(cta, 0, 1); - - // Simulates pressing the Android's home button and bringing Chrome to the background. - pressHome(); - - // Simulates pressing Chrome's icon and launching Chrome from warm start. - mActivityTestRule.resumeMainActivityFromLauncher(); - - waitForTabModel(); - if (mImmediateReturn) { - CriteriaHelper.pollUiThread(() - -> cta.getLayoutManager() != null - && cta.getLayoutManager().overviewVisible()); - // Verifies that with the vertical tab switcher, the regular Start surface is shown when - // resuming. - assertFalse(cta.getTabModelSelector().getCurrentModel().isIncognito()); - assertThat(cta.getTabModelSelector().getCurrentModel().getCount(), equalTo(0)); - } else { - assertTrue(cta.getTabModelSelector().getCurrentModel().isIncognito()); - onViewWaiting(allOf(withId(R.id.new_tab_incognito_container), isDisplayed())); - } - } - - @Test - @MediumTest - @Feature({"StartSurface"}) - // clang-format off @CommandLineFlags.Add({BASE_PARAMS + "/single"}) @DisableIf. Build(sdk_is_less_than = Build.VERSION_CODES.P, message = "Flaky, see crbug.com/1169673") @@ -1228,8 +1070,6 @@ Assert.assertEquals("single", StartSurfaceConfiguration.START_SURFACE_VARIATION.getValue()); Assert.assertTrue(StartSurfaceConfiguration.START_SURFACE_LAST_ACTIVE_TAB_ONLY.getValue()); - Assert.assertFalse( - StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()); CriteriaHelper.pollUiThread( () -> mActivityTestRule.getActivity().getLayoutManager() != null @@ -1312,35 +1152,6 @@ @Test @MediumTest - @Feature({"StartSurface"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" - + "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) - public void testShow_SingleAsHomepageV2_CloseAllTabsShouldHideTabSwitcher() { - // clang-format on - if (!mImmediateReturn) { - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); - } - - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - CriteriaHelper.pollUiThread( - () -> cta.getLayoutManager() != null && cta.getLayoutManager().overviewVisible()); - waitForTabModel(); - TabUiTestHelper.verifyTabModelTabCount(cta, 1, 0); - assertEquals(cta.findViewById(org.chromium.chrome.tab_ui.R.id.tab_switcher_title) - .getVisibility(), - View.VISIBLE); - - TestThreadUtils.runOnUiThreadBlocking( - () -> { cta.getTabModelSelector().getModel(false).closeAllTabs(); }); - TabUiTestHelper.verifyTabModelTabCount(cta, 0, 0); - assertEquals(cta.findViewById(org.chromium.chrome.tab_ui.R.id.tab_switcher_title) - .getVisibility(), - View.GONE); - } - - @Test - @MediumTest @Feature({"StartSurface", "TabGroup"}) @CommandLineFlags.Add({BASE_PARAMS + "/single"}) @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) @@ -1439,30 +1250,6 @@ @Test @MediumTest @Feature({"StartSurface"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/exclude_mv_tiles/true" - + "/show_last_active_tab_only/true/show_stack_tab_switcher/true"}) - @DisabledTest(message = "crbug.com/1148365") - public void testShow_SingleAsHomepageV2_VoiceSearchButtonShown() { - // clang-format on - if (!mImmediateReturn) { - onView(withId(org.chromium.chrome.tab_ui.R.id.home_button)).perform(click()); - } - - CriteriaHelper.pollUiThread( - () - -> mActivityTestRule.getActivity().getLayoutManager() != null - && mActivityTestRule.getActivity().getLayoutManager().overviewVisible()); - waitForTabModel(); - - onView(withId(R.id.primary_tasks_surface_view)).check(matches(isDisplayed())); - onView(withId(R.id.search_box_text)).check(matches(isDisplayed())); - onView(withId(R.id.voice_search_button)).check(matches(isDisplayed())); - } - - @Test - @MediumTest - @Feature({"StartSurface"}) @CommandLineFlags.Add({BASE_PARAMS + "/single"}) public void testShow_SingleAsHomepage_VoiceSearchButtonShown() { if (!mImmediateReturn) { @@ -1887,29 +1674,6 @@ }; } - @Test - @MediumTest - @Feature({"StartSurface"}) - @DisableIf.Build(sdk_is_less_than = N, message = "https://crbug.com/1173576") - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/single/show_stack_tab_switcher/true" - + "/open_ntp_instead_of_start/true"}) - public void testScrollToolbar() { - // clang-format on - - // We need to check toolbar background color with open_ntp_instead_of_start on. This flag - // requires mImmediateReturn to be true. - assumeTrue(mImmediateReturn); - - scrollToolbar(); - - // Check the toolbar's background color. - ToolbarPhone toolbar = - mActivityTestRule.getActivity().findViewById(org.chromium.chrome.R.id.toolbar); - Assert.assertEquals(toolbar.getToolbarDataProvider().getPrimaryColor(), - toolbar.getBackgroundDrawable().getColor()); - } - private void scrollToolbar() { onViewWaiting(allOf(withId(R.id.feed_stream_recycler_view), isDisplayed()));
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java index c9471fb3..cc31c10ff 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/TasksSurfaceViewBinderTest.java
@@ -11,7 +11,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.BOTTOM_BAR_HEIGHT; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; import android.view.View; @@ -67,7 +66,6 @@ @SmallTest public void testSetShowAndHideOverview() { assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); assertNull(mTasksSurfaceView.getParent()); mPropertyModel.set(BOTTOM_BAR_HEIGHT, 10); @@ -89,38 +87,6 @@ @Test @UiThreadTest @SmallTest - public void testSetShowAndHideStackTabSwitcher() { - assertFalse(mPropertyModel.get(IS_SHOWING_OVERVIEW)); - assertFalse(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER)); - assertNull(mTasksSurfaceView.getParent()); - - mPropertyModel.set(BOTTOM_BAR_HEIGHT, 10); - mPropertyModel.set(TOP_MARGIN, 20); - - mPropertyModel.set(IS_SHOWING_OVERVIEW, true); - assertEquals(mTasksSurfaceView.getVisibility(), View.VISIBLE); - assertNotNull(mTasksSurfaceView.getParent()); - MarginLayoutParams layoutParams = (MarginLayoutParams) mTasksSurfaceView.getLayoutParams(); - assertEquals(10, layoutParams.bottomMargin); - ViewGroup.LayoutParams layoutParams1 = mTopToolbarPlaceholderView.getLayoutParams(); - assertEquals(20, layoutParams1.height); - - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, true); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - assertNotNull(mTasksSurfaceView.getParent()); - - mPropertyModel.set(IS_SHOWING_STACK_TAB_SWITCHER, false); - assertEquals(mTasksSurfaceView.getVisibility(), View.VISIBLE); - assertNotNull(mTasksSurfaceView.getParent()); - - mPropertyModel.set(IS_SHOWING_OVERVIEW, false); - assertEquals(mTasksSurfaceView.getVisibility(), View.GONE); - assertNotNull(mTasksSurfaceView.getParent()); - } - - @Test - @UiThreadTest - @SmallTest public void testSetBottomBarHeight() { mPropertyModel.set(BOTTOM_BAR_HEIGHT, 10); mPropertyModel.set(IS_SHOWING_OVERVIEW, true);
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java index b8a1505b..aee6546 100644 --- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -42,7 +42,6 @@ import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_EXPLORE_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SECONDARY_SURFACE_VISIBLE; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_OVERVIEW; -import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.IS_SHOWING_STACK_TAB_SWITCHER; import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.TOP_MARGIN; import android.content.res.Resources; @@ -441,60 +440,6 @@ } @Test - public void showAndHideSingleSurfaceWithStackTabSwitcher() { - doReturn(false).when(mTabModelSelector).isIncognitoSelected(); - doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); - doReturn(true).when(mVoiceRecognitionHandler).isVoiceSearchEnabled(); - - StartSurfaceMediator mediator = - createStartSurfaceMediator(SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ true, - /* showStackTabSwitcher= */ false, /* hadWarmStart= */ false); - verify(mMainTabGridController) - .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); - - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); - // Sets the current OvervieMoStartSurfaceStatedeState to SHOWING_START before calling the - // {@link StartSurfaceMediator#showOverview()}. This is because if the current - // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in - // {@link StartSurfaceMediator#showOverview()}. - mediator.setOverviewState(StartSurfaceState.SHOWING_START); - - mediator.showOverview(false); - verify(mMainTabGridController).showOverview(eq(false)); - verify(mFakeBoxDelegate).addUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.capture()); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); - assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); - assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - assertThat(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER), equalTo(false)); - assertThat(mPropertyModel.get(TRENDY_TERMS_VISIBLE), equalTo(false)); - - mOverviewModeObserverCaptor.getValue().startedShowing(); - mOverviewModeObserverCaptor.getValue().finishedShowing(); - - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(true); - assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(false)); - mUrlFocusChangeListenerCaptor.getValue().onUrlFocusChange(false); - assertThat(mPropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_VOICE_RECOGNITION_BUTTON_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER), equalTo(false)); - - mediator.hideOverview(true); - verify(mMainTabGridController).hideOverview(eq(true)); - - mOverviewModeObserverCaptor.getValue().startedHiding(); - assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(false)); - verify(mFakeBoxDelegate) - .removeUrlFocusChangeListener(mUrlFocusChangeListenerCaptor.getValue()); - - mOverviewModeObserverCaptor.getValue().finishedHiding(); - - // TODO(crbug.com/1020223): Test the other SurfaceMode.SINGLE_PANE operations. - } - - @Test public void showAndHideTwoPanesSurface() { doReturn(false).when(mTabModelSelector).isIncognitoSelected(); doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); @@ -853,58 +798,6 @@ } @Test - public void overviewModeStatesNormalModeSinglePaneStackTabSwitcher() { - doReturn(false).when(mTabModelSelector).isIncognitoSelected(); - doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); - doReturn(true).when(mVoiceRecognitionHandler).isVoiceSearchEnabled(); - - StartSurfaceMediator mediator = - createStartSurfaceMediator(SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ true, - /* showStackTabSwitcher= */ true, /* hadWarmStart= */ false); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); - - doReturn(2).when(mNormalTabModel).getCount(); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); - mediator.showOverview(false); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); - assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); - assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER), equalTo(false)); - - mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - mediator.onClick(mock(View.class)); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_TABSWITCHER)); - assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); - assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER), equalTo(true)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_FAKE_SEARCH_BOX_VISIBLE), - equalTo(false)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO), equalTo(false)); - - mediator.onBackPressed(); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.SHOWN_HOMEPAGE)); - assertThat(mPropertyModel.get(IS_SHOWING_OVERVIEW), equalTo(true)); - assertThat(mPropertyModel.get(IS_INCOGNITO), equalTo(false)); - assertThat(mPropertyModel.get(IS_EXPLORE_SURFACE_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(MV_TILES_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true)); - assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false)); - assertThat(mPropertyModel.get(IS_SHOWING_STACK_TAB_SWITCHER), equalTo(false)); - - mediator.startedHiding(); - assertThat(mediator.getStartSurfaceState(), equalTo(StartSurfaceState.NOT_SHOWN)); - assertThat(mPropertyModel.get(IS_SECONDARY_SURFACE_VISIBLE), equalTo(false)); - } - - @Test public void overviewModeIncognitoModeSinglePane() { doReturn(true).when(mTabModelSelector).isIncognitoSelected(); doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); @@ -1368,60 +1261,6 @@ } @Test - public void setIncognitoDescriptionShowSinglePaneStackTabSwitcher() { - doReturn(false).when(mTabModelSelector).isIncognitoSelected(); - doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); - doReturn(true).when(mVoiceRecognitionHandler).isVoiceSearchEnabled(); - - StartSurfaceMediator mediator = - createStartSurfaceMediator(SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ true, - /* showStackTabSwitcher= */ true, /* hadWarmStart= */ false); - mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); - mediator.showOverview(false); - verify(mTabModelSelector).addObserver(mTabModelSelectorObserverCaptor.capture()); - - assertThat(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), equalTo(false)); - assertThat(mPropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), equalTo(false)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), - equalTo(false)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), - equalTo(false)); - - mediator.setSecondaryTasksSurfacePropertyModel(mSecondaryTasksSurfacePropertyModel); - doReturn(1).when(mIncognitoTabModel).getCount(); - mTabModelSelectorObserverCaptor.getValue().onTabModelSelected( - mIncognitoTabModel, mNormalTabModel); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), - equalTo(true)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), - equalTo(true)); - - mTabModelSelectorObserverCaptor.getValue().onTabModelSelected( - mNormalTabModel, mIncognitoTabModel); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), - equalTo(true)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), - equalTo(false)); - - doReturn(0).when(mIncognitoTabModel).getCount(); - mTabModelSelectorObserverCaptor.getValue().onTabModelSelected( - mIncognitoTabModel, mNormalTabModel); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), - equalTo(true)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), - equalTo(true)); - - mTabModelSelectorObserverCaptor.getValue().onTabModelSelected( - mNormalTabModel, mIncognitoTabModel); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_INITIALIZED), - equalTo(true)); - assertThat(mSecondaryTasksSurfacePropertyModel.get(IS_INCOGNITO_DESCRIPTION_VISIBLE), - equalTo(false)); - - mediator.hideOverview(true); - } - - @Test public void showAndHideTabSwitcherToolbarHomePage() { doReturn(false).when(mTabModelSelector).isIncognitoSelected(); doReturn(mVoiceRecognitionHandler).when(mFakeBoxDelegate).getVoiceRecognitionHandler(); @@ -1690,7 +1529,7 @@ StartSurfaceMediator mediator = createStartSurfaceMediatorWithoutInit( SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ false, - /* showStackTabSwitcher= */ false, /* hadWarmStart= */ false); + /* hadWarmStart= */ false); verify(mMainTabGridController) .addOverviewModeObserver(mOverviewModeObserverCaptor.capture()); @@ -1721,13 +1560,13 @@ resources.getDimensionPixelSize(R.dimen.tab_switcher_title_top_margin); createStartSurfaceMediatorWithoutInit(SurfaceMode.OMNIBOX_ONLY, /* excludeMVTiles= */ false, - /* showStackTabSwitcher= */ false, /* hadWarmStart= */ false); + /* hadWarmStart= */ false); assertThat(mPropertyModel.get(TASKS_SURFACE_BODY_TOP_MARGIN), equalTo(0)); assertThat(mPropertyModel.get(MV_TILES_CONTAINER_TOP_MARGIN), equalTo(0)); assertThat(mPropertyModel.get(TAB_SWITCHER_TITLE_TOP_MARGIN), equalTo(0)); createStartSurfaceMediatorWithoutInit(SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ false, - /* showStackTabSwitcher= */ false, /* hadWarmStart= */ false); + /* hadWarmStart= */ false); assertThat(mPropertyModel.get(TASKS_SURFACE_BODY_TOP_MARGIN), equalTo(tasksSurfaceBodyTopMargin)); assertThat(mPropertyModel.get(MV_TILES_CONTAINER_TOP_MARGIN), @@ -1745,7 +1584,7 @@ CachedFeatureFlags.setForTesting(INSTANT_START, true); StartSurfaceMediator mediator = createStartSurfaceMediator(SurfaceMode.SINGLE_PANE, /* excludeMVTiles= */ false, - /* showStackTabSwitcher= */ false, /* hadWarmStart= */ true); + /* hadWarmStart= */ true); assertFalse(mediator.shouldShowFeedPlaceholder()); mediator.setOverviewState(StartSurfaceState.SHOWING_HOMEPAGE); @@ -1764,14 +1603,13 @@ private StartSurfaceMediator createStartSurfaceMediator( @SurfaceMode int mode, boolean excludeMVTiles) { - return createStartSurfaceMediator( - mode, excludeMVTiles, /* showStackTabSwitcher= */ false, /* hadWarmStart= */ false); + return createStartSurfaceMediator(mode, excludeMVTiles, /* hadWarmStart= */ false); } - private StartSurfaceMediator createStartSurfaceMediator(@SurfaceMode int mode, - boolean excludeMVTiles, boolean showStackTabSwitcher, boolean hadWarmStart) { - StartSurfaceMediator mediator = createStartSurfaceMediatorWithoutInit( - mode, excludeMVTiles, showStackTabSwitcher, hadWarmStart); + private StartSurfaceMediator createStartSurfaceMediator( + @SurfaceMode int mode, boolean excludeMVTiles, boolean hadWarmStart) { + StartSurfaceMediator mediator = + createStartSurfaceMediatorWithoutInit(mode, excludeMVTiles, hadWarmStart); mediator.initWithNative(mFakeBoxDelegate, (mode == SurfaceMode.SINGLE_PANE || mode == SurfaceMode.TWO_PANES) ? mFeedSurfaceCreator @@ -1780,14 +1618,13 @@ return mediator; } - private StartSurfaceMediator createStartSurfaceMediatorWithoutInit(@SurfaceMode int mode, - boolean excludeMVTiles, boolean showStackTabSwitcher, boolean hadWarmStart) { + private StartSurfaceMediator createStartSurfaceMediatorWithoutInit( + @SurfaceMode int mode, boolean excludeMVTiles, boolean hadWarmStart) { StartSurfaceMediator mediator = new StartSurfaceMediator(mMainTabGridController, mTabModelSelector, mode == SurfaceMode.NO_START_SURFACE ? null : mPropertyModel, mode == SurfaceMode.SINGLE_PANE ? mSecondaryTasksSurfaceInitializer : null, mode, ContextUtils.getApplicationContext(), mBrowserControlsStateProvider, - mActivityStateChecker, excludeMVTiles, showStackTabSwitcher, mStartSurfaceSupplier, - hadWarmStart); + mActivityStateChecker, excludeMVTiles, mStartSurfaceSupplier, hadWarmStart); return mediator; } }
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java index 982128c..242b4f6 100644 --- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java +++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurfaceConfiguration.java
@@ -52,9 +52,6 @@ public static final BooleanCachedFieldTrialParameter START_SURFACE_LAST_ACTIVE_TAB_ONLY = new BooleanCachedFieldTrialParameter( ChromeFeatureList.START_SURFACE_ANDROID, "show_last_active_tab_only", false); - public static final BooleanCachedFieldTrialParameter START_SURFACE_SHOW_STACK_TAB_SWITCHER = - new BooleanCachedFieldTrialParameter( - ChromeFeatureList.START_SURFACE_ANDROID, "show_stack_tab_switcher", false); public static final BooleanCachedFieldTrialParameter START_SURFACE_OPEN_NTP_INSTEAD_OF_START = new BooleanCachedFieldTrialParameter( ChromeFeatureList.START_SURFACE_ANDROID, "open_ntp_instead_of_start", false); @@ -109,14 +106,6 @@ } /** - *@return Whether the Start Surface Stack Tab Switcher is enabled. - */ - public static boolean isStartSurfaceStackTabSwitcherEnabled() { - return isStartSurfaceSinglePaneEnabled() - && START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue(); - } - - /** * Add an observer to keep {@link ChromePreferenceKeys.FEED_ARTICLES_LIST_VISIBLE} consistent * with {@link Pref.ARTICLES_LIST_VISIBLE}. */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java index 4bbb99f..6a04f9f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -13,7 +13,6 @@ import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; @@ -105,13 +104,10 @@ * @param updateHost The parent {@link LayoutUpdateHost}. * @param renderHost The parent {@link LayoutRenderHost}. * @param startSurface The {@link StartSurface} the layout should own. - * @param browserControlsStateProviderSupplier The {@link ObservableSupplier} for - * {@link BrowserControlsStateProvider}. * @return The {@link StartSurfaceLayout}. */ Layout createStartSurfaceLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, - ObservableSupplier<BrowserControlsStateProvider> browserControlsStateProviderSupplier); + LayoutRenderHost renderHost, StartSurface startSurface); /** * Create the {@link StartSurface}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java index f19ec303..fb82f28 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
@@ -15,7 +15,6 @@ import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; @@ -91,10 +90,9 @@ @Override public Layout createStartSurfaceLayout(Context context, LayoutUpdateHost updateHost, - LayoutRenderHost renderHost, StartSurface startSurface, - ObservableSupplier<BrowserControlsStateProvider> browserControlsStateProviderSupplier) { - return StartSurfaceDelegate.createStartSurfaceLayout(context, updateHost, renderHost, - startSurface, browserControlsStateProviderSupplier); + LayoutRenderHost renderHost, StartSurface startSurface) { + return StartSurfaceDelegate.createStartSurfaceLayout( + context, updateHost, renderHost, startSurface); } @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index 7ff6ea47..f29b4de 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -107,9 +107,6 @@ * @return Whether the Grid Tab Switcher UI is enabled and available for use. */ public static boolean isGridTabSwitcherEnabled() { - // Disable grid tab switcher if stack tab switcher is enabled for the start surface. - if (StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled()) return false; - // Disable grid tab switcher for tablet. if (DeviceFormFactor.isNonMultiDisplayContextOnTablet( ContextUtils.getApplicationContext())) { @@ -127,9 +124,6 @@ * @return Whether the tab group feature is enabled and available for use. */ public static boolean isTabGroupsAndroidEnabled() { - // Disable tab groups if stack tab switcher is enabled for the start surface. - if (StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled()) return false; - // Disable tab group for tablet. if (DeviceFormFactor.isNonMultiDisplayContextOnTablet( ContextUtils.getApplicationContext())) {
diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml index b2eec037..258f8288 100644 --- a/chrome/android/java/res/values/styles.xml +++ b/chrome/android/java/res/values/styles.xml
@@ -461,13 +461,6 @@ <style name="NavigationPopupDialog" parent="Widget.AppCompat.Light.ListPopupWindow" /> <!-- Misc text appearance styles --> - <style name="TextAppearance.AddToHomeScreenEditText"> - <item name="android:textSize">18sp</item> - </style> - <style name="TextAppearance.AddToHomeScreenWebAppName" - parent="TextAppearance.TextLarge.Primary"> - <item name="android:textSize">20sp</item> - </style> <style name="TextAppearance.SearchEngineRecentTitle" parent="TextAppearance.RobotoMediumStyle"> <item name="android:textColor">@color/default_text_color_link</item> </style>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java index e609c350..0690d4c10 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -335,4 +335,8 @@ public ChromeStartupDelegate createChromeStartupDelegate() { return new ChromeStartupDelegate(); } + + public boolean canStartForegroundServiceWhileInvisible() { + return true; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 4e099fe9..3b3c417a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -603,8 +603,7 @@ try (TraceEvent e = TraceEvent.scoped( "ChromeTabbedActivity.setupCompositorContentPreNativeForPhone")) { CompositorViewHolder compositorViewHolder = getCompositorViewHolder(); - if (TabUiFeatureUtilities.isGridTabSwitcherEnabled() - || StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled()) { + if (TabUiFeatureUtilities.isGridTabSwitcherEnabled()) { TabManagementDelegate tabManagementDelegate = TabManagementModuleProvider.getDelegate(); if (tabManagementDelegate != null) { @@ -852,12 +851,6 @@ public void onResumeWithNative() { super.onResumeWithNative(); - // Switch to non incognito tab model to show the non incognito start surface if needed. - if (StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled() && isWarmOnResume() - && shouldShowTabSwitcherOnStart() && mTabModelSelectorImpl.isIncognitoSelected()) { - mTabModelSelectorImpl.selectModel(false); - } - if (IncognitoUtils.shouldDestroyIncognitoProfileOnStartup( getTabModelSelector().getCurrentModel().isIncognito())) { Profile.getLastUsedRegularProfile().getPrimaryOTRProfile().destroyWhenAppropriate();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index d900a94c..6e60704 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -172,7 +172,6 @@ import org.chromium.chrome.browser.vr.VrModuleProvider; import org.chromium.chrome.browser.webapps.PwaBottomSheetController; import org.chromium.chrome.browser.webapps.PwaBottomSheetControllerProvider; -import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenCoordinator; import org.chromium.components.bookmarks.BookmarkId; import org.chromium.components.bookmarks.BookmarkType; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; @@ -191,6 +190,7 @@ import org.chromium.components.policy.CombinedPolicyProvider.PolicyChangeListener; import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.webapk.lib.client.WebApkValidator; +import org.chromium.components.webapps.AddToHomescreenCoordinator; import org.chromium.components.webxr.ArDelegate; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.ScreenOrientationProvider;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index a4c63ea1..102fedb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -33,7 +33,6 @@ import org.chromium.base.supplier.OneshotSupplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.banners.AppMenuVerbiage; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; @@ -65,6 +64,7 @@ import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.webapk.lib.client.WebApkValidator; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.components.webapps.WebappsUtils; import org.chromium.net.ConnectionType; import org.chromium.ui.base.DeviceFormFactor;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index bd9a33c..5a144b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -100,7 +100,6 @@ StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB, StartSurfaceConfiguration.START_SURFACE_LAST_ACTIVE_TAB_ONLY, StartSurfaceConfiguration.START_SURFACE_OPEN_NTP_INSTEAD_OF_START, - StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER, StartSurfaceConfiguration.START_SURFACE_VARIATION, StartSurfaceConfiguration.START_SURFACE_OMNIBOX_SCROLL_MODE, StartSurfaceConfiguration.TRENDY_ENABLED,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index a470bb77..9573df7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -41,7 +41,6 @@ import org.chromium.chrome.browser.toolbar.ControlContainer; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.features.start_surface.StartSurface; -import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration; import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.ScrollDirection; import org.chromium.components.browser_ui.widget.gesture.SwipeGestureListener.SwipeHandler; import org.chromium.components.embedder_support.util.UrlUtilities; @@ -124,17 +123,15 @@ if (createOverviewLayout) { if (startSurface != null) { - assert TabUiFeatureUtilities.isGridTabSwitcherEnabled() - || StartSurfaceConfiguration.isStartSurfaceStackTabSwitcherEnabled(); + assert TabUiFeatureUtilities.isGridTabSwitcherEnabled(); TabManagementDelegate tabManagementDelegate = TabManagementModuleProvider.getDelegate(); assert tabManagementDelegate != null; final ObservableSupplier<? extends BrowserControlsStateProvider> browserControlsSupplier = mHost.getBrowserControlsManagerSupplier(); - mOverviewLayout = tabManagementDelegate.createStartSurfaceLayout(context, this, - renderHost, startSurface, - (ObservableSupplier<BrowserControlsStateProvider>) browserControlsSupplier); + mOverviewLayout = tabManagementDelegate.createStartSurfaceLayout( + context, this, renderHost, startSurface); } else { mCreateOverviewLayout = true; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java index 7678179..48e1b94a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundServiceManager.java
@@ -355,4 +355,11 @@ mHandler.postDelayed(mMaybeStopServiceRunnable, WAIT_TIME_MS); mStopServiceDelayed = true; } + + /** + * @return whether the service for making the app foreground is bound. + */ + public boolean isServiceBound() { + return mIsServiceBound; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index 913a7736..86ed65c5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -27,6 +27,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.StrictModeContext; import org.chromium.chrome.R; +import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; @@ -249,9 +250,12 @@ updateNotification(notificationId, notification, id, new DownloadSharedPreferenceEntry(id, notificationId, isOffTheRecord, canDownloadWhileMetered, fileName, true, isTransient)); - - mDownloadForegroundServiceManager.updateDownloadStatus( - context, DownloadStatus.IN_PROGRESS, notificationId, notification); + // If the notification is allowed to start foreground service, or if the app is already + // foreground, ask the foreground service manager to handle the notification. + if (canStartForegroundService() || mDownloadForegroundServiceManager.isServiceBound()) { + mDownloadForegroundServiceManager.updateDownloadStatus( + context, DownloadStatus.IN_PROGRESS, notificationId, notification); + } startTrackingInProgressDownload(id); } @@ -733,4 +737,9 @@ if (getResumptionAttemptLeft() <= 0) return; DownloadResumptionScheduler.getDownloadResumptionScheduler().scheduleIfNecessary(); } + + private boolean canStartForegroundService() { + if (AppHooks.get().canStartForegroundServiceWhileInvisible()) return true; + return ApplicationStatus.hasVisibleActivities(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index 374c50fd..ddfa440b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -38,7 +38,6 @@ import org.chromium.chrome.browser.DevToolsServer; import org.chromium.chrome.browser.app.video_tutorials.VideoTutorialShareHelper; import org.chromium.chrome.browser.banners.AppBannerInProductHelpControllerProvider; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProvider; import org.chromium.chrome.browser.contacts_picker.ChromePickerAdapter; import org.chromium.chrome.browser.content_capture.ContentCaptureHistoryDeletionObserver; @@ -92,6 +91,7 @@ import org.chromium.components.signin.AccountsChangeObserver; import org.chromium.components.viz.common.VizSwitches; import org.chromium.components.viz.common.display.DeJellyUtils; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.content_public.browser.BrowserTaskExecutor; import org.chromium.content_public.browser.ChildProcessLauncherHelper; import org.chromium.content_public.browser.ContactsPicker;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java index 68d059c..d324f5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingNotificationUtil.java
@@ -9,13 +9,13 @@ import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.os.Build; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import androidx.core.app.NotificationCompat; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; @@ -66,9 +66,9 @@ .setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL); - if (startsActivity && Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { - // We can't use the NotificationIntentInterceptor to start Activities after Android R. - // Use the unmodified PendingIntent directly instead. + if (startsActivity && BuildInfo.isAtLeastS()) { + // We can't use the NotificationIntentInterceptor to start Activities starting in + // Android S. Use the unmodified PendingIntent directly instead. builder.setContentIntent(contentIntent.getPendingIntent()); } else { builder.setContentIntent(contentIntent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java index 86f639f..7b9bfb1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java
@@ -15,6 +15,7 @@ import androidx.annotation.VisibleForTesting; +import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; import org.chromium.base.IntentUtils; import org.chromium.base.annotations.CalledByNative; @@ -122,9 +123,9 @@ private static PendingIntentProvider getContentIntentProvider(String phoneNumber) { Context context = ContextUtils.getApplicationContext(); - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) { - // We can't use the TapReceiver broadcast to start the dialer Activity after Android R. - // Use the dial intent directly instead. + if (BuildInfo.isAtLeastS()) { + // We can't use the TapReceiver broadcast to start the dialer Activity starting in + // Android S. Use the dial intent directly instead. return PendingIntentProvider.getActivity(context, /*requestCode=*/0, getDialIntent(phoneNumber), PendingIntent.FLAG_UPDATE_CURRENT); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 4160db0..30a5001 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -81,10 +81,6 @@ isGridTabSwitcherEnabled) .build(); - // START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB and START_SURFACE_SHOW_STACK_TAB_SWITCHER - // should not be both true. - assert !(StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue() - && StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()); mToolbarMediator = new StartSurfaceToolbarMediator(mPropertyModel, (iphCommandBuilder) -> { @@ -96,7 +92,6 @@ }, StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue(), StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH.getValue(), - StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue(), menuButtonCoordinator, identityDiscStateSupplier, identityDiscButtonSupplier); mThemeColorProvider = provider; @@ -264,26 +259,6 @@ if (LibraryLoader.getInstance().isInitialized()) { maybeCreateIncognitoSwitchCoordinator(); } - - if (StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()) { - mTabSwitcherButtonView = mView.findViewById(R.id.start_tab_switcher_button); - if (mTabSwitcherLongClickListener != null) { - mTabSwitcherButtonView.setOnLongClickListener(mTabSwitcherLongClickListener); - mTabSwitcherLongClickListener = null; - } - mTabSwitcherButtonCoordinator = - new TabSwitcherButtonCoordinator(mTabSwitcherButtonView); - mTabSwitcherButtonCoordinator.setThemeColorProvider(mThemeColorProvider); - mTabSwitcherButtonView.setVisibility(View.VISIBLE); - if (mTabCountProvider != null) { - mTabSwitcherButtonCoordinator.setTabCountProvider(mTabCountProvider); - mTabCountProvider = null; - } - if (mTabSwitcherClickListener != null) { - mTabSwitcherButtonCoordinator.setTabSwitcherListener(mTabSwitcherClickListener); - mTabSwitcherClickListener = null; - } - } } private void maybeCreateIncognitoSwitchCoordinator() { @@ -291,8 +266,7 @@ return; } - if (IncognitoUtils.isIncognitoModeEnabled() - && !StartSurfaceConfiguration.START_SURFACE_SHOW_STACK_TAB_SWITCHER.getValue()) { + if (IncognitoUtils.isIncognitoModeEnabled()) { boolean visible = !StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH_NO_TAB.getValue() && !StartSurfaceConfiguration.START_SURFACE_HIDE_INCOGNITO_SWITCH.getValue();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java index 72788cb2..7265ff6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediator.java
@@ -6,7 +6,6 @@ import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.ACCESSIBILITY_ENABLED; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.BUTTONS_CLICKABLE; -import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_AT_START; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_CLICK_HANDLER; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_DESCRIPTION; import static org.chromium.chrome.browser.toolbar.top.StartSurfaceToolbarProperties.IDENTITY_DISC_IMAGE; @@ -53,7 +52,6 @@ private final Callback<IPHCommandBuilder> mShowIPHCallback; private final boolean mHideIncognitoSwitchWhenNoTabs; private final boolean mHideIncognitoSwitchOnHomePage; - private final boolean mShowNewTabAndIdentityDiscAtStart; private final Supplier<ButtonData> mIdentityDiscButtonSupplier; private TabModelSelector mTabModelSelector; @@ -71,7 +69,7 @@ StartSurfaceToolbarMediator(PropertyModel model, Callback<IPHCommandBuilder> showIPHCallback, boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage, - boolean showNewTabAndIdentityDiscAtStart, MenuButtonCoordinator menuButtonCoordinator, + MenuButtonCoordinator menuButtonCoordinator, ObservableSupplier<Boolean> identityDiscStateSupplier, Supplier<ButtonData> identityDiscButtonSupplier) { mPropertyModel = model; @@ -79,7 +77,6 @@ mShowIPHCallback = showIPHCallback; mHideIncognitoSwitchWhenNoTabs = hideIncognitoSwitchWhenNoTabs; mHideIncognitoSwitchOnHomePage = hideIncognitoSwitchOnHomePage; - mShowNewTabAndIdentityDiscAtStart = showNewTabAndIdentityDiscAtStart; mMenuButtonCoordinator = menuButtonCoordinator; mIdentityDiscButtonSupplier = identityDiscButtonSupplier; identityDiscStateSupplier.addObserver((canShowHint) -> { @@ -168,8 +165,8 @@ } private void updateIncognitoSwitchVisibility() { - if (mOverviewModeState == StartSurfaceState.SHOWN_HOMEPAGE && mHideIncognitoSwitchOnHomePage - || mShowNewTabAndIdentityDiscAtStart) { + if (mOverviewModeState == StartSurfaceState.SHOWN_HOMEPAGE + && mHideIncognitoSwitchOnHomePage) { mPropertyModel.set(INCOGNITO_SWITCHER_VISIBLE, false); return; } @@ -222,13 +219,9 @@ updateIncognitoSwitchVisibility(); if (mOverviewModeState == StartSurfaceState.SHOWN_TABSWITCHER_OMNIBOX_ONLY || mOverviewModeState - == StartSurfaceState.SHOWN_TABSWITCHER_TRENDY_TERMS - || mShowNewTabAndIdentityDiscAtStart) { + == StartSurfaceState.SHOWN_TABSWITCHER_TRENDY_TERMS) { mPropertyModel.set(NEW_TAB_BUTTON_AT_START, true); } - if (mShowNewTabAndIdentityDiscAtStart) { - mPropertyModel.set(IDENTITY_DISC_AT_START, true); - } } } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java index c271af6..062778c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java
@@ -14,7 +14,6 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; @@ -26,6 +25,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; import org.chromium.base.IntentUtils; import org.chromium.base.Log; @@ -139,7 +139,7 @@ super.onCreate(savedInstanceState); // Close the notification tray. - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + if (!BuildInfo.isAtLeastS()) { // https://crbug.com/1166691 ContextUtils.getApplicationContext().sendBroadcast( new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java index 6a1e6dfa..41ef9e56 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java
@@ -39,7 +39,6 @@ import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.history.BrowsingHistoryBridge; import org.chromium.chrome.browser.history.HistoryItem; @@ -54,6 +53,7 @@ import org.chromium.components.location.LocationUtils; import org.chromium.components.permissions.PermissionDialogController; import org.chromium.components.site_engagement.SiteEngagementService; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.Coordinates; import org.chromium.content_public.browser.test.util.DOMUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java index cf1a94e0..e81f38d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
@@ -268,44 +268,6 @@ } /** - * Test that overview mode is triggered in Single-pane stack tab switcher variation in non - * incognito mode when resuming from incognito mode. - */ - @Test - @SmallTest - @Feature({"ReturnToChrome"}) - // clang-format off - @CommandLineFlags.Add({BASE_PARAMS + "/" + TAB_SWITCHER_ON_RETURN_MS_PARAM + "/0" - + "/start_surface_variation/single/show_last_active_tab_only/true" - + "/show_stack_tab_switcher/true/open_ntp_instead_of_start/true"}) - @DisableIf.Device(type = {UiDisableIf.TABLET}) // See https://crbug.com/1081754. - public void testTabSwitcherModeTriggeredWithinThreshold_WarmStart_FromIncognito_V2() throws Exception { - // clang-format on - - // TODO(crbug.com/1093506): Remove it when instant start supports 'show_stack_tab_switcher = - // true'. - assumeFalse(CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START)); - - testTabSwitcherModeTriggeredBeyondThreshold(); - - ChromeTabUtils.newTabFromMenu(InstrumentationRegistry.getInstrumentation(), - mActivityTestRule.getActivity(), true, true); - Assert.assertTrue( - mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected()); - assertEquals(3, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); - - // Trigger hide and resume. - ChromeApplicationTestUtils.fireHomeScreenIntent(InstrumentationRegistry.getTargetContext()); - mActivityTestRule.resumeMainActivityFromLauncher(); - - CriteriaHelper.pollUiThread(() -> { - return !mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected(); - }); - assertEquals(3, mActivityTestRule.getActivity().getTabModelSelector().getTotalTabCount()); - Assert.assertTrue(mActivityTestRule.getActivity().getLayoutManager().overviewVisible()); - } - - /** * Test that overview mode is triggered in Single-pane non stack tab switcher variation in * incognito mode when resuming from incognito mode. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenTest.java similarity index 95% rename from chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenTest.java index ccc0928..b8e04ae 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.chrome.browser.webapps; import android.content.Context; import android.content.Intent; @@ -30,18 +30,19 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.ShortcutHelper; import org.chromium.chrome.browser.app.ChromeActivity; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.banners.AppMenuVerbiage; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; -import org.chromium.chrome.browser.webapps.AddToHomescreenViewDelegate; -import org.chromium.chrome.browser.webapps.WebappDataStorage; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.browser.TabLoadObserver; import org.chromium.chrome.test.util.browser.TabTitleObserver; import org.chromium.chrome.test.util.browser.webapps.WebappTestPage; +import org.chromium.components.webapps.AddToHomescreenCoordinator; +import org.chromium.components.webapps.AddToHomescreenDialogView; +import org.chromium.components.webapps.AddToHomescreenViewDelegate; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.common.ContentSwitches; @@ -159,17 +160,17 @@ protected AddToHomescreenDialogView initView( AppBannerManager.InstallStringPair installStrings, AddToHomescreenViewDelegate delegate) { - return new AddToHomescreenDialogView( - mActivityContext, mModalDialogManager, installStrings, delegate) { + return new AddToHomescreenDialogView(getContextForTests(), + getModalDialogManagerForTests(), installStrings, delegate) { @Override - void setTitle(String title) { + protected void setTitle(String title) { if (TextUtils.isEmpty(mTitle)) { mTitle = title; } } @Override - void setCanSubmit(boolean canSubmit) { + protected void setCanSubmit(boolean canSubmit) { new Handler().post(() -> mDelegate.onAddToHomescreen(mTitle)); } }; @@ -299,7 +300,8 @@ @CommandLineFlags.Add({ContentSwitches.DISABLE_POPUP_BLOCKING, // TODO(yfriedman): Force WebApks off as this tests old A2HS behaviour. "disable-field-trial-config"}) - public void testAddWebappShortcutSplashScreenIcon() throws Exception { + public void + testAddWebappShortcutSplashScreenIcon() throws Exception { // Sets the overridden factory to observe splash screen update. final TestDataStorageFactory dataStorageFactory = new TestDataStorageFactory(); WebappDataStorage.setFactoryForTests(dataStorageFactory);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java index ca65418..d1662e1b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -40,7 +40,6 @@ import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.app.appmenu.AppMenuPropertiesDelegateImpl.AppMenuSimilarSelectionType; import org.chromium.chrome.browser.app.appmenu.AppMenuPropertiesDelegateImpl.MenuGroup; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.device.DeviceConditions; @@ -61,6 +60,7 @@ import org.chromium.components.prefs.PrefService; import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.user_prefs.UserPrefsJni; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.content.browser.ContentFeatureListImpl; import org.chromium.content.browser.ContentFeatureListImplJni; import org.chromium.content_public.browser.ContentFeatureList;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java index 3ee984c..7dcac04 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegateUnitTest.java
@@ -33,7 +33,6 @@ import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; -import org.chromium.chrome.browser.banners.AppBannerManager; import org.chromium.chrome.browser.bookmarks.BookmarkBridge; import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior; import org.chromium.chrome.browser.enterprise.util.ManagedBrowserUtils; @@ -49,6 +48,7 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.content.browser.ContentFeatureListImpl; import org.chromium.content.browser.ContentFeatureListImplJni; import org.chromium.content_public.browser.ContentFeatureList;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java index 3e059d4..063c956 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
@@ -588,8 +588,8 @@ } @Test - public void testShowAndHideHomePageWithNewTabAndIdentityDiscAtStart() { - createMediator(false, false, true); + public void testShowAndHideHomePage() { + createMediator(false, false); mMediator.setTabModelSelector(mTabModelSelector); doReturn(0).when(mIncognitoTabModel).getCount(); @@ -599,7 +599,7 @@ assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); assertEquals(mPropertyModel.get(IS_VISIBLE), true); @@ -608,7 +608,7 @@ assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); assertEquals(mPropertyModel.get(IS_VISIBLE), true); @@ -618,9 +618,9 @@ mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); - assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); - assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); + assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); + assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); assertEquals(mPropertyModel.get(IS_VISIBLE), true); @@ -633,16 +633,16 @@ mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_HOMEPAGE, true); assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); - assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); - assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); + assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); + assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); assertEquals(mPropertyModel.get(IS_VISIBLE), true); } @Test - public void testShowAndHideTabSwitcherWithNewTabAndIdentityDiscAtStart() { - createMediator(false, false, true); + public void testShowAndHideTabSwitcher() { + createMediator(false, false); mMediator.setTabModelSelector(mTabModelSelector); doReturn(0).when(mIncognitoTabModel).getCount(); mMediator.onNativeLibraryReady(); @@ -651,7 +651,7 @@ assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IS_VISIBLE), true); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), false); @@ -660,7 +660,7 @@ assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IS_VISIBLE), true); assertEquals(mPropertyModel.get(IN_START_SURFACE_MODE), true); @@ -670,9 +670,9 @@ mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); - assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); - assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); + assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); + assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IS_VISIBLE), true); mMediator.updateIdentityDisc(mButtonData); @@ -687,31 +687,22 @@ mMediator.onStartSurfaceStateChanged(StartSurfaceState.SHOWN_TABSWITCHER, true); assertEquals(mPropertyModel.get(LOGO_IS_VISIBLE), false); assertEquals(mPropertyModel.get(IDENTITY_DISC_IS_VISIBLE), false); - assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), true); - assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), false); - assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), true); + assertEquals(mPropertyModel.get(IDENTITY_DISC_AT_START), false); + assertEquals(mPropertyModel.get(INCOGNITO_SWITCHER_VISIBLE), true); + assertEquals(mPropertyModel.get(NEW_TAB_BUTTON_AT_START), false); assertEquals(mPropertyModel.get(IS_VISIBLE), true); } private void createMediator( boolean hideIncognitoSwitchWhenNoTabs, boolean hideIncognitoSwitchOnHomePage) { - createMediator(hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, false); - } - - private void createMediator(boolean hideIncognitoSwitchWhenNoTabs, - boolean hideIncognitoSwitchOnHomePage, boolean showNewTabAndIdentityDiscAtStart) { mMediator = new StartSurfaceToolbarMediator(mPropertyModel, mMockCallback, hideIncognitoSwitchWhenNoTabs, hideIncognitoSwitchOnHomePage, - showNewTabAndIdentityDiscAtStart, mMenuButtonCoordinator, - mIdentityDiscStateSupplier, + mMenuButtonCoordinator, mIdentityDiscStateSupplier, () -> mIdentityDiscController.getForStartSurface( mMediator.getOverviewModeStateForTesting())); mMediator.setLayoutStateProvider(mLayoutStateProvider); verify(mLayoutStateProvider).addObserver(mLayoutStateObserverCaptor.capture()); - if (showNewTabAndIdentityDiscAtStart) { - mPropertyModel.set(INCOGNITO_SWITCHER_VISIBLE, false); - } } }
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h index f197072..25d3fb9 100644 --- a/chrome/app/chrome_command_ids.h +++ b/chrome/app/chrome_command_ids.h
@@ -5,6 +5,7 @@ #ifndef CHROME_APP_CHROME_COMMAND_IDS_H_ #define CHROME_APP_CHROME_COMMAND_IDS_H_ +#include "build/build_config.h" #include "build/chromeos_buildflags.h" // This file lists all the command IDs understood by e.g. the browser. @@ -438,6 +439,11 @@ #define IDC_TAB_SEARCH 52500 #define IDC_TAB_SEARCH_CLOSE 52501 +// Views debug commands. +#define IDC_DEBUG_TOGGLE_TABLET_MODE 52510 +#define IDC_DEBUG_PRINT_VIEW_TREE 52511 +// Please leave a gap here for new debug commands. + // NOTE: The last valid command value is 57343 (0xDFFF) // See http://msdn.microsoft.com/en-us/library/t2zechd4(VS.71).aspx
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index 6c7f47e..2b4bb1a 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -715,17 +715,6 @@ </message> </if> - <!-- Work profile confirmation dialog --> - <message name="IDS_WORK_PROFILE_CONFIRMATION_TITLE" desc="Title of the work profile confirmation dialog in the tab modal signin flow when Dice is enabled"> - Chromium Profile Required - </message> - <message name="IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION" desc="Information about work profiles on the work profile confirmation dialog when Dice is enabled"> - This account is managed. Your administrator requires a Chromium profile for access. This profile is completely separated from any personal profile. Chromium data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords, and other settings) can be removed by your admin. <ph name="BEGIN_LINK"><a target="_blank" href="$1"></ph>Learn more<ph name="END_LINK"></a></ph> - </message> - <message name="IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO" desc="Information about work profiles on the work profile confirmation dialog when Dice is enabled"> - This account is managed by <ph name="MANAGEMENT_DOMAIN">$1<ex>example.com</ex></ph>. Your administrator requires a Chromium profile for access. This profile is completely separated from any personal profile. Chromium data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords, and other settings) can be removed by your admin. <ph name="BEGIN_LINK"><a target="_blank" href="$2"></ph>Learn more<ph name="END_LINK"></a></ph> - </message> - <!-- about:browser-switch strings --> <if expr="is_win or is_macosx or (is_linux and not chromeos)"> <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
diff --git a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 deleted file mode 100644 index 8ce9c0e..0000000 --- a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c0b893f4959c2e6e2d8a3a119cc9bf6a6f2aad \ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 b/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 deleted file mode 100644 index 8ce9c0e..0000000 --- a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c0b893f4959c2e6e2d8a3a119cc9bf6a6f2aad \ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 b/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 deleted file mode 100644 index 4df5684..0000000 --- a/chrome/app/chromium_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -7b6339b318944776c76d74ffbd456b7a4788be9d \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 43ab783..b4d00ca 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -8066,11 +8066,6 @@ Cancel sign in </message> - <!-- Sync Confirmation section of the tab modal signin flow --> - <message name="IDS_WORK_PROFILE_CONFIRMATION_CONFIRM_BUTTON_LABEL" desc="Label of the confirmation button in the sync confirmation dialog of the tab modal signin flow"> - Add Profile - </message> - <!-- Dice Web Signin Interception Bubble--> <if expr="not chromeos and not is_android"> <message name="IDS_SIGNIN_DICE_WEB_INTERCEPT_BUBBLE_NEW_PROFILE_BUTTON_LABEL" desc="Label of the confirmation button in the web signin interception bubble">
diff --git a/chrome/app/generated_resources_grd/IDS_WORK_PROFILE_CONFIRMATION_CONFIRM_BUTTON_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_WORK_PROFILE_CONFIRMATION_CONFIRM_BUTTON_LABEL.png.sha1 deleted file mode 100644 index 8ce9c0e..0000000 --- a/chrome/app/generated_resources_grd/IDS_WORK_PROFILE_CONFIRMATION_CONFIRM_BUTTON_LABEL.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c0b893f4959c2e6e2d8a3a119cc9bf6a6f2aad \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index f735afb..88bf537a 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -722,17 +722,6 @@ </message> </if> - <!-- Work profile confirmation dialog --> - <message name="IDS_WORK_PROFILE_CONFIRMATION_TITLE" desc="Title of the work profile confirmation dialog in the tab modal signin flow when Dice is enabled"> - Chrome Profile Required - </message> - <message name="IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION" desc="Information about work profiles on the work profile confirmation dialog when Dice is enabled"> - This account is managed. Your administrator requires a Chrome profile for access. This profile is completely separated from any personal profile. Chrome data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords, and other settings) can be removed by your admin. <ph name="BEGIN_LINK"><a target="_blank" href="$1"></ph>Learn more<ph name="END_LINK"></a></ph> - </message> - <message name="IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO" desc="Information about work profiles on the work profile confirmation dialog when Dice is enabled"> - This account is managed by <ph name="MANAGEMENT_DOMAIN">$1<ex>example.com</ex></ph>. Your administrator requires a Chrome profile for access. This profile is completely separated from any personal profile. Chrome data that is generated during the use of this profile (such as the creation of bookmarks, history, passwords, and other settings) can be removed by your admin. <ph name="BEGIN_LINK"><a target="_blank" href="$2"></ph>Learn more<ph name="END_LINK"></a></ph> - </message> - <!-- about:browser-switch strings --> <if expr="is_win or is_macosx or (is_linux and not chromeos)"> <message name="IDS_ABOUT_BROWSER_SWITCH_DESCRIPTION_UNKNOWN_BROWSER" desc="Description shown while waiting for an alternative browser to open, when the browser name is not auto-detected">
diff --git a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 deleted file mode 100644 index 8ce9c0e..0000000 --- a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c0b893f4959c2e6e2d8a3a119cc9bf6a6f2aad \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 deleted file mode 100644 index 8ce9c0e..0000000 --- a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -f5c0b893f4959c2e6e2d8a3a119cc9bf6a6f2aad \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 deleted file mode 100644 index 4df5684..0000000 --- a/chrome/app/google_chrome_strings_grd/IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -7b6339b318944776c76d74ffbd456b7a4788be9d \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index b90082ef..e69342a 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -811,6 +811,7 @@ "metrics/network_quality_estimator_provider_impl.h", "metrics/oom/out_of_memory_reporter.cc", "metrics/oom/out_of_memory_reporter.h", + "metrics/power/battery_level_provider.cc", "metrics/power/battery_level_provider.h", "metrics/power/power_metrics_reporter.cc", "metrics/power/power_metrics_reporter.h", @@ -2913,10 +2914,6 @@ "android/webapk/webapk_update_data_fetcher.cc", "android/webapk/webapk_update_data_fetcher.h", "android/webapk/webapk_update_manager.cc", - "android/webapps/add_to_homescreen_coordinator.cc", - "android/webapps/add_to_homescreen_coordinator.h", - "android/webapps/add_to_homescreen_mediator.cc", - "android/webapps/add_to_homescreen_mediator.h", "android/webapps/webapp_registry.cc", "android/webapps/webapp_registry.h", "android/webauth/fido2helper_native_android.cc", @@ -2942,8 +2939,6 @@ "autofill/manual_filling_view_interface.h", "banners/android/chrome_app_banner_manager_android.cc", "banners/android/chrome_app_banner_manager_android.h", - "banners/app_banner_manager_android.cc", - "banners/app_banner_manager_android.h", "browser_process_platform_part_android.cc", "browser_process_platform_part_android.h", "chrome_browser_field_trials_mobile.cc", @@ -3525,8 +3520,12 @@ "download/download_shelf_context_menu.h", "download/download_shelf_controller.cc", "download/download_shelf_controller.h", - "enterprise/connectors/analysis_service_settings.cc", - "enterprise/connectors/analysis_service_settings.h", + "enterprise/connectors/analysis/analysis_service_settings.cc", + "enterprise/connectors/analysis/analysis_service_settings.h", + "enterprise/connectors/analysis/content_analysis_delegate.cc", + "enterprise/connectors/analysis/content_analysis_delegate.h", + "enterprise/connectors/analysis/content_analysis_dialog.cc", + "enterprise/connectors/analysis/content_analysis_dialog.h", "enterprise/connectors/common.cc", "enterprise/connectors/common.h", "enterprise/connectors/connectors_manager.cc", @@ -3535,10 +3534,6 @@ "enterprise/connectors/connectors_prefs.h", "enterprise/connectors/connectors_service.cc", "enterprise/connectors/connectors_service.h", - "enterprise/connectors/content_analysis_delegate.cc", - "enterprise/connectors/content_analysis_delegate.h", - "enterprise/connectors/content_analysis_dialog.cc", - "enterprise/connectors/content_analysis_dialog.h", "enterprise/connectors/enterprise_connectors_policy_handler.cc", "enterprise/connectors/enterprise_connectors_policy_handler.h", "enterprise/connectors/file_system/authorization_client_info.cc", @@ -3555,8 +3550,8 @@ "enterprise/connectors/file_system/service_settings.h", "enterprise/connectors/file_system/signin_dialog_delegate.cc", "enterprise/connectors/file_system/signin_dialog_delegate.h", - "enterprise/connectors/reporting_service_settings.cc", - "enterprise/connectors/reporting_service_settings.h", + "enterprise/connectors/reporting/reporting_service_settings.cc", + "enterprise/connectors/reporting/reporting_service_settings.h", "enterprise/connectors/service_provider_config.cc", "enterprise/connectors/service_provider_config.h", "enterprise/reporting/browser_report_generator_desktop.cc", @@ -6943,8 +6938,8 @@ if (safe_browsing_mode == 1) { sources += [ - "enterprise/connectors/fake_content_analysis_delegate.cc", - "enterprise/connectors/fake_content_analysis_delegate.h", + "enterprise/connectors/analysis/fake_content_analysis_delegate.cc", + "enterprise/connectors/analysis/fake_content_analysis_delegate.h", "extensions/fake_safe_browsing_database_manager.cc", "extensions/fake_safe_browsing_database_manager.h", ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 26ef45d..2de52ed8 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3574,6 +3574,9 @@ {"toolbar-iph-android", flag_descriptions::kToolbarIphAndroidName, flag_descriptions::kToolbarIphAndroidDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kToolbarIphAndroid)}, + {"theme-refactor-android", flag_descriptions::kThemeRefactorAndroidName, + flag_descriptions::kThemeRefactorAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kThemeRefactorAndroid)}, #endif // OS_ANDROID {"disallow-doc-written-script-loads", flag_descriptions::kDisallowDocWrittenScriptsUiName, @@ -4471,6 +4474,11 @@ flag_descriptions::kTabGroupsFeedbackDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kTabGroupsFeedback)}, + {"tab-groups-new-badge-promo", + flag_descriptions::kTabGroupsNewBadgePromoName, + flag_descriptions::kTabGroupsNewBadgePromoDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTabGroupsNewBadgePromo)}, + {"new-tabstrip-animation", flag_descriptions::kNewTabstripAnimationName, flag_descriptions::kNewTabstripAnimationDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kNewTabstripAnimation)}, @@ -6419,13 +6427,6 @@ flag_descriptions::kAppCacheDescription, kOsAll, FEATURE_VALUE_TYPE(blink::features::kAppCache)}, - {"autofill-enable-sticky-payments-bubble", - flag_descriptions::kAutofillEnableStickyPaymentsBubbleName, - flag_descriptions::kAutofillEnableStickyPaymentsBubbleDescription, - kOsDesktop, - FEATURE_VALUE_TYPE( - autofill::features::kAutofillEnableStickyPaymentsBubble)}, - {"align-font-display-auto-lcp", flag_descriptions::kAlignFontDisplayAutoTimeoutWithLCPGoalName, flag_descriptions::kAlignFontDisplayAutoTimeoutWithLCPGoalDescription,
diff --git a/chrome/browser/banners/android/BUILD.gn b/chrome/browser/banners/android/BUILD.gn index 64631a5..6fac902 100644 --- a/chrome/browser/banners/android/BUILD.gn +++ b/chrome/browser/banners/android/BUILD.gn
@@ -9,7 +9,6 @@ "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpController.java", "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerFactory.java", "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java", - "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java", "java/src/org/chromium/chrome/browser/banners/AppData.java", "java/src/org/chromium/chrome/browser/banners/AppDetailsDelegate.java", ] @@ -42,10 +41,7 @@ } generate_jni("jni_headers") { - sources = [ - "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java", - "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java", - ] + sources = [ "java/src/org/chromium/chrome/browser/banners/AppBannerInProductHelpControllerProvider.java" ] } android_library("javatests") {
diff --git a/chrome/browser/banners/android/chrome_app_banner_manager_android.h b/chrome/browser/banners/android/chrome_app_banner_manager_android.h index 2cf008fb..ba377a2d 100644 --- a/chrome/browser/banners/android/chrome_app_banner_manager_android.h +++ b/chrome/browser/banners/android/chrome_app_banner_manager_android.h
@@ -7,7 +7,7 @@ #include <vector> -#include "chrome/browser/banners/app_banner_manager_android.h" +#include "components/webapps/browser/android/app_banner_manager_android.h" #include "content/public/browser/web_contents_user_data.h" #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java index 1383e47a..2ef5348 100644 --- a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java +++ b/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java
@@ -92,6 +92,7 @@ import org.chromium.components.signin.AccountManagerFacadeProvider; import org.chromium.components.signin.test.util.FakeAccountManagerFacade; import org.chromium.components.site_engagement.SiteEngagementService; +import org.chromium.components.webapps.AppBannerManager; import org.chromium.components.webapps.AppData; import org.chromium.components.webapps.AppDetailsDelegate; import org.chromium.components.webapps.installable.InstallableAmbientBadgeInfoBar;
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index d407c450d2..c3fdb404 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -230,12 +230,6 @@ <include name="IDR_SYNC_CONFIRMATION_IMAGES_SYNC_CONFIRMATION_ILLUSTRATION_DARK_SVG" file="resources\signin\sync_confirmation\images\sync_confirmation_illustration_dark.svg" type="BINDATA" /> <include name="IDR_SYNC_CONFIRMATION_IMAGES_SYNC_CONFIRMATION_REFRESHED_ILLUSTRATION_SVG" file="resources\signin\sync_confirmation\images\sync_confirmation_refreshed_illustration.svg" type="BINDATA" /> <include name="IDR_SYNC_CONFIRMATION_IMAGES_SYNC_CONFIRMATION_REFRESHED_ILLUSTRATION_DARK_SVG" file="resources\signin\sync_confirmation\images\sync_confirmation_refreshed_illustration_dark.svg" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_HTML" file="resources\signin\work_profile_confirmation\work_profile_confirmation.html" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_JS" file="resources\signin\work_profile_confirmation\work_profile_confirmation.js" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_BROWSER_PROXY_JS" file="resources\signin\work_profile_confirmation\work_profile_confirmation_browser_proxy.js" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_APP_JS" file="${root_gen_dir}\chrome\browser\resources\signin\work_profile_confirmation\work_profile_confirmation_app.js" use_base_dir="false" preprocess="true" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_IMAGES_WORK_PROFILE_CONFIRMATION_ILLUSTRATION_SVG" file="resources\signin\work_profile_confirmation\images\work_profile_confirmation_illustration.svg" type="BINDATA" /> - <include name="IDR_WORK_PROFILE_CONFIRMATION_IMAGES_WORK_PROFILE_CONFIRMATION_ILLUSTRATION_DARK_SVG" file="resources\signin\work_profile_confirmation\images\work_profile_confirmation_illustration_dark.svg" type="BINDATA" /> </if> <if expr="is_win or is_macosx or desktop_linux"> <include name="IDR_SIGNIN_DICE_WEB_INTERCEPT_HTML" file="resources\signin\dice_web_signin_intercept\dice_web_signin_intercept.html" type="BINDATA" />
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 5fffd99..50d096f 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -655,7 +655,7 @@ #endif #if BUILDFLAG(FULL_SAFE_BROWSING) -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #endif #if BUILDFLAG(ENABLE_VR)
diff --git a/chrome/browser/chrome_service_worker_browsertest.cc b/chrome/browser/chrome_service_worker_browsertest.cc index d4fb12d..7e58230b 100644 --- a/chrome/browser/chrome_service_worker_browsertest.cc +++ b/chrome/browser/chrome_service_worker_browsertest.cc
@@ -138,7 +138,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); GetServiceWorkerContext()->RegisterServiceWorker( embedded_test_server()->GetURL("/service_worker.js"), options, - base::BindOnce(&ExpectResultAndRun<bool>, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectResultAndRun<blink::ServiceWorkerStatusCode>, + blink::ServiceWorkerStatusCode::kOk, + run_loop.QuitClosure())); run_loop.Run(); // Leave the Service Worker registered, and make sure that the browser can @@ -164,7 +166,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); GetServiceWorkerContext()->RegisterServiceWorker( embedded_test_server()->GetURL("/service_worker.js"), options, - base::BindOnce(&ExpectResultAndRun<bool>, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectResultAndRun<blink::ServiceWorkerStatusCode>, + blink::ServiceWorkerStatusCode::kOk, + run_loop.QuitClosure())); run_loop.Run(); ui_test_utils::NavigateToURL(incognito, @@ -190,7 +194,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); GetServiceWorkerContext()->RegisterServiceWorker( embedded_test_server()->GetURL("/service_worker.js"), options, - base::BindOnce(&ExpectResultAndRun<bool>, false, run_loop.QuitClosure())); + base::BindOnce(&ExpectResultAndRun<blink::ServiceWorkerStatusCode>, + blink::ServiceWorkerStatusCode::kErrorDisallowed, + run_loop.QuitClosure())); run_loop.Run(); } @@ -674,7 +680,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); GetServiceWorkerContext()->RegisterServiceWorker( embedded_test_server()->GetURL("/sw.js"), options, - base::BindOnce(&ExpectResultAndRun<bool>, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectResultAndRun<blink::ServiceWorkerStatusCode>, + blink::ServiceWorkerStatusCode::kOk, + run_loop.QuitClosure())); run_loop.Run(); RunNavigationHintTest("/scope/", content::StartServiceWorkerForNavigationHintResult:: @@ -757,14 +765,16 @@ // Try to register the service worker. base::RunLoop run_loop; - bool result = true; + blink::ServiceWorkerStatusCode result = blink::ServiceWorkerStatusCode::kOk; blink::mojom::ServiceWorkerRegistrationOptions options( kScope, blink::mojom::ScriptType::kClassic, blink::mojom::ServiceWorkerUpdateViaCache::kImports); GetServiceWorkerContext()->RegisterServiceWorker( kScript, options, base::BindOnce( - [](base::OnceClosure quit_closure, bool* out_result, bool result) { + [](base::OnceClosure quit_closure, + blink::ServiceWorkerStatusCode* out_result, + blink::ServiceWorkerStatusCode result) { *out_result = result; std::move(quit_closure).Run(); }, @@ -786,7 +796,7 @@ // It's difficult to change all these, so the test author hasn't actually // changed Chrome in a way that makes this test fail, to prove that the test // would be effective at catching a regression. - EXPECT_FALSE(result); + EXPECT_EQ(result, blink::ServiceWorkerStatusCode::kErrorInvalidArguments); } enum class ServicifiedFeatures { kNone, kServiceWorker, kNetwork };
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 90dc00cf..dfea457 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -1010,13 +1010,6 @@ // Start watching for low disk space events to notify the user if it is not // a guest profile. low_disk_notification_ = std::make_unique<LowDiskNotification>(); - - // External PCI devices are only allowed in non-guest, primary users. - if (ProfileHelper::IsPrimaryProfile(profile())) { - PciguardClient::Get()->SendExternalPciDevicesPermissionState( - !base::FeatureList::IsEnabled( - features::kDisablePeripheralDataAccessProtection)); - } } gnubby_notification_ = std::make_unique<GnubbyNotification>(); @@ -1108,6 +1101,14 @@ base::BindOnce(&CrosUsbDetector::ConnectToDeviceManager, base::Unretained(cros_usb_detector_.get()))); + // External PCI devices are only allowed in non-guest, primary users. + if (!user_manager::UserManager::Get()->IsLoggedInAsGuest() && + ProfileHelper::IsPrimaryProfile(profile())) { + PciguardClient::Get()->SendExternalPciDevicesPermissionState( + base::FeatureList::IsEnabled( + features::kDisablePeripheralDataAccessProtection)); + } + crostini_unsupported_action_notifier_ = std::make_unique<crostini::CrostiniUnsupportedActionNotifier>();
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc index 713196c..fdc53b2 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.cc
@@ -35,6 +35,8 @@ #include "ui/views/background.h" #include "ui/views/controls/webview/webview.h" #include "ui/views/layout/grid_layout.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" @@ -56,11 +58,14 @@ class ToolbarRowView : public views::View { public: + METADATA_HEADER(ToolbarRowView); ToolbarRowView() { SetBackground(views::CreateSolidBackground(kDialogColor)); } - ~ToolbarRowView() override {} + ToolbarRowView(const ToolbarRowView&) = delete; + ToolbarRowView& operator=(const ToolbarRowView&) = delete; + ~ToolbarRowView() override = default; void Init(std::unique_ptr<views::View> back, std::unique_ptr<views::View> forward, @@ -96,11 +101,11 @@ layout->AddView(std::move(reload)); layout->AddView(std::move(location_bar)); } - - private: - DISALLOW_COPY_AND_ASSIGN(ToolbarRowView); }; +BEGIN_METADATA(ToolbarRowView, views::View) +END_METADATA + } // namespace namespace chromeos { @@ -108,8 +113,10 @@ // Stub implementation of ContentSettingBubbleModelDelegate. class StubBubbleModelDelegate : public ContentSettingBubbleModelDelegate { public: - StubBubbleModelDelegate() {} - ~StubBubbleModelDelegate() override {} + StubBubbleModelDelegate() = default; + StubBubbleModelDelegate(const StubBubbleModelDelegate&) = delete; + StubBubbleModelDelegate& operator=(const StubBubbleModelDelegate&) = delete; + ~StubBubbleModelDelegate() override = default; private: // ContentSettingBubbleModelDelegate implementation: @@ -118,8 +125,6 @@ void ShowContentSettingsPage(ContentSettingsType type) override {} void ShowMediaSettingsPage() override {} void ShowLearnMorePage(ContentSettingsType type) override {} - - DISALLOW_COPY_AND_ASSIGN(StubBubbleModelDelegate); }; // SimpleWebViewDialog class --------------------------------------------------- @@ -370,4 +375,7 @@ } } +BEGIN_METADATA(SimpleWebViewDialog, views::View) +END_METADATA + } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h index f65e739c..86067e248 100644 --- a/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h +++ b/chrome/browser/chromeos/login/ui/simple_web_view_dialog.h
@@ -15,6 +15,7 @@ #include "content/public/browser/page_navigator.h" #include "content/public/browser/web_contents_delegate.h" #include "ui/views/controls/button/image_button.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "url/gurl.h" class CommandUpdaterImpl; @@ -44,7 +45,10 @@ public content::PageNavigator, public content::WebContentsDelegate { public: + METADATA_HEADER(SimpleWebViewDialog); explicit SimpleWebViewDialog(Profile* profile); + SimpleWebViewDialog(const SimpleWebViewDialog&) = delete; + SimpleWebViewDialog& operator=(const SimpleWebViewDialog&) = delete; ~SimpleWebViewDialog() override; // Starts loading. @@ -100,8 +104,6 @@ std::unique_ptr<views::WebView> web_view_container_; std::unique_ptr<StubBubbleModelDelegate> bubble_model_delegate_; - - DISALLOW_COPY_AND_ASSIGN(SimpleWebViewDialog); }; } // namespace chromeos
diff --git a/chrome/browser/chromeos/policy/dlp/DEPS b/chrome/browser/chromeos/policy/dlp/DEPS new file mode 100644 index 0000000..5f1a9727 --- /dev/null +++ b/chrome/browser/chromeos/policy/dlp/DEPS
@@ -0,0 +1,5 @@ +specific_include_rules = { + "data_transfer_dlp_controller_browsertest\.cc": [ + "+ash/shell.h", + ], +}
diff --git a/chrome/browser/chromeos/policy/dlp/DIR_METADATA b/chrome/browser/chromeos/policy/dlp/DIR_METADATA index f37723a..eb9d838 100644 --- a/chrome/browser/chromeos/policy/dlp/DIR_METADATA +++ b/chrome/browser/chromeos/policy/dlp/DIR_METADATA
@@ -1,3 +1,3 @@ monorail: { - component: "Enterprise" + component: "OS>Software>Enterprise>DLP" }
diff --git a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc index eaf5d61..bcd80c7 100644 --- a/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc +++ b/chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller_browsertest.cc
@@ -3,33 +3,124 @@ // // found in the LICENSE file. #include <memory> +#include <string> +#include "ash/shell.h" #include "base/json/json_writer.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/crostini/fake_crostini_features.h" #include "chrome/browser/chromeos/policy/dlp/data_transfer_dlp_controller.h" #include "chrome/browser/chromeos/policy/dlp/dlp_policy_constants.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h" +#include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h" #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_test_utils.h" #include "chrome/browser/chromeos/policy/login_policy_test_base.h" #include "chrome/browser/chromeos/policy/user_policy_test_helper.h" #include "chrome/browser/profiles/profile_manager.h" +#include "components/policy/core/common/policy_pref_names.h" #include "components/policy/policy_constants.h" +#include "components/prefs/scoped_user_pref_update.h" #include "content/public/test/browser_test.h" +#include "testing/gmock/include/gmock/gmock-matchers.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/clipboard/clipboard.h" #include "ui/base/clipboard/clipboard_buffer.h" #include "ui/base/clipboard/scoped_clipboard_writer.h" #include "ui/base/data_transfer_policy/data_transfer_endpoint.h" +#include "ui/events/keycodes/keyboard_codes_posix.h" +#include "ui/events/test/event_generator.h" +#include "ui/views/controls/textfield/textfield.h" +#include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_observer.h" #include "url/origin.h" namespace policy { namespace { -constexpr char kClipboardText[] = "Hello World"; +constexpr char kClipboardText1[] = "Hello World"; +constexpr char kClipboardText2[] = "abcdef"; + +constexpr char kMailUrl[] = "https://mail.google.com"; +constexpr char kDocsUrl[] = "https://docs.google.com"; +constexpr char kExampleUrl[] = "https://example.com"; + +class FakeNotificationHelper : public DlpClipboardNotificationHelper { + public: + views::Widget* GetWidget() { return GetWidgetForTesting(); } + + void ProceedOnWarn(const ui::DataTransferEndpoint& data_dst) { + DlpClipboardNotificationHelper::ProceedOnWarn(GetWidget(), data_dst); + } +}; + +class FakeDlpController : public DataTransferDlpController, + public views::WidgetObserver { + public: + FakeDlpController(FakeNotificationHelper* helper) + : DataTransferDlpController( + *DlpRulesManagerFactory::GetForPrimaryProfile()), + helper_(helper) { + DCHECK(helper); + } + + ~FakeDlpController() { + if (widget_ && widget_->HasObserver(this)) { + widget_->RemoveObserver(this); + } + } + + void NotifyBlockedPaste( + const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst) override { + helper_->NotifyBlockedPaste(data_src, data_dst); + } + + void WarnOnPaste(const ui::DataTransferEndpoint* const data_src, + const ui::DataTransferEndpoint* const data_dst) override { + helper_->WarnOnPaste(data_src, data_dst); + } + + bool ShouldProceedOnWarn( + const ui::DataTransferEndpoint* const data_dst) override { + return helper_->DidUserProceedOnWarn(data_dst); + } + + bool ObserveWidget() { + widget_ = helper_->GetWidget(); + if (widget_ && !widget_->HasObserver(this)) { + widget_->AddObserver(this); + return true; + } + return false; + } + + MOCK_METHOD1(OnWidgetClosing, void(views::Widget* widget)); + views::Widget* widget_; + FakeNotificationHelper* helper_; +}; + +void SetClipboardText(base::string16 text, + std::unique_ptr<ui::DataTransferEndpoint> source) { + ui::ScopedClipboardWriter writer(ui::ClipboardBuffer::kCopyPaste, + source ? std::move(source) : nullptr); + writer.WriteText(text); +} + +// On Widget Closing, a task for NativeWidgetAura::CloseNow() gets posted. This +// task runs after the widget is destroyed which leads to a crash, that's why +// we need to flush the message loop. +void FlushMessageLoop() { + base::RunLoop run_loop; + base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, + run_loop.QuitClosure()); + run_loop.Run(); +} } // namespace @@ -64,36 +155,64 @@ "testuser", "/home/testuser", "PLACEHOLDER_IP")); } + + void SetupTextfield() { + // Create a widget containing a single, focusable textfield. + widget_ = std::make_unique<views::Widget>(); + + views::Widget::InitParams params; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS; + widget_->Init(std::move(params)); + textfield_ = widget_->SetContentsView(std::make_unique<views::Textfield>()); + textfield_->SetAccessibleName(base::UTF8ToUTF16("Textfield")); + textfield_->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); + + // Show the widget. + widget_->SetBounds(gfx::Rect(0, 0, 100, 100)); + widget_->Show(); + ASSERT_TRUE(widget_->IsActive()); + + // Focus the textfield and confirm initial state. + textfield_->RequestFocus(); + ASSERT_TRUE(textfield_->HasFocus()); + ASSERT_TRUE(textfield_->GetText().empty()); + + event_generator_ = std::make_unique<ui::test::EventGenerator>( + ash::Shell::GetPrimaryRootWindow()); + } + + std::unique_ptr<ui::test::EventGenerator> event_generator_; + std::unique_ptr<views::Widget> widget_; + views::Textfield* textfield_ = nullptr; }; IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, EmptyPolicy) { SkipToLoginScreen(); LogIn(kAccountId, kAccountPassword, kEmptyServices); - { - ui::ScopedClipboardWriter writer(ui::ClipboardBuffer::kCopyPaste); - writer.WriteText(base::UTF8ToUTF16(kClipboardText)); - } + SetClipboardText(base::UTF8ToUTF16(kClipboardText1), nullptr); + ui::DataTransferEndpoint data_dst( url::Origin::Create(GURL("https://google.com"))); base::string16 result; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst, &result); - EXPECT_EQ(base::UTF8ToUTF16(kClipboardText), result); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result); } -IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, RestrictedUrl) { +IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, BlockDestination) { SkipToLoginScreen(); LogIn(kAccountId, kAccountPassword, kEmptyServices); - const std::string kUrl1 = "https://mail.google.com"; - const std::string kUrl2 = "https://docs.google.com"; - const std::string kUrl3 = "https://example.com"; + std::unique_ptr<FakeNotificationHelper> helper = + std::make_unique<FakeNotificationHelper>(); + FakeDlpController dlp_controller(helper.get()); base::Value rules(base::Value::Type::LIST); base::Value src_urls1(base::Value::Type::LIST); - src_urls1.Append(kUrl1); + src_urls1.Append(kMailUrl); base::Value dst_urls1(base::Value::Type::LIST); dst_urls1.Append("*"); base::Value restrictions1(base::Value::Type::LIST); @@ -105,9 +224,9 @@ std::move(restrictions1))); base::Value src_urls2(base::Value::Type::LIST); - src_urls2.Append(kUrl1); + src_urls2.Append(kMailUrl); base::Value dst_urls2(base::Value::Type::LIST); - dst_urls2.Append(kUrl2); + dst_urls2.Append(kDocsUrl); base::Value restrictions2(base::Value::Type::LIST); restrictions2.Append(dlp_test_util::CreateRestrictionWithLevel( dlp::kClipboardRestriction, dlp::kAllowLevel)); @@ -117,46 +236,48 @@ /*dst_components=*/base::Value(base::Value::Type::LIST), std::move(restrictions2))); - SetDlpRulesPolicy(rules); + SetDlpRulesPolicy(std::move(rules)); - { - ui::ScopedClipboardWriter writer(ui::ClipboardBuffer::kCopyPaste, - std::make_unique<ui::DataTransferEndpoint>( - url::Origin::Create(GURL(kUrl1)))); - writer.WriteText(base::UTF8ToUTF16(kClipboardText)); - } - ui::DataTransferEndpoint data_dst1(url::Origin::Create(GURL(kUrl1))); + SetClipboardText(base::UTF8ToUTF16(kClipboardText1), + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kMailUrl)))); + + ui::DataTransferEndpoint data_dst1(url::Origin::Create(GURL(kMailUrl))); base::string16 result1; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst1, &result1); - EXPECT_EQ(base::UTF8ToUTF16(kClipboardText), result1); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result1); - ui::DataTransferEndpoint data_dst2(url::Origin::Create(GURL(kUrl2))); + ui::DataTransferEndpoint data_dst2(url::Origin::Create(GURL(kDocsUrl))); base::string16 result2; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst2, &result2); - EXPECT_EQ(base::UTF8ToUTF16(kClipboardText), result2); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result2); - ui::DataTransferEndpoint data_dst3(url::Origin::Create(GURL(kUrl3))); + ui::DataTransferEndpoint data_dst3(url::Origin::Create(GURL(kExampleUrl))); base::string16 result3; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst3, &result3); EXPECT_EQ(base::string16(), result3); + ASSERT_TRUE(dlp_controller.ObserveWidget()); - { - ui::ScopedClipboardWriter writer(ui::ClipboardBuffer::kCopyPaste, - std::make_unique<ui::DataTransferEndpoint>( - url::Origin::Create(GURL(kUrl3)))); - writer.WriteText(base::UTF8ToUTF16(kClipboardText)); - } - ui::DataTransferEndpoint data_dst4(url::Origin::Create(GURL(kUrl1))); + EXPECT_CALL(dlp_controller, OnWidgetClosing); + + SetClipboardText(base::UTF8ToUTF16(kClipboardText1), + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kExampleUrl)))); + testing::Mock::VerifyAndClearExpectations(helper.get()); + + ui::DataTransferEndpoint data_dst4(url::Origin::Create(GURL(kMailUrl))); base::string16 result4; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst1, &result4); - EXPECT_EQ(base::UTF8ToUTF16(kClipboardText), result4); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result4); + + FlushMessageLoop(); } -IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, RestrictedComponent) { +IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, BlockComponent) { SkipToLoginScreen(); LogIn(kAccountId, kAccountPassword, kEmptyServices); @@ -185,13 +306,13 @@ ui::ScopedClipboardWriter writer(ui::ClipboardBuffer::kCopyPaste, std::make_unique<ui::DataTransferEndpoint>( url::Origin::Create(GURL(kUrl1)))); - writer.WriteText(base::UTF8ToUTF16(kClipboardText)); + writer.WriteText(base::UTF8ToUTF16(kClipboardText1)); } ui::DataTransferEndpoint data_dst1(ui::EndpointType::kDefault); base::string16 result1; ui::Clipboard::GetForCurrentThread()->ReadText( ui::ClipboardBuffer::kCopyPaste, &data_dst1, &result1); - EXPECT_EQ(base::UTF8ToUTF16(kClipboardText), result1); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result1); ui::DataTransferEndpoint data_dst2(ui::EndpointType::kArc); base::string16 result2; @@ -206,6 +327,150 @@ EXPECT_EQ(base::string16(), result3); } -// TODO(crbug.com/1139884): Add browsertests for the clipboard notifications. +IN_PROC_BROWSER_TEST_F(DataTransferDlpBrowserTest, WarnDestination) { + SkipToLoginScreen(); + LogIn(kAccountId, kAccountPassword, kEmptyServices); + + std::unique_ptr<FakeNotificationHelper> helper = + std::make_unique<FakeNotificationHelper>(); + FakeDlpController dlp_controller(helper.get()); + + { + ListPrefUpdate update(g_browser_process->local_state(), + policy_prefs::kDlpRulesList); + base::Value rule(base::Value::Type::DICTIONARY); + base::Value src_urls(base::Value::Type::DICTIONARY); + base::Value src_urls_list(base::Value::Type::LIST); + src_urls_list.Append(base::Value(kMailUrl)); + src_urls.SetKey("urls", std::move(src_urls_list)); + rule.SetKey("sources", std::move(src_urls)); + + base::Value dst_urls(base::Value::Type::DICTIONARY); + base::Value dst_urls_list(base::Value::Type::LIST); + dst_urls_list.Append(base::Value("*")); + dst_urls.SetKey("urls", std::move(dst_urls_list)); + rule.SetKey("destinations", std::move(dst_urls)); + + base::Value restrictions(base::Value::Type::DICTIONARY); + base::Value restrictions_list(base::Value::Type::LIST); + base::Value class_level_dict(base::Value::Type::DICTIONARY); + class_level_dict.SetKey("class", base::Value("CLIPBOARD")); + class_level_dict.SetKey("level", base::Value("WARN")); + restrictions_list.Append(std::move(class_level_dict)); + rule.SetKey("restrictions", std::move(restrictions_list)); + + update->Append(std::move(rule)); + } + + SetClipboardText(base::UTF8ToUTF16(kClipboardText1), + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kMailUrl)))); + + SetupTextfield(); + // Initiate a paste on textfield_. + event_generator_->PressKey(ui::VKEY_V, ui::EF_CONTROL_DOWN); + event_generator_->ReleaseKey(ui::VKEY_V, ui::EF_CONTROL_DOWN); + + EXPECT_EQ("", base::UTF16ToUTF8(textfield_->GetText())); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + // Accept warning. + EXPECT_CALL(dlp_controller, OnWidgetClosing); + ui::DataTransferEndpoint default_endpoint(ui::EndpointType::kDefault); + helper->ProceedOnWarn(default_endpoint); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + EXPECT_EQ(kClipboardText1, base::UTF16ToUTF8(textfield_->GetText())); + + // Initiate a paste on example url. + ui::DataTransferEndpoint url_endpoint1( + url::Origin::Create(GURL(kExampleUrl))); + base::string16 result; + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint1, &result); + EXPECT_EQ(base::string16(), result); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + // Accept warning. + EXPECT_CALL(dlp_controller, OnWidgetClosing); + helper->ProceedOnWarn(url_endpoint1); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + // Initiate a paste on example url. + result.clear(); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint1, &result); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result); + ASSERT_FALSE(dlp_controller.ObserveWidget()); + + // Initiate a paste on docs url. + ui::DataTransferEndpoint url_endpoint2(url::Origin::Create(GURL(kDocsUrl))); + result.clear(); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint2, &result); + EXPECT_EQ(base::string16(), result); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + // Accept warning. + EXPECT_CALL(dlp_controller, OnWidgetClosing); + helper->ProceedOnWarn(url_endpoint2); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + // Initiate a paste on docs url. + result.clear(); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint2, &result); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText1), result); + ASSERT_FALSE(dlp_controller.ObserveWidget()); + + SetClipboardText(base::UTF8ToUTF16(kClipboardText2), + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kMailUrl)))); + + // Initiate a paste on example url with notify_if_restricted set to false. + ui::DataTransferEndpoint url_endpoint3(url::Origin::Create(GURL(kExampleUrl)), + /*notify_if_restricted=*/false); + result.clear(); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint3, &result); + EXPECT_EQ(base::UTF8ToUTF16(kClipboardText2), result); + ASSERT_FALSE(dlp_controller.ObserveWidget()); + + // Initiate a paste on example url with notify_if_restricted set to true. + result.clear(); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, &url_endpoint1, &result); + EXPECT_EQ(base::string16(), result); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + // Initiate a paste on textfield_. + textfield_->SetText(base::string16()); + EXPECT_CALL(dlp_controller, OnWidgetClosing); + textfield_->RequestFocus(); + event_generator_->PressKey(ui::VKEY_V, ui::EF_CONTROL_DOWN); + event_generator_->ReleaseKey(ui::VKEY_V, ui::EF_CONTROL_DOWN); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + EXPECT_EQ("", base::UTF16ToUTF8(textfield_->GetText())); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + // Initiate a paste on nullptr data_dst. + result.clear(); + EXPECT_CALL(dlp_controller, OnWidgetClosing); + ui::Clipboard::GetForCurrentThread()->ReadText( + ui::ClipboardBuffer::kCopyPaste, nullptr, &result); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + EXPECT_EQ(base::string16(), result); + ASSERT_TRUE(dlp_controller.ObserveWidget()); + + EXPECT_CALL(dlp_controller, OnWidgetClosing); + SetClipboardText(base::UTF8ToUTF16(kClipboardText2), + std::make_unique<ui::DataTransferEndpoint>( + url::Origin::Create(GURL(kDocsUrl)))); + testing::Mock::VerifyAndClearExpectations(&dlp_controller); + + FlushMessageLoop(); +} } // namespace policy
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.cc b/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.cc index 384b74c..52e9ccda 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.cc +++ b/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.cc
@@ -40,6 +40,8 @@ #include "ui/views/controls/button/button.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/image_view.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "url/origin.h" @@ -99,6 +101,7 @@ class Button : public views::LabelButton { public: + METADATA_HEADER(Button); explicit Button(const base::string16& button_label) { SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER); @@ -116,22 +119,26 @@ kButtonHeight}); } - int GetLabelWidth() { return label()->bounds().width(); } + Button(const Button&) = delete; + Button& operator=(const Button&) = delete; + ~Button() override = default; - gfx::FontList GetFontList() { + int GetLabelWidth() const { return label()->bounds().width(); } + + static gfx::FontList GetFontList() { return gfx::FontList({kTextFontName}, gfx::Font::NORMAL, kTextFontSize, gfx::Font::Weight::MEDIUM); } - - Button(const Button&) = delete; - Button& operator=(const Button&) = delete; - - ~Button() override = default; }; +BEGIN_METADATA(Button, views::LabelButton) +ADD_READONLY_PROPERTY_METADATA(int, LabelWidth) +END_METADATA + // This inline bubble shown for disabled copy/paste. class ClipboardBubbleView : public views::View { public: + METADATA_HEADER(ClipboardBubbleView); explicit ClipboardBubbleView(const base::string16& text) { SetPaintToLayer(ui::LAYER_SOLID_COLOR); ash::ColorProvider* color_provider = ash::ColorProvider::Get(); @@ -189,7 +196,7 @@ ~ClipboardBubbleView() override = default; - virtual gfx::Size GetBubbleSize() = 0; + virtual gfx::Size GetBubbleSize() const = 0; protected: // This function should get called if the view got updated e.g. AddChildView. @@ -200,8 +207,13 @@ views::ImageView* border_ = nullptr; }; +BEGIN_METADATA(ClipboardBubbleView, views::View) +ADD_READONLY_PROPERTY_METADATA(gfx::Size, BubbleSize) +END_METADATA + class ClipboardBlockBubble : public ClipboardBubbleView { public: + METADATA_HEADER(ClipboardBlockBubble); explicit ClipboardBlockBubble(const base::string16& text) : ClipboardBubbleView(text) { // Add "Got it" button. @@ -219,7 +231,7 @@ ~ClipboardBlockBubble() override = default; - gfx::Size GetBubbleSize() override { + gfx::Size GetBubbleSize() const override { DCHECK(label_); DCHECK(button_); return {kBubbleWidth, 2 * kBubblePadding + label_->bounds().height() + @@ -235,8 +247,12 @@ Button* button_ = nullptr; }; +BEGIN_METADATA(ClipboardBlockBubble, ClipboardBubbleView) +END_METADATA + class ClipboardWarnBubble : public ClipboardBubbleView { public: + METADATA_HEADER(ClipboardWarnBubble); explicit ClipboardWarnBubble(const base::string16& text) : ClipboardBubbleView(text) { // Add paste button. @@ -265,7 +281,7 @@ ~ClipboardWarnBubble() override = default; - gfx::Size GetBubbleSize() override { + gfx::Size GetBubbleSize() const override { DCHECK(label_); DCHECK(cancel_button_); DCHECK(paste_button_); @@ -288,6 +304,9 @@ Button* paste_button_ = nullptr; }; +BEGIN_METADATA(ClipboardWarnBubble, ClipboardBubbleView) +END_METADATA + bool IsRectContainedByAnyDisplay(const gfx::Rect& rect) { const std::vector<display::Display>& displays = display::Screen::GetScreen()->GetAllDisplays(); @@ -400,8 +419,10 @@ DlpClipboardNotificationHelper::~DlpClipboardNotificationHelper() { ui::ClipboardMonitor::GetInstance()->RemoveObserver(this); - if (widget_) + if (widget_) { widget_->RemoveObserver(this); + CloseWidget(widget_.get(), views::Widget::ClosedReason::kUnspecified); + } } void DlpClipboardNotificationHelper::NotifyBlockedPaste( @@ -556,13 +577,12 @@ void DlpClipboardNotificationHelper::OnWidgetActivationChanged( views::Widget* widget, bool active) { - if (widget_.get() == widget && !active) + if (!active) CloseWidget(widget, views::Widget::ClosedReason::kLostFocus); } void DlpClipboardNotificationHelper::OnClipboardDataChanged() { - if (widget_) - widget_->Close(); + CloseWidget(widget_.get(), views::Widget::ClosedReason::kUnspecified); ResetUserWarnSelection(); } @@ -594,7 +614,7 @@ void DlpClipboardNotificationHelper::CloseWidget( views::Widget* widget, views::Widget::ClosedReason reason) { - if (widget == widget_.get()) + if (widget && widget == widget_.get()) widget->CloseWithReason(reason); }
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.h b/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.h index 97fafe5..afb191fe 100644 --- a/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.h +++ b/chrome/browser/chromeos/policy/dlp/dlp_clipboard_notification_helper.h
@@ -52,6 +52,8 @@ void ResetUserWarnSelection(); + views::Widget* GetWidgetForTesting() { return widget_.get(); } + private: virtual void ShowClipboardBlockBubble(const base::string16& text); virtual void ShowClipboardBlockToast(const std::string& id,
diff --git a/chrome/browser/enterprise/connectors/README.md b/chrome/browser/enterprise/connectors/README.md index efea92d..9b78ad6 100644 --- a/chrome/browser/enterprise/connectors/README.md +++ b/chrome/browser/enterprise/connectors/README.md
@@ -1,11 +1,10 @@ This directory contains code used by Chrome Enterprise Connectors. This includes: * Code to handle Connector policies. - * Code specific to uploaded content analysis. - * Common utilities used by Connector code. + * Utilities, classes and services used by multiple Connectors. + * Code specific to content analysis Connectors (in analysis/). + * Code shared with user downloads cloud scanning should be added to `//chrome/browser/safe_browsing/cloud_content_scanning/` instead. + * Code specific to user downloads cloud scanning should be added to `//chrome/browser/safe_browsing/download_protection/` instead. + * Code specific to reporting Connectors (in reporting/). + * Code specific to the file system Connectors (in file_system/). -Code shared with user downloads cloud scanning should be added to -`//chrome/browser/safe_browsing/cloud_content_scanning/` instead. - -Code specific to user downloads cloud scanning should be added to -`//chrome/browser/safe_browsing/download_protection/` instead.
diff --git a/chrome/browser/enterprise/connectors/analysis_service_settings.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc similarity index 98% rename from chrome/browser/enterprise/connectors/analysis_service_settings.cc rename to chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc index ea7b6c6..5bf0b1718 100644 --- a/chrome/browser/enterprise/connectors/analysis_service_settings.cc +++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.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 "chrome/browser/enterprise/connectors/analysis_service_settings.h" +#include "chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/enterprise/connectors/service_provider_config.h"
diff --git a/chrome/browser/enterprise/connectors/analysis_service_settings.h b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h similarity index 94% rename from chrome/browser/enterprise/connectors/analysis_service_settings.h rename to chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h index 99739ca..d6f711b 100644 --- a/chrome/browser/enterprise/connectors/analysis_service_settings.h +++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.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 CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_SERVICE_SETTINGS_H_ -#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_SERVICE_SETTINGS_H_ +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_ANALYSIS_SERVICE_SETTINGS_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_ANALYSIS_SERVICE_SETTINGS_H_ #include <memory> #include <string> @@ -104,4 +104,4 @@ } // namespace enterprise_connectors -#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_SERVICE_SETTINGS_H_ +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_ANALYSIS_SERVICE_SETTINGS_H_
diff --git a/chrome/browser/enterprise/connectors/analysis_service_settings_unittest.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc similarity index 98% rename from chrome/browser/enterprise/connectors/analysis_service_settings_unittest.cc rename to chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc index 6f4e09d..da4e7300e 100644 --- a/chrome/browser/enterprise/connectors/analysis_service_settings_unittest.cc +++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc
@@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/enterprise/connectors/analysis_service_settings.h" +#include "chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h" + #include "base/json/json_reader.h" #include "base/no_destructor.h" #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/enterprise/connectors/content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc similarity index 98% rename from chrome/browser/enterprise/connectors/content_analysis_delegate.cc rename to chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.cc index 5c392dd..3d45ba7 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.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 "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include <algorithm> #include <numeric> @@ -26,9 +26,9 @@ #include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" -#include "chrome/browser/enterprise/connectors/content_analysis_dialog.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h" #include "chrome/browser/file_util_service.h" #include "chrome/browser/policy/dm_token_utils.h"
diff --git a/chrome/browser/enterprise/connectors/content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h similarity index 98% rename from chrome/browser/enterprise/connectors/content_analysis_delegate.h rename to chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h index ecdd35f..1c677d8e 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.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 CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DELEGATE_H_ -#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DELEGATE_H_ +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DELEGATE_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DELEGATE_H_ #include <memory> #include <string> @@ -368,4 +368,4 @@ } // namespace enterprise_connectors -#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DELEGATE_H_ +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DELEGATE_H_
diff --git a/chrome/browser/enterprise/connectors/content_analysis_delegate_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc similarity index 99% rename from chrome/browser/enterprise/connectors/content_analysis_delegate_browsertest.cc rename to chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc index 73c2ece..cf3a4bcf 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_delegate_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc
@@ -11,10 +11,10 @@ #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" -#include "chrome/browser/enterprise/connectors/content_analysis_dialog.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h" #include "chrome/browser/policy/dm_token_utils.h"
diff --git a/chrome/browser/enterprise/connectors/content_analysis_delegate_unittest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc similarity index 99% rename from chrome/browser/enterprise/connectors/content_analysis_delegate_unittest.cc rename to chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc index 32210ea..6d013815 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_delegate_unittest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_delegate_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 "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include <map> #include <set> @@ -19,9 +19,10 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" +#include "build/build_config.h" +#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" -#include "chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h" #include "chrome/browser/policy/dm_token_utils.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h"
diff --git a/chrome/browser/enterprise/connectors/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc similarity index 99% rename from chrome/browser/enterprise/connectors/content_analysis_dialog.cc rename to chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc index eb04e6d..cd57862d 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_dialog.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.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 "chrome/browser/enterprise/connectors/content_analysis_dialog.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h" #include <memory>
diff --git a/chrome/browser/enterprise/connectors/content_analysis_dialog.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h similarity index 96% rename from chrome/browser/enterprise/connectors/content_analysis_dialog.h rename to chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h index 40d65f4..b13294c 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_dialog.h +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DIALOG_H_ -#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DIALOG_H_ +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DIALOG_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DIALOG_H_ #include <memory> #include "base/memory/weak_ptr.h" #include "base/time/time.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h" #include "content/public/browser/web_contents_observer.h" #include "ui/views/animation/bounds_animator.h" @@ -267,4 +267,4 @@ } // namespace enterprise_connectors -#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_CONTENT_ANALYSIS_DIALOG_H_ +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_CONTENT_ANALYSIS_DIALOG_H_
diff --git a/chrome/browser/enterprise/connectors/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc similarity index 99% rename from chrome/browser/enterprise/connectors/content_analysis_dialog_browsertest.cc rename to chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc index 49022bd..9d344fa 100644 --- a/chrome/browser/enterprise/connectors/content_analysis_dialog_browsertest.cc +++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -7,8 +7,8 @@ #include "base/test/metrics/histogram_tester.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/enterprise/connectors/content_analysis_dialog.h" -#include "chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h" +#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
diff --git a/chrome/browser/enterprise/connectors/fake_content_analysis_delegate.cc b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc similarity index 98% rename from chrome/browser/enterprise/connectors/fake_content_analysis_delegate.cc rename to chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.cc index 77cb813..45df0075 100644 --- a/chrome/browser/enterprise/connectors/fake_content_analysis_delegate.cc +++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.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 "chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h" #include <base/callback.h> #include <base/logging.h>
diff --git a/chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h similarity index 93% rename from chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h rename to chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h index 58f31b5..4c24fbb5 100644 --- a/chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h +++ b/chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_ -#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_ +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_ #include <memory> #include "base/callback_forward.h" #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h" #include "components/enterprise/common/proto/connectors.pb.h" @@ -118,4 +118,4 @@ } // namespace enterprise_connectors -#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_ +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_ANALYSIS_FAKE_CONTENT_ANALYSIS_DELEGATE_H_
diff --git a/chrome/browser/enterprise/connectors/connectors_manager.h b/chrome/browser/enterprise/connectors/connectors_manager.h index d319b90..27c60864 100644 --- a/chrome/browser/enterprise/connectors/connectors_manager.h +++ b/chrome/browser/enterprise/connectors/connectors_manager.h
@@ -7,10 +7,10 @@ #include "base/callback_forward.h" #include "base/optional.h" -#include "chrome/browser/enterprise/connectors/analysis_service_settings.h" +#include "chrome/browser/enterprise/connectors/analysis/analysis_service_settings.h" #include "chrome/browser/enterprise/connectors/common.h" #include "chrome/browser/enterprise/connectors/file_system/service_settings.h" -#include "chrome/browser/enterprise/connectors/reporting_service_settings.h" +#include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h" #include "chrome/browser/enterprise/connectors/service_provider_config.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/enterprise/connectors/reporting_service_settings.cc b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc similarity index 96% rename from chrome/browser/enterprise/connectors/reporting_service_settings.cc rename to chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc index a1b619c..84796b2 100644 --- a/chrome/browser/enterprise/connectors/reporting_service_settings.cc +++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.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 "chrome/browser/enterprise/connectors/reporting_service_settings.h" +#include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h" #include "chrome/browser/enterprise/connectors/service_provider_config.h" #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
diff --git a/chrome/browser/enterprise/connectors/reporting_service_settings.h b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h similarity index 85% rename from chrome/browser/enterprise/connectors/reporting_service_settings.h rename to chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h index 7b31ebe..5e62c2e 100644 --- a/chrome/browser/enterprise/connectors/reporting_service_settings.h +++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.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 CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_SERVICE_SETTINGS_H_ -#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_SERVICE_SETTINGS_H_ +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_REPORTING_SERVICE_SETTINGS_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_REPORTING_SERVICE_SETTINGS_H_ #include <set> #include <string> @@ -44,4 +44,4 @@ } // namespace enterprise_connectors -#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_SERVICE_SETTINGS_H_ +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_REPORTING_REPORTING_SERVICE_SETTINGS_H_
diff --git a/chrome/browser/enterprise/connectors/reporting_service_settings_unittest.cc b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings_unittest.cc similarity index 97% rename from chrome/browser/enterprise/connectors/reporting_service_settings_unittest.cc rename to chrome/browser/enterprise/connectors/reporting/reporting_service_settings_unittest.cc index 5a2a8c8c..2a1df32e 100644 --- a/chrome/browser/enterprise/connectors/reporting_service_settings_unittest.cc +++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings_unittest.cc
@@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/enterprise/connectors/reporting_service_settings.h" +#include "chrome/browser/enterprise/connectors/reporting/reporting_service_settings.h" + #include "base/json/json_reader.h" #include "base/no_destructor.h" #include "chrome/browser/enterprise/connectors/connectors_service.h"
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc index bc5528c..e1c06ca 100644 --- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -77,8 +77,8 @@ using password_manager::BulkLeakCheckDelegateInterface; using password_manager::BulkLeakCheckService; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; using password_manager::InsecureCredentialTypeFlags; +using password_manager::InsecureType; using password_manager::IsLeaked; using password_manager::IsMuted; using password_manager::LeakCheckCredential; @@ -141,7 +141,7 @@ base::StringPiece signon_realm, base::StringPiece username, base::TimeDelta time_since_creation = base::TimeDelta(), - CompromiseType compromise_type = CompromiseType::kLeaked) { + InsecureType compromise_type = InsecureType::kLeaked) { return CompromisedCredentials( std::string(signon_realm), base::ASCIIToUTF16(username), base::Time::Now() - time_since_creation, compromise_type, IsMuted(false)); @@ -373,16 +373,16 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername2, base::TimeDelta::FromMinutes(2), - CompromiseType::kPhished)); + InsecureType::kPhished)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(3), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername1, base::TimeDelta::FromMinutes(4), - CompromiseType::kPhished)); + InsecureType::kPhished)); RunUntilIdle(); EXPECT_THAT( @@ -421,16 +421,16 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromSeconds(59), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername2, base::TimeDelta::FromSeconds(60), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername1, base::TimeDelta::FromDays(100), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername2, base::TimeDelta::FromDays(800), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); EXPECT_THAT( @@ -471,22 +471,22 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername2, base::TimeDelta::FromMinutes(2), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername1, base::TimeDelta::FromMinutes(3), - CompromiseType::kPhished)); + InsecureType::kPhished)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(4), - CompromiseType::kPhished)); + InsecureType::kPhished)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(5), - CompromiseType::kPhished)); + InsecureType::kPhished)); store().AddCompromisedCredentials( MakeCompromised(kExampleOrg, kUsername2, base::TimeDelta::FromMinutes(6), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); EXPECT_THAT( @@ -522,13 +522,13 @@ store().AddLogin(MakeSavedAndroidPassword(kExampleApp, kUsername1)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(5), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); store().AddCompromisedCredentials( MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername2, - base::TimeDelta::FromDays(3), CompromiseType::kPhished)); + base::TimeDelta::FromDays(3), InsecureType::kPhished)); store().AddCompromisedCredentials( MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername1, - base::TimeDelta::FromDays(4), CompromiseType::kPhished)); + base::TimeDelta::FromDays(4), InsecureType::kPhished)); RunUntilIdle(); // Verify that the compromised credentials match what is stored in the @@ -817,7 +817,7 @@ EXPECT_THAT(store().compromised_credentials(), ElementsAre(CompromisedCredentials( kExampleCom, base::ASCIIToUTF16(kUsername1), - base::Time::Now(), CompromiseType::kLeaked, IsMuted(false)))); + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)))); } // Test that a found leak creates a compromised credential in the password @@ -848,17 +848,17 @@ store().compromised_credentials(), UnorderedElementsAre( CompromisedCredentials(kExampleCom, base::ASCIIToUTF16(kUsername1), - base::Time::Now(), CompromiseType::kLeaked, + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)), CompromisedCredentials(kExampleOrg, base::ASCIIToUTF16(kUsername1), - base::Time::Now(), CompromiseType::kLeaked, + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)), CompromisedCredentials( kExampleCom, base::ASCIIToUTF16(kUsername2Upper), - base::Time::Now(), CompromiseType::kLeaked, IsMuted(false)), + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)), CompromisedCredentials( kExampleOrg, base::ASCIIToUTF16(kUsername2Email), - base::Time::Now(), CompromiseType::kLeaked, IsMuted(false)))); + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)))); } // Verifies that the case where the user has no saved passwords is reported @@ -1128,7 +1128,7 @@ store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1)); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); GURL change_password_url( @@ -1142,13 +1142,13 @@ MakeSavedAndroidPassword(kExampleApp, kUsername1, "", kExampleCom)); store().AddCompromisedCredentials( MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername1, - base::TimeDelta::FromDays(3), CompromiseType::kPhished)); + base::TimeDelta::FromDays(3), InsecureType::kPhished)); store().AddLogin(MakeSavedAndroidPassword(kExampleApp, kUsername2, "Example App", kExampleCom)); store().AddCompromisedCredentials( MakeCompromised(MakeAndroidRealm(kExampleApp), kUsername2, - base::TimeDelta::FromDays(3), CompromiseType::kPhished)); + base::TimeDelta::FromDays(3), InsecureType::kPhished)); RunUntilIdle(); EXPECT_EQ(delegate().GetCompromisedCredentials().at(0).change_password_url,
diff --git a/chrome/browser/file_select_helper.h b/chrome/browser/file_select_helper.h index 508461c..dfc6678 100644 --- a/chrome/browser/file_select_helper.h +++ b/chrome/browser/file_select_helper.h
@@ -24,7 +24,7 @@ #include "ui/shell_dialogs/select_file_dialog.h" #if BUILDFLAG(FULL_SAFE_BROWSING) -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #endif class Profile;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 7dcedcd..0f6dd8f6 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -210,7 +210,7 @@ { "name": "ash-limit-shelf-items-to-active-desk", "owners": [ "afakhry", "tclaiborne" ], - "expiry_milestone": 88 + "expiry_milestone": 98 }, { "name": "ash-swap-side-volume-buttons-for-orientation", @@ -293,11 +293,6 @@ "expiry_milestone": 90 }, { - "name": "autofill-enable-sticky-payments-bubble", - "owners": [ "siyua" ], - "expiry_milestone": 90 - }, - { "name": "autofill-enable-toolbar-status-chip", "owners": [ "siyua" ], "expiry_milestone": 96 @@ -3939,12 +3934,12 @@ { "name": "passwords-account-storage", "owners": [ "mamir", "treib" ], - "expiry_milestone": 89 + "expiry_milestone": 95 }, { "name": "passwords-account-storage-iph", "owners": [ "mamir", "treib" ], - "expiry_milestone": 89 + "expiry_milestone": 95 }, { "name": "passwords-weakness-check", @@ -4675,6 +4670,11 @@ "expiry_milestone": 92 }, { + "name": "start-surface", + "owners": [ "gogerald", "bling-flags@google.com" ], + "expiry_milestone": 94 + }, + { "name": "stop-in-background", "owners": [ "chrome-catan@google.com" ], "expiry_milestone": 76 @@ -4750,6 +4750,11 @@ "expiry_milestone": 86 }, { + "name": "tab-groups-new-badge-promo", + "owners": [ "chrome-desktop-ui-sea@google.com", "dfried" ], + "expiry_milestone": 90 + }, + { "name": "tab-hover-card-images", "owners": [ "dfried", "corising", "//chrome/browser/ui/views/tabs/OWNERS" ], "expiry_milestone": 90 @@ -4795,6 +4800,11 @@ "expiry_milestone": 90 }, { + "name": "theme-refactor-android", + "owners": [ "sinansahin@google.com", "twellington", "clank-app-team@google.com" ], + "expiry_milestone": 100 + }, + { "name": "tint-composited-content", "owners": [ "chromeos-gfx@google.com" ], // This flag is used for QA & development on ChromeOS, which has no way to
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 65306a5..62d3248 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -230,12 +230,6 @@ "When enabled, offer data will be retrieved during downstream and shown in " "the dropdown list."; -const char kAutofillEnableStickyPaymentsBubbleName[] = - "Enable Autofill payments sticky bubbles"; -const char kAutofillEnableStickyPaymentsBubbleDescription[] = - "When enabled, all Autofill payments bubbles will not be dismissed upon " - "navigation."; - const char kAutofillEnableToolbarStatusChipName[] = "Move Autofill omnibox icons next to the profile avatar icon"; const char kAutofillEnableToolbarStatusChipDescription[] = @@ -974,7 +968,9 @@ "Turn off peripheral data access protection"; const char kDisablePeripheralDataAccessProtectionDescription[] = "Disables data access protection for external PCI devices (including some " - "thunderbolt and SD Express devices that use PCI tunneling)"; + "thunderbolt and SD Express devices that use PCI tunneling). By default " + "this feature is disabled, which blocks data access from external PCI " + "devices."; const char kEnableLoginDetectionName[] = "Enable login detection"; const char kEnableLoginDetectionDescription[] = @@ -2063,12 +2059,11 @@ "capture mode UI bar. Try out new screen recording functionality."; const char kScrollableTabStripFlagId[] = "scrollable-tabstrip"; -const char kScrollableTabStripName[] = "Scrollable TabStrip"; +const char kScrollableTabStripName[] = "Tab Scrolling"; const char kScrollableTabStripDescription[] = - "Allows users to access tabs by scrolling when they no longer fit in the " - "tabstrip."; + "Enables tab strip to scroll left and right when full."; -const char kScrollableTabStripButtonsName[] = "Scrollable TabStrip Buttons"; +const char kScrollableTabStripButtonsName[] = "Tab Scrolling Buttons"; const char kScrollableTabStripButtonsDescription[] = "When the scrollable-tabstrip flag is enabled, this enables buttons to " "permanently appear on the tabstrip."; @@ -2317,6 +2312,11 @@ "Enables the feedback app to appear in the tab group editor bubble, if tab " "groups are enabled."; +const char kTabGroupsNewBadgePromoName[] = "Tab Groups 'New' Badge Promo"; +const char kTabGroupsNewBadgePromoDescription[] = + "Causes a 'New' badge to appear on the entry point for creating a tab " + "group in the tab context menu."; + const char kTabHoverCardsName[] = "Tab Hover Cards"; const char kTabHoverCardsDescription[] = "Enables a popup containing tab information to be visible when hovering " @@ -3226,6 +3226,10 @@ "#site-isolation-trial-opt-out for how to disable site isolation for " "testing."; +extern const char kThemeRefactorAndroidName[] = "Theme refactor on Android"; +extern const char kThemeRefactorAndroidDescription[] = + "Enables the theme refactoring on Android."; + const char kToolbarIphAndroidName[] = "Enable Toolbar IPH on Android"; const char kToolbarIphAndroidDescription[] = "Enables in product help bubbles on the toolbar. In particular, the home "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 099d115b..7f4dc8a 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -150,9 +150,6 @@ extern const char kAutofillEnableOffersInDownstreamName[]; extern const char kAutofillEnableOffersInDownstreamDescription[]; -extern const char kAutofillEnableStickyPaymentsBubbleName[]; -extern const char kAutofillEnableStickyPaymentsBubbleDescription[]; - extern const char kAutofillEnableToolbarStatusChipName[]; extern const char kAutofillEnableToolbarStatusChipDescription[]; @@ -1348,6 +1345,9 @@ extern const char kTabGroupsFeedbackName[]; extern const char kTabGroupsFeedbackDescription[]; +extern const char kTabGroupsNewBadgePromoName[]; +extern const char kTabGroupsNewBadgePromoDescription[]; + extern const char kTabHoverCardsName[]; extern const char kTabHoverCardsDescription[]; @@ -1860,6 +1860,9 @@ extern const char kActionableContentSettingsName[]; extern const char kActionableContentSettingsDescription[]; +extern const char kThemeRefactorAndroidName[]; +extern const char kThemeRefactorAndroidDescription[]; + extern const char kToolbarIphAndroidName[]; extern const char kToolbarIphAndroidDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 9414c37..26d82bbf 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -227,6 +227,7 @@ &kTabbedAppOverflowMenuThreeButtonActionbar, &kTestDefaultDisabled, &kTestDefaultEnabled, + &kThemeRefactorAndroid, &kToolbarIphAndroid, &kToolbarIphAndroidCohort1, &kToolbarIphAndroidCohort2, @@ -644,6 +645,9 @@ const base::Feature kTestDefaultEnabled{"TestDefaultEnabled", base::FEATURE_ENABLED_BY_DEFAULT}; +const base::Feature kThemeRefactorAndroid{"ThemeRefactorAndroid", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kToolbarIphAndroid{"ToolbarIphAndroid", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kToolbarIphAndroidCohort1{
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 5d6898c..a8aa4d2 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -124,6 +124,7 @@ extern const base::Feature kTabbedAppOverflowMenuThreeButtonActionbar; extern const base::Feature kTestDefaultDisabled; extern const base::Feature kTestDefaultEnabled; +extern const base::Feature kThemeRefactorAndroid; extern const base::Feature kToolbarIphAndroid; extern const base::Feature kToolbarIphAndroidCohort1; extern const base::Feature kToolbarIphAndroidCohort2;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 3913d4c..72a8fdf 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -448,6 +448,7 @@ "TabbedAppOverflowMenuThreeButtonActionbar"; public static final String TEST_DEFAULT_DISABLED = "TestDefaultDisabled"; public static final String TEST_DEFAULT_ENABLED = "TestDefaultEnabled"; + public static final String THEME_REFACTOR_ANDROID = "ThemeRefactorAndroid"; public static final String TOOLBAR_IPH_ANDROID = "ToolbarIphAndroid"; public static final String TRANSLATE_ASSIST_CONTENT = "TranslateAssistContent"; public static final String TRANSLATE_INTENT = "TranslateIntent";
diff --git a/chrome/browser/metrics/power/battery_level_provider.cc b/chrome/browser/metrics/power/battery_level_provider.cc new file mode 100644 index 0000000..fe23848 --- /dev/null +++ b/chrome/browser/metrics/power/battery_level_provider.cc
@@ -0,0 +1,80 @@ +// Copyright 2021 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/metrics/power/battery_level_provider.h" + +BatteryLevelProvider::BatteryState::BatteryState( + size_t interface_count, + size_t battery_count, + base::Optional<double> charge_level, + bool on_battery, + base::TimeTicks capture_time) + : interface_count(interface_count), + battery_count(battery_count), + charge_level(charge_level), + on_battery(on_battery), + capture_time(capture_time) {} + +BatteryLevelProvider::BatteryState::BatteryState(const BatteryState&) = default; + +BatteryLevelProvider::BatteryInterface::BatteryInterface( + bool battery_present_in) + : battery_present(battery_present_in) {} + +BatteryLevelProvider::BatteryInterface::BatteryInterface( + const BatteryDetails& details_in) + : battery_present(true), details(details_in) {} + +BatteryLevelProvider::BatteryInterface::BatteryInterface( + const BatteryInterface&) = default; + +BatteryLevelProvider::BatteryState BatteryLevelProvider::GetBatteryState() { + const base::TimeTicks capture_time = base::TimeTicks::Now(); + + std::vector<BatteryInterface> battery_interfaces = GetBatteryInterfaceList(); + + uint64_t total_max_capacity = 0; + uint64_t total_current_capacity = 0; + bool on_battery = true; + bool any_capacity_invalid = false; + size_t battery_count = 0; + + for (auto& interface : battery_interfaces) { + // The interface might have no battery. + if (!interface.battery_present) + continue; + + // Counts the number of interfaces that has |battery_present == true|. + ++battery_count; + + // The state is considered on battery power only if all of the batteries + // are explicitly marked as not connected. + if (!interface.details.has_value() || interface.details->is_connected) + on_battery = false; + + if (!interface.details.has_value()) { + any_capacity_invalid = true; + continue; + } + + // Total capacity is averaged across all the batteries. + total_current_capacity += interface.details->current_capacity; + total_max_capacity += interface.details->full_charged_capacity; + } + + base::Optional<double> charge_level; + // Avoid invalid division. + if (!any_capacity_invalid && total_max_capacity != 0) { + charge_level = static_cast<double>(total_current_capacity) / + static_cast<double>(total_max_capacity); + } + // If no battery was detected, we consider the system to be drawing power + // from an external power source, which is different from |on_battery|'s + // default value. + if (battery_count == 0) + on_battery = false; + + return {battery_interfaces.size(), battery_count, charge_level, on_battery, + capture_time}; +}
diff --git a/chrome/browser/metrics/power/battery_level_provider.h b/chrome/browser/metrics/power/battery_level_provider.h index 62e5748..485ac8dd 100644 --- a/chrome/browser/metrics/power/battery_level_provider.h +++ b/chrome/browser/metrics/power/battery_level_provider.h
@@ -7,17 +7,34 @@ #include "base/callback.h" #include "base/optional.h" +#include "base/time/time.h" -// BatteryLevelProvider provides an interface for querrying battery state. +// BatteryLevelProvider provides an interface for querying battery state. // A platform specific implementation is obtained with // BatteryLevelProvider::Create(). class BatteryLevelProvider { public: - // Represents the state of the battery at a certain point in time. + // Represents an aggregated state of all the batteries on the system at a + // certain point in time. struct BatteryState { + BatteryState(size_t interface_count, + size_t battery_count, + base::Optional<double> charge_level, + bool on_battery, + base::TimeTicks capture_time); + BatteryState(const BatteryState&); + + // Number of device interfaces that accept a battery on the system. + size_t interface_count = 0; + + // Number of batteries detected on the system. + size_t battery_count = 0; + // A fraction of the maximal battery capacity of the system, in the range - // [0.00, 1.00]. - double charge_level = 0; + // [0.00, 1.00], or nullopt if no battery is present or querying charge + // level failed. This may be nullopt even if |on_battery == true|, which + // indicates a failure to grab the battery level. + base::Optional<double> charge_level = 0; // True if the system is running on battery power, false if the system is // drawing power from an external power source. @@ -36,12 +53,43 @@ BatteryLevelProvider(const BatteryLevelProvider& other) = delete; BatteryLevelProvider& operator=(const BatteryLevelProvider& other) = delete; - // Returns the current battery state, or nullopt if no battery is present or - // querying battery information failed. - virtual base::Optional<BatteryState> GetBatteryState() = 0; + // Returns the current battery state. + virtual BatteryState GetBatteryState(); protected: BatteryLevelProvider() = default; + + struct BatteryDetails { + // True if the battery is connected and drawing power from external power + // source. + bool is_connected; + + // The current battery capacity. + uint64_t current_capacity; + + // The battery's fully charged capacity. + uint64_t full_charged_capacity; + }; + + struct BatteryInterface { + // Indicates whether a battery is present on the interface, without + // additional battery details. + explicit BatteryInterface(bool battery_present_in); + // Provides the details of a battery that was detected on the interface. + explicit BatteryInterface(const BatteryDetails& details_in); + BatteryInterface(const BatteryInterface&); + + // True if a battery is detected. + const bool battery_present; + + // Detailed power state of the battery. This may be nullopt even if + // |battery_present == true| when the details couldn't be queried. + const base::Optional<BatteryDetails> details; + }; + + // Returns a vector containing BatteryInterface for each interface present on + // the system. + virtual std::vector<BatteryInterface> GetBatteryInterfaceList() = 0; }; #endif // CHROME_BROWSER_METRICS_POWER_BATTERY_LEVEL_PROVIDER_H_
diff --git a/chrome/browser/metrics/power/battery_level_provider_mac.mm b/chrome/browser/metrics/power/battery_level_provider_mac.mm index 2b989364..b612342 100644 --- a/chrome/browser/metrics/power/battery_level_provider_mac.mm +++ b/chrome/browser/metrics/power/battery_level_provider_mac.mm
@@ -45,36 +45,48 @@ BatteryLevelProviderMac() = default; ~BatteryLevelProviderMac() override = default; - base::Optional<BatteryState> GetBatteryState() override; + std::vector<BatteryInterface> GetBatteryInterfaceList() override; + + private: + BatteryLevelProvider::BatteryInterface GetInterface( + CFDictionaryRef description); }; std::unique_ptr<BatteryLevelProvider> BatteryLevelProvider::Create() { return std::make_unique<BatteryLevelProviderMac>(); } -base::Optional<BatteryLevelProvider::BatteryState> -BatteryLevelProviderMac::GetBatteryState() { - const base::TimeTicks capture_time = base::TimeTicks::Now(); - +std::vector<BatteryLevelProvider::BatteryInterface> +BatteryLevelProviderMac::GetBatteryInterfaceList() { // Retrieve the IOPMPowerSource service. const base::mac::ScopedIOObject<io_service_t> service( IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPMPowerSource"))); + if (service == IO_OBJECT_NULL) + return {}; // Gather a dictionary containing the power information. base::ScopedCFTypeRef<CFMutableDictionaryRef> dict; kern_return_t result = IORegistryEntryCreateCFProperties( service.get(), dict.InitializeInto(), 0, 0); + std::vector<BatteryInterface> interfaces; // Retrieving dictionary failed. Cannot proceed. - if (result != KERN_SUCCESS) - return base::nullopt; + if (result != KERN_SUCCESS) { + interfaces.push_back(BatteryInterface(false)); + } else { + interfaces.push_back(GetInterface(dict)); + } + return interfaces; +} +BatteryLevelProvider::BatteryInterface BatteryLevelProviderMac::GetInterface( + CFDictionaryRef description) { base::Optional<bool> external_connected = - GetValueAsBoolean(dict, CFSTR("ExternalConnected")); - // Value was not available. + GetValueAsBoolean(description, CFSTR("ExternalConnected")); if (!external_connected.has_value()) - return base::nullopt; + return BatteryInterface(true); + bool is_connected = *external_connected; CFStringRef capacity_key; CFStringRef max_capacity_key; @@ -90,21 +102,10 @@ // Extract the information from the dictionary. base::Optional<SInt64> current_capacity = - GetValueAsSInt64(dict, capacity_key); + GetValueAsSInt64(description, capacity_key); base::Optional<SInt64> max_capacity = - GetValueAsSInt64(dict, max_capacity_key); - - // If any of the values were not available. + GetValueAsSInt64(description, max_capacity_key); if (!current_capacity.has_value() || !max_capacity.has_value()) - return base::nullopt; - - // Avoid invalid division. - if (*max_capacity == 0) - return base::nullopt; - - // |ratio| is the result of dividing |current_capacity| by |max_capacity|. - double charge_level = static_cast<double>(current_capacity.value()) / - static_cast<double>(max_capacity.value()); - - return BatteryState{charge_level, !(*external_connected), capture_time}; + return BatteryInterface(true); + return BatteryInterface({is_connected, *current_capacity, *max_capacity}); }
diff --git a/chrome/browser/metrics/power/battery_level_provider_unittest.cc b/chrome/browser/metrics/power/battery_level_provider_unittest.cc new file mode 100644 index 0000000..8faab70c --- /dev/null +++ b/chrome/browser/metrics/power/battery_level_provider_unittest.cc
@@ -0,0 +1,118 @@ +// Copyright 2020 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/metrics/power/battery_level_provider.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class FakeBatteryLevelProvider : public BatteryLevelProvider { + public: + using BatteryInterface = BatteryLevelProvider::BatteryInterface; + + explicit FakeBatteryLevelProvider(std::vector<BatteryInterface> details) + : details_(std::move(details)) {} + + private: + std::vector<BatteryInterface> GetBatteryInterfaceList() override { + return details_; + } + + std::vector<BatteryInterface> details_; +}; + +} // namespace + +using BatteryInterface = FakeBatteryLevelProvider::BatteryInterface; + +TEST(BatteryLevelProviderTest, NoInterface) { + FakeBatteryLevelProvider provider({}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(0U, state.interface_count); + EXPECT_EQ(0U, state.battery_count); + EXPECT_FALSE(state.charge_level.has_value()); + EXPECT_FALSE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, NoBattery) { + FakeBatteryLevelProvider provider({BatteryInterface(false)}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(1U, state.interface_count); + EXPECT_EQ(0U, state.battery_count); + EXPECT_FALSE(state.charge_level.has_value()); + EXPECT_FALSE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, PluggedBattery) { + FakeBatteryLevelProvider provider({BatteryInterface({true, 42, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(1U, state.interface_count); + EXPECT_EQ(1U, state.battery_count); + ASSERT_TRUE(state.charge_level.has_value()); + EXPECT_EQ(0.42, *state.charge_level); + EXPECT_FALSE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, DischargingBattery) { + FakeBatteryLevelProvider provider({BatteryInterface({false, 42, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(1U, state.interface_count); + EXPECT_EQ(1U, state.battery_count); + ASSERT_TRUE(state.charge_level.has_value()); + EXPECT_EQ(0.42, *state.charge_level); + EXPECT_TRUE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, InvalidBattery) { + FakeBatteryLevelProvider provider({BatteryInterface(true)}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(1U, state.interface_count); + EXPECT_EQ(1U, state.battery_count); + EXPECT_FALSE(state.charge_level.has_value()); + EXPECT_FALSE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, MultipleInterfaces) { + FakeBatteryLevelProvider provider( + {BatteryInterface(false), BatteryInterface({false, 42, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(2U, state.interface_count); + EXPECT_EQ(1U, state.battery_count); + ASSERT_TRUE(state.charge_level.has_value()); + EXPECT_EQ(0.42, *state.charge_level); + EXPECT_TRUE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, MultipleBatteries) { + FakeBatteryLevelProvider provider( + {BatteryInterface({true, 10, 100}), BatteryInterface({false, 30, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(2U, state.interface_count); + EXPECT_EQ(2U, state.battery_count); + ASSERT_TRUE(state.charge_level.has_value()); + EXPECT_EQ(0.20, *state.charge_level); + EXPECT_FALSE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, MultipleBatteriesDischarging) { + FakeBatteryLevelProvider provider( + {BatteryInterface({false, 10, 100}), BatteryInterface({false, 30, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(2U, state.interface_count); + EXPECT_EQ(2U, state.battery_count); + ASSERT_TRUE(state.charge_level.has_value()); + EXPECT_EQ(0.20, *state.charge_level); + EXPECT_TRUE(state.on_battery); +} + +TEST(BatteryLevelProviderTest, MultipleBatteriesInvalid) { + FakeBatteryLevelProvider provider( + {BatteryInterface(true), BatteryInterface({false, 10, 100})}); + auto state = provider.GetBatteryState(); + EXPECT_EQ(2U, state.interface_count); + EXPECT_EQ(2U, state.battery_count); + EXPECT_FALSE(state.charge_level.has_value()); + EXPECT_FALSE(state.on_battery); +}
diff --git a/chrome/browser/metrics/power/battery_level_provider_win.cc b/chrome/browser/metrics/power/battery_level_provider_win.cc index e6881bd..cc35502 100644 --- a/chrome/browser/metrics/power/battery_level_provider_win.cc +++ b/chrome/browser/metrics/power/battery_level_provider_win.cc
@@ -116,29 +116,28 @@ BatteryLevelProviderWin() = default; ~BatteryLevelProviderWin() override = default; - base::Optional<BatteryState> GetBatteryState() override; + std::vector<BatteryInterface> GetBatteryInterfaceList() override; + + private: + BatteryInterface GetInterface(HDEVINFO devices, + SP_DEVICE_INTERFACE_DATA* interface_data); }; std::unique_ptr<BatteryLevelProvider> BatteryLevelProvider::Create() { return std::make_unique<BatteryLevelProviderWin>(); } -base::Optional<BatteryLevelProvider::BatteryState> -BatteryLevelProviderWin::GetBatteryState() { - const base::TimeTicks capture_time = base::TimeTicks::Now(); - +std::vector<BatteryLevelProvider::BatteryInterface> +BatteryLevelProviderWin::GetBatteryInterfaceList() { // Battery interfaces are enumerated at every sample to detect when a new // interface is added, and avoid holding dangling handles when a battery is // disconnected. - base::win::ScopedDevInfo devices( - ::SetupDiGetClassDevs(&GUID_DEVICE_BATTERY, nullptr, nullptr, - DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); + base::win::ScopedDevInfo devices(::SetupDiGetClassDevs( + &GUID_DEVICE_BATTERY, 0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)); if (!devices.is_valid()) - return base::nullopt; + return {}; - uint64_t total_max_capacity = 0; - uint64_t total_current_capacity = 0; - bool external_connected = false; + std::vector<BatteryInterface> interfaces; // The algorithm to enumerate battery devices is taken from // https://docs.microsoft.com/en-us/windows/win32/power/enumerating-battery-devices @@ -158,37 +157,28 @@ continue; } - base::win::ScopedHandle battery = - GetBatteryHandle(devices.get(), &interface_data); - if (!battery.IsValid()) - continue; - - base::Optional<uint64_t> battery_tag = GetBatteryTag(battery.Get()); - if (!battery_tag) - continue; - auto battery_information = - GetBatteryInformation(battery.Get(), *battery_tag); - auto battery_status = GetBatteryStatus(battery.Get(), *battery_tag); - // If any of the values were not available. - if (!battery_information.has_value() || !battery_status.has_value()) - continue; - - // The state is set as connected if any battery has access to AC power. - external_connected = external_connected || - (battery_status->PowerState & BATTERY_POWER_ON_LINE); - - // Total capacity is averaged across multiple batteries. - total_max_capacity += battery_information->FullChargedCapacity; - total_current_capacity += battery_status->Capacity; + interfaces.push_back(GetInterface(devices.get(), &interface_data)); } + return interfaces; +} - // Avoid invalid division. - if (total_max_capacity == 0) - return base::nullopt; +BatteryLevelProvider::BatteryInterface BatteryLevelProviderWin::GetInterface( + HDEVINFO devices, + SP_DEVICE_INTERFACE_DATA* interface_data) { + base::win::ScopedHandle battery = GetBatteryHandle(devices, interface_data); + if (!battery.IsValid()) + return BatteryInterface(false); - DCHECK_LE(total_current_capacity, total_max_capacity); - double charge_level = static_cast<double>(total_current_capacity) / - static_cast<double>(total_max_capacity); + base::Optional<uint64_t> battery_tag = GetBatteryTag(battery.Get()); + if (!battery_tag) + return BatteryInterface(false); + auto battery_information = GetBatteryInformation(battery.Get(), *battery_tag); + auto battery_status = GetBatteryStatus(battery.Get(), *battery_tag); + // If any of the values were not available. + if (!battery_information.has_value() || !battery_status.has_value()) + return BatteryInterface(true); - return BatteryState{charge_level, !external_connected, capture_time}; + return BatteryInterface({battery_status->PowerState & BATTERY_POWER_ON_LINE, + battery_status->Capacity, + battery_information->FullChargedCapacity}); }
diff --git a/chrome/browser/metrics/power/power_metrics_provider_mac.h b/chrome/browser/metrics/power/power_metrics_provider_mac.h index 55df68d..b951a2c1 100644 --- a/chrome/browser/metrics/power/power_metrics_provider_mac.h +++ b/chrome/browser/metrics/power/power_metrics_provider_mac.h
@@ -64,7 +64,8 @@ BatteryLevelProvider::Create(); // Latest battery state provided by |battery_level_provider_|. - base::Optional<BatteryLevelProvider::BatteryState> battery_state_; + BatteryLevelProvider::BatteryState battery_state_{0, 0, base::nullopt, false, + base::TimeTicks()}; // Time that should elapse between calls to RecordBatteryDischarge. const base::TimeDelta recording_interval_;
diff --git a/chrome/browser/metrics/power/power_metrics_provider_mac.mm b/chrome/browser/metrics/power/power_metrics_provider_mac.mm index 857126d..00f3aff 100644 --- a/chrome/browser/metrics/power/power_metrics_provider_mac.mm +++ b/chrome/browser/metrics/power/power_metrics_provider_mac.mm
@@ -202,18 +202,20 @@ PowerDrainRecorder::~PowerDrainRecorder() = default; void PowerDrainRecorder::RecordBatteryDischarge() { - base::Optional<BatteryLevelProvider::BatteryState> previous_battery_state = + BatteryLevelProvider::BatteryState previous_battery_state = std::exchange(battery_state_, battery_level_provider_->GetBatteryState()); // Missing battery values. - if (!battery_state_.has_value() || !previous_battery_state.has_value()) + if (!battery_state_.charge_level.has_value() || + !previous_battery_state.charge_level.has_value()) { return; + } // Not discharging. - if (!battery_state_->on_battery || !previous_battery_state->on_battery) + if (!battery_state_.on_battery || !previous_battery_state.on_battery) return; - if (battery_state_->charge_level > previous_battery_state->charge_level) { + if (*battery_state_.charge_level > *previous_battery_state.charge_level) { // Charge level went up since last measurement. It's suspected the computer // was charged for less than the collection interval. Consider this time // slice as not even "on battery". @@ -221,7 +223,7 @@ } const base::TimeDelta time_since_last_record = - battery_state_->capture_time - previous_battery_state->capture_time; + battery_state_.capture_time - previous_battery_state.capture_time; // Ratio by which the time elapsed can deviate from |recording_interval| // without invalidating this sample. @@ -255,7 +257,7 @@ constexpr int kScalingFactor = 10000; int discharge = kScalingFactor * time_elapsed_ratio * - (previous_battery_state->charge_level - battery_state_->charge_level); + (*previous_battery_state.charge_level - *battery_state_.charge_level); base::UmaHistogramCounts1000("Power.Mac.BatteryDischarge", discharge); }
diff --git a/chrome/browser/metrics/power/power_metrics_provider_mac_unittest.cc b/chrome/browser/metrics/power/power_metrics_provider_mac_unittest.cc index 17c0969..e1f4cb8 100644 --- a/chrome/browser/metrics/power/power_metrics_provider_mac_unittest.cc +++ b/chrome/browser/metrics/power/power_metrics_provider_mac_unittest.cc
@@ -31,7 +31,7 @@ std::queue<BatteryLevelProvider::BatteryState>* battery_states) : battery_states_(battery_states) {} - base::Optional<BatteryState> GetBatteryState() override { + BatteryState GetBatteryState() override { DCHECK(!battery_states_->empty()); BatteryLevelProvider::BatteryState state = battery_states_->front(); battery_states_->pop(); @@ -39,6 +39,10 @@ } private: + std::vector<BatteryInterface> GetBatteryInterfaceList() override { + return {}; + } + std::queue<BatteryLevelProvider::BatteryState>* battery_states_; }; @@ -74,9 +78,10 @@ TEST_F(PowerMetricsProviderTest, BatteryDischargeOnPower) { // Two consecutive readings on power should not record a battery discharge. - battery_states_.push(BatteryLevelProvider::BatteryState{1.00, false, now_}); battery_states_.push(BatteryLevelProvider::BatteryState{ - 1.000, false, now_ + base::TimeDelta::FromMinutes(1)}); + /*interface_count=*/1, /*battery_count=*/1, 1.00, false, now_}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + 1, 1, 1.000, false, now_ + base::TimeDelta::FromMinutes(1)}); ConsumeBatteryStates(); histogram_tester_.ExpectTotalCount(kHistogramName, 0); @@ -87,10 +92,11 @@ constexpr double kSecondReading = 0.098; // Two consecutive readings on battery should record a battery discharge. - battery_states_.push( - BatteryLevelProvider::BatteryState{kFirstReading, true, now_}); battery_states_.push(BatteryLevelProvider::BatteryState{ - kSecondReading, true, now_ + base::TimeDelta::FromMinutes(1)}); + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, now_}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + now_ + base::TimeDelta::FromMinutes(1)}); ConsumeBatteryStates(); histogram_tester_.ExpectUniqueSample( @@ -103,10 +109,11 @@ constexpr double kFirstReading = 0.098; constexpr double kSecondReading = 0.100; - battery_states_.push( - BatteryLevelProvider::BatteryState{kFirstReading, true, now_}); battery_states_.push(BatteryLevelProvider::BatteryState{ - kSecondReading, true, now_ + base::TimeDelta::FromMinutes(1)}); + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, now_}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + now_ + base::TimeDelta::FromMinutes(1)}); ConsumeBatteryStates(); histogram_tester_.ExpectTotalCount(kHistogramName, 0); @@ -124,10 +131,12 @@ base::TimeDelta::FromSeconds(1); // If it took too long to record a value no recoding takes place. - battery_states_.push(BatteryLevelProvider::BatteryState{kFirstReading, true, - first_capture_time}); - battery_states_.push(BatteryLevelProvider::BatteryState{kSecondReading, true, - second_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, + first_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + second_capture_time}); ConsumeBatteryStates(); histogram_tester_.ExpectTotalCount(kHistogramName, 0); @@ -145,10 +154,12 @@ base::TimeDelta::FromSeconds(1); // The second recording came in just in time to not be counted as too early. - battery_states_.push(BatteryLevelProvider::BatteryState{kFirstReading, true, - first_capture_time}); - battery_states_.push(BatteryLevelProvider::BatteryState{kSecondReading, true, - second_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, + first_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + second_capture_time}); ConsumeBatteryStates(); @@ -174,10 +185,12 @@ base::TimeDelta::FromSeconds(1); // If it took too long to record a value no recoding takes place. - battery_states_.push(BatteryLevelProvider::BatteryState{kFirstReading, true, - first_capture_time}); - battery_states_.push(BatteryLevelProvider::BatteryState{kSecondReading, true, - second_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, + first_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + second_capture_time}); ConsumeBatteryStates(); histogram_tester_.ExpectTotalCount(kHistogramName, 0); @@ -195,10 +208,12 @@ // If it took longer to record the metric the value recorded is scaled to // normalize to one minute. - battery_states_.push(BatteryLevelProvider::BatteryState{kFirstReading, true, - first_capture_time}); - battery_states_.push(BatteryLevelProvider::BatteryState{kSecondReading, true, - second_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kFirstReading, true, + first_capture_time}); + battery_states_.push(BatteryLevelProvider::BatteryState{ + /*interface_count=*/1, /*battery_count=*/1, kSecondReading, true, + second_capture_time}); ConsumeBatteryStates();
diff --git a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc index 8741738..31c2c24f9 100644 --- a/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/core/ukm_page_load_metrics_observer.cc
@@ -56,7 +56,7 @@ const char kOfflinePreviewsMimeType[] = "multipart/related"; extern const base::Feature kLayoutShiftNormalizationRecordUKM{ - "LayoutShiftNormalizationRecordUKM", base::FEATURE_DISABLED_BY_DEFAULT}; + "LayoutShiftNormalizationRecordUKM", base::FEATURE_ENABLED_BY_DEFAULT}; bool IsSupportedProtocol(page_load_metrics::NetworkProtocol protocol) { switch (protocol) {
diff --git a/chrome/browser/password_check/android/password_check_manager_unittest.cc b/chrome/browser/password_check/android/password_check_manager_unittest.cc index d7aa9e8..74f90d2 100644 --- a/chrome/browser/password_check/android/password_check_manager_unittest.cc +++ b/chrome/browser/password_check/android/password_check_manager_unittest.cc
@@ -39,8 +39,8 @@ using password_manager::BulkLeakCheckService; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; using password_manager::InsecureCredentialTypeFlags; +using password_manager::InsecureType; using password_manager::PasswordCheckUIStatus; using password_manager::PasswordForm; using password_manager::TestPasswordStore; @@ -167,7 +167,7 @@ base::StringPiece signon_realm, base::StringPiece username, base::TimeDelta time_since_creation = base::TimeDelta(), - CompromiseType compromise_type = CompromiseType::kLeaked) { + InsecureType compromise_type = InsecureType::kLeaked) { return CompromisedCredentials( std::string(signon_realm), base::ASCIIToUTF16(username), base::Time::Now() - time_since_creation, compromise_type,
diff --git a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc index a6b41c2e..8c2d183 100644 --- a/chrome/browser/payments/secure_payment_confirmation_browsertest.cc +++ b/chrome/browser/payments/secure_payment_confirmation_browsertest.cc
@@ -24,6 +24,7 @@ #include "chrome/test/payments/payment_request_platform_browsertest_base.h" #include "components/keyed_service/core/service_access_type.h" #include "components/payments/content/payment_manifest_web_data_service.h" +#include "components/payments/content/secure_payment_confirmation_app.h" #include "components/payments/core/features.h" #include "components/payments/core/secure_payment_confirmation_instrument.h" #include "components/webdata/common/web_data_service_consumer.h" @@ -290,7 +291,7 @@ // for creating the public key credential, rather than using // IntenralAuthenticator. This stubs out authenticator instantiation in // content. - void ReplaceFidoDiscoveryFactory() { + void ReplaceFidoDiscoveryFactory(bool should_succeed) { auto owned_virtual_device_factory = std::make_unique<device::test::VirtualFidoDeviceFactory>(); auto* virtual_device_factory = owned_virtual_device_factory.get(); @@ -308,18 +309,39 @@ device::VirtualCtap2Device::Config config; config.is_platform_authenticator = true; config.internal_uv_support = true; + config.user_verification_succeeds = should_succeed; virtual_device_factory->SetCtap2Config(config); } const std::string GetDefaultIconURL() { return https_server()->GetURL("a.com", "/icon.png").spec(); } + + void ExpectNoFunnelCount() { + histogram_tester_.ExpectTotalCount( + "PaymentRequest.SecurePaymentConfirmation.Funnel." + "SystemPromptResult", + 0); + } + + void ExpectFunnelCount(SecurePaymentConfirmationSystemPromptResult result, + int count) { + histogram_tester_.ExpectTotalCount( + "PaymentRequest.SecurePaymentConfirmation.Funnel." + "SystemPromptResult", + count); + histogram_tester_.ExpectBucketCount( + "PaymentRequest.SecurePaymentConfirmation.Funnel." + "SystemPromptResult", + result, count); + } + + base::HistogramTester histogram_tester_; }; IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationCreationTest, CreatePaymentCredential) { - base::HistogramTester histogram_tester; - ReplaceFidoDiscoveryFactory(); + ReplaceFidoDiscoveryFactory(/*should_succeed=*/true); NavigateTo("a.com", "/secure_payment_confirmation.html"); EXPECT_EQ("OK", @@ -328,13 +350,14 @@ GetDefaultIconURL()))); // Verify that credential id size gets recorded. - histogram_tester.ExpectTotalCount( + histogram_tester_.ExpectTotalCount( "PaymentRequest.SecurePaymentConfirmationCredentialIdSizeInBytes", 1U); + ExpectNoFunnelCount(); } IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationCreationTest, LookupPaymentCredential) { - ReplaceFidoDiscoveryFactory(); + ReplaceFidoDiscoveryFactory(/*should_succeed=*/true); NavigateTo("a.com", "/secure_payment_confirmation.html"); std::string credentialIdentifier = content::EvalJs( @@ -360,12 +383,13 @@ EXPECT_EQ(1u, test_controller()->app_descriptions().size()); EXPECT_EQ("display_name_for_instrument", test_controller()->app_descriptions().front().label); + ExpectNoFunnelCount(); } IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationCreationTest, ConfirmPaymentInCrossOriginIframe) { NavigateTo("a.com", "/secure_payment_confirmation.html"); - ReplaceFidoDiscoveryFactory(); + ReplaceFidoDiscoveryFactory(/*should_succeed=*/true); std::string credentialIdentifier = content::EvalJs( GetActiveWebContents(), @@ -385,12 +409,13 @@ "postToIframe($1, $2);", https_server()->GetURL("c.com", "/iframe_receiver.html").spec(), credentialIdentifier))); + ExpectFunnelCount(SecurePaymentConfirmationSystemPromptResult::kAccepted, 1); } IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationCreationTest, ChallengeIsReturned) { NavigateTo("a.com", "/secure_payment_confirmation.html"); - ReplaceFidoDiscoveryFactory(); + ReplaceFidoDiscoveryFactory(/*should_succeed=*/true); std::string credentialIdentifier = content::EvalJs( GetActiveWebContents(), @@ -449,7 +474,43 @@ GetActiveWebContents(), content::JsReplace("getChallengeWithModifierAndShowPromise($1, $2);", credentialIdentifier, "0.04"))); + + ExpectFunnelCount(SecurePaymentConfirmationSystemPromptResult::kAccepted, 4); } + +IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationCreationTest, + UserVerificationFails) { + NavigateTo("a.com", "/secure_payment_confirmation.html"); + ReplaceFidoDiscoveryFactory(/*should_succeed=*/true); + std::string credentialIdentifier = + content::EvalJs( + GetActiveWebContents(), + content::JsReplace("createCredentialAndReturnItsIdentifier($1)", + GetDefaultIconURL())) + .ExtractString(); + + NavigateTo("b.com", "/get_challenge.html"); + test_controller()->SetHasAuthenticator(true); + // Make the authenticator fail to simulate the user cancelling. + ReplaceFidoDiscoveryFactory(/*should_succeed=*/false); + confirm_payment_ = true; + + // Strip the trailing slash ("/") from the merchant origin in serialization to + // match the implementation behavior. + std::string merchant_origin = https_server()->GetURL("b.com", "/").spec(); + ASSERT_EQ('/', merchant_origin[merchant_origin.length() - 1]); + merchant_origin = merchant_origin.substr(0, merchant_origin.length() - 1); + ASSERT_NE('/', merchant_origin[merchant_origin.length() - 1]); + + // EvalJs waits for JavaScript promise to resolve. + EXPECT_EQ("Authenticator returned AuthenticatorStatus::NOT_ALLOWED_ERROR.", + content::EvalJs(GetActiveWebContents(), + content::JsReplace("getChallenge($1, $2);", + credentialIdentifier, "0.01"))); + + ExpectFunnelCount(SecurePaymentConfirmationSystemPromptResult::kCanceled, 1); +} + #endif // !defined(OS_ANDROID) } // namespace
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc index dd22a826..e3a7b123 100644 --- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc +++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -2232,8 +2232,9 @@ })); } -void RunFirstParam(base::RepeatingClosure closure, bool success) { - ASSERT_TRUE(success); +void RunFirstParam(base::RepeatingClosure closure, + blink::ServiceWorkerStatusCode status) { + ASSERT_EQ(status, blink::ServiceWorkerStatusCode::kOk); closure.Run(); }
diff --git a/chrome/browser/resources/bluetooth_internals/BUILD.gn b/chrome/browser/resources/bluetooth_internals/BUILD.gn index f289ac5..c0b1598 100644 --- a/chrome/browser/resources/bluetooth_internals/BUILD.gn +++ b/chrome/browser/resources/bluetooth_internals/BUILD.gn
@@ -32,7 +32,6 @@ ] deps = [ - ":node_utils", ":page", ":page_manager", "//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings_js_library_for_compile", @@ -44,19 +43,11 @@ ] } -js_library("node_utils") { - deps = [ "//ui/webui/resources/js:cr" ] -} - js_library("page") { deps = [ - ":node_utils", "//ui/webui/resources/js:cr", "//ui/webui/resources/js:util", "//ui/webui/resources/js/cr:event_target", - "//ui/webui/resources/js/cr/ui:bubble", - "//ui/webui/resources/js/cr/ui:focus_outline_manager", - "//ui/webui/resources/js/cr/ui:overlay", ] } @@ -64,6 +55,7 @@ deps = [ ":page", "//ui/webui/resources/js:cr", + "//ui/webui/resources/js/cr/ui:focus_outline_manager", ] } @@ -117,7 +109,6 @@ "bluetooth_internals.html", "bluetooth_internals.js", "menu.svg", - "node_utils.js", "object_fieldset.js", "page_manager.js", "page.js",
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html index f439de6..42c71e4 100644 --- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html +++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.html
@@ -21,7 +21,6 @@ <script src="chrome://resources/js/cr/ui/list_selection_model.js"></script> <script src="chrome://resources/js/cr/ui/list_item.js"></script> <script src="chrome://resources/js/cr/ui/list.js"></script> - <script src="chrome://resources/js/cr/ui/overlay.js"></script> <script src="page_manager.js"></script> <script src="page.js"></script>
diff --git a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js index c3e111a..aa54e6b 100644 --- a/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js +++ b/chrome/browser/resources/bluetooth_internals/bluetooth_internals.js
@@ -20,12 +20,13 @@ const DeviceDetailsPage = device_details_page.DeviceDetailsPage; const DevicesPage = devices_page.DevicesPage; const DebugLogPage = debug_log_page.DebugLogPage; - const PageManager = cr.ui.pageManager.PageManager; const Snackbar = snackbar.Snackbar; const SnackbarType = snackbar.SnackbarType; devices = new device_collection.DeviceCollection([]); + /** @type {cr.ui.pageManager.PageManager} */ + const pageManager = cr.ui.pageManager.PageManager.getInstance(); /** @type {adapter_page.AdapterPage} */ let adapterPage = null; /** @type {devices_page.DevicesPage} */ @@ -44,17 +45,11 @@ /** * Observer for page changes. Used to update page title header. - * @constructor - * @extends {cr.ui.pageManager.PageManager.Observer} */ - const PageObserver = function() {}; - - PageObserver.prototype = { - __proto__: PageManager.Observer.prototype, - + const PageObserver = class extends cr.ui.pageManager.PageManagerObserver { updateHistory(path) { window.location.hash = '#' + path; - }, + } /** * Sets the page title. Called by PageManager. @@ -63,7 +58,7 @@ */ updateTitle(title) { document.querySelector('.page-title').textContent = title; - }, + } }; /** @@ -75,7 +70,9 @@ const id = 'devices/' + address.toLowerCase(); sidebarObj.removeItem(id); - const deviceDetailsPage = PageManager.registeredPages[id]; + const deviceDetailsPage = + /** @type {!device_details_page.DeviceDetailsPage} */ ( + pageManager.registeredPages.get(id)); assert(deviceDetailsPage, 'Device Details page must exist'); deviceDetailsPage.disconnect(); @@ -86,7 +83,7 @@ devicesPage.setInspecting( deviceDetailsPage.deviceInfo, false /* isInspecting */); - PageManager.unregister(deviceDetailsPage); + pageManager.unregister(deviceDetailsPage); } /** @@ -99,7 +96,9 @@ */ function makeDeviceDetailsPage(deviceInfo) { const deviceDetailsPageId = 'devices/' + deviceInfo.address.toLowerCase(); - let deviceDetailsPage = PageManager.registeredPages[deviceDetailsPageId]; + let deviceDetailsPage = + /** @type {?device_details_page.DeviceDetailsPage} */ ( + pageManager.registeredPages.get(deviceDetailsPageId)); if (deviceDetailsPage) { return deviceDetailsPage; } @@ -117,14 +116,14 @@ deviceDetailsPage.pageDiv.addEventListener( 'forgetpressed', function(event) { - PageManager.showPageByName(devicesPage.name); + pageManager.showPageByName(devicesPage.name); removeDeviceDetailsPage(event.detail.address); }); // Inform the devices page that the user is inspecting this device. // This will update the links in the device table. devicesPage.setInspecting(deviceInfo, true /* isInspecting */); - PageManager.register(deviceDetailsPage); + pageManager.register(deviceDetailsPage); sidebarObj.addItem({ pageName: deviceDetailsPageId, @@ -142,9 +141,9 @@ */ function updateDeviceDetailsPage(address) { const detailPageId = 'devices/' + address.toLowerCase(); - const page = PageManager.registeredPages[detailPageId]; + const page = pageManager.registeredPages.get(detailPageId); if (page) { - page.redraw(); + /** @type {!device_details_page.DeviceDetailsPage} */ (page).redraw(); } } @@ -202,11 +201,11 @@ devicesPage.pageDiv.addEventListener('inspectpressed', function(event) { const detailsPage = makeDeviceDetailsPage(devices.getByAddress(event.detail.address)); - PageManager.showPageByName(detailsPage.name); + pageManager.showPageByName(detailsPage.name); }); devicesPage.pageDiv.addEventListener('forgetpressed', function(event) { - PageManager.showPageByName(devicesPage.name); + pageManager.showPageByName(devicesPage.name); removeDeviceDetailsPage(event.detail.address); }); @@ -256,32 +255,32 @@ $('menu-btn').addEventListener('click', function() { sidebarObj.open(); }); - PageManager.addObserver(sidebarObj); - PageManager.addObserver(new PageObserver()); + pageManager.addObserver(sidebarObj); + pageManager.addObserver(new PageObserver()); devicesPage = new DevicesPage(); - PageManager.register(devicesPage); + pageManager.register(devicesPage); adapterPage = new AdapterPage(); - PageManager.register(adapterPage); + pageManager.register(adapterPage); debugLogPage = new DebugLogPage(bluetoothInternalsHandler); - PageManager.register(debugLogPage); + pageManager.register(debugLogPage); // Set up hash-based navigation. window.addEventListener('hashchange', function() { // If a user navigates and the page doesn't exist, do nothing. const pageName = window.location.hash.substr(1); if ($(pageName)) { - PageManager.showPageByName(pageName); + pageManager.showPageByName(pageName); } }); if (!window.location.hash) { - PageManager.showPageByName(adapterPage.name); + pageManager.showPageByName(adapterPage.name); return; } // Only the root pages are available on page load. - PageManager.showPageByName(window.location.hash.split('/')[0].substr(1)); + pageManager.showPageByName(window.location.hash.split('/')[0].substr(1)); } function initializeViews() {
diff --git a/chrome/browser/resources/bluetooth_internals/device_details_page.js b/chrome/browser/resources/bluetooth_internals/device_details_page.js index 876d45e6..293ed0c 100644 --- a/chrome/browser/resources/bluetooth_internals/device_details_page.js +++ b/chrome/browser/resources/bluetooth_internals/device_details_page.js
@@ -9,7 +9,6 @@ */ cr.define('device_details_page', function() { - const Page = cr.ui.pageManager.Page; const Snackbar = snackbar.Snackbar; const SnackbarType = snackbar.SnackbarType; @@ -32,7 +31,7 @@ * the DeviceInfo object and the Services section contains a ServiceList * compononent that lists all of the active services on the device. */ - class DeviceDetailsPage extends Page { + class DeviceDetailsPage extends cr.ui.pageManager.Page { /** * @param {string} id * @param {!bluetooth.mojom.DeviceInfo} deviceInfo
diff --git a/chrome/browser/resources/bluetooth_internals/node_utils.js b/chrome/browser/resources/bluetooth_internals/node_utils.js deleted file mode 100644 index 29c13ca4..0000000 --- a/chrome/browser/resources/bluetooth_internals/node_utils.js +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -cr.define('cr.ui', function() { - /** - * Reverse the child elements of any found button strips if they haven't - * already been reversed. This is necessary because WebKit does not alter the - * tab order for elements that are visually reversed using flex-direction: - * reverse, and the button order is reversed for views. See - * http://webk.it/62664 for more information. - * @param {Node=} opt_root Starting point for button strips to reverse. - */ - function reverseButtonStrips(opt_root) { - if (!(cr.isWindows || cr.isChromeOS)) { - // Only reverse on platforms that need it (differ from the HTML order). - return; - } - - const root = opt_root || document; - const buttonStrips = root.querySelectorAll('.button-strip:not([reversed])'); - for (let j = 0; j < buttonStrips.length; j++) { - const buttonStrip = buttonStrips[j]; - - const childNodes = buttonStrip.childNodes; - for (let i = childNodes.length - 1; i >= 0; i--) { - buttonStrip.appendChild(childNodes[i]); - } - - buttonStrip.setAttribute('reversed', ''); - } - } - - /** - * Finds a good place to set initial focus. Generally called when UI is shown. - * @param {!Element} root Where to start looking for focusable controls. - */ - function setInitialFocus(root) { - // Do not change focus if any element in |root| is already focused. - if (root.contains(document.activeElement)) { - return; - } - - const elements = - root.querySelectorAll('input, list, select, textarea, button'); - for (let i = 0; i < elements.length; i++) { - const element = elements[i]; - element.focus(); - // .focus() isn't guaranteed to work. Continue until it does. - if (document.activeElement == element) { - return; - } - } - } - - return { - reverseButtonStrips: reverseButtonStrips, - setInitialFocus: setInitialFocus, - }; -});
diff --git a/chrome/browser/resources/bluetooth_internals/page.js b/chrome/browser/resources/bluetooth_internals/page.js index 61d1cb2..2912bd3 100644 --- a/chrome/browser/resources/bluetooth_internals/page.js +++ b/chrome/browser/resources/bluetooth_internals/page.js
@@ -3,7 +3,27 @@ // found in the LICENSE file. cr.define('cr.ui.pageManager', function() { - const PageManager = cr.ui.pageManager.PageManager; + /** + * Finds a good place to set initial focus. Generally called when UI is shown. + * @param {!Element} root Where to start looking for focusable controls. + */ + function setInitialFocus(root) { + // Do not change focus if any element in |root| is already focused. + if (root.contains(document.activeElement)) { + return; + } + + const elements = + root.querySelectorAll('input, list, select, textarea, button'); + for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + element.focus(); + // .focus() isn't guaranteed to work. Continue until it does. + if (document.activeElement == element) { + return; + } + } + } /** * Base class for pages that can be shown and hidden by PageManager. Each Page @@ -52,23 +72,6 @@ * @type {Array<Element>} */ this.associatedControls = null; - - /** - * If true; this page should always be considered the top-most page when - * visible. - * @private {boolean} - */ - this.alwaysOnTop_ = false; - - /** - * Set this to handle cancelling an overlay (and skip some typical steps). - * @see {cr.ui.PageManager.prototype.cancelOverlay} - * @type {?Function} - */ - this.handleCancel = null; - - /** @type {boolean} */ - this.isOverlay = false; } /** @@ -87,25 +90,7 @@ * strategy. */ focus() { - cr.ui.setInitialFocus(this.pageDiv); - } - - /** - * Reverse any buttons strips in this page (only applies to overlays). - * @see cr.ui.reverseButtonStrips for an explanation of why this is - * necessary and when it's done. - */ - reverseButtonStrip() { - assert(this.isOverlay); - cr.ui.reverseButtonStrips(this.pageDiv); - } - - /** - * Whether it should be possible to show the page. - * @return {boolean} True if the page should be shown. - */ - canShowPage() { - return true; + setInitialFocus(this.pageDiv); } /** @@ -119,7 +104,7 @@ return; } this.hash = hash; - PageManager.onPageHashChanged(this); + this.dispatchEvent(new CustomEvent('page-hash-changed')); } /** @@ -139,24 +124,10 @@ didClosePage() {} /** - * Gets the container div for this page if it is an overlay. - * @type {HTMLDivElement} - */ - get container() { - assert(this.isOverlay); - return this.pageDiv.parentNode; - } - - /** * Gets page visibility state. * @type {boolean} */ get visible() { - // If this is an overlay dialog it is no longer considered visible while - // the overlay is fading out. See http://crbug.com/118629. - if (this.isOverlay && this.container.classList.contains('transparent')) { - return false; - } if (this.pageDiv.hidden) { return false; } @@ -172,139 +143,11 @@ return; } - // If using an overlay, the visibility of the dialog is toggled at the - // same time as the overlay to show the dialog's out transition. This - // is handled in setOverlayVisible. - if (this.isOverlay) { - this.setOverlayVisible_(visible); - } else { - this.pageDiv.page = this; - this.pageDiv.hidden = !visible; - PageManager.onPageVisibilityChanged(this); - } + this.pageDiv.page = this; + this.pageDiv.hidden = !visible; cr.dispatchPropertyChange(this, 'visible', visible, !visible); } - - /** - * Whether the page is considered 'sticky', such that it will remain a root - * page even if sub-pages change. - * @type {boolean} True if this page is sticky. - */ - get sticky() { - return false; - } - - /** - * @type {boolean} True if this page should always be considered the - * top-most page when visible. - */ - get alwaysOnTop() { - return this.alwaysOnTop_; - } - - /** - * @type {boolean} True if this page should always be considered the - * top-most page when visible. Only overlays can be always on top. - */ - set alwaysOnTop(value) { - assert(this.isOverlay); - this.alwaysOnTop_ = value; - } - - /** - * Shows or hides an overlay (including any visible dialog). - * @param {boolean} visible Whether the overlay should be visible or not. - * @private - */ - setOverlayVisible_(visible) { - assert(this.isOverlay); - const pageDiv = this.pageDiv; - const container = this.container; - - if (container.hidden != visible) { - if (visible) { - // If the container is set hidden and then immediately set visible - // again, the fadeCompleted_ callback would cause it to be erroneously - // hidden again. Removing the transparent tag avoids that. - container.classList.remove('transparent'); - - // Hide all dialogs in this container since a different one may have - // been previously visible before fading out. - const pages = container.querySelectorAll('.page'); - for (let i = 0; i < pages.length; i++) { - pages[i].hidden = true; - } - // Show the new dialog. - pageDiv.hidden = false; - pageDiv.page = this; - } - return; - } - - const self = this; - const loading = PageManager.isLoading(); - if (!loading) { - // TODO(flackr): Use an event delegate to avoid having to subscribe and - // unsubscribe for transitionend events. - container.addEventListener('transitionend', function f(e) { - const propName = e.propertyName; - if (e.target != e.currentTarget || - (propName && propName != 'opacity')) { - return; - } - container.removeEventListener('transitionend', f); - self.fadeCompleted_(); - }); - // transition is 200ms. Let's wait for 400ms. - ensureTransitionEndEvent(container, 400); - } - - if (visible) { - container.hidden = false; - pageDiv.hidden = false; - pageDiv.page = this; - // NOTE: This is a hacky way to force the container to layout which - // will allow us to trigger the transition. - /** @suppress {uselessCode} */ - container.scrollTop; - - this.pageDiv.removeAttribute('aria-hidden'); - if (this.parentPage) { - this.parentPage.pageDiv.parentElement.setAttribute( - 'aria-hidden', true); - } - container.classList.remove('transparent'); - PageManager.onPageVisibilityChanged(this); - } else { - // Kick change events for text fields. - if (pageDiv.contains(document.activeElement)) { - document.activeElement.blur(); - } - container.classList.add('transparent'); - } - - if (loading) { - this.fadeCompleted_(); - } - } - - /** - * Called when a container opacity transition finishes. - * @private - */ - fadeCompleted_() { - if (this.container.classList.contains('transparent')) { - this.pageDiv.hidden = true; - this.container.hidden = true; - - if (this.parentPage) { - this.parentPage.pageDiv.parentElement.removeAttribute('aria-hidden'); - } - - PageManager.onPageVisibilityChanged(this); - } - } } // Export
diff --git a/chrome/browser/resources/bluetooth_internals/page_manager.js b/chrome/browser/resources/bluetooth_internals/page_manager.js index c09879fb..fad109e 100644 --- a/chrome/browser/resources/bluetooth_internals/page_manager.js +++ b/chrome/browser/resources/bluetooth_internals/page_manager.js
@@ -4,46 +4,33 @@ cr.define('cr.ui.pageManager', function() { /** - * PageManager contains a list of root Page and overlay Page objects and - * handles "navigation" by showing and hiding these pages and overlays. On - * initial load, PageManager can use the path to open the correct hierarchy - * of pages and overlay(s). Handlers for user events, like pressing buttons, - * can call into PageManager to open a particular overlay or cancel an - * existing overlay. + * PageManager contains a list of root Page objects and handles "navigation" + * by showing and hiding these pages. On initial load, PageManager can use + * the path to open the correct hierarchy of pages. */ - const PageManager = { - /** - * True if page is served from a dialog. - * @type {boolean} - */ - isDialog: false, + class PageManager { + constructor() { + /** + * True if page is served from a dialog. + * @type {boolean} + */ + this.isDialog = false; - /** - * Offset of page container in pixels. Uber pages that use the side menu - * can override this with the setter. - * @type {number} - */ - horizontalOffset_: 23, + /** + * Root pages. Maps lower-case page names to the respective page object. + * @type {!Map<string, !cr.ui.pageManager.Page>} + */ + this.registeredPages = new Map(); - /** - * Root pages. Maps lower-case page names to the respective page object. - * @type {!Object<!cr.ui.pageManager.Page>} - */ - registeredPages: {}, + /** + * Observers will be notified when opening and closing overlays. + * @private {!Array<!cr.ui.pageManager.PageManagerObserver>} + */ + this.observers_ = []; - /** - * Pages which are meant to behave like modal dialogs. Maps lower-case - * overlay names to the respective overlay object. - * @type {!Object<!cr.ui.pageManager.Page>} - * @private - */ - registeredOverlayPages: {}, - - /** - * Observers will be notified when opening and closing overlays. - * @type {!Array<!cr.ui.pageManager.PageManager.Observer>} - */ - observers_: [], + /** @private {?cr.ui.pageManager.Page} */ + this.defaultPage_ = null; + } /** * Initializes the complete page. @@ -54,71 +41,27 @@ this.defaultPage_ = defaultPage; cr.ui.FocusOutlineManager.forDocument(document); - document.addEventListener('scroll', this.handleScroll_.bind(this)); - - // Trigger the scroll handler manually to set the initial state. - this.handleScroll_(); - - // Shake the dialog if the user clicks outside the dialog bounds. - const containers = /** @type {!NodeList<!HTMLElement>} */ ( - document.querySelectorAll('body > .overlay')); - for (let i = 0; i < containers.length; i++) { - const overlay = containers[i]; - cr.ui.overlay.setupOverlay(overlay); - overlay.addEventListener( - 'cancelOverlay', this.cancelOverlay.bind(this)); - } - - cr.ui.overlay.globalInitialization(); - }, + } /** * Registers new page. * @param {!cr.ui.pageManager.Page} page Page to register. */ register(page) { - this.registeredPages[page.name.toLowerCase()] = page; + this.registeredPages.set(page.name.toLowerCase(), page); + page.addEventListener( + 'page-hash-changed', + e => this.onPageHashChanged_(/** @type {!CustomEvent} */ (e))); page.initializePage(); - }, + } /** * Unregisters an existing page. * @param {!cr.ui.pageManager.Page} page Page to unregister. */ unregister(page) { - delete this.registeredPages[page.name.toLowerCase()]; - }, - - /** - * Registers a new Overlay page. - * @param {!cr.ui.pageManager.Page} overlay Overlay to register. - * @param {cr.ui.pageManager.Page} parentPage Associated parent page for - * this overlay. - * @param {Array} associatedControls Array of control elements associated - * with this page. - */ - registerOverlay(overlay, parentPage, associatedControls) { - this.registeredOverlayPages[overlay.name.toLowerCase()] = overlay; - overlay.parentPage = parentPage; - if (associatedControls) { - overlay.associatedControls = associatedControls; - if (associatedControls.length) { - overlay.associatedSection = - this.findSectionForNode_(associatedControls[0]); - } - - // Sanity check. - for (let i = 0; i < associatedControls.length; ++i) { - assert(associatedControls[i], 'Invalid element passed.'); - } - } - - overlay.tab = undefined; - overlay.isOverlay = true; - - overlay.reverseButtonStrip(); - overlay.initializePage(); - }, + this.registeredPages.delete(page.name.toLowerCase()); + } /** * Shows the default page. @@ -130,10 +73,10 @@ this.defaultPage_ instanceof cr.ui.pageManager.Page, 'PageManager must be initialized with a default page.'); this.showPageByName(this.defaultPage_.name, opt_updateHistory); - }, + } /** - * Shows a registered page. This handles both root and overlay pages. + * Shows a registered page. * @param {string} pageName Page name. * @param {boolean=} opt_updateHistory If we should update the history after * showing the page (defaults to true). @@ -145,13 +88,9 @@ opt_updateHistory = opt_updateHistory !== false; opt_propertyBag = opt_propertyBag || {}; - // If a bubble is currently being shown, hide it. - this.hideBubble(); - // Find the currently visible root-level page. let rootPage = null; - for (const name in this.registeredPages) { - const page = this.registeredPages[name]; + for (const page of this.registeredPages.values()) { if (page.visible && !page.parentPage) { rootPage = page; break; @@ -159,31 +98,16 @@ } // Find the target page. - let targetPage = this.registeredPages[pageName.toLowerCase()]; - if (!targetPage || !targetPage.canShowPage()) { - // If it's not a page, try it as an overlay. - const hash = opt_propertyBag.hash || ''; - if (!targetPage && this.showOverlay_(pageName, hash, rootPage)) { - if (opt_updateHistory) { - this.updateHistoryState_(!!opt_propertyBag.replaceState); - } - this.updateTitle_(); - return; - } + let targetPage = this.registeredPages.get(pageName.toLowerCase()); + if (!targetPage) { targetPage = this.defaultPage_; } pageName = targetPage.name.toLowerCase(); const targetPageWasVisible = targetPage.visible; - // Determine if the root page is 'sticky', meaning that it - // shouldn't change when showing an overlay. This can happen for special - // pages like Search. - const isRootPageLocked = - rootPage && rootPage.sticky && targetPage.parentPage; - // Notify pages if they will be hidden. - this.forEachPage_(!isRootPageLocked, function(page) { + this.registeredPages.forEach(page => { if (page.name != pageName && !this.isAncestorOfPage(page, targetPage)) { page.willHidePage(); } @@ -193,7 +117,7 @@ targetPage.hash = opt_propertyBag.hash || ''; // Update visibilities to show only the hierarchy of the target page. - this.forEachPage_(!isRootPageLocked, function(page) { + this.registeredPages.forEach(page => { page.visible = page.name == pageName || this.isAncestorOfPage(page, targetPage); }); @@ -211,7 +135,7 @@ } // Notify pages if they were shown. - this.forEachPage_(!isRootPageLocked, function(page) { + this.registeredPages.forEach(page => { if (!targetPageWasVisible && (page.name == pageName || this.isAncestorOfPage(page, targetPage))) { @@ -228,7 +152,7 @@ // Update the document title. Do this after didShowPage was called, in // case a page decides to change its title. this.updateTitle_(); - }, + } /** * Returns the name of the page from the current path. @@ -242,7 +166,7 @@ // Skip starting slash and remove trailing slash (if any). return path.slice(1).replace(/\/$/, ''); - }, + } /** * Gets the level of the page. Root pages (e.g., BrowserOptions) are at @@ -257,7 +181,7 @@ parent = parent.parentPage; } return level; - }, + } /** * Checks whether one page is an ancestor of the other page in terms of @@ -276,331 +200,42 @@ parent = parent.parentPage; } return false; - }, - - /** - * Returns true if the page is a direct descendent of a root page, or if - * the page is considered always on top. Doesn't consider visibility. - * @param {cr.ui.pageManager.Page} page Page to check. - * @return {boolean} True if |page| is a top-level overlay. - */ - isTopLevelOverlay(page) { - return page.isOverlay && - (page.alwaysOnTop || this.getNestingLevel(page) == 1); - }, - - /** - * Called when an page is shown or hidden to update the root page - * based on the page's new visibility. - * @param {cr.ui.pageManager.Page} page The page being made visible or - * invisible. - */ - onPageVisibilityChanged(page) { - this.updateRootPageFreezeState(); - - for (let i = 0; i < this.observers_.length; ++i) { - this.observers_[i].onPageVisibilityChanged(page); - } - - if (!page.visible && this.isTopLevelOverlay(page)) { - this.updateScrollPosition_(); - } - }, + } /** * Called when a page's hash changes. If the page is the topmost visible * page, the history state is updated. - * @param {cr.ui.pageManager.Page} page The page whose hash has changed. + * @param {!CustomEvent} e */ - onPageHashChanged(page) { + onPageHashChanged_(e) { + const page = /** @type {!cr.ui.pageManager.Page} */ (e.target); if (page == this.getTopmostVisiblePage()) { this.updateHistoryState_(false); } - }, + } /** - * Returns the topmost visible page, or null if no page is visible. - * @return {cr.ui.pageManager.Page} The topmost visible page. - */ - getTopmostVisiblePage() { - // Check overlays first since they're top-most if visible. - return this.getVisibleOverlay_() || - this.getTopmostVisibleNonOverlayPage_(); - }, - - /** - * Closes the visible overlay. Updates the history state after closing the - * overlay. - */ - closeOverlay() { - const overlay = this.getVisibleOverlay_(); - if (!overlay) { - return; - } - - overlay.visible = false; - overlay.didClosePage(); - - this.updateHistoryState_(false); - this.updateTitle_(); - - this.restoreLastFocusedElement_(); - }, - - /** - * Closes all overlays and updates the history after each closed overlay. - */ - closeAllOverlays() { - while (this.isOverlayVisible_()) { - this.closeOverlay(); - } - }, - - /** - * Cancels (closes) the overlay, due to the user pressing <Esc>. - */ - cancelOverlay() { - // Blur the active element to ensure any changed pref value is saved. - document.activeElement.blur(); - const overlay = this.getVisibleOverlay_(); - if (!overlay) { - return; - } - // Let the overlay handle the <Esc> if it wants to. - if (overlay.handleCancel) { - overlay.handleCancel(); - this.restoreLastFocusedElement_(); - } else { - this.closeOverlay(); - } - }, - - /** - * Shows an informational bubble displaying |content| and pointing at the - * |target| element. If |content| has focusable elements, they join the - * current page's tab order as siblings of |domSibling|. - * @param {HTMLDivElement} content The content of the bubble. - * @param {HTMLElement} target The element at which the bubble points. - * @param {HTMLElement} domSibling The element after which the bubble is - * added to the DOM. - * @param {cr.ui.ArrowLocation} location The arrow location. - */ - showBubble(content, target, domSibling, location) { - this.hideBubble(); - - const bubble = new cr.ui.AutoCloseBubble; - bubble.anchorNode = target; - bubble.domSibling = domSibling; - bubble.arrowLocation = location; - bubble.content = content; - bubble.show(); - this.bubble_ = bubble; - }, - - /** - * Hides the currently visible bubble, if any. - */ - hideBubble() { - if (this.bubble_) { - this.bubble_.hide(); - } - }, - - /** - * Returns the currently visible bubble, or null if no bubble is visible. - * @return {cr.ui.AutoCloseBubble} The bubble currently being shown. - */ - getVisibleBubble() { - const bubble = this.bubble_; - return bubble && !bubble.hidden ? bubble : null; - }, - - /** - * Callback for window.onpopstate to handle back/forward navigations. - * @param {string} pageName The current page name. - * @param {string} hash The hash to pass into the page. - * @param {Object} data State data pushed into history. - */ - setState(pageName, hash, data) { - const currentOverlay = this.getVisibleOverlay_(); - const lowercaseName = pageName.toLowerCase(); - const newPage = this.registeredPages[lowercaseName] || - this.registeredOverlayPages[lowercaseName] || this.defaultPage_; - if (currentOverlay && !this.isAncestorOfPage(currentOverlay, newPage)) { - currentOverlay.visible = false; - currentOverlay.didClosePage(); - } - this.showPageByName(pageName, false, {hash: hash}); - }, - - - /** - * Whether the page is still loading (i.e. onload hasn't finished running). - * @return {boolean} Whether the page is still loading. - */ - isLoading() { - return document.documentElement.classList.contains('loading'); - }, - - /** - * Callback for window.onbeforeunload. Used to notify overlays that they - * will be closed. - */ - willClose() { - const overlay = this.getVisibleOverlay_(); - if (overlay) { - overlay.didClosePage(); - } - }, - - /** - * Freezes/unfreezes the scroll position of the root page based on the - * current page stack. - */ - updateRootPageFreezeState() { - const topPage = this.getTopmostVisiblePage(); - if (topPage) { - this.setRootPageFrozen_(topPage.isOverlay); - } - }, - - /** - * Change the horizontal offset used to reposition elements while showing an - * overlay from the default. - */ - set horizontalOffset(value) { - this.horizontalOffset_ = value; - }, - - /** - * @param {!cr.ui.pageManager.PageManager.Observer} observer The observer to + * @param {!cr.ui.pageManager.PageManagerObserver} observer The observer to * register. */ addObserver(observer) { this.observers_.push(observer); - }, + } /** - * Shows a registered overlay page. Does not update history. - * @param {string} overlayName Page name. - * @param {string} hash The hash state to associate with the overlay. - * @param {cr.ui.pageManager.Page} rootPage The currently visible root-level - * page. - * @return {boolean} Whether we showed an overlay. + * Returns the topmost visible page. + * @return {cr.ui.pageManager.Page} * @private */ - showOverlay_(overlayName, hash, rootPage) { - const overlay = this.registeredOverlayPages[overlayName.toLowerCase()]; - if (!overlay || !overlay.canShowPage()) { - return false; - } - - const focusOutlineManager = - cr.ui.FocusOutlineManager.forDocument(document); - - // Save the currently focused element in the page for restoration later. - const currentPage = this.getTopmostVisiblePage(); - if (currentPage && focusOutlineManager.visible) { - currentPage.lastFocusedElement = document.activeElement; - } - - if ((!rootPage || !rootPage.sticky) && overlay.parentPage && - !overlay.parentPage.visible) { - this.showPageByName(overlay.parentPage.name, false); - } - - overlay.hash = hash; - if (!overlay.visible) { - overlay.visible = true; - overlay.didShowPage(); - } else { - overlay.didChangeHash(); - } - - if (focusOutlineManager.visible) { - overlay.focus(); - } - - if (!overlay.pageDiv.contains(document.activeElement)) { - document.activeElement.blur(); - } - - if ($('search-field') && $('search-field').value == '') { - const section = overlay.associatedSection; - if (section) { - /** @suppress {checkTypes|checkVars} */ - (function() { - options.BrowserOptions.scrollToSection(section); - })(); - } - } - - return true; - }, - - /** - * Returns whether or not an overlay is visible. - * @return {boolean} True if an overlay is visible. - * @private - */ - isOverlayVisible_() { - return this.getVisibleOverlay_() != null; - }, - - /** - * Returns the currently visible overlay, or null if no page is visible. - * @return {cr.ui.pageManager.Page} The visible overlay. - * @private - */ - getVisibleOverlay_() { - let topmostPage = null; - for (const name in this.registeredOverlayPages) { - const page = this.registeredOverlayPages[name]; - if (!page.visible) { - continue; - } - - if (page.alwaysOnTop) { - return page; - } - - if (!topmostPage || - this.getNestingLevel(page) > this.getNestingLevel(topmostPage)) { - topmostPage = page; - } - } - return topmostPage; - }, - - /** - * Returns the topmost visible page (overlays excluded). - * @return {cr.ui.pageManager.Page} The topmost visible page aside from any - * overlays. - * @private - */ - getTopmostVisibleNonOverlayPage_() { - for (const name in this.registeredPages) { - const page = this.registeredPages[name]; + getTopmostVisiblePage() { + for (const page of this.registeredPages.values()) { if (page.visible) { return page; } } return null; - }, - - /** - * Scrolls the page to the correct position (the top when opening an - * overlay, or the old scroll position a previously hidden overlay - * becomes visible). - * @private - */ - updateScrollPosition_() { - const container = $('page-container'); - const scrollTop = container.oldScrollTop || 0; - container.oldScrollTop = undefined; - window.scroll(scrollLeftForDocument(document), scrollTop); - }, + } /** * Updates the title to the title of the current page, or of the topmost @@ -618,7 +253,7 @@ } page = page.parentPage; } - }, + } /** * Constructs a new path to push onto the history stack, using observers @@ -649,152 +284,29 @@ for (let i = 0; i < this.observers_.length; ++i) { this.observers_[i].updateHistory(newPath, replace); } - }, - - /** - * Restores the last focused element on a given page. - * @private - */ - restoreLastFocusedElement_() { - const currentPage = this.getTopmostVisiblePage(); - - if (!currentPage.lastFocusedElement) { - return; - } - - if (cr.ui.FocusOutlineManager.forDocument(document).visible) { - currentPage.lastFocusedElement.focus(); - } - - currentPage.lastFocusedElement = null; - }, - - /** - * Find an enclosing section for an element if it exists. - * @param {Node} node Element to search. - * @return {Node} The section element, or null. - * @private - */ - findSectionForNode_(node) { - while (node = node.parentNode) { - if (node.nodeName == 'SECTION') { - return node; - } - } - return null; - }, - - /** - * Freezes/unfreezes the scroll position of the root page container. - * @param {boolean} freeze Whether the page should be frozen. - * @private - */ - setRootPageFrozen_(freeze) { - const container = $('page-container'); - if (container.classList.contains('frozen') == freeze) { - return; - } - - if (freeze) { - // Lock the width, since auto width computation may change. - container.style.width = window.getComputedStyle(container).width; - container.oldScrollTop = scrollTopForDocument(document); - container.classList.add('frozen'); - const verticalPosition = - container.getBoundingClientRect().top - container.oldScrollTop; - container.style.top = verticalPosition + 'px'; - this.updateFrozenElementHorizontalPosition_(container); - } else { - container.classList.remove('frozen'); - container.style.top = ''; - container.style.left = ''; - container.style.right = ''; - container.style.width = ''; - } - }, - - /** - * Called when the page is scrolled; moves elements that are position:fixed - * but should only behave as if they are fixed for vertical scrolling. - * @private - */ - handleScroll_() { - this.updateAllFrozenElementPositions_(); - }, - - /** - * Updates all frozen pages to match the horizontal scroll position. - * @private - */ - updateAllFrozenElementPositions_() { - const frozenElements = document.querySelectorAll('.frozen'); - for (let i = 0; i < frozenElements.length; i++) { - this.updateFrozenElementHorizontalPosition_(frozenElements[i]); - } - }, - - /** - * Updates the given frozen element to match the horizontal scroll position. - * @param {HTMLElement} e The frozen element to update. - * @private - */ - updateFrozenElementHorizontalPosition_(e) { - if (isRTL()) { - e.style.right = this.horizontalOffset + 'px'; - } else { - const scrollLeft = scrollLeftForDocument(document); - e.style.left = this.horizontalOffset - scrollLeft + 'px'; - } - }, - - /** - * Calls the given callback with each registered page. - * @param {boolean} includeRootPages Whether the callback should be called - * for the root pages. - * @param {function(cr.ui.pageManager.Page)} callback The callback. - * @private - */ - forEachPage_(includeRootPages, callback) { - let pageNames = Object.keys(this.registeredOverlayPages); - if (includeRootPages) { - pageNames = Object.keys(this.registeredPages).concat(pageNames); - } - - pageNames.forEach(function(name) { - callback.call( - this, - this.registeredOverlayPages[name] || this.registeredPages[name]); - }, this); - }, - }; + } + } /** * An observer of PageManager. - * @constructor */ - PageManager.Observer = function() {}; - - PageManager.Observer.prototype = { - /** - * Called when a page is being shown or has been hidden. - * @param {cr.ui.pageManager.Page} page The page being shown or hidden. - */ - onPageVisibilityChanged(page) {}, - + class PageManagerObserver { /** * Called when a new title should be set. * @param {string} title The title to set. */ - updateTitle(title) {}, + updateTitle(title) {} /** * Called when a page is navigated to. * @param {string} path The path of the page being visited. * @param {boolean} replace If true, allow no history events to be created. */ - updateHistory(path, replace) {}, - }; + updateHistory(path, replace) {} + } // Export - return {PageManager: PageManager}; + return {PageManager: PageManager, PageManagerObserver: PageManagerObserver}; }); + +cr.addSingletonGetter(cr.ui.pageManager.PageManager);
diff --git a/chrome/browser/resources/bluetooth_internals/sidebar.js b/chrome/browser/resources/bluetooth_internals/sidebar.js index abb3c3112..350d7d1 100644 --- a/chrome/browser/resources/bluetooth_internals/sidebar.js +++ b/chrome/browser/resources/bluetooth_internals/sidebar.js
@@ -10,42 +10,36 @@ /** @typedef {{pageName: string, text: string}} */ let SidebarItem; - /** @const {!Object}*/ - const PageManager = cr.ui.pageManager.PageManager; - /** * A side menu that lists the currently navigable pages. - * @constructor - * @param {!Element} sidebarDiv The div corresponding to the sidebar. - * @extends {cr.ui.pageManager.PageManager.Observer} */ - function Sidebar(sidebarDiv) { - /** @private {!Element} */ - this.sidebarDiv_ = sidebarDiv; - /** @private {!Element} */ - this.sidebarContent_ = - assert(this.sidebarDiv_.querySelector('.sidebar-content')); - /** @private {!Element} */ - this.sidebarList_ = assert(this.sidebarContent_.querySelector('ul')); + class Sidebar extends cr.ui.pageManager.PageManagerObserver { + /** @param {!Element} sidebarDiv The div corresponding to the sidebar. */ + constructor(sidebarDiv) { + super(); + /** @private {!Element} */ + this.sidebarDiv_ = sidebarDiv; + /** @private {!Element} */ + this.sidebarContent_ = + assert(this.sidebarDiv_.querySelector('.sidebar-content')); + /** @private {!Element} */ + this.sidebarList_ = assert(this.sidebarContent_.querySelector('ul')); - this.sidebarList_.querySelectorAll('li button').forEach(function(item) { - item.addEventListener('click', this.onItemClick_.bind(this)); - }, this); + this.sidebarList_.querySelectorAll('li button').forEach(function(item) { + item.addEventListener('click', this.onItemClick_.bind(this)); + }, this); - /** @private {!Element} */ - this.overlayDiv_ = assert(this.sidebarDiv_.querySelector('.overlay')); - this.overlayDiv_.addEventListener('click', this.close.bind(this)); + /** @private {!Element} */ + this.overlayDiv_ = assert(this.sidebarDiv_.querySelector('.overlay')); + this.overlayDiv_.addEventListener('click', this.close.bind(this)); - window.matchMedia('screen and (max-width: 600px)') - .addListener(function(query) { - if (!query.matches) { - this.close(); - } - }.bind(this)); - } - - Sidebar.prototype = { - __proto__: PageManager.Observer.prototype, + window.matchMedia('screen and (max-width: 600px)') + .addListener(function(query) { + if (!query.matches) { + this.close(); + } + }.bind(this)); + } /** * Adds a new list item to the sidebar using the given |item|. @@ -62,7 +56,7 @@ sidebarItem.appendChild(button); this.sidebarList_.appendChild(sidebarItem); - }, + } /** * Closes the sidebar. Only applies to layouts with window width <= 600px. @@ -71,7 +65,7 @@ this.sidebarDiv_.classList.remove('open'); document.body.style.overflow = ''; document.dispatchEvent(new CustomEvent('contentfocus')); - }, + } /** * Opens the sidebar. Only applies to layouts with window width <= 600px. @@ -80,7 +74,7 @@ document.body.style.overflow = 'hidden'; this.sidebarDiv_.classList.add('open'); document.dispatchEvent(new CustomEvent('contentblur')); - }, + } /** * Removes a sidebar item where |pageName| matches the item's pageName. @@ -90,7 +84,7 @@ pageName = pageName.toLowerCase(); const query = 'li[data-page-name="' + pageName + '"]'; this.sidebarList_.removeChild(this.sidebarList_.querySelector(query)); - }, + } /** * Called when a page is navigated to. @@ -101,7 +95,7 @@ this.sidebarContent_.querySelectorAll('li').forEach(function(item) { item.classList.toggle('selected', item.dataset.pageName === path); }); - }, + } /** * Switches the page based on which sidebar list button was clicked. @@ -110,9 +104,10 @@ */ onItemClick_(event) { this.close(); - PageManager.showPageByName(event.target.parentNode.dataset.pageName); - }, - }; + cr.ui.pageManager.PageManager.getInstance().showPageByName( + event.target.parentNode.dataset.pageName); + } + } return {Sidebar: Sidebar}; });
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/accessibility_common_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/accessibility_common_test.js index 94b019d..824975c7 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/accessibility_common_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/accessibility_common_test.js
@@ -33,8 +33,8 @@ // the extension to load. Extension load is required for this test suite to // have a place to be injected. GEN(` - base::Closure load_cb = - base::Bind(&AccessibilityManager::EnableAutoclick, + base::OnceClosure load_cb = + base::BindOnce(&AccessibilityManager::EnableAutoclick, base::Unretained(AccessibilityManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js index 02924ed..6cd0ff8 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/autoclick/autoclick_test.js
@@ -47,8 +47,8 @@ /** @override */ testGenPreamble() { GEN(` - base::Closure load_cb = - base::Bind(&AccessibilityManager::EnableAutoclick, + base::OnceClosure load_cb = + base::BindOnce(&AccessibilityManager::EnableAutoclick, base::Unretained(AccessibilityManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js index 07790995..f852948 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/magnifier/magnifier_test.js
@@ -57,8 +57,8 @@ testGenPreamble() { super.testGenPreamble(); GEN(` - base::Closure load_cb = - base::Bind(&MagnificationManager::SetMagnifierEnabled, + base::OnceClosure load_cb = + base::BindOnce(&MagnificationManager::SetMagnifierEnabled, base::Unretained(MagnificationManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js index d7bd899..0a88bb2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/chromevox_e2e_test_base.js
@@ -33,8 +33,8 @@ super.testGenPreamble(); GEN(` auto allow = extension_l10n_util::AllowGzippedMessagesAllowedForTest(); - base::Closure load_cb = - base::Bind(&AccessibilityManager::EnableSpokenFeedback, + base::OnceClosure load_cb = + base::BindOnce(&AccessibilityManager::EnableSpokenFeedback, base::Unretained(AccessibilityManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js index 55fd384..ab83487 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/common/testing/e2e_test_base.js
@@ -48,7 +48,7 @@ testGenPreambleCommon(extensionIdName, failOnConsoleError = true) { GEN(` - WaitForExtension(extension_misc::${extensionIdName}, load_cb); + WaitForExtension(extension_misc::${extensionIdName}, std::move(load_cb)); extensions::ExtensionHost* host = extensions::ProcessManager::Get(browser()->profile())
diff --git a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_e2e_test_base.js index ab4f777f..9023b24 100644 --- a/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/select_to_speak/select_to_speak_e2e_test_base.js
@@ -28,8 +28,8 @@ testGenPreamble() { super.testGenPreamble(); GEN(` - base::Closure load_cb = - base::Bind(&AccessibilityManager::SetSelectToSpeakEnabled, + base::OnceClosure load_cb = + base::BindOnce(&AccessibilityManager::SetSelectToSpeakEnabled, base::Unretained(AccessibilityManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js index ff235729..15f332f 100644 --- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access_e2e_test_base.js
@@ -27,8 +27,8 @@ testGenPreamble() { super.testGenPreamble(); GEN(` - base::Closure load_cb = - base::Bind(&AccessibilityManager::SetSwitchAccessEnabled, + base::OnceClosure load_cb = + base::BindOnce(&AccessibilityManager::SetSwitchAccessEnabled, base::Unretained(AccessibilityManager::Get()), true); `);
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 2e88a66a..22ab646 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -54,6 +54,7 @@ ":pin_setup", ":recommend_apps", ":saml_confirm_password", + ":screen_error_message", ":screen_tpm_error", ":screen_wrong_hwid", ":sync_consent", @@ -397,6 +398,16 @@ ] } +js_library("screen_error_message") { + deps = [ + "components:login_screen_behavior", + "components/oobe_adaptive_dialog:oobe_adaptive_dialog", + "components/oobe_dialog_host_behavior:oobe_dialog_host_behavior", + "components/oobe_i18n_behavior:oobe_i18n_behavior", + "//ui/login:display_manager_types", + ] +} + js_library("screen_tpm_error") { deps = [ "components:login_screen_behavior",
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js b/chrome/browser/resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js index 1f784570..f7d954e 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_dialog_host_behavior/oobe_dialog_host_behavior.js
@@ -17,8 +17,10 @@ * @param {string=} selector CSS selector (optional). */ propagateOnBeforeShow(selector) { - if (!selector) - selector = 'oobe-dialog,oobe-adaptive-dialog'; + if (!selector) { + selector = 'oobe-dialog,oobe-adaptive-dialog,oobe-content-dialog,' + + 'gaia-dialog,oobe-loading-dialog'; + } var screens = Polymer.dom(this.root).querySelectorAll(selector); for (var i = 0; i < screens.length; ++i) {
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.html b/chrome/browser/resources/chromeos/login/screen_error_message.html index 4d1807a..d4247dc 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.html +++ b/chrome/browser/resources/chromeos/login/screen_error_message.html
@@ -3,7 +3,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html"> -<link rel="import" href="/components/oobe_dialog.html"> +<link rel="import" href="/components/oobe_adaptive_dialog.html"> <link rel="import" href="/components/oobe_i18n_behavior.html"> <dom-module id="error-message-element"> @@ -45,13 +45,11 @@ animation: connecting-indicator-ellipsis 3s 1s infinite; } </style> - <oobe-dialog role="dialog" id="dialog" has-buttons> - <iron-icon icon="oobe-24:perm-scan-wifi" slot="oobe-icon"> + <oobe-adaptive-dialog role="dialog" id="dialog"> + <iron-icon icon="oobe-24:perm-scan-wifi" slot="icon"> </iron-icon> - <h1 slot="title"> - <div class="error-header" aria-live="assertive"> - [[getDialogTitle_(locale, errorState_, uiState_)]] - </div> + <h1 slot="title" aria-live="assertive"> + [[getDialogTitle_(locale, errorState_, uiState_)]] </h1> <div slot="subtitle"> <div hidden="[[!isOneOf_(errorState_, 'kiosk-online')]]"> @@ -140,7 +138,7 @@ <span id="connecting-indicator-ellipsis-3">.</span> </div> </div> - <div slot="footer" class="flex layout vertical"> + <div slot="content" class="flex layout vertical"> <div class="error-body" aria-live="assertive"> <div hidden="[[!isOneOf_(uiState_, 'ui-state-update', @@ -160,37 +158,35 @@ </oobe-back-button> </div> <div slot="bottom-buttons"> - <div class="layout horizontal"> - <oobe-text-button on-click="rebootButtonClicked" - text-key="rebootButton" - hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> - </oobe-text-button> - <oobe-text-button on-click="diagnoseButtonClicked" - text-key="diagnoseButton" - hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> - </oobe-text-button> - <oobe-text-button id="configureCertsButton" - on-click="configureCertsButtonClicked" - text-key="configureCertsButton" - hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> - </oobe-text-button> - <oobe-text-button id="continueButton" - on-click="continueButtonClicked" - text-key="continueButton" - hidden="[[!isOneOf_(errorState_, 'kiosk-online')]]"> - </oobe-text-button> - <oobe-text-button id="okButton" - on-click="okButtonClicked" - text-key="okButton" - hidden="[[!isOneOf_(uiState_, 'ui-state-rollback-error')]]"> - </oobe-text-button> - <oobe-text-button id="powerwashButton" - on-click="powerwashButtonClicked" - text-key="localStateErrorPowerwashButton" - hidden="[[!isOneOf_(uiState_, 'ui-state-local-state-error')]]"> - </oobe-text-button> - </div> + <oobe-text-button on-click="rebootButtonClicked" + text-key="rebootButton" + hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> + </oobe-text-button> + <oobe-text-button on-click="diagnoseButtonClicked" + text-key="diagnoseButton" + hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> + </oobe-text-button> + <oobe-text-button id="configureCertsButton" + on-click="configureCertsButtonClicked" + text-key="configureCertsButton" + hidden="[[!isOneOf_(uiState_, 'ui-state-kiosk-mode')]]"> + </oobe-text-button> + <oobe-text-button id="continueButton" + on-click="continueButtonClicked" + text-key="continueButton" + hidden="[[!isOneOf_(errorState_, 'kiosk-online')]]"> + </oobe-text-button> + <oobe-text-button id="okButton" + on-click="okButtonClicked" + text-key="okButton" + hidden="[[!isOneOf_(uiState_, 'ui-state-rollback-error')]]"> + </oobe-text-button> + <oobe-text-button id="powerwashButton" + on-click="powerwashButtonClicked" + text-key="localStateErrorPowerwashButton" + hidden="[[!isOneOf_(uiState_, 'ui-state-local-state-error')]]"> + </oobe-text-button> </div> - </oobe-dialog> + </oobe-adaptive-dialog> </template> </dom-module>
diff --git a/chrome/browser/resources/chromeos/login/screen_error_message.js b/chrome/browser/resources/chromeos/login/screen_error_message.js index 9f2d71d..1ae8dd9 100644 --- a/chrome/browser/resources/chromeos/login/screen_error_message.js +++ b/chrome/browser/resources/chromeos/login/screen_error_message.js
@@ -34,7 +34,8 @@ OFFLINE: 'offline', PROXY: 'proxy', AUTH_EXT_TIMEOUT: 'auth-ext-timeout', - KIOSK_ONLINE: 'kiosk-online' + KIOSK_ONLINE: 'kiosk-online', + NONE: '', }; // Possible error states of the screen. Must be in the same order as @@ -134,6 +135,9 @@ }, }, + /** + * @suppress {checkTypes} isOneOf_ allows arbitrary number of arguments. + */ getDialogTitle_() { if (this.isOneOf_(this.errorState_, 'portal', 'offline')) { return this.i18n('captivePortalTitle'); @@ -181,7 +185,7 @@ /** * Checks if the state ( === arguments[0]) is equal to one of the following * arguments. - * @param {!String} state State name. + * @param {!string} state State name. */ isOneOf_(state) { return Array.from(arguments).slice(1).includes(state); @@ -221,7 +225,7 @@ * @param {string} element_id * @param {string} string_id * @param {SanitizeInnerHtmlOpts=} opts - * @param {...any} anchor_ids + * @param {Array<string>|string} anchor_ids */ updateElementWithStringAndAnchorTag_( element_id, string_id, opts, ...anchor_ids) { @@ -252,7 +256,8 @@ element = element.parentElement; } for (const anchorId of anchor_ids) { - linkElement = this.shadowRoot.getElementById(anchorId); + /** @suppress {checkTypes} anchorId is a string */ + let linkElement = this.shadowRoot.getElementById(anchorId); if (hidden) { linkElement.setAttribute('hidden', ''); } else { @@ -337,6 +342,7 @@ /** * Event handler that is invoked just before the screen is shown. * @param {Object} data Screen init payload. + * @suppress {missingProperties} clearErrors() exists */ onBeforeShow(data) { cr.ui.Oobe.clearErrors(); @@ -345,6 +351,7 @@ /** * Event handler that is invoked just before the screen is hidden. + * @suppress {missingProperties} setOobeUIState() exists */ onBeforeHide() { Oobe.getInstance().setOobeUIState(OOBE_UI_STATE.HIDDEN); @@ -355,6 +362,7 @@ /** * Event handler for guest session launch. * @private + * @suppress {missingProperties} isOobeUI() exists */ launchGuestSession_() { if (Oobe.getInstance().isOobeUI()) { @@ -402,8 +410,8 @@ * Sets current error network state of the screen. * @param {string} network Name of the current network */ - setErrorStateNetwork(value) { - this.currentNetworkName_ = value; + setErrorStateNetwork(network) { + this.currentNetworkName_ = network; }, /**
diff --git a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js index 266d7b8c6..c42c6736 100644 --- a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js +++ b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -139,6 +139,14 @@ type: Boolean, value: false, }, + + /** + * @private {?nearbyShare.mojom.TransferStatus} + */ + lastTransferStatus_: { + type: nearbyShare.mojom.TransferStatus, + value: null, + }, }, listeners: { @@ -151,6 +159,19 @@ transferUpdateListener_: null, /** + * @return {!Object} The transferStatus, errorTitle, and errorDescription. + * @public + */ + getTransferInfoForTesting() { + return { + confirmationToken: this.confirmationToken_, + transferStatus: this.lastTransferStatus_, + errorTitle: this.errorTitle_, + errorDescription: this.errorDescription_, + }; + }, + + /** * @param {?nearbyShare.mojom.TransferUpdateListenerPendingReceiver} * transferUpdateListener * @private @@ -172,6 +193,7 @@ if (token) { this.confirmationToken_ = token; } + this.lastTransferStatus_ = status; switch (status) { case nearbyShare.mojom.TransferStatus.kAwaitingLocalConfirmation:
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js index dcca98f..0b50e2b 100644 --- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js +++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -170,6 +170,28 @@ this.resizeObserver_.disconnect(); }, + /** + * @return {!Array<!nearbyShare.mojom.ShareTarget>} + * @public + */ + getShareTargetsForTesting() { + return this.shareTargets_; + }, + + /** + * @param {nearbyShare.mojom.ShareTarget} shareTarget + * @return {boolean} True if share target found + * @public + */ + selectShareTargetForTesting(shareTarget) { + const token = tokenToString(shareTarget.id); + if (this.shareTargetMap_.has(token)) { + this.selectShareTarget_(this.shareTargetMap_.get(token)); + return true; + } + return false; + }, + /** @private */ onViewEnterStart_() { this.startDiscovery_(); @@ -276,26 +298,29 @@ /** @private */ onNext_() { - if (!this.selectedShareTarget) { - return; + if (this.selectedShareTarget) { + this.selectShareTarget_(this.selectedShareTarget); } + }, - getDiscoveryManager() - .selectShareTarget(this.selectedShareTarget.id) - .then(response => { - const {result, transferUpdateListener, confirmationManager} = - response; - if (result !== nearbyShare.mojom.SelectShareTargetResult.kOk) { - this.errorTitle_ = this.i18n('nearbyShareErrorCantShare'); - this.errorDescription_ = - this.i18n('nearbyShareErrorSomethingWrong'); - return; - } + /** + * Select the given share target and proceed to the confirmation page. + * @param {!nearbyShare.mojom.ShareTarget} shareTarget + * @private + */ + selectShareTarget_(shareTarget) { + getDiscoveryManager().selectShareTarget(shareTarget.id).then(response => { + const {result, transferUpdateListener, confirmationManager} = response; + if (result !== nearbyShare.mojom.SelectShareTargetResult.kOk) { + this.errorTitle_ = this.i18n('nearbyShareErrorCantShare'); + this.errorDescription_ = this.i18n('nearbyShareErrorSomethingWrong'); + return; + } - this.confirmationManager = confirmationManager; - this.transferUpdateListener = transferUpdateListener; - this.fire('change-page', {page: 'confirmation'}); - }); + this.confirmationManager = confirmationManager; + this.transferUpdateListener = transferUpdateListener; + this.fire('change-page', {page: 'confirmation'}); + }); }, /** @private */
diff --git a/chrome/browser/resources/new_tab_page/modules/drive/module.js b/chrome/browser/resources/new_tab_page/modules/drive/module.js index b144bb8..9c8fa1b 100644 --- a/chrome/browser/resources/new_tab_page/modules/drive/module.js +++ b/chrome/browser/resources/new_tab_page/modules/drive/module.js
@@ -30,8 +30,8 @@ * @return {!Promise<?DriveModuleElement>} */ async function createDriveElement() { - const {testString} = await DriveProxy.getInstance().handler.getTestString(); - console.log(testString); + console.log(await DriveProxy.getInstance().handler.getDocuments()); + // TODO(cr/1161362): Render results in module. return new DriveModuleElement(); }
diff --git a/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown.js b/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown.js index d4ce32b..e4b59a53 100644 --- a/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown.js +++ b/chrome/browser/resources/pdf/elements/viewer-toolbar-dropdown.js
@@ -61,9 +61,6 @@ observer: 'lowerBoundChanged_', }, - /** Unique id to identify this dropdown for metrics purposes. */ - metricsId: String, - /** Whether the dropdown must be selected before opening. */ openAfterSelect: { type: Boolean, @@ -131,10 +128,7 @@ if (!this.maxHeightValid_) { this.updateMaxHeight(); } - this.fire('dropdown-opened', this.metricsId); - } - if (this.dropdownOpen) { const listener = (e) => { if (e.path.includes(this)) { return;
diff --git a/chrome/browser/resources/pdf/metrics.js b/chrome/browser/resources/pdf/metrics.js index 8598bcb..a8678b0 100644 --- a/chrome/browser/resources/pdf/metrics.js +++ b/chrome/browser/resources/pdf/metrics.js
@@ -102,10 +102,6 @@ FIT_TO_PAGE_FIRST: 5, FIT_TO_PAGE: 6, - // Recorded when the bookmarks panel is opened. - OPEN_BOOKMARKS_PANEL_FIRST: 7, - OPEN_BOOKMARKS_PANEL: 8, - // Recorded when a bookmark is followed. FOLLOW_BOOKMARK_FIRST: 9, FOLLOW_BOOKMARK: 10, @@ -238,10 +234,6 @@ UserAction.FIT_TO_PAGE_FIRST, ], [ - UserAction.OPEN_BOOKMARKS_PANEL, - UserAction.OPEN_BOOKMARKS_PANEL_FIRST, - ], - [ UserAction.FOLLOW_BOOKMARK, UserAction.FOLLOW_BOOKMARK_FIRST, ],
diff --git a/chrome/browser/resources/pdf/pdf_viewer.html b/chrome/browser/resources/pdf/pdf_viewer.html index f24b385..ed7f613 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.html +++ b/chrome/browser/resources/pdf/pdf_viewer.html
@@ -133,7 +133,6 @@ </if> on-change-page="onChangePage_" on-display-annotations-changed="onDisplayAnnotationsChanged_" - on-dropdown-opened="onDropdownOpened_" on-fit-to-changed="onFitToChanged" on-present-click="onPresentClick_" on-properties-click="onPropertiesClick_"
diff --git a/chrome/browser/resources/pdf/pdf_viewer.js b/chrome/browser/resources/pdf/pdf_viewer.js index 888c7e8..5105c819 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.js +++ b/chrome/browser/resources/pdf/pdf_viewer.js
@@ -1062,16 +1062,6 @@ } /** - * @param {!CustomEvent<string>} e - * @private - */ - onDropdownOpened_(e) { - if (e.detail === 'bookmarks') { - record(UserAction.OPEN_BOOKMARKS_PANEL); - } - } - - /** * @param {!CustomEvent<!{newtab: boolean, uri: string}>} e * @private */
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js index c6b4c7a2..e621722 100644 --- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js +++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js
@@ -32,10 +32,14 @@ * @private */ onAppChanged_: async function() { - const {messages: messages} = - await app_management.BrowserProxy.getInstance() - .handler.getExtensionAppPermissionMessages(this.app_.id); - this.messages_ = messages; + try { + const {messages: messages} = + await app_management.BrowserProxy.getInstance() + .handler.getExtensionAppPermissionMessages(this.app_.id); + this.messages_ = messages; + } catch (err) { + console.log(err); + } }, onClickExtensionsSettingsButton_() {
diff --git a/chrome/browser/resources/signin/BUILD.gn b/chrome/browser/resources/signin/BUILD.gn index 971a43a7..7be31ec 100644 --- a/chrome/browser/resources/signin/BUILD.gn +++ b/chrome/browser/resources/signin/BUILD.gn
@@ -6,10 +6,7 @@ import("//tools/polymer/html_to_js.gni") group("closure_compile") { - deps = [ - "sync_confirmation:closure_compile", - "work_profile_confirmation:closure_compile", - ] + deps = [ "sync_confirmation:closure_compile" ] if (!is_chromeos_ash) { deps += [ "dice_web_signin_intercept:closure_compile", @@ -26,7 +23,6 @@ public_deps = [ ":web_components_local", "sync_confirmation:web_components", - "work_profile_confirmation:web_components", ] if (!is_chromeos_ash) { public_deps += [
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/BUILD.gn b/chrome/browser/resources/signin/work_profile_confirmation/BUILD.gn deleted file mode 100644 index df83c07..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/BUILD.gn +++ /dev/null
@@ -1,44 +0,0 @@ -# Copyright 2021 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("//third_party/closure_compiler/compile_js.gni") -import("//tools/polymer/html_to_js.gni") - -js_type_check("closure_compile") { - is_polymer3 = true - deps = [ - ":work_profile_confirmation", - ":work_profile_confirmation_app", - ":work_profile_confirmation_browser_proxy", - ] -} - -js_library("work_profile_confirmation") { - deps = [ - ":work_profile_confirmation_browser_proxy", - "//ui/webui/resources/js:cr.m", - ] -} - -js_library("work_profile_confirmation_app") { - deps = [ - ":work_profile_confirmation_browser_proxy", - "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/js:i18n_behavior.m", - "//ui/webui/resources/js:load_time_data.m", - "//ui/webui/resources/js:web_ui_listener_behavior.m", - ] -} - -js_library("work_profile_confirmation_browser_proxy") { - deps = [ "//ui/webui/resources/js:cr.m" ] - externs_list = [ - "$externs_path/chrome_send.js", - "$externs_path/metrics_private.js", - ] -} - -html_to_js("web_components") { - js_files = [ "work_profile_confirmation_app.js" ] -}
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google.png b/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google.png deleted file mode 100644 index f7602a5..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google_2x.png b/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google_2x.png deleted file mode 100644 index 76d09858..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/images/ic_google_2x.png +++ /dev/null Binary files differ
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration.svg b/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration.svg deleted file mode 100644 index 324434e2..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 168"><defs><style>.cls-1{fill:#fff}.cls-3{fill:#e8e9eb}.cls-5{fill:#bdc0c5}</style></defs><path class="cls-1" d="M256 89a41 41 0 0 0-41 39.13h82A41 41 0 0 0 256 89z"/><path d="M97.76 72H103c0-10.83 2.9-19.34 8.63-25.3 9-9.37 22.15-9.41 22.28-9.41L134 32c-.62 0-15.32 0-25.84 10.91-6.79 6.99-10.4 16.78-10.4 29.09z" fill="#4285f4"/><path class="cls-3" d="M82.41 102.42A35.27 35.27 0 0 1 67 106.75V112a40.36 40.36 0 0 0 18-5c8.23-4.61 18-14.42 18-35h-5.24c0 14.48-5.16 24.71-15.35 30.42zm61.37-69.15v5.33h7.41a6.35 6.35 0 0 1-2.77 4.15 8.28 8.28 0 0 1-12.36-4.35 8.29 8.29 0 0 1 7.71-10.91 7.52 7.52 0 0 1 5.23 2.05l4-3.95a13.22 13.22 0 0 0-9.22-3.59 13.75 13.75 0 0 0-12.3 7.6 13.64 13.64 0 0 0 0 12.35 13.76 13.76 0 0 0 12.3 7.59 13.15 13.15 0 0 0 9.12-3.33 13.46 13.46 0 0 0 4.1-10.12 15.82 15.82 0 0 0-.25-2.82zM433 109h18v-8.48a11 11 0 0 0-18 8.48zm58-49.51h-30.2a5.6 5.6 0 0 0-5.59 5.59v72.36a5.6 5.6 0 0 0 5.59 5.56H491a5.6 5.6 0 0 0 5.59-5.59V65.08a5.6 5.6 0 0 0-5.59-5.59zm4.89 77.95a4.89 4.89 0 0 1-4.89 4.89h-30.2a4.89 4.89 0 0 1-4.89-4.89V65.08a4.89 4.89 0 0 1 4.89-4.89H491a4.89 4.89 0 0 1 4.89 4.89zM418.43 92.8c6.1-10.92 17.06-16.46 32.56-16.46v-5.62c-22 0-32.53 10.52-37.46 19.34a43.35 43.35 0 0 0-5.36 19.27h5.62a37.88 37.88 0 0 1 4.64-16.53zM342 50.45a9.28 9.28 0 0 1-8.17-4.86l-9.38-16.21A21.84 21.84 0 0 0 321 40.92a21 21 0 0 0 17.56 20.86l7-11.94a10.66 10.66 0 0 1-3.56.61z"/><path class="cls-3" d="M347.91 33.67a9.58 9.58 0 0 1 3.54 7.33 8.47 8.47 0 0 1-1.28 4.61L340.66 62h1.26a20.93 20.93 0 0 0 15.21-6.49h-2.81a8.64 8.64 0 0 1 7.82-8.6 20.8 20.8 0 0 0 .87-5.82 21.63 21.63 0 0 0-1.23-7.35z"/><path class="cls-3" d="M342 31.55l18.69.07a20.52 20.52 0 0 0-13.78-11A50.49 50.49 0 0 0 341 .16V0h-6c.6.9 1.14 1.79 1.62 2.67A44.81 44.81 0 0 1 341.83 20a20.87 20.87 0 0 0-15.94 7.49l6.88 12a9.47 9.47 0 0 1 9.23-7.94z"/><circle class="cls-3" cx="342" cy="41" r="7.35" transform="rotate(-89.77 342 40.997)"/><path class="cls-3" d="M258.56 166.88A37.06 37.06 0 0 1 221.77 144H226v-8.48a11 11 0 0 0-6.86-2.51v-.48a37 37 0 0 1 34.36-39.47l-.07-1a38 38 0 0 0-35.29 40.53v.45A11 11 0 0 0 208 144h12.68a38 38 0 0 0 73.21-11.35l-1-.07a37 37 0 0 1-34.33 34.3z"/><path d="M62.72 48.5H0v88.33h67.51V53.28a4.78 4.78 0 0 0-4.79-4.78z" fill="#f4f4f4"/><path class="cls-5" d="M68 53.28A5.3 5.3 0 0 0 62.72 48H0v1h62.72A4.28 4.28 0 0 1 67 53.28v83.06H0v1h68zM0 143.01h86v.99H0zm451.72-3.91V63.73a7.9 7.9 0 0 1 7.89-7.89h25.07v-.7h-25.06a8.6 8.6 0 0 0-8.6 8.59v75.37a8.6 8.6 0 0 0 8.6 8.59H472V147h-12.38a7.9 7.9 0 0 1-7.9-7.9zm43.5-83.55v.75a7.9 7.9 0 0 1 5.26 7.43v75.37a7.9 7.9 0 0 1-7.89 7.89H480.2v.7h12.39a8.6 8.6 0 0 0 8.6-8.59V63.73a8.61 8.61 0 0 0-5.97-8.18z"/><path d="M499.48 7.6c-11.6 11.7-11.6 28-11.59 28.74 0 .15 0 14.78-10 24.78-6.34 6.37-15.38 9.6-26.89 9.6v5.62c13.08 0 23.48-3.8 30.91-11.3 11.6-11.7 11.6-28 11.59-28.74 0-.15 0-14.78 10-24.78a29.73 29.73 0 0 1 8.5-5.94V0h-1.28a35.46 35.46 0 0 0-11.24 7.6z" fill="#34a751"/><path class="cls-1" d="M62.56 99.28a11.77 11.77 0 0 0-9.48 5 7.42 7.42 0 0 0-2.7-.52c-4.49 0-8.12 4-8.12 9h32.49c0-7.46-5.46-13.48-12.19-13.48z"/><path class="cls-5" d="M68 70v.53a8.35 8.35 0 0 1 8.44 7.94H68V79h9v-.26A8.88 8.88 0 0 0 68 70zm98.5 11a2 2 0 0 1 2-2h4.72v-2a2.55 2.55 0 0 1 5.11 0v2h.49v-2a3 3 0 0 0-6.09 0v1.44h-4.23A2.48 2.48 0 0 0 166 81v4.5h.49zm20.5 4.19h-1.43V81a2.49 2.49 0 0 0-2.57-2.52h-3.25V79H183a2 2 0 0 1 2 2v4.72h2a2.55 2.55 0 0 1 0 5.11h-2v.49h2a3 3 0 0 0 0-6.09zm-2 10.33a2 2 0 0 1-2 2h-4v-1.44a3.27 3.27 0 0 0-6.54 0V98h.54v-1.92a2.78 2.78 0 0 1 5.56 0V98H183a2.49 2.49 0 0 0 2.48-2.48v-3.26H185zm-18.51 0v-4h1.43a3.27 3.27 0 1 0 0-6.54h-.24v.49h.24a2.78 2.78 0 0 1 0 5.56H166v4.5a2.49 2.49 0 0 0 2.48 2.47h3v-.49h-3a2 2 0 0 1-1.99-1.99zM231.5 32.3v14.81h2.64V32.3zm2.15 14.32H232V32.79h1.66z"/><path class="cls-5" d="M234.61 28h-27.22a2.4 2.4 0 0 0-2.39 2.39v3.1h.49v-3.1a1.9 1.9 0 0 1 1.9-1.9h27.21a1.9 1.9 0 0 1 1.9 1.9V49a1.9 1.9 0 0 1-1.9 1.9h-27.21a1.9 1.9 0 0 1-1.9-1.9v-6.52l1.87 2.58 2.14-1.55-2.13-2.93 3.44-1.12-.81-2.51-3.43 1.11v-3.62H205v.49h1.07v3.8l3.61-1.17.51 1.57-3.62 1.17 2.24 3.08-1.34 1L205 41v8a2.4 2.4 0 0 0 2.39 2.39h27.21A2.4 2.4 0 0 0 237 49V30.39a2.4 2.4 0 0 0-2.39-2.39z"/><path class="cls-5" d="M219.68 34.44v3.62l-3.43-1.11-.82 2.51 3.44 1.12-2.13 2.93 2.14 1.55 2.12-2.92 2.12 2.92 2.14-1.55-2.13-2.93 3.44-1.12-.82-2.51-3.43 1.11v-3.62zm5.75 3.13l.51 1.57-3.61 1.17 2.24 3.08-1.34 1-2.23-3.08-2.23 3.06-1.34-1 2.24-3.08-3.62-1.17.51-1.57 3.61 1.17v-3.8h1.66v3.8zm71.32 32.29h-.5v3.75l-5.2-5.2 5.2-5.21v3.76h.5V62l-6.41 6.41 6.41 6.41v-4.96zm-.5 17.42h.5v-3.75l5.2 5.2-5.2 5.21v-3.75h-.5v4.95l6.41-6.41-6.41-6.41v4.96z"/><path class="cls-5" d="M296.5 68.07v.5a10 10 0 0 1 8.62 15.08l.43.25a10.5 10.5 0 0 0-9-15.83zm0 20.5a10 10 0 0 1-8.62-15.08l-.43-.25a10.5 10.5 0 0 0 9 15.83zM47 31.7V20.58H23.49v-3a2.1 2.1 0 0 1 2.09-2.11H44.4a2.11 2.11 0 0 1 2.11 2.11v2H47v-2A2.6 2.6 0 0 0 44.4 15H25.6a2.59 2.59 0 0 0-2.6 2.6v3.48h23.51V31.7a2.11 2.11 0 0 1-2.11 2.11H25.6a2.11 2.11 0 0 1-2.11-2.11v-8h22.45v-.5H23v8.5a2.6 2.6 0 0 0 2.6 2.6h18.8a2.6 2.6 0 0 0 2.6-2.6zm307 69.85a4.78 4.78 0 1 0 4.78 4.78 4.79 4.79 0 0 0-4.78-4.78zm0 9.06a4.28 4.28 0 1 1 4.28-4.28 4.28 4.28 0 0 1-4.28 4.29z"/><path class="cls-5" d="M365.9 102.27l-2.41-4.18a.88.88 0 0 0-1.05-.38l-2.88 1.16a9 9 0 0 0-1.85-1.07l-.43-3.06a.85.85 0 0 0-.85-.73h-4.84a.84.84 0 0 0-.84.73l-.43 3.06a9.33 9.33 0 0 0-1.85 1.07l-2.88-1.16a.85.85 0 0 0-1 .38l-2.42 4.19a.84.84 0 0 0 .22 1.09l2.44 1.9a7.56 7.56 0 0 0-.09 1.07 8 8 0 0 0 .07 1.07l-2.44 1.91a.88.88 0 0 0-.21 1.09l2.41 4.18a.87.87 0 0 0 1.05.38l2.88-1.16a9 9 0 0 0 1.85 1.07l.44 3.07a.87.87 0 0 0 .85.72h4.84a.83.83 0 0 0 .84-.73l.43-3.06a9.34 9.34 0 0 0 1.85-1.07l2.88 1.16a.85.85 0 0 0 1-.38l2.42-4.19a.84.84 0 0 0-.22-1.09l-2.41-1.91a9.82 9.82 0 0 0 .06-1.07 7.93 7.93 0 0 0-.07-1.07l2.44-1.91a.88.88 0 0 0 .2-1.08zm-.52.7l-2.67 2.09v.15a7.28 7.28 0 0 1 .09 1.14 9.76 9.76 0 0 1-.07 1.15v.14l2.64 2.09a.33.33 0 0 1 .08.44l-2.45 4.17a.34.34 0 0 1-.43.16l-3.14-1.26-.11.09a8.89 8.89 0 0 1-2 1.15l-.13.05-.47 3.36a.33.33 0 0 1-.34.29h-4.84a.36.36 0 0 1-.36-.3l-.47-3.34-.13-.06a8.58 8.58 0 0 1-2-1.15l-.11-.09-3.12 1.26a.36.36 0 0 1-.44-.16l-2.41-4.18a.37.37 0 0 1 .08-.45l2.67-2.09v-.15a7.4 7.4 0 0 1-.09-1.14 7.28 7.28 0 0 1 .1-1.14v-.15l-2.62-2.04a.33.33 0 0 1-.08-.44l2.44-4.23a.34.34 0 0 1 .43-.16l3.14 1.26.11-.09a8.9 8.9 0 0 1 2-1.15l.13-.05.47-3.34a.34.34 0 0 1 .34-.3h4.84a.35.35 0 0 1 .36.3l.47 3.35.13.05a8.58 8.58 0 0 1 2 1.15l.11.09 3.12-1.26a.36.36 0 0 1 .44.16l2.41 4.18a.37.37 0 0 1-.13.48zM62.56 99a12 12 0 0 0-9.56 5 7.64 7.64 0 0 0-2.62-.47c-4.62 0-8.38 4.14-8.38 9.24v.23h33v-.28C75 105.15 69.42 99 62.56 99zm11.93 13.44h-32c.13-4.66 3.61-8.4 7.87-8.4a7.19 7.19 0 0 1 2.62.5l.17.07.11-.15a11.5 11.5 0 0 1 9.28-4.9c6.52 0 11.81 5.75 11.95 12.88zm301.42-70.16a13.18 13.18 0 0 0-10.17 4.77A8.89 8.89 0 0 0 354 55.51v.27h35.1v-.27a13.24 13.24 0 0 0-13.19-13.23zm-21.33 13a8.35 8.35 0 0 1 11.15-7.61l.18.06.12-.15a12.69 12.69 0 0 1 22.56 7.7zM441 33.51a2.5 2.5 0 1 0-2.5-2.5 2.51 2.51 0 0 0 2.5 2.5zm0-4.51a2 2 0 1 1-2 2 2 2 0 0 1 2-2z"/><path class="cls-5" d="M441 38a7 7 0 0 0 6.53-4.49H452V38h5v-4.49h2v-5h-11.47A7 7 0 1 0 441 38zm0-13.48a6.48 6.48 0 0 1 6.11 4.32l.06.17h11.32v4h-2v4.49h-4V33h-5.3l-.06.17a6.48 6.48 0 1 1-6.13-8.65z"/><path d="M256 92v1a37 37 0 0 1 37 37h1a38 38 0 0 0-38-38z" fill="#f7bb2a"/><path class="cls-1" d="M411.08 121a16.81 16.81 0 0 0-13.08 6.27 11.21 11.21 0 0 0-15 10.58h44.93A16.85 16.85 0 0 0 411.08 121z"/><path class="cls-3" d="M411.08 121.7a16.17 16.17 0 0 1 16.13 15.44h-43.48a10.5 10.5 0 0 1 14-9.22l.47.17.31-.39a16.09 16.09 0 0 1 12.56-6m0-.7a16.81 16.81 0 0 0-13.07 6.27 11.21 11.21 0 0 0-15 10.58h44.93A16.85 16.85 0 0 0 411.08 121z"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration_dark.svg b/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration_dark.svg deleted file mode 100644 index e75815ea..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/images/work_profile_confirmation_illustration_dark.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg width="512" height="168" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#202124" d="M0 0h512v128H0z"/><path d="M256 89c-21.933-.023-40 17.22-41 39.13h82c-1-21.91-19.067-39.153-41-39.13z" fill="#292A2D" fill-rule="nonzero"/><path d="M97.76 72H103c0-10.83 2.9-19.34 8.63-25.3 9-9.37 22.15-9.41 22.28-9.41L134 32c-.62 0-15.32 0-25.84 10.91-6.79 6.99-10.4 16.78-10.4 29.09z" fill="#8AB4F8" fill-rule="nonzero"/><path d="M82.41 102.42A35.27 35.27 0 0 1 67 106.75V112a40.36 40.36 0 0 0 18-5c8.23-4.61 18-14.42 18-35h-5.24c0 14.48-5.16 24.71-15.35 30.42zm61.37-69.15v5.33h7.41a6.35 6.35 0 0 1-2.77 4.15 8.28 8.28 0 0 1-12.36-4.35 8.29 8.29 0 0 1 7.71-10.91 7.52 7.52 0 0 1 5.23 2.05l4-3.95a13.22 13.22 0 0 0-9.22-3.59 13.75 13.75 0 0 0-12.3 7.6 13.64 13.64 0 0 0 0 12.35 13.76 13.76 0 0 0 12.3 7.59 13.15 13.15 0 0 0 9.12-3.33 13.46 13.46 0 0 0 4.1-10.12 15.82 15.82 0 0 0-.25-2.82h-12.97zM433 109h18v-8.48a11 11 0 0 0-18 8.48z" fill="#3C4043" fill-rule="nonzero"/><path d="M491 59.49h-30.2a5.6 5.6 0 0 0-5.59 5.59v72.36a5.6 5.6 0 0 0 5.59 5.56H491a5.6 5.6 0 0 0 5.59-5.59V65.08a5.6 5.6 0 0 0-5.59-5.59zm4.89 77.95c0 2.7-2.19 4.89-4.89 4.89h-30.2a4.89 4.89 0 0 1-4.89-4.89V65.08c0-2.7 2.19-4.89 4.89-4.89H491c2.7 0 4.89 2.19 4.89 4.89v72.36z" fill="#5F6368" fill-rule="nonzero"/><path d="M418.43 92.8c6.1-10.92 17.06-16.46 32.56-16.46v-5.62c-22 0-32.53 10.52-37.46 19.34a43.35 43.35 0 0 0-5.36 19.27h5.62a37.88 37.88 0 0 1 4.64-16.53zM342 50.45a9.28 9.28 0 0 1-8.17-4.86l-9.38-16.21A21.84 21.84 0 0 0 321 40.92c-.07 10.325 7.375 19.169 17.56 20.86l7-11.94a10.66 10.66 0 0 1-3.56.61z" fill="#3C4043" fill-rule="nonzero"/><path d="M347.91 33.67a9.58 9.58 0 0 1 3.54 7.33 8.47 8.47 0 0 1-1.28 4.61L340.66 62h1.26a20.93 20.93 0 0 0 15.21-6.49h-2.81a8.64 8.64 0 0 1 7.82-8.6 20.8 20.8 0 0 0 .87-5.82 21.63 21.63 0 0 0-1.23-7.35l-13.87-.07z" fill="#3C4043" fill-rule="nonzero"/><path d="M342 31.55l18.69.07a20.52 20.52 0 0 0-13.78-11A50.49 50.49 0 0 0 341 .16V0h-6c.6.9 1.14 1.79 1.62 2.67A44.81 44.81 0 0 1 341.83 20a20.87 20.87 0 0 0-15.94 7.49l6.88 12a9.47 9.47 0 0 1 9.23-7.94z" fill="#3C4043" fill-rule="nonzero"/><circle fill="#3C4043" fill-rule="nonzero" transform="rotate(-89.77 342.003 40.997)" cx="342.003" cy="40.997" r="7.35"/><path d="M258.56 166.88A37.06 37.06 0 0 1 221.77 144H226v-8.48a11 11 0 0 0-6.86-2.51v-.48a37 37 0 0 1 34.36-39.47l-.07-1a38 38 0 0 0-35.29 40.53v.45A11 11 0 0 0 208 144h12.68c6.553 16.464 23.616 26.214 41.128 23.499 17.511-2.715 30.822-17.173 32.082-34.849l-1-.07c-1.3 18.39-15.94 33.016-34.33 34.3z" fill="#5F6368" fill-rule="nonzero"/><path d="M62.72 48.5H0v88.33h67.51V53.28a4.78 4.78 0 0 0-4.79-4.78z" fill="#202124" fill-rule="nonzero"/><path d="M68 53.28A5.3 5.3 0 0 0 62.72 48H0v1h62.72A4.28 4.28 0 0 1 67 53.28v83.06H0v1h68V53.28zM0 143.01h86v.99H0z" fill="#3C4043" fill-rule="nonzero"/><path d="M451.72 139.1V63.73a7.9 7.9 0 0 1 7.89-7.89h25.07v-.7h-25.06a8.6 8.6 0 0 0-8.6 8.59v75.37a8.6 8.6 0 0 0 8.6 8.59H472V147h-12.38a7.9 7.9 0 0 1-7.9-7.9zm43.5-83.55v.75a7.9 7.9 0 0 1 5.26 7.43v75.37a7.9 7.9 0 0 1-7.89 7.89H480.2v.7h12.39a8.6 8.6 0 0 0 8.6-8.59V63.73a8.61 8.61 0 0 0-5.97-8.18z" fill="#5F6368" fill-rule="nonzero"/><path d="M499.48 7.6c-11.6 11.7-11.6 28-11.59 28.74 0 .15 0 14.78-10 24.78-6.34 6.37-15.38 9.6-26.89 9.6v5.62c13.08 0 23.48-3.8 30.91-11.3 11.6-11.7 11.6-28 11.59-28.74 0-.15 0-14.78 10-24.78a29.73 29.73 0 0 1 8.5-5.94V0h-1.28a35.46 35.46 0 0 0-11.24 7.6z" fill="#81C995" fill-rule="nonzero"/><path d="M62.56 99.28a11.77 11.77 0 0 0-9.48 5 7.42 7.42 0 0 0-2.7-.52c-4.49 0-8.12 4-8.12 9h32.49c0-7.46-5.46-13.48-12.19-13.48z" fill="#292A2D" fill-rule="nonzero"/><path d="M68 70v.53a8.35 8.35 0 0 1 8.44 7.94H68V79h9v-.26A8.88 8.88 0 0 0 68 70zm98.5 11a2 2 0 0 1 2-2h4.72v-2a2.555 2.555 0 1 1 5.11 0v2h.49v-2a3.045 3.045 0 0 0-6.09 0v1.44h-4.23A2.48 2.48 0 0 0 166 81v4.5h.49l.01-4.5zm20.5 4.19h-1.43V81a2.49 2.49 0 0 0-2.57-2.52h-3.25V79H183a2 2 0 0 1 2 2v4.72h2a2.555 2.555 0 1 1 0 5.11h-2v.49h2a3.045 3.045 0 0 0 0-6.09v-.04zm-2 10.33a2 2 0 0 1-2 2h-4v-1.44a3.27 3.27 0 0 0-6.54 0V98h.54v-1.92a2.78 2.78 0 1 1 5.56 0V98H183a2.49 2.49 0 0 0 2.48-2.48v-3.26H185v3.26zm-18.51 0v-4h1.43a3.27 3.27 0 0 0 0-6.54h-.24v.49h.24a2.78 2.78 0 1 1 0 5.56H166v4.5a2.49 2.49 0 0 0 2.48 2.47h3v-.49h-3a2 2 0 0 1-1.99-1.99zM231.5 32.3v14.81h2.64V32.3h-2.64zm2.15 14.32H232V32.79h1.66l-.01 13.83z" fill="#5F6368" fill-rule="nonzero"/><path d="M234.61 28h-27.22a2.4 2.4 0 0 0-2.39 2.39v3.1h.49v-3.1c0-1.05.85-1.9 1.9-1.9h27.21a1.9 1.9 0 0 1 1.9 1.9V49a1.9 1.9 0 0 1-1.9 1.9h-27.21a1.9 1.9 0 0 1-1.9-1.9v-6.52l1.87 2.58 2.14-1.55-2.13-2.93 3.44-1.12-.81-2.51-3.43 1.11v-3.62H205v.49h1.07v3.8l3.61-1.17.51 1.57-3.62 1.17 2.24 3.08-1.34 1L205 41v8a2.4 2.4 0 0 0 2.39 2.39h27.21A2.4 2.4 0 0 0 237 49V30.39a2.4 2.4 0 0 0-2.39-2.39z" fill="#5F6368" fill-rule="nonzero"/><path d="M219.68 34.44v3.62l-3.43-1.11-.82 2.51 3.44 1.12-2.13 2.93 2.14 1.55 2.12-2.92 2.12 2.92 2.14-1.55-2.13-2.93 3.44-1.12-.82-2.51-3.43 1.11v-3.62h-2.64zm5.75 3.13l.51 1.57-3.61 1.17 2.24 3.08-1.34 1-2.23-3.08-2.23 3.06-1.34-1 2.24-3.08-3.62-1.17.51-1.57 3.61 1.17v-3.8h1.66v3.8l3.6-1.15zm70.82 32.29v3.75l-5.2-5.2 5.2-5.21v3.76h.5V62l-6.41 6.41 6.41 6.41v-4.96zm0 17.42h.5v-3.75l5.2 5.2-5.2 5.21v-3.75h-.5v4.95l6.41-6.41-6.41-6.41z" fill="#5F6368" fill-rule="nonzero"/><path d="M296.5 68.07v.5a10 10 0 0 1 8.62 15.08l.43.25a10.5 10.5 0 0 0-9-15.83h-.05zm0 20.5a10 10 0 0 1-8.62-15.08l-.43-.25a10.5 10.5 0 0 0 9 15.83l.05-.5zM47 31.7V20.58H23.49v-3a2.1 2.1 0 0 1 2.09-2.11H44.4a2.11 2.11 0 0 1 2.11 2.11v2H47v-2A2.6 2.6 0 0 0 44.4 15H25.6a2.59 2.59 0 0 0-2.6 2.6v3.48h23.51V31.7a2.11 2.11 0 0 1-2.11 2.11H25.6a2.11 2.11 0 0 1-2.11-2.11v-8h22.45v-.5H23v8.5a2.6 2.6 0 0 0 2.6 2.6h18.8a2.6 2.6 0 0 0 2.6-2.6zm307 69.85a4.78 4.78 0 1 0 4.78 4.78 4.79 4.79 0 0 0-4.78-4.78zm0 9.06a4.28 4.28 0 1 1 4.28-4.28 4.28 4.28 0 0 1-4.28 4.29v-.01z" fill="#5F6368" fill-rule="nonzero"/><path d="M365.9 102.27l-2.41-4.18a.88.88 0 0 0-1.05-.38l-2.88 1.16a9 9 0 0 0-1.85-1.07l-.43-3.06a.85.85 0 0 0-.85-.73h-4.84a.84.84 0 0 0-.84.73l-.43 3.06a9.33 9.33 0 0 0-1.85 1.07l-2.88-1.16a.85.85 0 0 0-1 .38l-2.42 4.19a.84.84 0 0 0 .22 1.09l2.44 1.9a7.56 7.56 0 0 0-.09 1.07 8 8 0 0 0 .07 1.07l-2.44 1.91a.88.88 0 0 0-.21 1.09l2.41 4.18a.87.87 0 0 0 1.05.38l2.88-1.16a9 9 0 0 0 1.85 1.07l.44 3.07a.87.87 0 0 0 .85.72h4.84a.83.83 0 0 0 .84-.73l.43-3.06a9.34 9.34 0 0 0 1.85-1.07l2.88 1.16a.85.85 0 0 0 1-.38l2.42-4.19a.84.84 0 0 0-.22-1.09l-2.41-1.91c.04-.355.06-.713.06-1.07a7.93 7.93 0 0 0-.07-1.07l2.44-1.91a.88.88 0 0 0 .2-1.08zm-.52.7l-2.67 2.09v.15c.06.377.09.758.09 1.14 0 .384-.024.768-.07 1.15v.14l2.64 2.09a.33.33 0 0 1 .08.44l-2.45 4.17a.34.34 0 0 1-.43.16l-3.14-1.26-.11.09a8.89 8.89 0 0 1-2 1.15l-.13.05-.47 3.36a.33.33 0 0 1-.34.29h-4.84a.36.36 0 0 1-.36-.3l-.47-3.34-.13-.06a8.58 8.58 0 0 1-2-1.15l-.11-.09-3.12 1.26a.36.36 0 0 1-.44-.16l-2.41-4.18a.37.37 0 0 1 .08-.45l2.67-2.09v-.15a7.4 7.4 0 0 1-.09-1.14 7.28 7.28 0 0 1 .1-1.14v-.15l-2.62-2.04a.33.33 0 0 1-.08-.44l2.44-4.23a.34.34 0 0 1 .43-.16l3.14 1.26.11-.09a8.9 8.9 0 0 1 2-1.15l.13-.05.47-3.34a.34.34 0 0 1 .34-.3h4.84a.35.35 0 0 1 .36.3l.47 3.35.13.05a8.58 8.58 0 0 1 2 1.15l.11.09 3.12-1.26a.36.36 0 0 1 .44.16l2.41 4.18a.37.37 0 0 1-.13.48l.01-.03zM62.56 99a12 12 0 0 0-9.56 5 7.64 7.64 0 0 0-2.62-.47c-4.62 0-8.38 4.14-8.38 9.24v.23h33v-.28C75 105.15 69.42 99 62.56 99zm11.93 13.44h-32c.13-4.66 3.61-8.4 7.87-8.4a7.19 7.19 0 0 1 2.62.5l.17.07.11-.15a11.5 11.5 0 0 1 9.28-4.9c6.52 0 11.81 5.75 11.95 12.88zm301.42-70.16a13.18 13.18 0 0 0-10.17 4.77A8.89 8.89 0 0 0 354 55.51v.27h35.1v-.27c-.005-7.289-5.901-13.202-13.19-13.23zm-21.33 13a8.35 8.35 0 0 1 11.15-7.61l.18.06.12-.15a12.69 12.69 0 0 1 22.56 7.7h-34.01zM441 33.51a2.5 2.5 0 1 0-2.5-2.5 2.51 2.51 0 0 0 2.5 2.5zm0-4.51a2 2 0 1 1 0 4 2 2 0 0 1 0-4z" fill="#5F6368" fill-rule="nonzero"/><path d="M441 38a7 7 0 0 0 6.53-4.49H452V38h5v-4.49h2v-5h-11.47A7 7 0 1 0 441 38zm0-13.48a6.48 6.48 0 0 1 6.11 4.32l.06.17h11.32v4h-2v4.49h-4V33h-5.3l-.06.17a6.48 6.48 0 1 1-6.13-8.65z" fill="#5F6368" fill-rule="nonzero"/><path d="M256 92v1c20.435 0 37 16.565 37 37h1c0-20.987-17.013-38-38-38z" fill="#FED563" fill-rule="nonzero"/><path d="M411.08 121a16.81 16.81 0 0 0-13.08 6.27 11.21 11.21 0 0 0-15 10.58h44.93c0-9.306-7.544-16.85-16.85-16.85z" fill="#292A2D" fill-rule="nonzero"/><path d="M411.08 121.7c8.637.013 15.74 6.811 16.13 15.44h-43.48a10.5 10.5 0 0 1 14-9.22l.47.17.31-.39a16.09 16.09 0 0 1 12.56-6h.01zm-.01-.7a16.81 16.81 0 0 0-13.07 6.27 11.21 11.21 0 0 0-15 10.58h44.93c0-9.306-7.544-16.85-16.85-16.85h-.01z" fill="#5F6368" fill-rule="nonzero"/></g></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.html b/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.html deleted file mode 100644 index 93517ab..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!doctype html> -<html dir="$i18n{textdirection}" lang="$i18n{language}"> - <head> - <meta charset="utf-8"> - <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> - <script type="module" src="work_profile_confirmation_app.js"></script> - <style> - body { - margin: 0; - padding: 0; - width: 512px; - } - @media (prefers-color-scheme: dark) { - body { - background-color: var(--md-background-color); - } - } - </style> - <title>$i18n{workProfileConfirmationTitle}</title> - </head> - <body> - <work-profile-confirmation-app></work-profile-confirmation-app> - </body> - <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> - <script type="module" src="work_profile_confirmation.js"></script> -</html>
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.js b/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.js deleted file mode 100644 index 198c224..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation.js +++ /dev/null
@@ -1,19 +0,0 @@ -/* Copyright 2021 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 {WorkProfileConfirmationBrowserProxyImpl} from './work_profile_confirmation_browser_proxy.js'; - -document.addEventListener('DOMContentLoaded', () => { - const workProfileConfirmationBrowserProxy = - WorkProfileConfirmationBrowserProxyImpl.getInstance(); - // Prefer using |document.body.offsetHeight| instead of - // |document.body.scrollHeight| as it returns the correct height of the - // even when the page zoom in Chrome is different than 100%. - workProfileConfirmationBrowserProxy.initializedWithSize( - [document.body.offsetHeight]); - // The web dialog size has been initialized, so reset the body width to - // auto. This makes sure that the body only takes up the viewable width, - // e.g. when there is a scrollbar. - document.body.style.width = 'auto'; -});
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.html b/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.html deleted file mode 100644 index 966ab217..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.html +++ /dev/null
@@ -1,107 +0,0 @@ -<style include="signin-dialog-shared"> - :host { - color: var(--cr-primary-text-color); - display: block; - } - - cr-button { - padding-inline-end: 16px; - padding-inline-start: 16px; - } - - .action-container { - bottom: 0; - box-sizing: border-box; - position: absolute; - width: 100%; - } - - #illustrationContainer { - height: 168px; - margin-bottom: 32px; - position: relative; - width: 100%; - } - - #illustration { - background: url(./images/work_profile_confirmation_illustration.svg); - background-size: 100% 100%; - height: 100%; - position: absolute; - top: 0; - width: 100%; - } - - @media (prefers-color-scheme: dark) { - #illustration { - background-image: - url(./images/work_profile_confirmation_illustration_dark.svg); - } - } - - #illustrationContainer > img { - border-radius: 50%; - height: 68px; - left: 0; - margin: auto; - position: absolute; - right: 0; - top: 96px; - width: 68px; - } - - .heading { - font-weight: normal; - margin-bottom: 32px; - padding: 0 24px; - text-align: center; - } - - #content-container { - /* Saves space for button row. */ - padding-bottom: 96px; - position: relative; - width: 100%; - } - - .message-container { - color: var(--cr-secondary-text-color); - line-height: 20px; - margin-bottom: 16px; - padding: 0 24px; - } - - @media (prefers-color-scheme: light) { - #grey-banner { - background: var(--paper-grey-50); - height: 128px; - top: 0; - width: 100%; - } - } -</style> - - -<div id="illustrationContainer"> - <div id="grey-banner"></div> - <div id="illustration"></div> - <img src="[[accountImageSrc_]]"> -</div> -<div id="content-container"> - <h1 id="workProfileConfirmationHeading" class="heading"> - $i18n{workProfileConfirmationTitle} - </h1> - <div class="message-container secondary" - inner-h-t-m-l="[[i18nAdvanced('workProfileConfirmationInfo')]]"> - </div> - <!-- Todo add learn more --> - <div class="action-container"> - <cr-button id="cancelButton" on-click="onCancel_"> - $i18n{workProfileConfirmationCancelLabel} - </cr-button> - <cr-button class="action-button" id="confirmButton" - on-click="onConfirm_" autofocus> - $i18n{workProfileConfirmationConfirmLabel} - </cr-button> - </div> -</div>
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.js b/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.js deleted file mode 100644 index b97a8f5..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_app.js +++ /dev/null
@@ -1,67 +0,0 @@ -/* Copyright 2021 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 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; -import 'chrome://resources/polymer/v3_0/paper-styles/color.js'; -import './strings.m.js'; -import './signin_shared_css.js'; - -import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js'; -import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {WorkProfileConfirmationBrowserProxy, WorkProfileConfirmationBrowserProxyImpl} from './work_profile_confirmation_browser_proxy.js'; - -Polymer({ - is: 'work-profile-confirmation-app', - - _template: html`{__html_template__}`, - - behaviors: [ - I18nBehavior, - WebUIListenerBehavior, - ], - - properties: { - /** @private {string} */ - accountImageSrc_: { - type: String, - value() { - return loadTimeData.getString('accountPictureUrl'); - }, - }, - }, - - /** @private {?WorkProfileConfirmationBrowserProxy} */ - workProfileConfirmationBrowserProxy_: null, - - /** @override */ - ready() { - this.workProfileConfirmationBrowserProxy_ = - WorkProfileConfirmationBrowserProxyImpl.getInstance(); - this.addWebUIListener( - 'account-image-changed', this.handleAccountImageChanged_.bind(this)); - this.workProfileConfirmationBrowserProxy_.requestAccountImage(); - }, - - /** @private */ - onConfirm_() { - this.workProfileConfirmationBrowserProxy_.confirm(); - }, - - /** @private */ - onCancel_() { - this.workProfileConfirmationBrowserProxy_.cancel(); - }, - - /** - * Called when the account image changes. - * @param {string} imageSrc - * @private - */ - handleAccountImageChanged_(imageSrc) { - this.accountImageSrc_ = imageSrc; - }, -});
diff --git a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_browser_proxy.js b/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_browser_proxy.js deleted file mode 100644 index da4799c..0000000 --- a/chrome/browser/resources/signin/work_profile_confirmation/work_profile_confirmation_browser_proxy.js +++ /dev/null
@@ -1,55 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A helper object used by the work profile confirmation dialog to - * interact with the browser. - */ -import {addSingletonGetter} from 'chrome://resources/js/cr.m.js'; - -/** @interface */ -export class WorkProfileConfirmationBrowserProxy { - /** - * Called when the user confirms and creates a work profile. - */ - confirm() {} - - /** - * Called when the user cancel the creation of a work profile. - */ - cancel() {} - - /** @param {!Array<number>} height */ - initializedWithSize(height) {} - - /** - * Called when the WebUIListener for "account-image-changed" was added. - */ - requestAccountImage() {} -} - -/** @implements {WorkProfileConfirmationBrowserProxy} */ -export class WorkProfileConfirmationBrowserProxyImpl { - /** @override */ - confirm() { - chrome.send('confirm'); - } - - /** @override */ - cancel() { - chrome.send('cancel'); - } - - /** @override */ - initializedWithSize(height) { - chrome.send('initializedWithSize', height); - } - - /** @override */ - requestAccountImage() { - chrome.send('accountImageRequest'); - } -} - -addSingletonGetter(WorkProfileConfirmationBrowserProxyImpl);
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc index d7ce6470..1618c92 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1732,7 +1732,7 @@ password_store->AddCompromisedCredentials( password_manager::CompromisedCredentials( credential.signon_realm, credential.username, base::Time::Now(), - password_manager::CompromiseType::kPhished, + password_manager::InsecureType::kPhished, password_manager::IsMuted(false))); } } @@ -1752,7 +1752,7 @@ } password_store->RemoveCompromisedCredentials( credential.signon_realm, credential.username, - password_manager::RemoveCompromisedCredentialsReason:: + password_manager::RemoveInsecureCredentialsReason:: kMarkSiteAsLegitimate); } }
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc index 22353330..8671ee6 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -611,7 +611,7 @@ EXPECT_CALL(*password_store_, RemoveCompromisedCredentialsImpl( _, _, - password_manager::RemoveCompromisedCredentialsReason:: + password_manager::RemoveInsecureCredentialsReason:: kMarkSiteAsLegitimate)) .Times(2); service_->RemovePhishedSavedPasswordCredential(credentials); @@ -1584,7 +1584,7 @@ EXPECT_CALL(*account_password_store_, RemoveCompromisedCredentialsImpl( _, _, - password_manager::RemoveCompromisedCredentialsReason:: + password_manager::RemoveInsecureCredentialsReason:: kMarkSiteAsLegitimate)) .Times(2); service_->RemovePhishedSavedPasswordCredential(credentials);
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc index c1785ddc..3aa9303 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.cc
@@ -5,9 +5,9 @@ #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h" #include "base/callback_helpers.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h" +#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" -#include "chrome/browser/enterprise/connectors/content_analysis_dialog.h" -#include "chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h" #include "chrome/browser/policy/dm_token_utils.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h" #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h index fef3ee91..d43791a 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_browsertest_base.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_BROWSERTEST_BASE_H_ #define CHROME_BROWSER_SAFE_BROWSING_CLOUD_CONTENT_SCANNING_DEEP_SCANNING_BROWSERTEST_BASE_H_ -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc index 04fe16a..3dee3e16 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/file_analysis_request_unittest.cc
@@ -11,8 +11,8 @@ #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/task_environment.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/browser/enterprise/connectors/common.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h" #include "chrome/common/chrome_paths.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/search/drive/drive.mojom b/chrome/browser/search/drive/drive.mojom index 47f2724..0a9b50f 100644 --- a/chrome/browser/search/drive/drive.mojom +++ b/chrome/browser/search/drive/drive.mojom
@@ -4,11 +4,14 @@ module drive.mojom; -// TODO(crbug/1163760): Create struct to model Drive data response. +// TODO(crbug/161362): Further flesh out struct with document info +// (ex. document type, activity text, etc). +struct Document { + string title; +}; // Browser-side handler for requests from NTP Module UI. interface DriveHandler { - // TODO(crbug/1163760): Replace GetTestString method with - // method to retrieve file info from recent drive files. - GetTestString() => (string test_string); + // Fetches document suggestions from ItemSuggest API. + GetDocuments() => (array<Document> documents); };
diff --git a/chrome/browser/search/drive/drive_handler.cc b/chrome/browser/search/drive/drive_handler.cc index b1c1720..8330d10 100644 --- a/chrome/browser/search/drive/drive_handler.cc +++ b/chrome/browser/search/drive/drive_handler.cc
@@ -14,7 +14,7 @@ DriveHandler::~DriveHandler() = default; -void DriveHandler::GetTestString(GetTestStringCallback callback) { +void DriveHandler::GetDocuments(GetDocumentsCallback callback) { DriveServiceFactory::GetForProfile(profile_)->GetDriveSuggestions( std::move(callback)); }
diff --git a/chrome/browser/search/drive/drive_handler.h b/chrome/browser/search/drive/drive_handler.h index 2dbb739..774eaa9a 100644 --- a/chrome/browser/search/drive/drive_handler.h +++ b/chrome/browser/search/drive/drive_handler.h
@@ -19,7 +19,7 @@ ~DriveHandler() override; // drive::mojom::DriveHandler: - void GetTestString(GetTestStringCallback callback) override; + void GetDocuments(GetDocumentsCallback callback) override; private: mojo::Receiver<drive::mojom::DriveHandler> handler_;
diff --git a/chrome/browser/search/drive/drive_service.cc b/chrome/browser/search/drive/drive_service.cc index 562de1a5..68a1342 100644 --- a/chrome/browser/search/drive/drive_service.cc +++ b/chrome/browser/search/drive/drive_service.cc
@@ -76,7 +76,7 @@ : url_loader_factory_(std::move(url_loader_factory)), identity_manager_(identity_manager) {} -void DriveService::GetDriveSuggestions(SuggestionsCallback callback) { +void DriveService::GetDriveSuggestions(GetDocumentsCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // TODO(crbug/1168763) May need to handle multiple requests after @@ -89,14 +89,14 @@ signin::ConsentLevel::kSync); } -void DriveService::OnTokenReceived(SuggestionsCallback callback, +void DriveService::OnTokenReceived(GetDocumentsCallback callback, GoogleServiceAuthError error, signin::AccessTokenInfo token_info) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); token_fetcher_.reset(); if (error.state() != GoogleServiceAuthError::NONE) { - std::move(callback).Run(""); + std::move(callback).Run(std::vector<drive::mojom::DocumentPtr>()); return; } @@ -113,26 +113,61 @@ resource_request->headers.SetHeader(net::HttpRequestHeaders::kAuthorization, "Bearer " + token_info.token); + // TODO(crbug/1168763) Also need to handle multiple pending requests + // here as well. + if (url_loader_) { + return; + } url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request), kTrafficAnnotation); url_loader_->SetRetryOptions(0, network::SimpleURLLoader::RETRY_NEVER); url_loader_->AttachStringForUpload(kRequestBody, "application/json"); url_loader_->DownloadToString( url_loader_factory_.get(), - base::BindOnce(&DriveService::OnSuggestionsReceived, - weak_factory_.GetWeakPtr(), std::move(callback)), + base::BindOnce(&DriveService::OnJsonReceived, weak_factory_.GetWeakPtr(), + std::move(callback)), kMaxResponseSize); } -void DriveService::OnSuggestionsReceived( - SuggestionsCallback callback, - const std::unique_ptr<std::string> json_response) { +void DriveService::OnJsonReceived( + GetDocumentsCallback callback, + const std::unique_ptr<std::string> response_body) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const int net_error = url_loader_->NetError(); - if (net_error != net::OK) { - std::move(callback).Run(""); + url_loader_.reset(); + + if (net_error != net::OK || !response_body) { + std::move(callback).Run(std::vector<drive::mojom::DocumentPtr>()); return; } - std::move(callback).Run("JSON response"); + data_decoder::DataDecoder::ParseJsonIsolated( + *response_body, + base::BindOnce(&DriveService::OnJsonParsed, weak_factory_.GetWeakPtr(), + std::move(callback))); +} + +void DriveService::OnJsonParsed( + GetDocumentsCallback callback, + data_decoder::DataDecoder::ValueOrError result) { + if (!result.value) { + std::move(callback).Run(std::vector<drive::mojom::DocumentPtr>()); + return; + } + auto* documents = result.value->FindListPath("item"); + if (!documents) { + std::move(callback).Run(std::vector<drive::mojom::DocumentPtr>()); + return; + } + std::vector<drive::mojom::DocumentPtr> document_list; + for (const auto& document : documents->GetList()) { + auto* title = document.FindStringPath("driveItem.title"); + if (!title) { + continue; + } + auto mojo_drive_doc = drive::mojom::Document::New(); + mojo_drive_doc->title = *title; + document_list.push_back(std::move(mojo_drive_doc)); + } + std::move(callback).Run(std::move(document_list)); }
diff --git a/chrome/browser/search/drive/drive_service.h b/chrome/browser/search/drive/drive_service.h index 2329673..7819ee2 100644 --- a/chrome/browser/search/drive/drive_service.h +++ b/chrome/browser/search/drive/drive_service.h
@@ -9,9 +9,11 @@ #include <string> #include "base/sequence_checker.h" +#include "chrome/browser/search/drive/drive.mojom.h" #include "components/keyed_service/core/keyed_service.h" #include "components/signin/public/identity_manager/access_token_info.h" #include "google_apis/gaia/google_service_auth_error.h" +#include "services/data_decoder/public/cpp/data_decoder.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" @@ -29,18 +31,18 @@ signin::IdentityManager* identity_manager); ~DriveService() override; - using SuggestionsCallback = base::OnceCallback<void(const std::string&)>; + using GetDocumentsCallback = drive::mojom::DriveHandler::GetDocumentsCallback; // Retrieves Google Drive document suggestions from ItemSuggest API. - void GetDriveSuggestions(SuggestionsCallback callback); - void OnSuggestionsReceived(SuggestionsCallback callback, - const std::unique_ptr<std::string> json_response); + void GetDriveSuggestions(GetDocumentsCallback callback); private: - // TODO(crbug/1164012): Use token to create request - // with callback. - void OnTokenReceived(SuggestionsCallback callback, + void OnTokenReceived(GetDocumentsCallback callback, GoogleServiceAuthError error, signin::AccessTokenInfo token_info); + void OnJsonReceived(GetDocumentsCallback callback, + const std::unique_ptr<std::string> json_response); + void OnJsonParsed(GetDocumentsCallback callback, + data_decoder::DataDecoder::ValueOrError result); // Used for fetching OAuth2 access tokens. Only non-null when a token // is made available, or a token is being fetched.
diff --git a/chrome/browser/search/drive/drive_service_unittest.cc b/chrome/browser/search/drive/drive_service_unittest.cc index 7c6afe6..988d3845 100644 --- a/chrome/browser/search/drive/drive_service_unittest.cc +++ b/chrome/browser/search/drive/drive_service_unittest.cc
@@ -9,6 +9,7 @@ #include "content/public/test/browser_task_environment.h" #include "google_apis/gaia/google_service_auth_error.h" #include "net/base/load_flags.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" @@ -35,41 +36,69 @@ content::BrowserTaskEnvironment task_environment_; network::TestURLLoaderFactory test_url_loader_factory_; std::unique_ptr<DriveService> service_; + data_decoder::test::InProcessDataDecoder in_process_data_decoder_; signin::IdentityTestEnvironment identity_test_env; }; TEST_F(DriveServiceTest, PassesDataOnSuccess) { - bool empty_response = true; - base::MockCallback<DriveService::SuggestionsCallback> callback; + std::vector<drive::mojom::DocumentPtr> actual_documents; + base::MockCallback<DriveService::GetDocumentsCallback> callback; EXPECT_CALL(callback, Run(testing::_)) .Times(1) - .WillOnce(testing::Invoke([&empty_response](std::string arg) { - empty_response = arg.empty(); - })); + .WillOnce(testing::Invoke( + [&](std::vector<drive::mojom::DocumentPtr> documents) { + actual_documents = std::move(documents); + })); service_->GetDriveSuggestions(callback.Get()); identity_test_env.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( - "token", base::Time()); + "foo", base::Time()); test_url_loader_factory_.SimulateResponseForPendingRequest( - "https://appsitemsuggest-pa.googleapis.com/v1/items", std::string(), + "https://appsitemsuggest-pa.googleapis.com/v1/items", + R"( + { + "item": [ + { + "driveItem": { + "title": "Foo" + } + }, + { + "driveItem": { + "title": "Bar" + } + }, + { + "driveItem": { + } + } + + ] + } + )", net::HTTP_OK, network::TestURLLoaderFactory::ResponseMatchFlags::kUrlMatchPrefix); - EXPECT_FALSE(empty_response); + + EXPECT_EQ(2u, actual_documents.size()); + EXPECT_EQ("Foo", actual_documents.at(0)->title); + EXPECT_EQ("Bar", actual_documents.at(1)->title); } TEST_F(DriveServiceTest, PassesNoDataOnAuthError) { bool token_is_valid = true; - base::MockCallback<DriveService::SuggestionsCallback> callback; + base::MockCallback<DriveService::GetDocumentsCallback> callback; EXPECT_CALL(callback, Run(testing::_)) .Times(1) - .WillOnce(testing::Invoke([&token_is_valid](std::string suggestion) { - token_is_valid = !suggestion.empty(); - })); + .WillOnce(testing::Invoke( + [&token_is_valid]( + std::vector<drive::mojom::DocumentPtr> suggestions) { + token_is_valid = !suggestions.empty(); + })); service_->GetDriveSuggestions(callback.Get()); @@ -81,13 +110,15 @@ TEST_F(DriveServiceTest, PassesNoDataOnNetError) { bool empty_response = false; - base::MockCallback<DriveService::SuggestionsCallback> callback; + base::MockCallback<DriveService::GetDocumentsCallback> callback; EXPECT_CALL(callback, Run(testing::_)) .Times(1) - .WillOnce(testing::Invoke([&empty_response](std::string arg) { - empty_response = arg.empty(); - })); + .WillOnce(testing::Invoke( + [&empty_response]( + std::vector<drive::mojom::DocumentPtr> suggestions) { + empty_response = suggestions.empty(); + })); service_->GetDriveSuggestions(callback.Get()); @@ -108,3 +139,55 @@ EXPECT_TRUE(empty_response); } + +TEST_F(DriveServiceTest, PassesNoDataOnEmptyResponse) { + bool empty_response = false; + + base::MockCallback<DriveService::GetDocumentsCallback> callback; + + EXPECT_CALL(callback, Run(testing::_)) + .Times(1) + .WillOnce(testing::Invoke( + [&empty_response]( + std::vector<drive::mojom::DocumentPtr> suggestions) { + empty_response = suggestions.empty(); + })); + + service_->GetDriveSuggestions(callback.Get()); + + identity_test_env.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "foo", base::Time()); + + test_url_loader_factory_.SimulateResponseForPendingRequest( + "https://appsitemsuggest-pa.googleapis.com/v1/items", "", net::HTTP_OK, + network::TestURLLoaderFactory::ResponseMatchFlags::kUrlMatchPrefix); + + EXPECT_TRUE(empty_response); +} + +TEST_F(DriveServiceTest, PassesNoDataOnMissingItemKey) { + std::vector<drive::mojom::DocumentPtr> actual_documents; + base::MockCallback<DriveService::GetDocumentsCallback> callback; + + EXPECT_CALL(callback, Run(testing::_)) + .Times(1) + .WillOnce(testing::Invoke( + [&](std::vector<drive::mojom::DocumentPtr> documents) { + actual_documents = std::move(documents); + })); + + service_->GetDriveSuggestions(callback.Get()); + + identity_test_env.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "foo", base::Time()); + + test_url_loader_factory_.SimulateResponseForPendingRequest( + "https://appsitemsuggest-pa.googleapis.com/v1/items", + R"( + {} + )", + net::HTTP_OK, + network::TestURLLoaderFactory::ResponseMatchFlags::kUrlMatchPrefix); + + EXPECT_TRUE(actual_documents.empty()); +}
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java index 93c8470..708e5097 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java
@@ -145,7 +145,8 @@ TextView view = (TextView) parent.findViewById(R.id.text); view.setText(model.get(ShareSheetItemViewProperties.LABEL)); } else if (ShareSheetItemViewProperties.CLICK_LISTENER.equals(propertyKey)) { - parent.setOnClickListener(model.get(ShareSheetItemViewProperties.CLICK_LISTENER)); + View layout = (View) parent.findViewById(R.id.layout); + layout.setOnClickListener(model.get(ShareSheetItemViewProperties.CLICK_LISTENER)); } else if (ShareSheetItemViewProperties.SHOW_NEW_BADGE.equals(propertyKey)) { TextView newBadge = (TextView) parent.findViewById(R.id.display_new); newBadge.setVisibility(model.get(ShareSheetItemViewProperties.SHOW_NEW_BADGE)
diff --git a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetView.java b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetView.java index 94d31da..d3ce7ee 100644 --- a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetView.java +++ b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerBottomSheetView.java
@@ -214,29 +214,22 @@ @Override public int getSheetContentDescriptionStringId() { - // TODO(https://crbug.com/1112696): Use more specific string - // account picker content description return R.string.signin_account_picker_bottom_sheet_subtitle; } @Override public int getSheetHalfHeightAccessibilityStringId() { - return R.string.signin_account_picker_dialog_title; + return R.string.account_picker_bottom_sheet_accessibility_opened; } @Override public int getSheetFullHeightAccessibilityStringId() { - // TODO(https://crbug.com/1112696): Use more specific string - // like |Open account picker bottom sheet...| when bottom sheet opens - // after a11y meeting - return R.string.signin_account_picker_dialog_title; + return R.string.account_picker_bottom_sheet_accessibility_opened; } @Override public int getSheetClosedAccessibilityStringId() { - // TODO(https://crbug.com/1112696): Use more specific string when the account - // picker is closed. - return R.string.close; + return R.string.account_picker_bottom_sheet_accessibility_closed; } private static void setUpContinueButton(View view, @StringRes int buttonId) {
diff --git a/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.cc b/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.cc index e6f9be9..cfd6a34 100644 --- a/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.cc +++ b/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.cc
@@ -213,6 +213,18 @@ test_ruleset_publisher.SetRuleset(test_ruleset_pair.unindexed)); } +void SubresourceFilterBrowserTest::SetRulesetToDisallowURLsWithSubstrings( + std::vector<base::StringPiece> substrings) { + TestRulesetPair test_ruleset_pair; + ruleset_creator_.CreateRulesetToDisallowURLWithSubstrings( + std::move(substrings), &test_ruleset_pair); + + TestRulesetPublisher test_ruleset_publisher( + g_browser_process->subresource_filter_ruleset_service()); + ASSERT_NO_FATAL_FAILURE( + test_ruleset_publisher.SetRuleset(test_ruleset_pair.unindexed)); +} + void SubresourceFilterBrowserTest::SetRulesetWithRules( const std::vector<proto::UrlRule>& rules) { TestRulesetPair test_ruleset_pair;
diff --git a/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h b/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h index ad9eeb71e..cbedcab 100644 --- a/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h +++ b/chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h
@@ -100,6 +100,9 @@ void SetRulesetToDisallowURLsWithPathSuffix(const std::string& suffix); + void SetRulesetToDisallowURLsWithSubstrings( + std::vector<base::StringPiece> substrings); + void SetRulesetWithRules(const std::vector<proto::UrlRule>& rules); // Re-initializes the ruleset_service by opening the ruleset file provided
diff --git a/chrome/browser/subresource_filter/subresource_filter_dns_alias_browsertest.cc b/chrome/browser/subresource_filter/subresource_filter_dns_alias_browsertest.cc new file mode 100644 index 0000000..b273da7 --- /dev/null +++ b/chrome/browser/subresource_filter/subresource_filter_dns_alias_browsertest.cc
@@ -0,0 +1,213 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <map> +#include <string> + +#include "chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h" + +#include "base/strings/pattern.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/safe_browsing/test_safe_browsing_database_helper.h" +#include "chrome/browser/safe_browsing/test_safe_browsing_service.h" +#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" +#include "chrome/browser/ui/browser.h" +#include "components/metrics/content/subprocess_metrics_provider.h" +#include "components/safe_browsing/core/db/v4_test_util.h" +#include "components/subresource_filter/content/browser/async_document_subresource_filter.h" +#include "components/subresource_filter/content/browser/async_document_subresource_filter_test_utils.h" +#include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" +#include "components/subresource_filter/content/browser/ruleset_service.h" +#include "components/subresource_filter/content/browser/test_ruleset_publisher.h" +#include "components/subresource_filter/core/browser/subresource_filter_constants.h" +#include "components/subresource_filter/core/browser/subresource_filter_features.h" +#include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h" +#include "components/subresource_filter/core/common/activation_decision.h" +#include "components/subresource_filter/core/common/common_features.h" +#include "components/subresource_filter/core/common/test_ruleset_creator.h" +#include "components/subresource_filter/core/common/test_ruleset_utils.h" +#include "components/subresource_filter/core/mojom/subresource_filter.mojom.h" +#include "components/url_pattern_index/proto/rules.pb.h" +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/no_renderer_crashes_assertion.h" +#include "content/public/test/test_navigation_observer.h" +#include "content/public/test/test_utils.h" +#include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/embedded_test_server.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/features.h" +#include "url/gurl.h" + +namespace subresource_filter { + +using ActivationLevel = subresource_filter::mojom::ActivationLevel; + +// Struct allows for definition of PrintToString method below. +struct Level { + ActivationLevel level; +}; + +// Used by ::testing::PrintToStringParamName(). +std::string PrintToString(Level level) { + switch (level.level) { + case ActivationLevel::kEnabled: + return "ActivationEnabled"; + case ActivationLevel::kDryRun: + return "ActivationDryRun"; + case ActivationLevel::kDisabled: + return "ActivationDisabled"; + } + NOTREACHED(); + return ""; +} + +namespace { + +void AddHostResolverRules(net::RuleBasedHostResolverProc* host_resolver) { + host_resolver->AddIPLiteralRuleWithDnsAliases( + "a.com", "127.0.0.1", {"alias1.com", "example.com", "example.org"}); + host_resolver->AddIPLiteralRuleWithDnsAliases( + "cname-to-bad.com", "127.0.0.1", + {"alias.com", "example.com", "disallowed.com", "bad.com", + "cname-to-bad.com"}); +} + +std::vector<Level> GetActivationLevels() { + static_assert(ActivationLevel::kMaxValue == ActivationLevel::kEnabled, + "Update these tests if more activation levels are added"); + return {{ActivationLevel::kEnabled}, + {ActivationLevel::kDryRun}, + {ActivationLevel::kDisabled}}; +} + +} // namespace + +class SubresourceFilterDnsAliasResourceLoaderBrowserTest + : public SubresourceFilterBrowserTest, + public ::testing::WithParamInterface<Level> { + public: + SubresourceFilterDnsAliasResourceLoaderBrowserTest() { + feature_list_.InitWithFeatures( + {kAdTagging, + blink::features::kSendCnameAliasesToSubresourceFilterFromRenderer}, + {} /* disabled_features */); + } + + ~SubresourceFilterDnsAliasResourceLoaderBrowserTest() override = default; + + protected: + // InProcessBrowserTest: + void SetUpOnMainThread() override { + AddHostResolverRules(host_resolver()); + SubresourceFilterBrowserTest::SetUpOnMainThread(); + } + + base::test::ScopedFeatureList feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(Renderer, + SubresourceFilterDnsAliasResourceLoaderBrowserTest, + ::testing::ValuesIn(GetActivationLevels()), + ::testing::PrintToStringParamName()); + +IN_PROC_BROWSER_TEST_P(SubresourceFilterDnsAliasResourceLoaderBrowserTest, + CheckDnsAliasesFromRenderer) { + ActivationLevel level = GetParam().level; + Configuration config( + level, subresource_filter::ActivationScope::ACTIVATION_LIST, + subresource_filter::ActivationList::PHISHING_INTERSTITIAL); + ResetConfiguration(std::move(config)); + + GURL url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(cname-to-bad)")); + ConfigureAsPhishingURL(url); + ASSERT_NO_FATAL_FAILURE( + SetRulesetToDisallowURLsWithSubstrings({"disallowed"})); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(web_contents != nullptr); + + EXPECT_TRUE(NavigateToURL(web_contents, url)); + + content::RenderFrameHost* child_rfh = + web_contents->GetMainFrame()->GetFramesInSubtree().back(); + + if (level == ActivationLevel::kEnabled) + EXPECT_FALSE(WasParsedScriptElementLoaded(child_rfh)); + else + EXPECT_TRUE(WasParsedScriptElementLoaded(child_rfh)); +} + +class SubresourceFilterDnsAliasFilteringThrottleBrowserTest + : public SubresourceFilterBrowserTest, + public ::testing::WithParamInterface<Level> { + public: + SubresourceFilterDnsAliasFilteringThrottleBrowserTest() { + feature_list_.InitWithFeatures( + {kAdTagging, features::kSendCnameAliasesToSubresourceFilterFromBrowser}, + {} /* disabled_features */); + } + + ~SubresourceFilterDnsAliasFilteringThrottleBrowserTest() override = default; + + protected: + // InProcessBrowserTest: + void SetUpOnMainThread() override { + AddHostResolverRules(host_resolver()); + SubresourceFilterBrowserTest::SetUpOnMainThread(); + } + + base::test::ScopedFeatureList feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(Browser, + SubresourceFilterDnsAliasFilteringThrottleBrowserTest, + ::testing::ValuesIn(GetActivationLevels()), + ::testing::PrintToStringParamName()); + +IN_PROC_BROWSER_TEST_P(SubresourceFilterDnsAliasFilteringThrottleBrowserTest, + CheckDnsAliasesFromBrowser) { + ActivationLevel level = GetParam().level; + Configuration config( + level, subresource_filter::ActivationScope::ACTIVATION_LIST, + subresource_filter::ActivationList::PHISHING_INTERSTITIAL); + ResetConfiguration(std::move(config)); + + GURL url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(cname-to-bad)")); + ConfigureAsPhishingURL(url); + ASSERT_NO_FATAL_FAILURE( + SetRulesetToDisallowURLsWithSubstrings({"disallowed"})); + + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(web_contents != nullptr); + + EXPECT_TRUE(NavigateToURL(web_contents, url)); + + content::RenderFrameHost* main_rfh = web_contents->GetMainFrame(); + content::RenderFrameHost* child_rfh = main_rfh->GetFramesInSubtree().back(); + + if (level == ActivationLevel::kEnabled) { + EXPECT_EQ(GURL(), child_rfh->GetLastCommittedURL()); + } else { + GURL main_url = main_rfh->GetLastCommittedURL(); + GURL expected_child_url( + base::StrCat({"http://cname-to-bad.com:", main_url.port(), + "/cross_site_iframe_factory.html?cname-to-bad()"})); + + EXPECT_EQ(expected_child_url, child_rfh->GetLastCommittedURL()); + } +} + +} // namespace subresource_filter
diff --git a/chrome/browser/sync/test/integration/passwords_helper.cc b/chrome/browser/sync/test/integration/passwords_helper.cc index 5aa2afd..711e6d2 100644 --- a/chrome/browser/sync/test/integration/passwords_helper.cc +++ b/chrome/browser/sync/test/integration/passwords_helper.cc
@@ -259,7 +259,7 @@ store->RemoveCompromisedCredentials( credential.signon_realm, credential.username, // kRemove used for arbitrary reason just for test. - password_manager::RemoveCompromisedCredentialsReason::kRemove); + password_manager::RemoveInsecureCredentialsReason::kRemove); store->ScheduleTask(base::BindOnce(&PasswordStoreCallback, &wait_event)); wait_event.Wait(); } @@ -382,7 +382,7 @@ CompromisedCredentials CreateCompromisedCredentials( int index, - password_manager::CompromiseType type) { + password_manager::InsecureType type) { CompromisedCredentials issue; issue.signon_realm = kFakeSignonRealm; // This should stay compatible with the implementation of
diff --git a/chrome/browser/sync/test/integration/passwords_helper.h b/chrome/browser/sync/test/integration/passwords_helper.h index d7c81fd..9bd502d 100644 --- a/chrome/browser/sync/test/integration/passwords_helper.h +++ b/chrome/browser/sync/test/integration/passwords_helper.h
@@ -119,7 +119,7 @@ // CreateTestPasswordForm(int index); password_manager::CompromisedCredentials CreateCompromisedCredentials( int index, - password_manager::CompromiseType type); + password_manager::InsecureType type); // Injects the password entity based on given |form| and encrypted with key // derived from |key_derivation_params| into |fake_server|.
diff --git a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc index ffabb28..cf78c83 100644 --- a/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc
@@ -44,7 +44,7 @@ using CheckForCompromised = SamePasswordFormsChecker::CheckForCompromised; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::PasswordForm; using testing::UnorderedElementsAre; @@ -406,9 +406,9 @@ PasswordForm form1 = CreateTestPasswordForm(1); const CompromisedCredentials issue0 = - CreateCompromisedCredentials(0, CompromiseType::kLeaked); + CreateCompromisedCredentials(0, InsecureType::kLeaked); const CompromisedCredentials issue1 = - CreateCompromisedCredentials(1, CompromiseType::kPhished); + CreateCompromisedCredentials(1, InsecureType::kPhished); ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; @@ -443,9 +443,9 @@ ASSERT_TRUE(AllProfilesContainSamePasswordForms()); const CompromisedCredentials issue1 = - CreateCompromisedCredentials(0, CompromiseType::kLeaked); + CreateCompromisedCredentials(0, InsecureType::kLeaked); const CompromisedCredentials issue2 = - CreateCompromisedCredentials(0, CompromiseType::kPhished); + CreateCompromisedCredentials(0, InsecureType::kPhished); // Add the form and security issues to Client 0. AddLogin(GetPasswordStore(0), CreateTestPasswordForm(0)); @@ -468,9 +468,9 @@ ASSERT_TRUE(AllProfilesContainSamePasswordForms()); const CompromisedCredentials issue1 = - CreateCompromisedCredentials(0, CompromiseType::kLeaked); + CreateCompromisedCredentials(0, InsecureType::kLeaked); const CompromisedCredentials issue2 = - CreateCompromisedCredentials(1, CompromiseType::kPhished); + CreateCompromisedCredentials(1, InsecureType::kPhished); // Add the form and security issues to Client 0. AddLogin(GetPasswordStore(0), CreateTestPasswordForm(0)); @@ -501,7 +501,7 @@ ASSERT_TRUE(AllProfilesContainSamePasswordForms()); CompromisedCredentials issue = - CreateCompromisedCredentials(0, CompromiseType::kLeaked); + CreateCompromisedCredentials(0, InsecureType::kLeaked); // Add the form and security issue to Client 0. AddLogin(GetPasswordStore(0), CreateTestPasswordForm(0)); AddCompromisedCredentials(GetPasswordStore(0), issue);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index d08f3741..b71d042 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2872,10 +2872,6 @@ "webui/signin/sync_confirmation_handler.h", "webui/signin/sync_confirmation_ui.cc", "webui/signin/sync_confirmation_ui.h", - "webui/signin/work_profile_confirmation_handler.cc", - "webui/signin/work_profile_confirmation_handler.h", - "webui/signin/work_profile_confirmation_ui.cc", - "webui/signin/work_profile_confirmation_ui.h", ] deps += [ "//ui/webui" ] }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 35d81d4..e5c28455 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2147,11 +2147,6 @@ Refreshing page </message> - <!-- App banner accessibility strings, used for touch exploration --> - <message name="IDS_APP_BANNER_VIEW_NATIVE_APP_INSTALL_ACCESSIBILITY" desc="Accessibility text: Indicates that clicking on the button will either purchase the app or install it."> - Get the app from the Google Play Store: <ph name="APP_ACTION">%s<ex>Install</ex></ph> - </message> - <!-- DOM Distiller strings --> <message name="IDS_DARK_MODE" desc="Title of button that will change theme of distilled pages to dark mode."> Dark @@ -2176,24 +2171,15 @@ </message> <!-- Add to Home screen strings --> - <message name="IDS_MENU_ADD_TO_HOMESCREEN" desc="Menu item for adding a shortcut to the Home screen (default title). [CHAR-LIMIT=27]"> - Add to Home screen - </message> <message name="IDS_MENU_OPEN_WEBAPK" desc="Menu item for opening the installed WebAPK associated with the current PWA. [CHAR-LIMIT=27]"> Open <ph name="WEBAPK_NAME">%1$s<ex>Telegram</ex></ph> </message> <message name="IDS_OPEN_WEBAPK_FAILED" desc="Opening of a WebAPK failed."> Could not open app </message> - <message name="IDS_MENU_ADD_TO_HOMESCREEN_INSTALL" desc="Menu item for adding a shortcut to the Home screen. [CHAR-LIMIT=27]"> - Install app - </message> <message name="IDS_APP_BANNER_ADD" desc="A button in an app banner to confirm adding a site to homescreen"> Add </message> - <message name="IDS_APP_BANNER_INSTALL" desc="A button in an app banner to confirm adding a site to homescreen"> - Install - </message> <message name="IDS_ADDED_TO_HOMESCREEN" desc="Indicates that the website with the specified name was added to the user's Home screen."> <ph name="NAME">%1$s<ex>Google</ex></ph> was added to your Home screen </message> @@ -2592,6 +2578,12 @@ <message name="IDS_SIGNIN_ACCOUNT_PICKER_DIALOG_TITLE" desc="The title for the dialog that shows the list of accounts on the device and asks the user to select one of these accounts. [CHAR-LIMIT=27]"> Choose an account </message> + <message name="IDS_ACCOUNT_PICKER_BOTTOM_SHEET_ACCESSIBILITY_OPENED" is_accessibility_with_no_ui="true" desc="The accessibility text to read when account picker bottom sheet is opened."> + Sign in to Chrome, opened. + </message> + <message name="IDS_ACCOUNT_PICKER_BOTTOM_SHEET_ACCESSIBILITY_CLOSED" is_accessibility_with_no_ui="true" desc="The accessibility text to read when account picker bottom sheet is closed."> + Sign in to Chrome, closed. + </message> <message name="IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE" desc="The subtitle for the account picker bottom sheet that tells the user what happens if the button 'Continue as John Doe' is clicked"> Sign in to this site and Chrome with your Google Account. You can turn on sync later. </message>
diff --git a/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.cc b/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.cc index b87f3d1..6b8d3c11 100644 --- a/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.cc +++ b/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.cc
@@ -44,10 +44,6 @@ UpdatePageActionIcon(); } -bool SaveAddressProfileBubbleController::HandleDidFinishRelevantNavigation() { - return true; -} - PageActionIconType SaveAddressProfileBubbleController::GetPageActionIconType() { return PageActionIconType::kSaveCard; }
diff --git a/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.h b/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.h index 7155c8fb..d50ae44 100644 --- a/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.h +++ b/chrome/browser/ui/autofill/address_profiles/save_address_profile_bubble_controller.h
@@ -39,7 +39,6 @@ protected: // AutofillBubbleControllerBase:: - bool HandleDidFinishRelevantNavigation() override; PageActionIconType GetPageActionIconType() override; void DoShowBubble() override;
diff --git a/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc b/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc index ef9cb9c..b9581a5 100644 --- a/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc +++ b/chrome/browser/ui/autofill/autofill_bubble_controller_base.cc
@@ -23,37 +23,6 @@ UpdatePageActionIcon(); DoShowBubble(); UpdatePageActionIcon(); - SetShownTimestampToNow(); -} - -void AutofillBubbleControllerBase::DidFinishNavigation( - content::NavigationHandle* navigation_handle) { - if (base::FeatureList::IsEnabled( - features::kAutofillEnableStickyPaymentsBubble)) { - return; - } - - if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted()) - return; - - // Don't react to same-document (fragment) navigations. - if (navigation_handle->IsSameDocument()) - return; - - // Don't do anything if a navigation occurs before a user could reasonably - // interact with the bubble. - const base::TimeDelta elapsed_time = - AutofillClock::Now() - bubble_shown_timestamp_; - if (elapsed_time < kCardBubbleSurviveNavigationTime) - return; - - if (!HandleDidFinishRelevantNavigation()) - return; - - if (bubble_view_) - bubble_view_->Hide(); - else - UpdatePageActionIcon(); } void AutofillBubbleControllerBase::OnVisibilityChanged( @@ -72,10 +41,6 @@ browser->window()->UpdatePageActionIcon(GetPageActionIconType()); } -void AutofillBubbleControllerBase::SetShownTimestampToNow() { - bubble_shown_timestamp_ = AutofillClock::Now(); -} - void AutofillBubbleControllerBase::HideBubble() { if (bubble_view_) { bubble_view_->Hide();
diff --git a/chrome/browser/ui/autofill/autofill_bubble_controller_base.h b/chrome/browser/ui/autofill/autofill_bubble_controller_base.h index e0a8c3d..38dfeaa 100644 --- a/chrome/browser/ui/autofill/autofill_bubble_controller_base.h +++ b/chrome/browser/ui/autofill/autofill_bubble_controller_base.h
@@ -22,21 +22,10 @@ ~AutofillBubbleControllerBase() override; // content::WebContentsObserver: - void DidFinishNavigation( - content::NavigationHandle* navigation_handle) override; void OnVisibilityChanged(content::Visibility visibility) override; void WebContentsDestroyed() override; protected: - // Called in DidFinishNavigation() if the navigation may result in an action - // in the bubble. Isn't called when the navigation happens too quickly or is a - // navigation to the same document. Check DidFinishNavigation() for details. - // Returns true if this navigation is relevant from the point of view of the - // specific controller (e.g. whether the bubble is available or not). - // Subclasses usually override this method to do custom work upon - // navigation (e.g. reporting metrics). - virtual bool HandleDidFinishRelevantNavigation() = 0; - virtual PageActionIconType GetPageActionIconType() = 0; // Subclasses should implement this method to actually show the bubble and @@ -61,9 +50,6 @@ // Weak reference. Will be nullptr if no bubble is currently shown. AutofillBubbleBase* bubble_view_ = nullptr; - // The time at which the bubble was shown. If it has been visible for less - // time than some reasonable limit, don't close the bubble upon navigation. - base::Time bubble_shown_timestamp_; }; } // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.cc index 7ce532c..93914b7 100644 --- a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.cc
@@ -98,53 +98,28 @@ } // Log local card migration bubble result according to the closed reason. - if (base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - AutofillMetrics::LocalCardMigrationBubbleResultMetric metric; - switch (closed_reason) { - case PaymentsBubbleClosedReason::kAccepted: - metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED; - break; - case PaymentsBubbleClosedReason::kClosed: - metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED; - break; - case PaymentsBubbleClosedReason::kNotInteracted: - metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED; - break; - case PaymentsBubbleClosedReason::kLostFocus: - metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS; - break; - case PaymentsBubbleClosedReason::kUnknown: - metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN; - break; - case PaymentsBubbleClosedReason::kCancelled: - NOTREACHED(); - return; - } - AutofillMetrics::LogLocalCardMigrationBubbleResultMetric(metric, - is_reshow_); + AutofillMetrics::LocalCardMigrationBubbleResultMetric metric; + switch (closed_reason) { + case PaymentsBubbleClosedReason::kAccepted: + metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED; + break; + case PaymentsBubbleClosedReason::kClosed: + metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED; + break; + case PaymentsBubbleClosedReason::kNotInteracted: + metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED; + break; + case PaymentsBubbleClosedReason::kLostFocus: + metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS; + break; + case PaymentsBubbleClosedReason::kUnknown: + metric = AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN; + break; + case PaymentsBubbleClosedReason::kCancelled: + NOTREACHED(); + return; } -} - -bool LocalCardMigrationBubbleControllerImpl:: - HandleDidFinishRelevantNavigation() { - // Nothing to do if there's no bubble available. - if (!local_card_migration_bubble_closure_) - return false; - - local_card_migration_bubble_closure_.Reset(); - for (LocalCardMigrationControllerObserver& observer : observer_list_) { - observer.OnMigrationNoLongerAvailable(); - } - - AutofillMetrics::LogLocalCardMigrationBubbleUserInteractionMetric( - bubble_view() - ? AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_SHOWING - : AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_HIDDEN, - is_reshow_); - return true; + AutofillMetrics::LogLocalCardMigrationBubbleResultMetric(metric, is_reshow_); } PageActionIconType
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h index 28ccba2..c7455a34 100644 --- a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl.h
@@ -49,7 +49,6 @@ content::WebContents* web_contents); // AutofillBubbleControllerBase:: - bool HandleDidFinishRelevantNavigation() override; PageActionIconType GetPageActionIconType() override; void DoShowBubble() override;
diff --git a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc index 9807058f..4333989 100644 --- a/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/payments/local_card_migration_bubble_controller_impl_unittest.cc
@@ -178,110 +178,6 @@ AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_DENIED, 1); } -// TODO(siyua): Remove in experiment clean-up. -// Test class to ensure the local card migration bubble navigation is logged -// correctly. -class LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble - : public LocalCardMigrationBubbleControllerImplTest { - public: - LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{ - features::kAutofillEnableFixedPaymentsBubbleLogging, - features::kAutofillEnableStickyPaymentsBubble}); - } - ~LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble() override = - default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble, - Metrics_FirstShow_NavigateWhileShowing) { - ShowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to kSurviveNavigationSeconds - // (5) seconds regardless of navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleUserInteraction.FirstShow", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleUserInteraction.FirstShow", - AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_SHOWING, - 1); -} - -TEST_F(LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble, - Metrics_Reshows_NavigateWhileShowing) { - ShowBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to kSurviveNavigationSeconds - // (5) seconds regardless of navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleUserInteraction.Reshows", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleUserInteraction.Reshows", - AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_SHOWING, - 1); -} - -TEST_F(LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble, - Metrics_FirstShow_NavigateWhileHidden) { - ShowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleUserInteraction.FirstShow", - AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_HIDDEN, - 1); -} - -TEST_F(LocalCardMigrationBubbleControllerImplTestWithoutStickyBubble, - Metrics_Reshows_NavigateWhileHidden) { - ShowBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleUserInteraction.Reshows", - AutofillMetrics:: - LOCAL_CARD_MIGRATION_BUBBLE_CLOSED_NAVIGATED_WHILE_HIDDEN, - 1); -} - TEST_F(LocalCardMigrationBubbleControllerImplTest, OnlyOneActiveBubble_Repeated) { base::HistogramTester histogram_tester; @@ -296,24 +192,10 @@ Bucket(AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_SHOWN, 1))); } -class LocalCardMigrationBubbleControllerImplTestWithStickyPaymentsBubble - : public LocalCardMigrationBubbleControllerImplTest { - public: - LocalCardMigrationBubbleControllerImplTestWithStickyPaymentsBubble() { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillEnableStickyPaymentsBubble); - } - ~LocalCardMigrationBubbleControllerImplTestWithStickyPaymentsBubble() - override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - // Ensures the bubble should still stick around even if the time since bubble // showing is longer than kCardBubbleSurviveNavigationTime (5 seconds) when the // feature is enabled. -TEST_F(LocalCardMigrationBubbleControllerImplTestWithStickyPaymentsBubble, +TEST_F(LocalCardMigrationBubbleControllerImplTest, StickyBubble_ShouldNotDismissUponNavigation) { ShowBubble(); base::HistogramTester histogram_tester; @@ -326,204 +208,127 @@ } // Test class to ensure the local card migration bubble result is logged -// correctly. The boolean Param of this class decides whether the new logging -// experiment has been enabled. -class LocalCardMigrationBubbleLoggingTest - : public LocalCardMigrationBubbleControllerImplTest, - public ::testing::WithParamInterface<bool> { - public: - LocalCardMigrationBubbleLoggingTest() { - scoped_feature_list_.InitWithFeatureState( - features::kAutofillEnableFixedPaymentsBubbleLogging, GetParam()); - } - ~LocalCardMigrationBubbleLoggingTest() override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_P(LocalCardMigrationBubbleLoggingTest, FirstShow_BubbleAccepted) { +// correctly. +TEST_F(LocalCardMigrationBubbleControllerImplTest, FirstShow_BubbleAccepted) { base::HistogramTester histogram_tester; ShowBubble(); CloseBubble(PaymentsBubbleClosedReason::kAccepted); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, FirstShow_BubbleClosed) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, FirstShow_BubbleClosed) { base::HistogramTester histogram_tester; ShowBubble(); CloseBubble(PaymentsBubbleClosedReason::kClosed); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, FirstShow_BubbleNotInteracted) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, + FirstShow_BubbleNotInteracted) { base::HistogramTester histogram_tester; ShowBubble(); CloseBubble(PaymentsBubbleClosedReason::kNotInteracted); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, FirstShow_BubbleLostFocus) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, FirstShow_BubbleLostFocus) { base::HistogramTester histogram_tester; ShowBubble(); CloseBubble(PaymentsBubbleClosedReason::kLostFocus); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, FirstShow_Unknown) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, FirstShow_Unknown) { base::HistogramTester histogram_tester; ShowBubble(); CloseBubble(PaymentsBubbleClosedReason::kUnknown); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, Reshows_BubbleAccepted) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, Reshows_BubbleAccepted) { base::HistogramTester histogram_tester; ShowBubble(); CloseAndReshowBubble(); CloseBubble(PaymentsBubbleClosedReason::kAccepted); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.Reshows", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.Reshows", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.Reshows", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, Reshows_BubbleClosed) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, Reshows_BubbleClosed) { base::HistogramTester histogram_tester; ShowBubble(); CloseAndReshowBubble(); CloseBubble(PaymentsBubbleClosedReason::kClosed); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.Reshows", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.Reshows", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.Reshows", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, Reshows_BubbleNotInteracted) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, + Reshows_BubbleNotInteracted) { base::HistogramTester histogram_tester; ShowBubble(); CloseAndReshowBubble(); CloseBubble(PaymentsBubbleClosedReason::kNotInteracted); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.Reshows", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.Reshows", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.Reshows", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, Reshows_BubbleLostFocus) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, Reshows_BubbleLostFocus) { base::HistogramTester histogram_tester; ShowBubble(); CloseAndReshowBubble(); CloseBubble(PaymentsBubbleClosedReason::kLostFocus); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.Reshows", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.Reshows", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.Reshows", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_LOST_FOCUS, 1); } -TEST_P(LocalCardMigrationBubbleLoggingTest, Reshows_Unknown) { +TEST_F(LocalCardMigrationBubbleControllerImplTest, Reshows_Unknown) { base::HistogramTester histogram_tester; ShowBubble(); CloseAndReshowBubble(); CloseBubble(PaymentsBubbleClosedReason::kUnknown); - if (GetParam()) { - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); - histogram_tester.ExpectUniqueSample( - "Autofill.LocalCardMigrationBubbleResult.Reshows", - AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.FirstShow", 0); - histogram_tester.ExpectTotalCount( - "Autofill.LocalCardMigrationBubbleResult.Reshows", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.FirstShow", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); + histogram_tester.ExpectUniqueSample( + "Autofill.LocalCardMigrationBubbleResult.Reshows", + AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_RESULT_UNKNOWN, 1); } -INSTANTIATE_TEST_SUITE_P(LocalCardMigrationBubbleControllerImplTest, - LocalCardMigrationBubbleLoggingTest, - ::testing::Bool()); - } // namespace autofill
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc index 779b93b..e56ffb99 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.cc
@@ -341,16 +341,6 @@ pref_service_->GetInteger( prefs::kAutofillAcceptSaveCreditCardPromptState), GetSecurityLevel(), GetSyncState()); - - // If the experiment is not enabled, update user's previous decision here. - // Otherwise since the logging will happen in OnBubbleClosed() which is - // invoked after OnSaveButton(), the previous decision should be set there. - if (!base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - pref_service_->SetInteger( - prefs::kAutofillAcceptSaveCreditCardPromptState, - prefs::PREVIOUS_SAVE_CREDIT_CARD_PROMPT_USER_DECISION_ACCEPTED); - } } } @@ -364,17 +354,6 @@ prefs::kAutofillAcceptSaveCreditCardPromptState), GetSecurityLevel(), GetSyncState()); - // If the experiment is not enabled, update user's previous decision here. - // Otherwise since the logging will happen in OnBubbleClosed() which is - // invoked after OnCancelButton(), the previous decision should be set - // there. - if (!base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - pref_service_->SetInteger( - prefs::kAutofillAcceptSaveCreditCardPromptState, - prefs::PREVIOUS_SAVE_CREDIT_CARD_PROMPT_USER_DECISION_DENIED); - } - if (current_bubble_type_ == BubbleType::LOCAL_SAVE) { std::move(local_save_card_prompt_callback_).Run(AutofillClient::DECLINED); } else { // BubbleType::UPLOAD_SAVE @@ -393,10 +372,7 @@ prefs::kAutofillAcceptSaveCreditCardPromptState), GetSecurityLevel(), GetSyncState()); - if (base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - AutofillMetrics::LogCreditCardUploadLegalMessageLinkClicked(); - } + AutofillMetrics::LogCreditCardUploadLegalMessageLinkClicked(); } void SaveCardBubbleControllerImpl::OnManageCardsClicked() { @@ -419,9 +395,7 @@ set_bubble_view(nullptr); // Log save card prompt result according to the closed reason. - if (base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging) && - (current_bubble_type_ == BubbleType::LOCAL_SAVE || + if ((current_bubble_type_ == BubbleType::LOCAL_SAVE || current_bubble_type_ == BubbleType::UPLOAD_SAVE)) { AutofillMetrics::SaveCardPromptResultMetric metric; switch (closed_reason) { @@ -564,36 +538,6 @@ return GetSaveCardBubbleView(); } -bool SaveCardBubbleControllerImpl::HandleDidFinishRelevantNavigation() { - // Nothing to do if there's no bubble available. - if (current_bubble_type_ == BubbleType::INACTIVE) - return false; - - if (current_bubble_type_ == BubbleType::LOCAL_SAVE || - current_bubble_type_ == BubbleType::UPLOAD_SAVE) { - AutofillMetrics::LogSaveCardPromptMetric( - bubble_view() ? AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING - : AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, - is_upload_save_, is_reshow_, options_, - pref_service_->GetInteger( - prefs::kAutofillAcceptSaveCreditCardPromptState), - GetSecurityLevel(), GetSyncState()); - - if (current_bubble_type_ == BubbleType::LOCAL_SAVE) { - DCHECK(!local_save_card_prompt_callback_.is_null()); - std::move(local_save_card_prompt_callback_).Run(AutofillClient::IGNORED); - } else { // BubbleType::UPLOAD_SAVE - DCHECK(!upload_save_card_prompt_callback_.is_null()); - std::move(upload_save_card_prompt_callback_) - .Run(AutofillClient::IGNORED, {}); - } - } - - // Otherwise, get rid of the bubble and icon. - current_bubble_type_ = BubbleType::INACTIVE; - return true; -} - PageActionIconType SaveCardBubbleControllerImpl::GetPageActionIconType() { return PageActionIconType::kSaveCard; } @@ -614,15 +558,12 @@ pref_service_->GetInteger( prefs::kAutofillAcceptSaveCreditCardPromptState), GetSecurityLevel(), GetSyncState()); - if (base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - AutofillMetrics::LogSaveCardPromptOfferMetric( - AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, is_upload_save_, - is_reshow_, options_, - pref_service_->GetInteger( - prefs::kAutofillAcceptSaveCreditCardPromptState), - GetSecurityLevel(), GetSyncState()); - } + AutofillMetrics::LogSaveCardPromptOfferMetric( + AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, is_upload_save_, is_reshow_, + options_, + pref_service_->GetInteger( + prefs::kAutofillAcceptSaveCreditCardPromptState), + GetSecurityLevel(), GetSyncState()); break; case BubbleType::MANAGE_CARDS: AutofillMetrics::LogManageCardsPromptMetric( @@ -685,8 +626,6 @@ // explicitly clicks the icon. UpdatePageActionIcon(); - SetShownTimestampToNow(); - switch (current_bubble_type_) { case BubbleType::UPLOAD_SAVE: case BubbleType::LOCAL_SAVE: @@ -696,15 +635,12 @@ pref_service_->GetInteger( prefs::kAutofillAcceptSaveCreditCardPromptState), GetSecurityLevel(), GetSyncState()); - if (base::FeatureList::IsEnabled( - features::kAutofillEnableFixedPaymentsBubbleLogging)) { - AutofillMetrics::LogSaveCardPromptOfferMetric( - AutofillMetrics::SAVE_CARD_PROMPT_NOT_SHOWN_MAX_STRIKES_REACHED, - is_upload_save_, is_reshow_, options_, - pref_service_->GetInteger( - prefs::kAutofillAcceptSaveCreditCardPromptState), - GetSecurityLevel(), GetSyncState()); - } + AutofillMetrics::LogSaveCardPromptOfferMetric( + AutofillMetrics::SAVE_CARD_PROMPT_NOT_SHOWN_MAX_STRIKES_REACHED, + is_upload_save_, is_reshow_, options_, + pref_service_->GetInteger( + prefs::kAutofillAcceptSaveCreditCardPromptState), + GetSecurityLevel(), GetSyncState()); break; case BubbleType::FAILURE: AutofillMetrics::LogCreditCardUploadFeedbackMetric(
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h index 5b6bedd..de05bdc 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl.h
@@ -137,7 +137,6 @@ virtual void ShowPaymentsSettingsPage(); // AutofillBubbleControllerBase:: - bool HandleDidFinishRelevantNavigation() override; PageActionIconType GetPageActionIconType() override; void DoShowBubble() override;
diff --git a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc index 0061633c..c0d0a4f5 100644 --- a/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/payments/save_card_bubble_controller_impl_unittest.cc
@@ -216,625 +216,10 @@ EXPECT_TRUE(controller()->ShouldRequestExpirationDateFromUser()); } -// TODO(crbug.com/1070799): Delete these navigation tests once the new logging -// is launched. - -// Ensures the bubble should still stick around even if the time since bubble -// showing is longer than kCardBubbleSurviveNavigationTime (5 seconds) when the -// feature is enabled. -TEST_F(SaveCardBubbleControllerImplTest, - StickyBubble_ShouldNotDismissUponNavigation) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - features::kAutofillEnableStickyPaymentsBubble); - - ShowLocalBubble(); - base::HistogramTester histogram_tester; - test_clock_.Advance(base::TimeDelta::FromSeconds(10)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", 0); - EXPECT_NE(nullptr, controller()->GetSaveCardBubbleView()); -} - -// TODO(siyua): Remove in experiment clean-up. -// Test class to ensure the save card bubble navigation is logged -// correctly. -class SaveCardBubbleControllerImplTestWithoutStickyBubble - : public SaveCardBubbleControllerImplTest { - public: - SaveCardBubbleControllerImplTestWithoutStickyBubble() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{ - features::kAutofillEnableFixedPaymentsBubbleLogging, - features::kAutofillEnableStickyPaymentsBubble}); - } - ~SaveCardBubbleControllerImplTestWithoutStickyBubble() override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_NavigateWhileShowing) { - ShowLocalBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_FromDynamicChangeForm_NavigateWhileShowing) { - ShowLocalBubble(/*card=*/nullptr, AutofillClient::SaveCreditCardOptions() - .with_from_dynamic_change_form(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow.FromDynamicChangeForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_FromNonFocusableForm_NavigateWhileShowing) { - ShowLocalBubble(/*card=*/nullptr, AutofillClient::SaveCreditCardOptions() - .with_has_non_focusable_field(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow.FromNonFocusableForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_Reshows_NavigateWhileShowing) { - ShowLocalBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Local.Reshows", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.Reshows", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_NavigateWhileShowing) { - ShowUploadBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_FromNonFocusableForm_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_has_non_focusable_field(true) - .with_show_prompt()); - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromNonFocusableForm", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromNonFocusableForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_FromDynamicChangeForm_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_from_dynamic_change_form(true) - .with_show_prompt()); - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromDynamicChangeForm", - 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromDynamicChangeForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_RequestingCardholderName_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_name_from_user(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingCardholderName", - 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingCardholderName", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_RequestingExpirationDate_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_expiration_date_from_user(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingExpirationDate", - 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingExpirationDate", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_NavigateWhileShowing) { - ShowUploadBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.Reshows", 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_RequestingCardholderName_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_name_from_user(true) - .with_show_prompt()); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingCardholderName", - 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingCardholderName", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_RequestingExpirationDate_NavigateWhileShowing) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_expiration_date_from_user(true) - .with_show_prompt()); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - // The bubble should still stick around for up to - // kCardBubbleSurviveNavigationTime (5 seconds) regardless of navigation. - // Start by waiting for 3 seconds, simulating navigation, and ensuring the - // bubble has not changed. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingExpirationDate", - 0); - - // Wait 3 more seconds (6 total); bubble should go away on next navigation. - test_clock_.Advance(base::TimeDelta::FromSeconds(3)); - - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingExpirationDate", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_SHOWING, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_NavigateWhileHidden) { - ShowLocalBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_Reshows_NavigateWhileHidden) { - ShowLocalBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.Reshows", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_NavigateWhileHidden) { - ShowUploadBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_FromNonFocusableForm_NavigateWhileHidden) { - ShowLocalBubble(/*card=*/nullptr, AutofillClient::SaveCreditCardOptions() - .with_has_non_focusable_field(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow.FromNonFocusableForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Local_FirstShow_FromDynamicChangeForm_NavigateWhileHidden) { - ShowLocalBubble(/*card=*/nullptr, AutofillClient::SaveCreditCardOptions() - .with_from_dynamic_change_form(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Local.FirstShow.FromDynamicChangeForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_FromDynamicChangeForm_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_from_dynamic_change_form(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromDynamicChangeForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_FromNonFocusableForm_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_has_non_focusable_field(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.FromNonFocusableForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_RequestingCardholderName_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_name_from_user(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingCardholderName", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_FirstShow_RequestingExpirationDate_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_expiration_date_from_user(true) - .with_show_prompt()); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.FirstShow.RequestingExpirationDate", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_NavigateWhileHidden) { - ShowUploadBubble(); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_FromDynamicChangeForm_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_from_dynamic_change_form(true) - .with_show_prompt()); - - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.FromDynamicChangeForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_FromNonFocusableForm_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_has_non_focusable_field(true) - .with_show_prompt()); - - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.FromNonFocusableForm", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_RequestingCardholderName_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_name_from_user(true) - .with_show_prompt()); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingCardholderName", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - -TEST_F(SaveCardBubbleControllerImplTestWithoutStickyBubble, - Metrics_Upload_Reshows_RequestingExpirationDate_NavigateWhileHidden) { - ShowUploadBubble(AutofillClient::SaveCreditCardOptions() - .with_should_request_expiration_date_from_user(true) - .with_show_prompt()); - CloseAndReshowBubble(); - - base::HistogramTester histogram_tester; - CloseBubble(); - // Fake-navigate after bubble has been visible for a long time. - test_clock_.Advance(base::TimeDelta::FromMinutes(1)); - controller()->SimulateNavigation(); - - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPrompt.Upload.Reshows.RequestingExpirationDate", - AutofillMetrics::SAVE_CARD_PROMPT_END_NAVIGATION_HIDDEN, 1); -} - // Param of the SaveCardBubbleSingletonTestData: -// -- bool metrics_revamp_experiment_enabled; // -- bool first_shown_is_local; // -- bool second_and_third_shown_are_local; -typedef std::tuple<bool, bool, bool> SaveCardBubbleSingletonTestData; +typedef std::tuple<bool, bool> SaveCardBubbleSingletonTestData; // One test case will be run several times till we cover all the param // combinations of the |SaveCardBubbleSingletonTestData|. GetParam() will help @@ -844,17 +229,8 @@ public testing::WithParamInterface<SaveCardBubbleSingletonTestData> { public: SaveCardBubbleSingletonTest() - : metrics_revamp_experiment_enabled_(std::get<0>(GetParam())), - first_shown_is_local_(std::get<1>(GetParam())), - second_and_third_shown_are_local_(std::get<2>(GetParam())) { - if (metrics_revamp_experiment_enabled_) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillEnableFixedPaymentsBubbleLogging); - } else { - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillEnableFixedPaymentsBubbleLogging); - } - } + : first_shown_is_local_(std::get<0>(GetParam())), + second_and_third_shown_are_local_(std::get<1>(GetParam())) {} ~SaveCardBubbleSingletonTest() override = default; @@ -868,7 +244,6 @@ ShowBubble(second_and_third_shown_are_local_); } - const bool metrics_revamp_experiment_enabled_; const bool first_shown_is_local_; const bool second_and_third_shown_are_local_; }; @@ -876,7 +251,6 @@ INSTANTIATE_TEST_SUITE_P(, SaveCardBubbleSingletonTest, testing::Combine(testing::Bool(), - testing::Bool(), testing::Bool())); TEST_P(SaveCardBubbleSingletonTest, OnlyOneActiveBubble) { @@ -885,14 +259,9 @@ std::string suffix = first_shown_is_local_ ? ".Local.FirstShow" : ".Upload.FirstShow"; - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptOffer" + suffix, - AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptOffer" + suffix, 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptOffer" + suffix, + AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, 1); EXPECT_THAT( histogram_tester.GetAllSamples("Autofill.SaveCreditCardPrompt" + suffix), @@ -918,11 +287,10 @@ }; // Param of the SaveCardBubbleSingletonTestData: -// -- bool metrics_revamp_experiment_enabled // -- std::string destination // -- std::string show // -- SaveCardOptionParam save_card_option_param -typedef std::tuple<bool, std::string, std::string, SaveCardOptionParam> +typedef std::tuple<std::string, std::string, SaveCardOptionParam> SaveCardBubbleLoggingTestData; // Test class to ensure the save card bubble events are logged correctly. @@ -931,18 +299,8 @@ public ::testing::WithParamInterface<SaveCardBubbleLoggingTestData> { public: SaveCardBubbleLoggingTest() - : metrics_revamp_experiment_enabled_(std::get<0>(GetParam())), - destination_(std::get<1>(GetParam())), - show_(std::get<2>(GetParam())) { - if (metrics_revamp_experiment_enabled_) { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillEnableFixedPaymentsBubbleLogging); - } else { - scoped_feature_list_.InitAndDisableFeature( - features::kAutofillEnableFixedPaymentsBubbleLogging); - } - - SaveCardOptionParam save_card_option_param = std::get<3>(GetParam()); + : destination_(std::get<0>(GetParam())), show_(std::get<1>(GetParam())) { + SaveCardOptionParam save_card_option_param = std::get<2>(GetParam()); save_credit_card_options_ = AutofillClient::SaveCreditCardOptions() .with_from_dynamic_change_form( @@ -1007,7 +365,6 @@ return result; } - const bool metrics_revamp_experiment_enabled_; const std::string destination_; const std::string show_; @@ -1018,8 +375,7 @@ INSTANTIATE_TEST_SUITE_P( , SaveCardBubbleLoggingTest, - testing::Combine(testing::Bool(), - testing::Values("Local", "Upload"), + testing::Combine(testing::Values("Local", "Upload"), testing::Values("FirstShow", "Reshows"), testing::ValuesIn(kSaveCardOptionParam))); @@ -1027,14 +383,9 @@ base::HistogramTester histogram_tester; TriggerFlow(); - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), - AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), + AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, 1); // Verifies legacy metrics are logged correctly. This does not depend on the // experiment flag. @@ -1054,14 +405,9 @@ base::HistogramTester histogram_tester; TriggerFlow(/*show_prompt=*/false); - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), - AutofillMetrics::SAVE_CARD_PROMPT_NOT_SHOWN_MAX_STRIKES_REACHED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptOffer" + GetHistogramNameSuffix(), + AutofillMetrics::SAVE_CARD_PROMPT_NOT_SHOWN_MAX_STRIKES_REACHED, 1); // Verifies legacy metrics are logged correctly. This does not depend on the // experiment flag. @@ -1076,14 +422,9 @@ controller()->OnSaveButton({}); CloseBubble(PaymentsBubbleClosedReason::kAccepted); - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), - AutofillMetrics::SAVE_CARD_PROMPT_ACCEPTED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), + AutofillMetrics::SAVE_CARD_PROMPT_ACCEPTED, 1); // Verifies legacy metrics are logged correctly. This does not depend on the // experiment flag. @@ -1101,14 +442,9 @@ controller()->OnCancelButton(); CloseBubble(PaymentsBubbleClosedReason::kCancelled); - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), - AutofillMetrics::SAVE_CARD_PROMPT_CANCELLED, 1); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptResult" + GetHistogramNameSuffix(), + AutofillMetrics::SAVE_CARD_PROMPT_CANCELLED, 1); // Verifies legacy metrics are logged correctly. This does not depend on the // experiment flag. @@ -1121,9 +457,6 @@ } TEST_P(SaveCardBubbleLoggingTest, Metrics_Closed) { - if (!metrics_revamp_experiment_enabled_) - return; - base::HistogramTester histogram_tester; TriggerFlow(); CloseBubble(PaymentsBubbleClosedReason::kClosed); @@ -1134,9 +467,6 @@ } TEST_P(SaveCardBubbleLoggingTest, Metrics_NotInteracted) { - if (!metrics_revamp_experiment_enabled_) - return; - base::HistogramTester histogram_tester; TriggerFlow(); CloseBubble(PaymentsBubbleClosedReason::kNotInteracted); @@ -1147,9 +477,6 @@ } TEST_P(SaveCardBubbleLoggingTest, Metrics_LostFocus) { - if (!metrics_revamp_experiment_enabled_) - return; - base::HistogramTester histogram_tester; TriggerFlow(); CloseBubble(PaymentsBubbleClosedReason::kLostFocus); @@ -1160,9 +487,6 @@ } TEST_P(SaveCardBubbleLoggingTest, Metrics_Unknown) { - if (!metrics_revamp_experiment_enabled_) - return; - base::HistogramTester histogram_tester; TriggerFlow(); CloseBubble(PaymentsBubbleClosedReason::kUnknown); @@ -1179,14 +503,9 @@ int expected_count = (show_ == "Reshows") ? 2 : 1; - if (metrics_revamp_experiment_enabled_) { - histogram_tester.ExpectUniqueSample( - "Autofill.SaveCreditCardPromptOffer." + destination_ + ".SECURE", - AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, expected_count); - } else { - histogram_tester.ExpectTotalCount( - "Autofill.SaveCreditCardPromptOffer." + destination_ + ".SECURE", 0); - } + histogram_tester.ExpectUniqueSample( + "Autofill.SaveCreditCardPromptOffer." + destination_ + ".SECURE", + AutofillMetrics::SAVE_CARD_PROMPT_SHOWN, expected_count); EXPECT_THAT( histogram_tester.GetAllSamples("Autofill.SaveCreditCardPrompt." + @@ -1206,13 +525,8 @@ base::UserActionTester user_action_tester; controller()->OnLegalMessageLinkClicked(GURL("http://www.example.com")); - if (metrics_revamp_experiment_enabled_) { - EXPECT_EQ(1, user_action_tester.GetActionCount( - "Autofill_CreditCardUpload_LegalMessageLinkClicked")); - } else { - EXPECT_EQ(0, user_action_tester.GetActionCount( - "Autofill_CreditCardUpload_LegalMessageLinkClicked")); - } + EXPECT_EQ(1, user_action_tester.GetActionCount( + "Autofill_CreditCardUpload_LegalMessageLinkClicked")); histogram_tester.ExpectUniqueSample( "Autofill.SaveCreditCardPrompt." + destination_ + "." + show_, @@ -1239,38 +553,6 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -class SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble - : public SaveCardBubbleControllerImplTest { - public: - SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{ - features::kAutofillEnableFixedPaymentsBubbleLogging, - features::kAutofillEnableStickyPaymentsBubble, - features::kAutofillCreditCardUploadFeedback, - features::kAutofillEnableToolbarStatusChip}); - } - ~SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble() override = - default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble, - Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - ShowLocalBubble(); - ClickSaveButton(); - CloseAndReshowBubble(); - CloseBubble(); - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - // Icon should disappear after navigating away. - EXPECT_FALSE(controller()->IsIconVisible()); - EXPECT_EQ(nullptr, controller()->GetSaveCardBubbleView()); -} - TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { ShowLocalBubble(); @@ -1326,21 +608,6 @@ } TEST_F( - SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble, - Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Close_Navigate) { - base::HistogramTester histogram_tester; - ShowLocalBubble(); - ClickSaveButton(); - CloseAndReshowBubble(); - CloseBubble(); - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); -} - -TEST_F( SaveCardBubbleControllerImplTestWithoutStatusChip, Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_ManageCards) { base::HistogramTester histogram_tester; @@ -1354,19 +621,6 @@ ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); } -TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChipAndStickyBubble, - Metrics_Local_FirstShow_SaveButton_SigninPromo_Close_Reshow_Navigate) { - base::HistogramTester histogram_tester; - ShowLocalBubble(); - ClickSaveButton(); - CloseAndReshowBubble(); - test_clock_.Advance(base::TimeDelta::FromSeconds(6)); - controller()->SimulateNavigation(); - EXPECT_THAT( - histogram_tester.GetAllSamples("Autofill.ManageCardsPrompt.Local"), - ElementsAre(Bucket(AutofillMetrics::MANAGE_CARDS_SHOWN, 1))); -} - TEST_F(SaveCardBubbleControllerImplTestWithoutStatusChip, Upload_FirstShow_SaveButton_NoSigninPromo) { ShowUploadBubble();
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index 1105837d..1018243 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -66,6 +66,7 @@ #include "content/public/common/url_constants.h" #include "extensions/browser/extension_system.h" #include "printing/buildflags/buildflags.h" +#include "ui/base/ui_base_features.h" #include "ui/events/keycodes/keyboard_codes.h" #if defined(OS_MAC) @@ -92,7 +93,6 @@ #endif #if defined(USE_OZONE) -#include "ui/base/ui_base_features.h" #include "ui/ozone/public/ozone_platform.h" #endif @@ -834,6 +834,13 @@ } break; } + + // UI debug commands + case IDC_DEBUG_TOGGLE_TABLET_MODE: + case IDC_DEBUG_PRINT_VIEW_TREE: + ExecuteUIDebugCommand(id, browser_); + break; + default: LOG(WARNING) << "Received Unimplemented Command: " << id; break; @@ -1125,6 +1132,11 @@ command_updater_.UpdateCommandEnabled(IDC_TAB_SEARCH_CLOSE, enable_tab_search_commands); + if (base::FeatureList::IsEnabled(features::kUIDebugTools)) { + command_updater_.UpdateCommandEnabled(IDC_DEBUG_TOGGLE_TABLET_MODE, true); + command_updater_.UpdateCommandEnabled(IDC_DEBUG_PRINT_VIEW_TREE, true); + } + // Initialize other commands whose state changes based on various conditions. UpdateCommandsForFullscreenMode(); UpdateCommandsForContentRestrictionState();
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h index 8375445..f2e46d8 100644 --- a/chrome/browser/ui/browser_commands.h +++ b/chrome/browser/ui/browser_commands.h
@@ -219,6 +219,7 @@ void ToggleCaretBrowsing(Browser* browser); void PromptToNameWindow(Browser* browser); void ToggleCommander(Browser* browser); +void ExecuteUIDebugCommand(int id, const Browser* browser); base::Optional<int> GetKeyboardFocusedTabIndex(const Browser* browser);
diff --git a/chrome/browser/ui/passwords/manage_passwords_test.cc b/chrome/browser/ui/passwords/manage_passwords_test.cc index 2dcd2053..e632e8f 100644 --- a/chrome/browser/ui/passwords/manage_passwords_test.cc +++ b/chrome/browser/ui/passwords/manage_passwords_test.cc
@@ -155,7 +155,7 @@ // This is an unrelated compromised credential that should still be fixed. password_manager::CompromisedCredentials compromised( "https://somesite.com/", ASCIIToUTF16(kTestUsername), base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false)); password_store->AddCompromisedCredentials(compromised); SetupPendingPassword(); @@ -175,11 +175,11 @@ // This is an unrelated compromised credential that should still be fixed. password_manager::CompromisedCredentials some_compromised( "https://somesite.com/", ASCIIToUTF16(kTestUsername), base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false)); password_manager::CompromisedCredentials current_compromised( password_form_.signon_realm, password_form_.username_value, base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false)); password_store->AddCompromisedCredentials(some_compromised); password_store->AddCompromisedCredentials(current_compromised); @@ -239,7 +239,7 @@ password_manager::CompromisedCredentials compromised( password_form_.signon_realm, password_form_.username_value, base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false)); fetcher_.set_compromised({compromised});
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc index 1f5e337..7a07675 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -214,7 +214,7 @@ CompromisedCredentials CreateCompromised(const PasswordForm& form) { return CompromisedCredentials(form.signon_realm, form.username_value, base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false)); }
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc index 07bd5af5..27a192e 100644 --- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc +++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc
@@ -11,7 +11,7 @@ #include "base/task/post_task.h" #include "base/task/thread_pool.h" #include "base/task_runner_util.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc index a6d84e9..acfde95 100644 --- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc +++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop_unittest.cc
@@ -14,9 +14,9 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" +#include "chrome/browser/enterprise/connectors/analysis/content_analysis_delegate.h" +#include "chrome/browser/enterprise/connectors/analysis/fake_content_analysis_delegate.h" #include "chrome/browser/enterprise/connectors/connectors_service.h" -#include "chrome/browser/enterprise/connectors/content_analysis_delegate.h" -#include "chrome/browser/enterprise/connectors/fake_content_analysis_delegate.h" #include "chrome/browser/policy/dm_token_utils.h" #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.h" #include "chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.h"
diff --git a/chrome/browser/ui/tabs/tab_menu_model.cc b/chrome/browser/ui/tabs/tab_menu_model.cc index 5001859..19fbac3 100644 --- a/chrome/browser/ui/tabs/tab_menu_model.cc +++ b/chrome/browser/ui/tabs/tab_menu_model.cc
@@ -62,12 +62,14 @@ l10n_util::GetPluralStringFUTF16(IDS_TAB_CXMENU_ADD_TAB_TO_GROUP, num_tabs), add_to_existing_group_submenu_.get()); - SetIsNewFeatureAt(GetItemCount() - 1, true); + if (base::FeatureList::IsEnabled(features::kTabGroupsNewBadgePromo)) + SetIsNewFeatureAt(GetItemCount() - 1, true); } else { AddItem(TabStripModel::CommandAddToNewGroup, l10n_util::GetPluralStringFUTF16( IDS_TAB_CXMENU_ADD_TAB_TO_NEW_GROUP, num_tabs)); - SetIsNewFeatureAt(GetItemCount() - 1, true); + if (base::FeatureList::IsEnabled(features::kTabGroupsNewBadgePromo)) + SetIsNewFeatureAt(GetItemCount() - 1, true); } for (const auto& selection : indices) {
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 49746cc..7d7530d1 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -94,6 +94,13 @@ const base::Feature kTabGroupsFeedback{"TabGroupsFeedback", base::FEATURE_ENABLED_BY_DEFAULT}; +// Directly controls the "new" badge (as opposed to old "master switch"; see +// https://crbug.com/1169907 for master switch deprecation and +// https://crbug.com/968587 for the feature itself) +// https://crbug.com/1173792 +const base::Feature kTabGroupsNewBadgePromo{"TabGroupsNewBadgePromo", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables popup cards containing tab information when hovering over a tab. // https://crbug.com/910739 const base::Feature kTabHoverCards{"TabHoverCards",
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 9047f80..044ec21 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -61,6 +61,8 @@ extern const base::Feature kTabGroupsFeedback; +extern const base::Feature kTabGroupsNewBadgePromo; + extern const base::Feature kTabHoverCards; extern const char kTabHoverCardsFeatureParameterName[];
diff --git a/chrome/browser/ui/views/accelerator_table.cc b/chrome/browser/ui/views/accelerator_table.cc index 2b6eed0..bb9107a 100644 --- a/chrome/browser/ui/views/accelerator_table.cc +++ b/chrome/browser/ui/views/accelerator_table.cc
@@ -6,6 +6,7 @@ #include <stddef.h> +#include "base/feature_list.h" #include "base/no_destructor.h" #include "base/notreached.h" #include "base/stl_util.h" @@ -241,6 +242,15 @@ }; #endif +constexpr int kDebugModifier = + ui::EF_PLATFORM_ACCELERATOR | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN; + +// Accelerators to enable if features::UIDebugTools is true. +constexpr AcceleratorMapping kUIDebugAcceleratorMap[] = { + {ui::VKEY_T, kDebugModifier, IDC_DEBUG_TOGGLE_TABLET_MODE}, + {ui::VKEY_V, kDebugModifier, IDC_DEBUG_PRINT_VIEW_TREE}, +}; + const int kRepeatableCommandIds[] = { IDC_FIND_NEXT, IDC_FIND_PREVIOUS, @@ -273,6 +283,12 @@ std::end(kDisableWithNewMappingAcceleratorMap)); } #endif + + if (base::FeatureList::IsEnabled(features::kUIDebugTools)) { + accelerators->insert(accelerators->begin(), + std::begin(kUIDebugAcceleratorMap), + std::end(kUIDebugAcceleratorMap)); + } } return *accelerators;
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc index 87fc5f7..40c50bf 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc +++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.cc
@@ -11,6 +11,7 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" AppDialogView::AppDialogView(const gfx::ImageSkia& image) : BubbleDialogDelegateView(nullptr, views::BubbleBorder::NONE) { @@ -41,3 +42,6 @@ DCHECK(label_); label_->SetText(text); } + +BEGIN_METADATA(AppDialogView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.h b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.h index 7497e4b..44f328f 100644 --- a/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.h +++ b/chrome/browser/ui/views/apps/app_dialog/app_dialog_view.h
@@ -8,6 +8,7 @@ #include "base/strings/string16.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/controls/label.h" +#include "ui/views/metadata/metadata_header_macros.h" namespace gfx { class ImageSkia; @@ -17,6 +18,7 @@ // for app related dialog classes, e.g AppBlockDialogView, AppPauseDialogView. class AppDialogView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(AppDialogView); explicit AppDialogView(const gfx::ImageSkia& image); ~AppDialogView() override;
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc index 59d5722..fee9bc6a 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_browsertest.cc
@@ -1157,21 +1157,7 @@ #endif // !BUILDFLAG(IS_CHROMEOS_ASH) -class LocalCardMigrationBrowserTestForFixedLogging - : public LocalCardMigrationBrowserTest { - protected: - LocalCardMigrationBrowserTestForFixedLogging() { - scoped_feature_list_.InitAndEnableFeature( - features::kAutofillEnableFixedPaymentsBubbleLogging); - } - - ~LocalCardMigrationBrowserTestForFixedLogging() override = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForFixedLogging, +IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTest, ClosedReason_BubbleAccepted) { base::HistogramTester histogram_tester; @@ -1185,7 +1171,7 @@ AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_ACCEPTED, 1); } -IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForFixedLogging, +IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTest, ClosedReason_BubbleClosed) { base::HistogramTester histogram_tester; @@ -1200,7 +1186,7 @@ AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_CLOSED, 1); } -IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForFixedLogging, +IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTest, ClosedReason_BubbleNotInteracted) { base::HistogramTester histogram_tester; @@ -1217,7 +1203,7 @@ AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_NOT_INTERACTED, 1); } -IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForFixedLogging, +IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTest, ClosedReason_BubbleLostFocus) { base::HistogramTester histogram_tester;
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index 52832062..874b627 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -2374,102 +2374,4 @@ Bucket(AutofillMetrics::MANAGE_CARDS_DONE, 1))); } -// TODO(crbug.com/1070799): Remove the following two tests when the sticky -// bubble feature is launched. -class SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubble - : public SaveCardBubbleViewsFullFormBrowserTest { - public: - SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubble() { - feature_list_.InitWithFeatures( - /*enabled_features=*/{}, - /*disabled_features=*/{ - features::kAutofillUpstream, - features::kAutofillEnableStickyPaymentsBubble, - features::kAutofillEnableFixedPaymentsBubbleLogging}); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Tests StrikeDatabase interaction with the local save bubble. Ensures that a -// strike is added if the bubble is ignored. -IN_PROC_BROWSER_TEST_F( - SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubble, - StrikeDatabase_Local_AddStrikeIfBubbleIgnored) { - TestAutofillClock test_clock; - test_clock.SetNow(base::Time::Now()); - - // Set up the Payments RPC. - SetUploadDetailsRpcPaymentsDeclines(); - - FillForm(); - SubmitFormAndWaitForCardLocalSaveBubble(); - - // Clicking the [X] close button should dismiss the bubble. - ClickOnCloseButton(); - - base::HistogramTester histogram_tester; - - // Wait long enough to avoid bubble stickiness, then navigate away from the - // page. - test_clock.Advance(kCardBubbleSurviveNavigationTime); - ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); - NavigateTo(kCreditCardAndAddressUploadForm); - WaitForObservedEvent(); - - // Ensure that a strike was added due to the bubble being ignored. - histogram_tester.ExpectUniqueSample( - "Autofill.StrikeDatabase.NthStrikeAdded.CreditCardSave", - /*sample=*/1, /*count=*/1); -} - -class - SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubbleWithAutofillUpstream - : public SaveCardBubbleViewsFullFormBrowserTest { - public: - SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubbleWithAutofillUpstream() { - feature_list_.InitWithFeatures( - /*enabled_features=*/{features::kAutofillUpstream}, - /*disabled_features=*/{ - features::kAutofillEnableStickyPaymentsBubble, - features::kAutofillEnableFixedPaymentsBubbleLogging}); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Tests StrikeDatabase interaction with the upload save bubble. Ensures that a -// strike is added if the bubble is ignored. -IN_PROC_BROWSER_TEST_F( - SaveCardBubbleViewsFullFormBrowserTestWithoutStickyBubbleWithAutofillUpstream, - StrikeDatabase_Upload_AddStrikeIfBubbleIgnored) { - TestAutofillClock test_clock; - test_clock.SetNow(base::Time::Now()); - - // Start sync. - harness_->SetupSync(); - - FillForm(); - SubmitFormAndWaitForCardUploadSaveBubble(); - - // Clicking the [X] close button should dismiss the bubble. - ClickOnCloseButton(); - - base::HistogramTester histogram_tester; - - // Wait long enough to avoid bubble stickiness, then navigate away from the - // page. - test_clock.Advance(kCardBubbleSurviveNavigationTime); - ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); - NavigateTo(kCreditCardAndAddressUploadForm); - WaitForObservedEvent(); - - // Ensure that a strike was added due to the bubble being ignored. - histogram_tester.ExpectUniqueSample( - "Autofill.StrikeDatabase.NthStrikeAdded.CreditCardSave", - /*sample=*/1, /*count=*/1); -} - } // namespace autofill
diff --git a/chrome/browser/ui/views/browser_commands_views.cc b/chrome/browser/ui/views/browser_commands_views.cc index 5a74128..fe9d1fa 100644 --- a/chrome/browser/ui/views/browser_commands_views.cc +++ b/chrome/browser/ui/views/browser_commands_views.cc
@@ -2,9 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/notreached.h" +#include "build/build_config.h" +#include "chrome/app/chrome_command_ids.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/tabs/tab_strip.h" +#include "ui/base/ui_base_features.h" +#include "ui/views/debug_utils.h" namespace chrome { @@ -15,4 +20,28 @@ return base::nullopt; } +void ExecuteUIDebugCommand(int id, const Browser* browser) { + if (!base::FeatureList::IsEnabled(features::kUIDebugTools)) + return; + + switch (id) { + case IDC_DEBUG_TOGGLE_TABLET_MODE: { + auto* controller = ui::TouchUiController::Get(); + // Chrome always uses touch_ui_state auto mode except in tests, so whether + // it is touch ui relies on whether it is in tablet mode. + controller->OnTabletModeToggled(!controller->touch_ui()); + break; + } + case IDC_DEBUG_PRINT_VIEW_TREE: + // TODO(weili): replace with a new tree dumping utility which can show + // detailed property info. + PrintViewHierarchy(BrowserView::GetBrowserViewForBrowser(browser)); + break; + + default: + NOTREACHED() << "Unimplemented UI Debug command: " << id; + break; + } +} + } // namespace chrome
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.cc b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.cc index d9da573..5c61885 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.cc
@@ -7,6 +7,7 @@ #include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/views/bubble/bubble_border.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/widget/widget.h" namespace { @@ -76,3 +77,6 @@ void WebUIBubbleDialogView::OnWebViewSizeChanged() { SizeToContents(); } + +BEGIN_METADATA(WebUIBubbleDialogView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h index 222d9a5..b720774 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h +++ b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h
@@ -8,11 +8,14 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/ui/views/bubble/webui_bubble_view.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" // A Views bubble host for a WebUIBubbleView. class WebUIBubbleDialogView : public views::BubbleDialogDelegateView, public WebUIBubbleView::Host { public: + METADATA_HEADER(WebUIBubbleDialogView); + static base::WeakPtr<WebUIBubbleDialogView> CreateWebUIBubbleDialog( std::unique_ptr<WebUIBubbleDialogView> bubble_view);
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.cc b/chrome/browser/ui/views/critical_notification_bubble_view.cc index ecad8f5b..0d385614 100644 --- a/chrome/browser/ui/views/critical_notification_bubble_view.cc +++ b/chrome/browser/ui/views/critical_notification_bubble_view.cc
@@ -25,6 +25,7 @@ #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/style/typography.h" #include "ui/views/widget/widget.h" @@ -145,3 +146,6 @@ if (details.is_add && details.child == this) NotifyAccessibilityEvent(ax::mojom::Event::kAlert, true); } + +BEGIN_METADATA(CriticalNotificationBubbleView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/critical_notification_bubble_view.h b/chrome/browser/ui/views/critical_notification_bubble_view.h index 7e4993c1..60faa34 100644 --- a/chrome/browser/ui/views/critical_notification_bubble_view.h +++ b/chrome/browser/ui/views/critical_notification_bubble_view.h
@@ -8,10 +8,16 @@ #include "base/macros.h" #include "base/timer/timer.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" class CriticalNotificationBubbleView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(CriticalNotificationBubbleView); explicit CriticalNotificationBubbleView(views::View* anchor_view); + CriticalNotificationBubbleView(const CriticalNotificationBubbleView&) = + delete; + CriticalNotificationBubbleView& operator=( + const CriticalNotificationBubbleView&) = delete; ~CriticalNotificationBubbleView() override; // views::BubbleDialogDelegateView overrides: @@ -37,8 +43,6 @@ // When the bubble was created. base::TimeTicks bubble_created_; - - DISALLOW_COPY_AND_ASSIGN(CriticalNotificationBubbleView); }; #endif // CHROME_BROWSER_UI_VIEWS_CRITICAL_NOTIFICATION_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/global_error_bubble_view.cc b/chrome/browser/ui/views/global_error_bubble_view.cc index d4e95d3..705096d 100644 --- a/chrome/browser/ui/views/global_error_bubble_view.cc +++ b/chrome/browser/ui/views/global_error_bubble_view.cc
@@ -33,6 +33,7 @@ #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/grid_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" // GlobalErrorBubbleViewBase --------------------------------------------------- @@ -147,3 +148,6 @@ void GlobalErrorBubbleView::CloseBubbleView() { GetWidget()->Close(); } + +BEGIN_METADATA(GlobalErrorBubbleView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/global_error_bubble_view.h b/chrome/browser/ui/views/global_error_bubble_view.h index 36b728ef..126c0fe 100644 --- a/chrome/browser/ui/views/global_error_bubble_view.h +++ b/chrome/browser/ui/views/global_error_bubble_view.h
@@ -9,6 +9,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/ui/global_error/global_error_bubble_view_base.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" class Browser; class ElevationIconSetter; @@ -17,11 +18,14 @@ class GlobalErrorBubbleView : public views::BubbleDialogDelegateView, public GlobalErrorBubbleViewBase { public: + METADATA_HEADER(GlobalErrorBubbleView); GlobalErrorBubbleView( views::View* anchor_view, views::BubbleBorder::Arrow arrow, Browser* browser, const base::WeakPtr<GlobalErrorWithStandardBubble>& error); + GlobalErrorBubbleView(const GlobalErrorBubbleView&) = delete; + GlobalErrorBubbleView& operator=(const GlobalErrorBubbleView&) = delete; ~GlobalErrorBubbleView() override; // views::BubbleDialogDelegateView implementation. @@ -35,8 +39,6 @@ base::WeakPtr<GlobalErrorWithStandardBubble> error_; std::unique_ptr<ElevationIconSetter> elevation_icon_setter_; - - DISALLOW_COPY_AND_ASSIGN(GlobalErrorBubbleView); }; #endif // CHROME_BROWSER_UI_VIEWS_GLOBAL_ERROR_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc index d59e1df..88a6c2e 100644 --- a/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc +++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view.cc
@@ -34,6 +34,7 @@ #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/views_features.h" using media_session::mojom::MediaSessionAction; @@ -327,3 +328,6 @@ live_caption_title_->SetText(l10n_util::GetStringFUTF16Int( IDS_GLOBAL_MEDIA_CONTROLS_LIVE_CAPTION_DOWNLOAD_PROGRESS, progress)); } + +BEGIN_METADATA(MediaDialogView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/global_media_controls/media_dialog_view.h b/chrome/browser/ui/views/global_media_controls/media_dialog_view.h index 26081fa..bfc3c12 100644 --- a/chrome/browser/ui/views/global_media_controls/media_dialog_view.h +++ b/chrome/browser/ui/views/global_media_controls/media_dialog_view.h
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/global_media_controls/media_dialog_delegate.h" #include "chrome/browser/ui/global_media_controls/media_notification_container_observer.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" class MediaDialogViewObserver; class MediaNotificationContainerImplView; @@ -34,6 +35,11 @@ public MediaNotificationContainerObserver, public speech::SodaInstaller::Observer { public: + METADATA_HEADER(MediaDialogView); + + MediaDialogView(const MediaDialogView&) = delete; + MediaDialogView& operator=(const MediaDialogView&) = delete; + static views::Widget* ShowDialog(views::View* anchor_view, MediaNotificationService* service, Profile* profile); @@ -119,8 +125,6 @@ NewBadgeLabel* live_caption_title_new_badge_ = nullptr; views::Label* live_caption_title_ = nullptr; views::ToggleButton* live_caption_button_ = nullptr; - - DISALLOW_COPY_AND_ASSIGN(MediaDialogView); }; #endif // CHROME_BROWSER_UI_VIEWS_GLOBAL_MEDIA_CONTROLS_MEDIA_DIALOG_VIEW_H_
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.cc b/chrome/browser/ui/views/hats/hats_bubble_view.cc index d8e25bc..2f280cf 100644 --- a/chrome/browser/ui/views/hats/hats_bubble_view.cc +++ b/chrome/browser/ui/views/hats/hats_bubble_view.cc
@@ -29,6 +29,7 @@ #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -186,3 +187,6 @@ views::BubbleDialogDelegateView::OnBoundsChanged(previous_bounds); } + +BEGIN_METADATA(HatsBubbleView, views::BubbleDialogDelegateView) +END_METADATA
diff --git a/chrome/browser/ui/views/hats/hats_bubble_view.h b/chrome/browser/ui/views/hats/hats_bubble_view.h index 7bfc060b..30d8a4f 100644 --- a/chrome/browser/ui/views/hats/hats_bubble_view.h +++ b/chrome/browser/ui/views/hats/hats_bubble_view.h
@@ -12,6 +12,7 @@ #include "base/macros.h" #include "chrome/browser/ui/views/close_bubble_on_tab_activation_helper.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" class AppMenuButton; class Browser; @@ -25,6 +26,8 @@ // It displays a WebUI that hosts the survey. class HatsBubbleView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(HatsBubbleView); + // Histogram enum on how users interact with the bubble. // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. @@ -36,6 +39,9 @@ kMaxValue = kIgnored, }; + HatsBubbleView(const HatsBubbleView&) = delete; + HatsBubbleView& operator=(const HatsBubbleView&) = delete; + // Returns a pointer to the Hats Bubble being shown. For testing only. static views::BubbleDialogDelegateView* GetHatsBubble(); @@ -71,8 +77,6 @@ static HatsBubbleView* instance_; CloseBubbleOnTabActivationHelper close_bubble_helper_; HatsConsentCallback consent_callback_; - - DISALLOW_COPY_AND_ASSIGN(HatsBubbleView); }; #endif // CHROME_BROWSER_UI_VIEWS_HATS_HATS_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc index f2519f1..71da149 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -300,8 +300,8 @@ // origin changed. Other intent picker bubbles will be handled in // intent_picker_helpers, they will get closed on each navigation start and // should stay open until after navigation finishes. - set_close_on_main_frame_origin_navigation(icon_type == - PageActionIconType::kClickToCall); + SetCloseOnMainFrameOriginNavigation(icon_type == + PageActionIconType::kClickToCall); chrome::RecordDialogCreation(chrome::DialogIdentifier::INTENT_PICKER); }
diff --git a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc index a5f2af0..8055a033 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.cc
@@ -20,6 +20,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/bubble/bubble_frame_view.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "url/origin.h" LocationBarBubbleDelegateView::WebContentMouseHandler::WebContentMouseHandler( @@ -175,3 +176,17 @@ void LocationBarBubbleDelegateView::CloseBubble() { GetWidget()->Close(); } + +void LocationBarBubbleDelegateView::SetCloseOnMainFrameOriginNavigation( + bool close) { + close_on_main_frame_origin_navigation_ = close; +} + +bool LocationBarBubbleDelegateView::GetCloseOnMainFrameOriginNavigation() + const { + return close_on_main_frame_origin_navigation_; +} + +BEGIN_METADATA(LocationBarBubbleDelegateView, views::BubbleDialogDelegateView) +ADD_READONLY_PROPERTY_METADATA(bool, CloseOnMainFrameOriginNavigation) +END_METADATA
diff --git a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h index 2645e31..2c5e16fc 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h +++ b/chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h
@@ -13,6 +13,7 @@ #include "ui/events/event_observer.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/event_monitor.h" +#include "ui/views/metadata/metadata_header_macros.h" namespace content { class WebContents; @@ -26,6 +27,8 @@ public FullscreenObserver, public content::WebContentsObserver { public: + METADATA_HEADER(LocationBarBubbleDelegateView); + enum DisplayReason { // The bubble appears as a direct result of a user action (clicking on the // location bar icon). @@ -45,6 +48,9 @@ LocationBarBubbleDelegateView(views::View* anchor_view, content::WebContents* web_contents); + LocationBarBubbleDelegateView(const LocationBarBubbleDelegateView&) = delete; + LocationBarBubbleDelegateView& operator=( + const LocationBarBubbleDelegateView&) = delete; ~LocationBarBubbleDelegateView() override; // Displays the bubble with appearance and behavior tailored for |reason|. @@ -98,9 +104,8 @@ // Closes the bubble. virtual void CloseBubble(); - void set_close_on_main_frame_origin_navigation(bool close) { - close_on_main_frame_origin_navigation_ = close; - } + void SetCloseOnMainFrameOriginNavigation(bool close); + bool GetCloseOnMainFrameOriginNavigation() const; private: base::ScopedObservation<FullscreenController, FullscreenObserver> @@ -111,8 +116,6 @@ bool close_on_main_frame_origin_navigation_ = false; DisplayReason display_reason_ = AUTOMATIC; - - DISALLOW_COPY_AND_ASSIGN(LocationBarBubbleDelegateView); }; #endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_LOCATION_BAR_BUBBLE_DELEGATE_VIEW_H_
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_view.cc index 234ba92..ac64ae7 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.cc
@@ -39,6 +39,7 @@ #include "ui/views/controls/scroll_view.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" namespace media_router { @@ -473,4 +474,7 @@ // static CastDialogView* CastDialogView::instance_ = nullptr; +BEGIN_METADATA(CastDialogView, views::BubbleDialogDelegateView) +END_METADATA + } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view.h b/chrome/browser/ui/views/media_router/cast_dialog_view.h index aaa1419cb..4bcbd9a 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_view.h +++ b/chrome/browser/ui/views/media_router/cast_dialog_view.h
@@ -17,6 +17,7 @@ #include "ui/views/bubble/bubble_border.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/controls/menu/menu_runner.h" +#include "ui/views/metadata/metadata_header_macros.h" class Browser; class Profile; @@ -38,6 +39,8 @@ public CastDialogController::Observer, public ui::SimpleMenuModel::Delegate { public: + METADATA_HEADER(CastDialogView); + class Observer : public base::CheckedObserver { public: virtual void OnDialogModelUpdated(CastDialogView* dialog_view) = 0; @@ -46,6 +49,9 @@ enum SourceType { kTab, kDesktop, kLocalFile }; + CastDialogView(const CastDialogView&) = delete; + CastDialogView& operator=(const CastDialogView&) = delete; + // Shows the singleton dialog anchored to the Cast toolbar icon. Requires that // BrowserActionsContainer exists for |browser|. static void ShowDialogWithToolbarAction( @@ -237,8 +243,6 @@ bool keep_shown_for_testing_ = false; base::WeakPtrFactory<CastDialogView> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(CastDialogView); }; } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc index dc1c325..818067b 100644 --- a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc +++ b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.cc
@@ -23,6 +23,7 @@ #include "ui/gfx/text_constants.h" #include "ui/views/controls/styled_label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "url/gurl.h" @@ -132,4 +133,7 @@ // static CloudServicesDialogView* CloudServicesDialogView::instance_ = nullptr; +BEGIN_METADATA(CloudServicesDialogView, views::BubbleDialogDelegateView) +END_METADATA + } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.h b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.h index 9a69251..90e61cf 100644 --- a/chrome/browser/ui/views/media_router/cloud_services_dialog_view.h +++ b/chrome/browser/ui/views/media_router/cloud_services_dialog_view.h
@@ -7,6 +7,7 @@ #include "base/strings/string16.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" +#include "ui/views/metadata/metadata_header_macros.h" class Browser; @@ -16,6 +17,11 @@ // Cast feature. class CloudServicesDialogView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(CloudServicesDialogView); + + CloudServicesDialogView(const CloudServicesDialogView&) = delete; + CloudServicesDialogView& operator=(const CloudServicesDialogView&) = delete; + // Instantiates and shows the singleton dialog. static void ShowDialog(views::View* anchor_view, Browser* browser); @@ -43,8 +49,6 @@ // Browser window that this dialog is attached to. Browser* const browser_; - - DISALLOW_COPY_AND_ASSIGN(CloudServicesDialogView); }; } // namespace media_router
diff --git a/chrome/browser/ui/views/network_profile_bubble_view.cc b/chrome/browser/ui/views/network_profile_bubble_view.cc index f4194e1f..cf2432437 100644 --- a/chrome/browser/ui/views/network_profile_bubble_view.cc +++ b/chrome/browser/ui/views/network_profile_bubble_view.cc
@@ -20,14 +20,20 @@ #include "ui/views/controls/label.h" #include "ui/views/controls/link.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" namespace { class NetworkProfileBubbleView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(NetworkProfileBubbleView); NetworkProfileBubbleView(views::View* anchor, content::PageNavigator* navigator, Profile* profile); + NetworkProfileBubbleView(const NetworkProfileBubbleView&) = delete; + NetworkProfileBubbleView& operator=(const NetworkProfileBubbleView&) = delete; + private: ~NetworkProfileBubbleView() override; @@ -40,8 +46,6 @@ // Used for loading pages. content::PageNavigator* navigator_; Profile* profile_; - - DISALLOW_COPY_AND_ASSIGN(NetworkProfileBubbleView); }; //////////////////////////////////////////////////////////////////////////////// @@ -106,6 +110,9 @@ GetWidget()->Close(); } +BEGIN_METADATA(NetworkProfileBubbleView, views::BubbleDialogDelegateView) +END_METADATA + } // namespace // static
diff --git a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc index 92a032c2..c2cd1f1 100644 --- a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc +++ b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
@@ -133,7 +133,7 @@ SetFootnoteView(CreateOriginView(data_)); } - set_close_on_main_frame_origin_navigation(true); + SetCloseOnMainFrameOriginNavigation(true); } SharingDialogView::~SharingDialogView() = default;
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.cc index ff70bf4..d6ff984 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.cc
@@ -7,6 +7,7 @@ #include "ui/base/hit_test.h" #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/window/custom_frame_view.h" #include "ui/views/window/hit_test_utils.h" @@ -81,6 +82,5 @@ layer()->SetOpacity(1); } -const char* WebAppContentSettingsContainer::GetClassName() const { - return "WebAppContentSettingsContainer"; -} +BEGIN_METADATA(WebAppContentSettingsContainer, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.h b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.h index 57838d15..d7e495e46 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_content_settings_container.h
@@ -10,19 +10,20 @@ #include "chrome/browser/ui/views/location_bar/content_setting_image_view.h" #include "chrome/browser/ui/views/location_bar/icon_label_bubble_view.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/view.h" class WebAppContentSettingsContainer : public views::View { public: + METADATA_HEADER(WebAppContentSettingsContainer); WebAppContentSettingsContainer( IconLabelBubbleView::Delegate* icon_label_bubble_delegate, ContentSettingImageView::Delegate* content_setting_image_delegate); - ~WebAppContentSettingsContainer() override; - WebAppContentSettingsContainer(const WebAppContentSettingsContainer&) = delete; WebAppContentSettingsContainer& operator=( const WebAppContentSettingsContainer&) = delete; + ~WebAppContentSettingsContainer() override; void UpdateContentSettingViewsVisibility(); @@ -40,9 +41,6 @@ return content_setting_views_; } - // views::View: - const char* GetClassName() const override; - private: // Owned by the views hierarchy. std::vector<ContentSettingImageView*> content_setting_views_;
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.cc index a7943ce2..ba980a7 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.cc
@@ -17,6 +17,7 @@ #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/views/controls/label.h" #include "ui/views/layout/fill_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" namespace { @@ -99,3 +100,6 @@ node_data->role = ax::mojom::Role::kApplication; node_data->SetName(label_->GetText()); } + +BEGIN_METADATA(WebAppOriginText, views::View) +END_METADATA
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.h b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.h index 3e25b9b3..dd987be 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_origin_text.h
@@ -9,6 +9,7 @@ #include "base/strings/string16.h" #include "base/time/time.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/view.h" class Browser; @@ -20,7 +21,10 @@ // A URL's origin text with a fade in/out animation. class WebAppOriginText : public views::View { public: + METADATA_HEADER(WebAppOriginText); explicit WebAppOriginText(Browser* browser); + WebAppOriginText(const WebAppOriginText&) = delete; + WebAppOriginText& operator=(const WebAppOriginText&) = delete; ~WebAppOriginText() override; void SetTextColor(SkColor color); @@ -38,8 +42,6 @@ void AnimationComplete(); base::WeakPtrFactory<WebAppOriginText> weak_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(WebAppOriginText); }; #endif // CHROME_BROWSER_UI_VIEWS_WEB_APPS_FRAME_TOOLBAR_WEB_APP_ORIGIN_TEXT_H_
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc index bd2d2c7..db58d45 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.cc
@@ -23,6 +23,7 @@ #include "chrome/common/chrome_features.h" #include "ui/base/hit_test.h" #include "ui/views/layout/flex_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/window/hit_test_utils.h" namespace { @@ -204,10 +205,6 @@ base::Unretained(toolbar_button_provider_), layout->GetDefaultFlexRule()); } -const char* WebAppToolbarButtonContainer::GetClassName() const { - return "WebAppToolbarButtonContainer"; -} - void WebAppToolbarButtonContainer::DisableAnimationForTesting() { g_animation_disabled_for_testing = true; } @@ -234,13 +231,13 @@ // Methods for coordinate the titlebar animation (origin text slide, menu // highlight and icon fade in). -bool WebAppToolbarButtonContainer::ShouldAnimate() const { +bool WebAppToolbarButtonContainer::GetAnimate() const { return !g_animation_disabled_for_testing && !browser_view_->immersive_mode_controller()->IsEnabled(); } void WebAppToolbarButtonContainer::StartTitlebarAnimation() { - if (!ShouldAnimate()) + if (!GetAnimate()) return; if (web_app_origin_text_) @@ -363,7 +360,7 @@ if (!visible || !pending_widget_visibility_) return; pending_widget_visibility_ = false; - if (ShouldAnimate()) { + if (GetAnimate()) { if (content_settings_container_) content_settings_container_->SetUpForFadeIn(); animation_start_delay_.Start( @@ -371,3 +368,7 @@ &WebAppToolbarButtonContainer::StartTitlebarAnimation); } } + +BEGIN_METADATA(WebAppToolbarButtonContainer, views::View) +ADD_READONLY_PROPERTY_METADATA(bool, Animate) +END_METADATA
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.h b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.h index 1f15cb8..73e5cac 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_toolbar_button_container.h
@@ -14,6 +14,7 @@ #include "chrome/browser/ui/views/toolbar/browser_actions_container.h" #include "chrome/browser/ui/web_applications/web_app_menu_model.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_observer.h" @@ -34,6 +35,8 @@ public PageActionIconContainer, public views::WidgetObserver { public: + METADATA_HEADER(WebAppToolbarButtonContainer); + // Timing parameters for the origin fade animation. // These control how long it takes for the origin text and menu button // highlight to fade in, pause then fade out. @@ -76,9 +79,6 @@ WebAppMenuButton* web_app_menu_button() { return web_app_menu_button_; } - // views::View: - const char* GetClassName() const override; - static void DisableAnimationForTesting(); private: @@ -99,7 +99,7 @@ // Methods for coordinate the titlebar animation (origin text slide, menu // highlight and icon fade in). - bool ShouldAnimate() const; + bool GetAnimate() const; void StartTitlebarAnimation();
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc index 77174b2e..1c07e5a 100644 --- a/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_section.cc
@@ -704,7 +704,7 @@ bool AccessibilitySection::LogMetric(mojom::Setting setting, base::Value& value) const { // TODO(accessibility): Ensure to capture metrics for Switch Access's action - // idalog on detach. + // dialog on detach. switch (setting) { case mojom::Setting::kFullscreenMagnifierFocusFollowing: base::UmaHistogramBoolean(
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc index ac0fc20d..4d17482 100644 --- a/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/safety_check_handler_unittest.cc
@@ -178,7 +178,7 @@ store_->AddCompromisedCredentials(password_manager::CompromisedCredentials( form.signon_realm, form.username_value, base::Time(), - password_manager::CompromiseType::kLeaked, + password_manager::InsecureType::kLeaked, password_manager::IsMuted(false))); base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.cc b/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.cc deleted file mode 100644 index 9ef3d8b2..0000000 --- a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.cc +++ /dev/null
@@ -1,186 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h" - -#include <vector> - -#include "base/bind.h" -#include "base/metrics/histogram_macros.h" -#include "base/metrics/user_metrics.h" -#include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_avatar_icon_util.h" -#include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" -#include "chrome/browser/ui/webui/signin/signin_utils.h" -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h" -#include "chrome/common/webui_url_constants.h" -#include "components/signin/public/base/avatar_icon_util.h" -#include "components/signin/public/identity_manager/account_info.h" -#include "components/signin/public/identity_manager/consent_level.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_ui.h" -#include "url/gurl.h" - -using signin::ConsentLevel; - -namespace { -const int kProfileImageSize = 128; -} // namespace - -WorkProfileConfirmationHandler::WorkProfileConfirmationHandler( - Profile* profile, - Browser* browser, - DiceTurnSyncOnHelper::SigninChoiceCallback callback) - : profile_(profile), - browser_(browser), - identity_manager_(IdentityManagerFactory::GetForProfile(profile_)), - callback_(std::move(callback)) { - DCHECK(profile_); - BrowserList::AddObserver(this); -} - -WorkProfileConfirmationHandler::~WorkProfileConfirmationHandler() { - BrowserList::RemoveObserver(this); - identity_manager_->RemoveObserver(this); - - // Abort signin and prevent work profile creation if none of the actions on - // the work profile confirmation dialog are taken by the user. - if (!did_user_explicitly_interact_) { - CloseModalSigninWindow(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL); - base::RecordAction(base::UserMetricsAction("Signin_Abort_Signin")); - } -} - -void WorkProfileConfirmationHandler::OnBrowserRemoved(Browser* browser) { - if (browser_ == browser) - browser_ = nullptr; -} - -void WorkProfileConfirmationHandler::RegisterMessages() { - web_ui()->RegisterMessageCallback( - "confirm", - base::BindRepeating(&WorkProfileConfirmationHandler::HandleConfirm, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "cancel", - base::BindRepeating(&WorkProfileConfirmationHandler::HandleCancel, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "initializedWithSize", - base::BindRepeating( - &WorkProfileConfirmationHandler::HandleInitializedWithSize, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "accountImageRequest", - base::BindRepeating( - &WorkProfileConfirmationHandler::HandleAccountImageRequest, - base::Unretained(this))); -} - -void WorkProfileConfirmationHandler::HandleConfirm( - const base::ListValue* args) { - did_user_explicitly_interact_ = true; - CloseModalSigninWindow(DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE); -} - -void WorkProfileConfirmationHandler::HandleCancel(const base::ListValue* args) { - did_user_explicitly_interact_ = true; - CloseModalSigninWindow(DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL); -} - -void WorkProfileConfirmationHandler::HandleAccountImageRequest( - const base::ListValue* args) { - base::Optional<AccountInfo> primary_account_info = - identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken( - identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); - - // Fire the "account-image-changed" listener from |SetUserImageURL()|. - // Note: If the account info is not available yet in the - // IdentityManager, i.e. account_info is empty, the listener will be - // fired again through |OnAccountUpdated()|. - if (primary_account_info) - SetUserImageURL(primary_account_info->picture_url); -} - -void WorkProfileConfirmationHandler::SetUserImageURL( - const std::string& picture_url) { - GURL picture_gurl(picture_url); - if (!picture_gurl.is_valid()) { - // As long as the provided gaia picture is not valid, stick to the default - // avatar provided in the load-time data. - return; - } - GURL picture_gurl_with_options = signin::GetAvatarImageURLWithOptions( - picture_gurl, kProfileImageSize, false /* no_silhouette */); - base::Value picture_url_value(picture_gurl_with_options.spec()); - - AllowJavascript(); - FireWebUIListener("account-image-changed", picture_url_value); -} - -void WorkProfileConfirmationHandler::OnExtendedAccountInfoUpdated( - const AccountInfo& info) { - if (!info.IsValid()) - return; - - if (info.account_id != - identity_manager_->GetPrimaryAccountId(ConsentLevel::kNotRequired)) { - return; - } - - identity_manager_->RemoveObserver(this); - SetUserImageURL(info.picture_url); -} - -void WorkProfileConfirmationHandler::CloseModalSigninWindow( - DiceTurnSyncOnHelper::SigninChoice result) { - if (did_user_explicitly_interact_) { - switch (result) { - case DiceTurnSyncOnHelper::SIGNIN_CHOICE_CANCEL: - base::RecordAction( - base::UserMetricsAction("Signin_WorkProfilePrompt_Cancel")); - break; - case DiceTurnSyncOnHelper::SIGNIN_CHOICE_CONTINUE: - NOTREACHED(); - break; - case DiceTurnSyncOnHelper::SIGNIN_CHOICE_NEW_PROFILE: - base::RecordAction( - base::UserMetricsAction("Signin_WorkProfilePrompt_Add")); - break; - case DiceTurnSyncOnHelper::SIGNIN_CHOICE_SIZE: - NOTREACHED(); - break; - } - } - std::move(callback_).Run(result); - if (browser_) - browser_->signin_view_controller()->CloseModalSignin(); -} - -void WorkProfileConfirmationHandler::HandleInitializedWithSize( - const base::ListValue* args) { - AllowJavascript(); - - if (browser_) - signin::SetInitializedModalHeight(browser_, web_ui(), args); - - base::Optional<AccountInfo> primary_account_info = - identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken( - identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)); - if (!primary_account_info) { - // No account is signed in, so there is nothing to be displayed in the sync - // confirmation dialog. - return; - } - - if (!primary_account_info->IsValid()) { - identity_manager_->AddObserver(this); - } else { - SetUserImageURL(primary_account_info->picture_url); - } -}
diff --git a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h b/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h deleted file mode 100644 index f99f43f..0000000 --- a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h +++ /dev/null
@@ -1,100 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_HANDLER_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_HANDLER_H_ - -#include <string> -#include <unordered_map> - -#include "base/macros.h" -#include "chrome/browser/ui/browser_list_observer.h" -#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h" -#include "chrome/browser/ui/webui/signin/login_ui_service.h" -#include "components/signin/public/identity_manager/identity_manager.h" -#include "content/public/browser/web_ui_message_handler.h" - -namespace base { -class ListValue; -} - -namespace signin { -class IdentityManager; -} - -// WebUI message handler for the work profile confirmation dialog. -// IdentityManager calls in this class use signin::ConsentLevel::kNotRequired -// because the user hasn't consented to anything yet. -class WorkProfileConfirmationHandler : public content::WebUIMessageHandler, - public signin::IdentityManager::Observer, - public BrowserListObserver { - public: - // Creates a WorkProfileConfirmationHandler for the |profile|. All strings in - // the corresponding Web UI should be represented in |string_to_grd_id_map| - // and mapped to their GRD IDs. If |browser| is provided, its signin view - // controller will be notified of the rendered size of the web page. - WorkProfileConfirmationHandler( - Profile* profile, - Browser* browser, - DiceTurnSyncOnHelper::SigninChoiceCallback callback); - ~WorkProfileConfirmationHandler() override; - - // content::WebUIMessageHandler: - void RegisterMessages() override; - - // signin::IdentityManager::Observer: - void OnExtendedAccountInfoUpdated(const AccountInfo& info) override; - - // BrowserListObserver: - void OnBrowserRemoved(Browser* browser) override; - - protected: - // Handles "confirm" message from the page. No arguments. - // This message is sent when the user confirms that they want complete sign in - // with a work profile. - virtual void HandleConfirm(const base::ListValue* args); - - // Handles "cancel" message from the page. No arguments. - // This message is sent when the user clicks "cancel" on the work profile - // confirmation dialog, which aborts signin and prevents the creation of a - // work profile. - virtual void HandleCancel(const base::ListValue* args); - - // Handles the web ui message sent when the html content is done being laid - // out and it's time to resize the native view hosting it to fit. |args| is - // a single integer value for the height the native view should resize to. - virtual void HandleInitializedWithSize(const base::ListValue* args); - - // Handles the "accountImageRequest" message sent after the - // "account-image-changed" WebUIListener was added. This method calls - // |SetUserImageURL| with the signed-in user's picture url. - virtual void HandleAccountImageRequest(const base::ListValue* args); - - // Sets the profile picture shown in the dialog to the image at |url|. - virtual void SetUserImageURL(const std::string& url); - - // TODO: Update comment - // Closes the modal signin window and calls - // DiceTurnSyncOnHelper::SigninChoice with |result|. |result| - // indicates the option chosen by the user in the confirmation UI. - void CloseModalSigninWindow(DiceTurnSyncOnHelper::SigninChoice result); - - private: - Profile* profile_; - - // Records whether the user clicked on Undo, Ok, or Settings. - bool did_user_explicitly_interact_ = false; - - // Weak reference to the browser that showed the work profile confirmation - // dialog (if such a dialog exists). - Browser* browser_; - - signin::IdentityManager* identity_manager_; - - DiceTurnSyncOnHelper::SigninChoiceCallback callback_; - - DISALLOW_COPY_AND_ASSIGN(WorkProfileConfirmationHandler); -}; - -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_HANDLER_H_
diff --git a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler_unittest.cc b/chrome/browser/ui/webui/signin/work_profile_confirmation_handler_unittest.cc deleted file mode 100644 index ad3b808..0000000 --- a/chrome/browser/ui/webui/signin/work_profile_confirmation_handler_unittest.cc +++ /dev/null
@@ -1,260 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h" - -#include <memory> -#include <unordered_map> -#include <vector> - -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "base/scoped_observation.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/metrics/user_action_tester.h" -#include "base/values.h" -#include "chrome/browser/profiles/profile_avatar_icon_util.h" -#include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h" -#include "chrome/common/webui_url_constants.h" -#include "chrome/test/base/browser_with_test_window_test.h" -#include "chrome/test/base/dialog_test_browser_window.h" -#include "chrome/test/base/testing_profile.h" -#include "components/signin/public/base/avatar_icon_util.h" -#include "content/public/test/browser_task_environment.h" -#include "content/public/test/test_web_ui.h" - -const int kExpectedProfileImageSize = 128; - -// The dialog needs to be initialized with a height but the actual value doesn't -// really matter in unit tests. -const double kDefaultDialogHeight = 350.0; - -class TestingWorkProfileConfirmationHandler - : public WorkProfileConfirmationHandler { - public: - TestingWorkProfileConfirmationHandler( - Browser* browser, - content::WebUI* web_ui, - DiceTurnSyncOnHelper::SigninChoiceCallback callback) - : WorkProfileConfirmationHandler(browser->profile(), - browser, - std::move(callback)) { - set_web_ui(web_ui); - } - - using WorkProfileConfirmationHandler::HandleCancel; - using WorkProfileConfirmationHandler::HandleConfirm; - using WorkProfileConfirmationHandler::HandleInitializedWithSize; - using WorkProfileConfirmationHandler::SetUserImageURL; - - private: - DISALLOW_COPY_AND_ASSIGN(TestingWorkProfileConfirmationHandler); -}; - -// TODO (crbug/1170448): Re-enable all tests. -class WorkProfileConfirmationHandlerTest : public BrowserWithTestWindowTest { - public: - WorkProfileConfirmationHandlerTest() : web_ui_(new content::TestWebUI) {} - - void SetUp() override { - BrowserWithTestWindowTest::SetUp(); - chrome::NewTab(browser()); - web_ui()->set_web_contents( - browser()->tab_strip_model()->GetActiveWebContents()); - - auto handler = std::make_unique<TestingWorkProfileConfirmationHandler>( - browser(), web_ui(), - base::BindOnce(&WorkProfileConfirmationHandlerTest:: - OnWorkProfileConfirmationUIClosed, - base::Unretained(this))); - handler_ = handler.get(); - - work_profile_confirmation_ui_ = - std::make_unique<WorkProfileConfirmationUI>(web_ui()); - web_ui()->AddMessageHandler(std::move(handler)); - - identity_test_env_adaptor_ = - std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile()); - account_info_ = - identity_test_env()->MakePrimaryAccountAvailable("foo@example.com"); - } - - void TearDown() override { - work_profile_confirmation_ui_.reset(); - web_ui_.reset(); - identity_test_env_adaptor_.reset(); - BrowserWithTestWindowTest::TearDown(); - - EXPECT_EQ(did_user_explicitly_interact_ ? 0 : 1, - user_action_tester()->GetActionCount("Signin_Abort_Signin")); - } - - TestingWorkProfileConfirmationHandler* handler() { return handler_; } - - content::TestWebUI* web_ui() { return web_ui_.get(); } - - base::UserActionTester* user_action_tester() { return &user_action_tester_; } - - signin::IdentityTestEnvironment* identity_test_env() { - return identity_test_env_adaptor_->identity_test_env(); - } - - std::unique_ptr<BrowserWindow> CreateBrowserWindow() override { - return std::make_unique<DialogTestBrowserWindow>(); - } - - TestingProfile::TestingFactories GetTestingFactories() override { - TestingProfile::TestingFactories factories; - IdentityTestEnvironmentProfileAdaptor:: - AppendIdentityTestEnvironmentFactories(&factories); - return factories; - } - - void OnWorkProfileConfirmationUIClosed( - DiceTurnSyncOnHelper::SigninChoice result) { - on_work_profile_confirmation_ui_closed_called_ = true; - work_profile_confirmation_ui_closed_result_ = result; - } - - void ExpectAccountImageChanged( - const content::TestWebUI::CallData& call_data) { - EXPECT_EQ("cr.webUIListenerCallback", call_data.function_name()); - std::string event; - ASSERT_TRUE(call_data.arg1()->GetAsString(&event)); - EXPECT_EQ("account-image-changed", event); - - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile()); - base::Optional<AccountInfo> primary_account = - identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken( - identity_manager->GetPrimaryAccountInfo()); - - std::string original_picture_url = - primary_account ? primary_account->picture_url : std::string(); - std::string expected_picture_url = - original_picture_url.empty() - ? profiles::GetPlaceholderAvatarIconUrl() - : signin::GetAvatarImageURLWithOptions(GURL(original_picture_url), - kExpectedProfileImageSize, - false /* no_silhouette */) - .spec(); - std::string passed_picture_url; - ASSERT_TRUE(call_data.arg2()->GetAsString(&passed_picture_url)); - EXPECT_EQ(expected_picture_url, passed_picture_url); - } - - protected: - bool did_user_explicitly_interact_ = false; - bool on_work_profile_confirmation_ui_closed_called_ = false; - DiceTurnSyncOnHelper::SigninChoice - work_profile_confirmation_ui_closed_result_ = - DiceTurnSyncOnHelper::SigninChoice::SIGNIN_CHOICE_CANCEL; - // Holds information for the account currently logged in. - AccountInfo account_info_; - - private: - std::unique_ptr<content::TestWebUI> web_ui_; - std::unique_ptr<WorkProfileConfirmationUI> work_profile_confirmation_ui_; - TestingWorkProfileConfirmationHandler* handler_; // Not owned. - base::UserActionTester user_action_tester_; - std::unordered_map<std::string, int> string_to_grd_id_map_; - base::HistogramTester histogram_tester_; - std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> - identity_test_env_adaptor_; - - DISALLOW_COPY_AND_ASSIGN(WorkProfileConfirmationHandlerTest); -}; - -TEST_F(WorkProfileConfirmationHandlerTest, - DISABLED_TestSetImageIfPrimaryAccountReady) { - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - - ASSERT_EQ(1U, web_ui()->call_data().size()); - ExpectAccountImageChanged(*web_ui()->call_data()[0]); -} - -TEST_F(WorkProfileConfirmationHandlerTest, - DISABLED_TestSetImageIfPrimaryAccountReadyLater) { - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - - ASSERT_EQ(0U, web_ui()->call_data().size()); - - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - ASSERT_EQ(1U, web_ui()->call_data().size()); - ExpectAccountImageChanged(*web_ui()->call_data()[0]); -} - -TEST_F(WorkProfileConfirmationHandlerTest, - DISABLED_TestSetImageIgnoredIfSecondaryAccountUpdated) { - base::ListValue args; - args.Set(0, std::make_unique<base::Value>(kDefaultDialogHeight)); - handler()->HandleInitializedWithSize(&args); - - AccountInfo account_info = - identity_test_env()->MakeAccountAvailable("bar@example.com"); - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info.account_id, account_info.email, account_info.gaia, "", - "bar_full_name", "bar_given_name", "bar_locale", - "http://picture.example.com/bar_picture.jpg"); - - // Updating the account info of a secondary account should not update the - // image of the sync confirmation dialog. - EXPECT_EQ(0U, web_ui()->call_data().size()); - - identity_test_env()->SimulateSuccessfulFetchOfAccountInfo( - account_info_.account_id, account_info_.email, account_info_.gaia, "", - "full_name", "given_name", "locale", - "http://picture.example.com/picture.jpg"); - - // Updating the account info of the primary account should update the - // image of the sync confirmation dialog. - ASSERT_EQ(1U, web_ui()->call_data().size()); - ExpectAccountImageChanged(*web_ui()->call_data()[0]); -} - -TEST_F(WorkProfileConfirmationHandlerTest, DISABLED_TestHandleCancel) { - handler()->HandleCancel(nullptr); - did_user_explicitly_interact_ = true; - - EXPECT_TRUE(on_work_profile_confirmation_ui_closed_called_); - EXPECT_EQ(DiceTurnSyncOnHelper::SigninChoice::SIGNIN_CHOICE_CANCEL, - work_profile_confirmation_ui_closed_result_); - EXPECT_EQ(1, user_action_tester()->GetActionCount( - "Signin_WorkProfilePrompt_Cancel")); - EXPECT_EQ( - 0, user_action_tester()->GetActionCount("Signin_WorkProfilePrompt_Add")); -} - -TEST_F(WorkProfileConfirmationHandlerTest, DISABLED_TestHandleConfirm) { - // These are passed as parameters to HandleConfirm(). - base::ListValue args; - - handler()->HandleConfirm(&args); - did_user_explicitly_interact_ = true; - - EXPECT_TRUE(on_work_profile_confirmation_ui_closed_called_); - EXPECT_EQ(DiceTurnSyncOnHelper::SigninChoice::SIGNIN_CHOICE_NEW_PROFILE, - work_profile_confirmation_ui_closed_result_); - EXPECT_EQ(0, user_action_tester()->GetActionCount( - "Signin_WorkProfilePrompt_Cancel")); - EXPECT_EQ( - 1, user_action_tester()->GetActionCount("Signin_WorkProfilePrompt_Add")); -}
diff --git a/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.cc b/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.cc deleted file mode 100644 index 6205f8a..0000000 --- a/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.cc +++ /dev/null
@@ -1,129 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h" - -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_avatar_icon_util.h" -#include "chrome/browser/signin/account_consistency_mode_manager.h" -#include "chrome/browser/signin/identity_manager_factory.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h" -#include "chrome/browser/ui/webui/signin/work_profile_confirmation_handler.h" -#include "chrome/common/url_constants.h" -#include "chrome/grit/browser_resources.h" -#include "chrome/grit/chromium_strings.h" -#include "chrome/grit/generated_resources.h" -#include "components/signin/public/base/avatar_icon_util.h" -#include "components/signin/public/identity_manager/identity_manager.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/web_ui.h" -#include "content/public/browser/web_ui_data_source.h" -#include "google_apis/gaia/gaia_auth_util.h" -#include "services/network/public/mojom/content_security_policy.mojom.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/webui/web_ui_util.h" -#include "ui/resources/grit/webui_generated_resources.h" -#include "ui/resources/grit/webui_resources.h" - -namespace { -constexpr char kManagedLearnMoreUrl[] = - "https://support.google.com/chrome/?p=is_chrome_managed"; -} - -WorkProfileConfirmationUI::WorkProfileConfirmationUI(content::WebUI* web_ui) - : SigninWebDialogUI(web_ui) { - Profile* profile = Profile::FromWebUI(web_ui); - - content::WebUIDataSource* source = content::WebUIDataSource::Create( - chrome::kChromeUIWorkProfileConfirmationHost); - source->UseStringsJs(); - source->EnableReplaceI18nInJS(); - - source->AddResourcePath("signin_shared_css.js", IDR_SIGNIN_SHARED_CSS_JS); - source->AddResourcePath("work_profile_confirmation_browser_proxy.js", - IDR_WORK_PROFILE_CONFIRMATION_BROWSER_PROXY_JS); - source->AddResourcePath("work_profile_confirmation.js", - IDR_WORK_PROFILE_CONFIRMATION_JS); - - source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS); - source->AddResourcePath("test_loader.html", IDR_WEBUI_HTML_TEST_LOADER_HTML); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - "script-src chrome://resources chrome://test 'self';"); - - source->SetDefaultResource(IDR_WORK_PROFILE_CONFIRMATION_HTML); - source->AddResourcePath("work_profile_confirmation_app.js", - IDR_WORK_PROFILE_CONFIRMATION_APP_JS); - - source->AddResourcePath( - "images/work_profile_confirmation_illustration.svg", - IDR_WORK_PROFILE_CONFIRMATION_IMAGES_WORK_PROFILE_CONFIRMATION_ILLUSTRATION_SVG); - source->AddResourcePath( - "images/work_profile_confirmation_illustration_dark.svg", - IDR_WORK_PROFILE_CONFIRMATION_IMAGES_WORK_PROFILE_CONFIRMATION_ILLUSTRATION_DARK_SVG); - - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile); - base::Optional<AccountInfo> primary_account_info = - identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken( - identity_manager->GetPrimaryAccountInfo()); - - if (primary_account_info) { - source->AddString("workProfileConfirmationInfo", - l10n_util::GetStringFUTF16( - IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO, - base::ASCIIToUTF16(kManagedLearnMoreUrl), - base::UTF8ToUTF16(gaia::ExtractDomainName( - primary_account_info->email)))); - } else { - source->AddString( - "workProfileConfirmationInfo", - l10n_util::GetStringFUTF16( - IDS_WORK_PROFILE_CONFIRMATION_WORK_PROFILE_INFO_UNKNOWN_ORGANIZATION, - base::ASCIIToUTF16(kManagedLearnMoreUrl))); - } - - source->AddString("accountPictureUrl", - profiles::GetPlaceholderAvatarIconUrl()); - source->AddLocalizedString("workProfileConfirmationTitle", - IDS_WORK_PROFILE_CONFIRMATION_TITLE); - source->AddLocalizedString( - "workProfileConfirmationConfirmLabel", - IDS_WORK_PROFILE_CONFIRMATION_CONFIRM_BUTTON_LABEL); - source->AddLocalizedString("workProfileConfirmationCancelLabel", IDS_CANCEL); - - source->DisableTrustedTypesCSP(); - - base::DictionaryValue strings; - webui::SetLoadTimeDataDefaults(g_browser_process->GetApplicationLocale(), - &strings); - source->AddLocalizedStrings(strings); - - content::WebUIDataSource::Add(profile, source); -} - -WorkProfileConfirmationUI::~WorkProfileConfirmationUI() = default; - -void WorkProfileConfirmationUI::InitializeMessageHandlerWithBrowser( - Browser* browser) { - NOTREACHED(); -} - -void WorkProfileConfirmationUI::InitializeMessageHandlerWithBrowser( - Browser* browser, - DiceTurnSyncOnHelper::SigninChoiceCallback callback) { - web_ui()->AddMessageHandler(std::make_unique<WorkProfileConfirmationHandler>( - browser->profile(), browser, std::move(callback))); -} - -void WorkProfileConfirmationUI::InitializeMessageHandlerWithProfile( - Profile* profile, - DiceTurnSyncOnHelper::SigninChoiceCallback callback) { - web_ui()->AddMessageHandler(std::make_unique<WorkProfileConfirmationHandler>( - profile, nullptr, std::move(callback))); -}
diff --git a/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h b/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h deleted file mode 100644 index 4cc34d2..0000000 --- a/chrome/browser/ui/webui/signin/work_profile_confirmation_ui.h +++ /dev/null
@@ -1,63 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_UI_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_UI_H_ - -#include <memory> -#include <string> -#include <unordered_map> -#include <vector> - -#include "base/macros.h" -#include "base/optional.h" -#include "chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.h" -#include "chrome/browser/ui/webui/signin/signin_web_dialog_ui.h" - -class Browser; -class Profile; - -namespace content { -class WebUIDataSource; -} - -namespace ui { -class WebUI; -} - -// WebUI controller for the work prorfile confirmation dialog. -// -// Note: This controller does not set the WebUI message handler. It is -// the responsibility of the caller to pass the correct message handler. -class WorkProfileConfirmationUI : public SigninWebDialogUI { - public: - explicit WorkProfileConfirmationUI(content::WebUI* web_ui); - ~WorkProfileConfirmationUI() override; - - // SigninWebDialogUI: - void InitializeMessageHandlerWithBrowser(Browser* browser) override; - void InitializeMessageHandlerWithBrowser( - Browser* browser, - DiceTurnSyncOnHelper::SigninChoiceCallback callback); - - // Initializes the message handler when there's no browser for `profile` - // available (such as in the profile creation flow). - void InitializeMessageHandlerWithProfile( - Profile* profile, - DiceTurnSyncOnHelper::SigninChoiceCallback callback); - - private: - // Adds a string resource with the given GRD |ids| to the WebUI data |source| - // named as |name|. Also stores a reverse mapping from the localized version - // of the string to the |ids| in order to later pass it to - // SyncConfirmationHandler. - void AddStringResource(content::WebUIDataSource* source, - const std::string& name, - int ids, - base::Optional<std::vector<base::string16>> params); - - DISALLOW_COPY_AND_ASSIGN(WorkProfileConfirmationUI); -}; - -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_WORK_PROFILE_CONFIRMATION_UI_H_
diff --git a/chrome/browser/webapps/android/BUILD.gn b/chrome/browser/webapps/android/BUILD.gn index 101b0f8f..6de72cc 100644 --- a/chrome/browser/webapps/android/BUILD.gn +++ b/chrome/browser/webapps/android/BUILD.gn
@@ -30,8 +30,6 @@ sources = [ "java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java", - "java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java", - "java/src/org/chromium/chrome/browser/webapps/AddToHomescreenViewDelegate.java", "java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java", "java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerFactory.java", "java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetControllerProvider.java", @@ -45,6 +43,7 @@ "//base:base_java", "//base:jni_java", "//components/browser_ui/bottomsheet/android:java", + "//components/webapps/browser/android:java", "//content/public/android:content_java", "//third_party/android_deps:androidx_annotation_annotation_java", "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java index 730e9c31..4de1beec 100644 --- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java +++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenBottomSheetViewBinder.java
@@ -7,6 +7,7 @@ import android.graphics.Bitmap; import android.util.Pair; +import org.chromium.components.webapps.AddToHomescreenProperties; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java index d2827a27..1384a82 100644 --- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java +++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaBottomSheetController.java
@@ -20,6 +20,8 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider; +import org.chromium.components.webapps.AddToHomescreenProperties; +import org.chromium.components.webapps.AddToHomescreenViewDelegate; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver;
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetContent.java b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetContent.java index 39ebdce..6258ac1 100644 --- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetContent.java +++ b/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/PwaInstallBottomSheetContent.java
@@ -10,6 +10,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; +import org.chromium.components.webapps.AddToHomescreenViewDelegate; /** * The class handling the bottom sheet install for PWA installs. The UI is shown on construction
diff --git a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc index 02194a86..e634f86a 100644 --- a/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc +++ b/chrome/browser/webapps/android/pwa_bottom_sheet_controller.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/webapps/android/jni_headers/PwaBottomSheetControllerProvider_jni.h" #include "chrome/browser/webapps/android/jni_headers/PwaBottomSheetController_jni.h" #include "components/url_formatter/elide_url.h" -#include "components/webapps/browser/banners/app_banner_manager.h" #include "content/public/browser/web_contents.h" #include "ui/gfx/android/java_bitmap.h"
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 1b13784..f1c49691 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-master-1612353344-f61bb2499ae4530bce57c7717174146d2dbf4ec3.profdata +chrome-linux-master-1612374575-6184f3217a8add1609de115b2d337c421f22cd8e.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 070b9b4..aea434c 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-master-1612353344-dee8798d50737e6580b23cd914634e6bfee99a2c.profdata +chrome-mac-master-1612374575-63817629c7b408841dd340c4b714545974a7dd52.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index f9e3f1c..9a5e82c5 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-master-1612320397-a99fe59794952e01096067b6a58b247861e8b048.profdata +chrome-win32-master-1612364365-4004087cb28f5899984f6776af32ee447f340d67.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 4fd2045..29a85f22 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-master-1612353344-511544a9a2b1a7e446b83dd50d995ff1ab945dea.profdata +chrome-win64-master-1612364365-c74b74b67f7921589c07ca7b662ca77112879da1.profdata
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index eaf9de94..e4f35ab 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -186,9 +186,6 @@ "chrome://web-footer-experiment/"; const char kChromeUIWelcomeHost[] = "welcome"; const char kChromeUIWelcomeURL[] = "chrome://welcome/"; -const char kChromeUIWorkProfileConfirmationHost[] = "work-profile-confirmation"; -const char kChromeUIWorkProfileConfirmationURL[] = - "chrome://work-profile-confirmation/"; #if defined(OS_WIN) // TODO(crbug.com/1003960): Remove when issue is resolved.
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index 567d51824..c538ab5 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -184,8 +184,6 @@ extern const char kChromeUIWebFooterExperimentURL[]; extern const char kChromeUIWelcomeHost[]; extern const char kChromeUIWelcomeURL[]; -extern const char kChromeUIWorkProfileConfirmationHost[]; -extern const char kChromeUIWorkProfileConfirmationURL[]; #if defined(OS_WIN) // TODO(crbug.com/1003960): Remove when issue is resolved.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index b6c0494..0c646c70 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1052,9 +1052,9 @@ "../browser/download/download_frame_policy_browsertest.cc", "../browser/download/download_started_animation_browsertest.cc", "../browser/download/save_page_browsertest.cc", + "../browser/enterprise/connectors/analysis/content_analysis_delegate_browsertest.cc", + "../browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc", "../browser/enterprise/connectors/connectors_service_browsertest.cc", - "../browser/enterprise/connectors/content_analysis_delegate_browsertest.cc", - "../browser/enterprise/connectors/content_analysis_dialog_browsertest.cc", "../browser/enterprise/reporting/report_scheduler_browsertest.cc", "../browser/extensions/protocol_handler_apitest.cc", "../browser/fast_shutdown_browsertest.cc", @@ -1375,6 +1375,7 @@ "../browser/subresource_filter/subresource_filter_browser_test_harness.h", "../browser/subresource_filter/subresource_filter_browsertest.cc", "../browser/subresource_filter/subresource_filter_devtools_browsertest.cc", + "../browser/subresource_filter/subresource_filter_dns_alias_browsertest.cc", "../browser/subresource_filter/subresource_filter_intercepting_browsertest.cc", "../browser/subresource_filter/subresource_filter_popup_browsertest.cc", "../browser/subresource_filter/subresource_filter_settings_browsertest.cc", @@ -3544,6 +3545,7 @@ "../browser/metrics/chrome_metrics_service_client_unittest.cc", "../browser/metrics/chrome_metrics_services_manager_client_unittest.cc", "../browser/metrics/oom/out_of_memory_reporter_unittest.cc", + "../browser/metrics/power/battery_level_provider_unittest.cc", "../browser/metrics/power/power_metrics_reporter_unittest.cc", "../browser/metrics/process_memory_metrics_emitter_unittest.cc", "../browser/metrics/tab_footprint_aggregator_unittest.cc", @@ -4049,7 +4051,6 @@ "../browser/ui/webui/discards/graph_dump_impl_unittest.cc", "../browser/ui/webui/favicon_source_unittest.cc", "../browser/ui/webui/signin/sync_confirmation_handler_unittest.cc", - "../browser/ui/webui/signin/work_profile_confirmation_handler_unittest.cc", "../browser/upgrade_detector/build_state_unittest.cc", "../browser/upgrade_detector/mock_build_state_observer.cc", "../browser/upgrade_detector/mock_build_state_observer.h", @@ -4428,12 +4429,12 @@ "../browser/diagnostics/diagnostics_model_unittest.cc", "../browser/download/download_commands_unittest.cc", "../browser/download/download_shelf_unittest.cc", - "../browser/enterprise/connectors/analysis_service_settings_unittest.cc", + "../browser/enterprise/connectors/analysis/analysis_service_settings_unittest.cc", "../browser/enterprise/connectors/connectors_manager_unittest.cc", "../browser/enterprise/connectors/connectors_service_unittest.cc", "../browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc", "../browser/enterprise/connectors/file_system/service_settings_unittest.cc", - "../browser/enterprise/connectors/reporting_service_settings_unittest.cc", + "../browser/enterprise/connectors/reporting/reporting_service_settings_unittest.cc", "../browser/enterprise/connectors/service_provider_config_unittest.cc", "../browser/enterprise/reporting/browser_report_generator_unittest.cc", "../browser/enterprise/reporting/extension_info_unittest.cc", @@ -5658,7 +5659,7 @@ if (safe_browsing_mode == 1) { # TODO(sgurun): enable tests for safe_browsing==2. sources += [ - "../browser/enterprise/connectors/content_analysis_delegate_unittest.cc", + "../browser/enterprise/connectors/analysis/content_analysis_delegate_unittest.cc", "../browser/safe_browsing/advanced_protection_status_manager_factory_unittest.cc", "../browser/safe_browsing/advanced_protection_status_manager_unittest.cc", "../browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc",
diff --git a/chrome/test/data/pdf/metrics_test.js b/chrome/test/data/pdf/metrics_test.js index 30915dfc..405b65b7 100644 --- a/chrome/test/data/pdf/metrics_test.js +++ b/chrome/test/data/pdf/metrics_test.js
@@ -136,11 +136,11 @@ chrome.metricsPrivate = new MockMetricsPrivate(); record(UserAction.DOCUMENT_OPENED); - record(UserAction.OPEN_BOOKMARKS_PANEL); + record(UserAction.SELECT_SIDENAV_OUTLINE); record(UserAction.FOLLOW_BOOKMARK); record(UserAction.FOLLOW_BOOKMARK); - record(UserAction.OPEN_BOOKMARKS_PANEL); + record(UserAction.SELECT_SIDENAV_OUTLINE); record(UserAction.FOLLOW_BOOKMARK); record(UserAction.FOLLOW_BOOKMARK); record(UserAction.FOLLOW_BOOKMARK); @@ -148,8 +148,8 @@ chrome.test.assertEq( { [UserAction.DOCUMENT_OPENED]: 1, - [UserAction.OPEN_BOOKMARKS_PANEL_FIRST]: 1, - [UserAction.OPEN_BOOKMARKS_PANEL]: 2, + [UserAction.SELECT_SIDENAV_OUTLINE_FIRST]: 1, + [UserAction.SELECT_SIDENAV_OUTLINE]: 2, [UserAction.FOLLOW_BOOKMARK_FIRST]: 1, [UserAction.FOLLOW_BOOKMARK]: 5 },
diff --git a/chrome/test/data/webui/bluetooth_internals_browsertest.js b/chrome/test/data/webui/bluetooth_internals_browsertest.js index d3b3180..7227997 100644 --- a/chrome/test/data/webui/bluetooth_internals_browsertest.js +++ b/chrome/test/data/webui/bluetooth_internals_browsertest.js
@@ -345,7 +345,7 @@ }; TEST_F('BluetoothInternalsTest', 'Startup_BluetoothInternals', function() { - /** @const */ var PageManager = cr.ui.pageManager.PageManager; + /** @const */ var pageManager = cr.ui.pageManager.PageManager.getInstance(); var internalsHandler = null; var adapterFieldSet = null; @@ -394,14 +394,15 @@ snackbar.Snackbar.dismiss(true); connectedDevices.clear(); - PageManager.registeredPages['adapter'].setAdapterInfo(fakeAdapterInfo()); + pageManager.registeredPages.get('adapter').setAdapterInfo( + fakeAdapterInfo()); - for (var pageName in PageManager.registeredPages) { - var page = PageManager.registeredPages[pageName]; + for (const pageName of pageManager.registeredPages.keys()) { + var page = pageManager.registeredPages.get(pageName); if (pageNames.indexOf(pageName) < 0) { page.pageDiv.parentNode.removeChild(page.pageDiv); - PageManager.unregister(page); + pageManager.unregister(page); } } });
diff --git a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js index f3e36a2c..8a8aab8 100644 --- a/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js +++ b/chrome/test/data/webui/nearby_share/nearby_confirmation_page_test.js
@@ -122,4 +122,18 @@ const errorTitle = confirmationPageElement.$$('#errorTitle').textContent; assertTrue(!!errorTitle); }); + + test('gets transfer info for testing', async function() { + const token = 'TestToken1234'; + transferUpdateListener.remote_.onTransferUpdate( + nearbyShare.mojom.TransferStatus.kRejected, token); + await transferUpdateListener.remote_.$.flushForTesting(); + + const info = confirmationPageElement.getTransferInfoForTesting(); + assertEquals( + info.transferStatus, nearbyShare.mojom.TransferStatus.kRejected); + assertEquals(info.confirmationToken, token); + assertTrue(!!info.errorTitle); + assertTrue(!!info.errorDescription); + }); });
diff --git a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js index 87e4b69..7c78890d 100644 --- a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js +++ b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
@@ -214,6 +214,28 @@ assertEquals('confirmation', eventDetail.page); }); + test('selects share target using testing methods', async function() { + const created = await setupShareTarget(); + const targets = discoveryPageElement.getShareTargetsForTesting(); + assertEquals(targets.length, 1); + + discoveryManager.selectShareTargetResult.token = 'test token'; + discoveryManager.selectShareTargetResult.confirmationManager = + new FakeConfirmationManagerRemote(); + + let eventDetail = null; + discoveryPageElement.addEventListener('change-page', (event) => { + eventDetail = event.detail; + }); + + discoveryPageElement.selectShareTargetForTesting(targets[0]); + const selectedId = await discoveryManager.whenCalled('selectShareTarget'); + assertTokensEqual(created.id, selectedId); + + await discoveryManager.whenCalled('selectShareTarget'); + assertEquals('confirmation', eventDetail.page); + }); + test('starts discovery', async function() { await startDiscovery(); });
diff --git a/chrome/test/data/webui/new_tab_page/modules/drive/module_test.js b/chrome/test/data/webui/new_tab_page/modules/drive/module_test.js index 8d3819b..927f563 100644 --- a/chrome/test/data/webui/new_tab_page/modules/drive/module_test.js +++ b/chrome/test/data/webui/new_tab_page/modules/drive/module_test.js
@@ -21,12 +21,10 @@ }); test('module appears on render', async () => { - testProxy.handler.setResultFor( - 'getTestString', Promise.resolve({dataItem: 'test string'})); await driveDescriptor.initialize(); const module = driveDescriptor.element; assertTrue(!!module); - await testProxy.handler.whenCalled('getTestString'); + await testProxy.handler.whenCalled('getDocuments'); assertTrue(!!driveDescriptor.element); }); });
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_detail_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/app_detail_view_test.js new file mode 100644 index 0000000..578321e --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/app_detail_view_test.js
@@ -0,0 +1,54 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-app-detail-view>', () => { + let appDetailView; + let fakeHandler; + let arcApp; + + setup(async () => { + fakeHandler = setupFakeHandler(); + replaceStore(); + + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateArcSupported(true)); + + // Create an ARC app. + const arcOptions = {type: apps.mojom.AppType.kArc}; + + // Add an app, and make it the currently selected app. + arcApp = await fakeHandler.addApp('app1_id', arcOptions); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateSelectedAppId(arcApp.id)); + + appDetailView = document.createElement('app-management-app-detail-view'); + + replaceBody(appDetailView); + await fakeHandler.flushPipesForTesting(); + }); + + test('Change selected app', async () => { + assertEquals( + app_management.AppManagementStore.getInstance().data.selectedAppId, + appDetailView.app_.id); + assertEquals(arcApp.id, appDetailView.app_.id); + assertTrue(!!appDetailView.$$('app-management-arc-detail-view')); + assertFalse(!!appDetailView.$$('app-management-pwa-detail-view')); + const pwaOptions = {type: apps.mojom.AppType.kWeb}; + // Add an second pwa app, and make it the currently selected app. + const pwaApp = await fakeHandler.addApp('app2_id', pwaOptions); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateSelectedAppId(pwaApp.id)); + await fakeHandler.flushPipesForTesting(); + + assertEquals( + app_management.AppManagementStore.getInstance().data.selectedAppId, + appDetailView.app_.id); + assertEquals(pwaApp.id, appDetailView.app_.id); + assertFalse(!!appDetailView.$$('app-management-arc-detail-view')); + assertTrue(!!appDetailView.$$('app-management-pwa-detail-view')); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js new file mode 100644 index 0000000..ba5d9d4 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js
@@ -0,0 +1,41 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-app-item>', () => { + let appItem; + let arcApp; + + setup(async () => { + appItem = document.createElement('app-management-app-item'); + replaceBody(appItem); + await test_util.flushTasks(); + + // Create an ARC app. + const arcOptions = {type: apps.mojom.AppType.kArc}; + + arcApp = app_management.FakePageHandler.createApp('app1_id', arcOptions); + appItem.app = arcApp; + + await test_util.flushTasks(); + }); + + test('Onclick redirects to correct route', async () => { + assertFalse(!!settings.Router.getInstance().getQueryParameters().get('id')); + + appItem.click(); + await test_util.flushTasks(); + assertEquals( + arcApp.id, + settings.Router.getInstance().getQueryParameters().get('id')); + }); + + test('Icon renders', async () => { + const icon = appItem.$$('#app-icon'); + + assertTrue(!!icon); + assertEquals(appItem.iconUrlFromId_(arcApp), icon.getAttribute('src')); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js new file mode 100644 index 0000000..101cf78 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js
@@ -0,0 +1,42 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-chrome-app-detail-view>', () => { + let chromeAppDetailView; + let fakeHandler; + + setup(async () => { + fakeHandler = setupFakeHandler(); + replaceStore(); + + const chromeOptions = { + type: apps.mojom.AppType.kExtension, + permissions: {} + }; + + // Add an chrome app, and make it the currently selected app. + const app = await fakeHandler.addApp(null, chromeOptions); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateSelectedAppId(app.id)); + + fakeHandler.flushPipesForTesting(); + await test_util.flushTasks(); + + chromeAppDetailView = + document.createElement('app-management-chrome-app-detail-view'); + replaceBody(chromeAppDetailView); + fakeHandler.flushPipesForTesting(); + await test_util.flushTasks(); + }); + + test('App is rendered correctly', () => { + assertEquals( + app_management.AppManagementStore.getInstance().data.selectedAppId, + chromeAppDetailView.app_.id); + assertTrue(!!chromeAppDetailView.$$('app-management-pin-to-shelf-item')); + assertTrue(!!chromeAppDetailView.$$('#more-settings')); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/main_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/main_view_test.js index 26533c1c..f83c896 100644 --- a/chrome/test/data/webui/settings/chromeos/app_management/main_view_test.js +++ b/chrome/test/data/webui/settings/chromeos/app_management/main_view_test.js
@@ -19,8 +19,7 @@ } function getAppItems() { - return mainView.$$('app-management-expandable-app-list') - .querySelectorAll('app-management-app-item'); + return mainView.$$('#app-list').querySelectorAll('app-management-app-item'); } setup(function() { @@ -39,42 +38,11 @@ const appItems = getAppItems(); expectEquals(1, appItems.length); - expectEquals(app.id, appItems[0].app.id); - + assertFalse(!!settings.Router.getInstance().getQueryParameters().get('id')); store.setReducersEnabled(false); + appItems[0].click(); - const expected = app_management.actions.changePage(PageType.DETAIL, app.id); - assertDeepEquals(expected, store.lastAction); - }); - - // TODO(jshikaram) uncomment once more apps bar is added back. - test.skip('more apps bar visibility', async function() { - // The more apps bar shouldn't appear when there are 4 apps. - await addApps(NUMBER_OF_APPS_DISPLAYED_DEFAULT); - expectEquals(NUMBER_OF_APPS_DISPLAYED_DEFAULT, getAppItems().length); - expectTrue(mainView.$$('app-management-expandable-app-list') - .$['expander-row'] - .hidden); - - // The more apps bar appears when there are 5 apps. - await addApps(1); - expectEquals(NUMBER_OF_APPS_DISPLAYED_DEFAULT + 1, getAppItems().length); - expectFalse(mainView.$$('app-management-expandable-app-list') - .$['expander-row'] - .hidden); - }); - - test('notifications sublabel collapsibility', async function() { - // The three spans contains collapsible attribute. - await addApps(4); - const pieces = await mainView.getNotificationSublabelPieces_(); - expectTrue(pieces.filter(p => p.arg === '$1')[0].collapsible); - expectTrue(pieces.filter(p => p.arg === '$2')[0].collapsible); - expectTrue(pieces.filter(p => p.arg === '$3')[0].collapsible); - - // Checking ",and other x apps" is non-collapsible - await addApps(6); - const pieces2 = await mainView.getNotificationSublabelPieces_(); - expectFalse(pieces2.filter(p => p.arg === '$4')[0].collapsible); + fakeHandler.flushPipesForTesting(); + assertTrue(!!settings.Router.getInstance().getQueryParameters().get('id')); }); });
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/permission_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/permission_item_test.js new file mode 100644 index 0000000..d4d996f --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/permission_item_test.js
@@ -0,0 +1,53 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-permission-item>', () => { + let permissionItem; + let fakeHandler; + + setup(async () => { + fakeHandler = setupFakeHandler(); + replaceStore(); + + fakeHandler = setupFakeHandler(); + replaceStore(); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateArcSupported(true)); + + const arcOptions = { + type: apps.mojom.AppType.kArc, + permissions: app_management.FakePageHandler.createArcPermissions([ + ArcPermissionType.CAMERA, + ArcPermissionType.LOCATION, + ArcPermissionType.NOTIFICATIONS, + ArcPermissionType.CONTACTS, + ArcPermissionType.STORAGE, + ]) + }; + + // Add an arc app, and make it the currently selected app. + const app = await fakeHandler.addApp(null, arcOptions); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateSelectedAppId(app.id)); + + permissionItem = document.createElement('app-management-permission-item'); + }); + + test('Toggle permission', async () => { + permissionItem.permissionType = 'LOCATION'; + + replaceBody(permissionItem); + await fakeHandler.flushPipesForTesting(); + assertTrue(app_management.util.getPermissionValueBool( + permissionItem.app_, permissionItem.permissionType)); + + permissionItem.click(); + await test_util.flushTasks(); + await fakeHandler.flushPipesForTesting(); + assertFalse(app_management.util.getPermissionValueBool( + permissionItem.app_, permissionItem.permissionType)); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js new file mode 100644 index 0000000..2600d6e --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js
@@ -0,0 +1,44 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-pin-to-shelf-item>', () => { + let pinToShelfItem; + let fakeHandler; + + setup(async () => { + fakeHandler = setupFakeHandler(); + pinToShelfItem = document.createElement('app-management-pin-to-shelf-item'); + + replaceBody(pinToShelfItem); + test_util.flushTasks(); + }); + + test('Toggle pin to shelf', async () => { + const arcOptions = {type: apps.mojom.AppType.kArc, permissions: {}}; + + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateArcSupported(true)); + + // Add an arc app, and make it the currently selected app. + const app = await fakeHandler.addApp('app1', arcOptions); + + await fakeHandler.flushPipesForTesting(); + pinToShelfItem.app = app; + assertFalse(app_management.util.convertOptionalBoolToBool( + app_management.AppManagementStore.getInstance() + .data.apps[app.id] + .isPinned)); + + pinToShelfItem.click(); + test_util.flushTasks(); + await fakeHandler.flushPipesForTesting(); + + assertTrue(app_management.util.convertOptionalBoolToBool( + app_management.AppManagementStore.getInstance() + .data.apps[app.id] + .isPinned)); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js b/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js new file mode 100644 index 0000000..b62bef6 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js
@@ -0,0 +1,39 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-toggle-row', () => { + let toggleRow; + + setup(async () => { + toggleRow = document.createElement('app-management-toggle-row'); + replaceBody(toggleRow); + await test_util.flushTasks(); + }); + + test('Click toggle', async () => { + toggleRow.setToggle(false); + assertFalse(toggleRow.isChecked()); + toggleRow.click(); + await test_util.flushTasks(); + assertTrue(toggleRow.isChecked()); + }); + + test('Toggle disabled by policy', async () => { + toggleRow.setToggle(false); + assertFalse(toggleRow.isChecked()); + assertFalse(!!toggleRow.$$('cr-toggle').disabled); + assertFalse(!!toggleRow.$$('cr-policy-indicator')); + + toggleRow.managed = true; + await test_util.flushTasks(); + assertTrue(!!toggleRow.$$('cr-toggle').disabled); + assertTrue(!!toggleRow.$$('cr-policy-indicator')); + + toggleRow.click(); + await test_util.flushTasks(); + assertFalse(toggleRow.isChecked()); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/uninstall_button_test.js b/chrome/test/data/webui/settings/chromeos/app_management/uninstall_button_test.js new file mode 100644 index 0000000..0529d8c --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/app_management/uninstall_button_test.js
@@ -0,0 +1,69 @@ +// Copyright 2021 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. + +'use strict'; + +suite('<app-management-uninstall-button', () => { + let uninstallButton; + let fakeHandler; + let app; + + + setup(async () => { + fakeHandler = setupFakeHandler(); + replaceStore(); + }); + + async function setupUninstallButton(installSource) { + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateArcSupported(true)); + + // Create an ARC app options. + const arcOptions = { + type: apps.mojom.AppType.kArc, + installSource: installSource + }; + + // Add an app, and make it the currently selected app. + app = await fakeHandler.addApp('app1_id', arcOptions); + app_management.AppManagementStore.getInstance().dispatch( + app_management.actions.updateSelectedAppId(app.id)); + await fakeHandler.flushPipesForTesting(); + + assertTrue( + !!app_management.AppManagementStore.getInstance().data.apps[app.id]); + + uninstallButton = document.createElement('app-management-uninstall-button'); + + replaceBody(uninstallButton); + await fakeHandler.flushPipesForTesting(); + } + + test('Click uninstall', async () => { + await setupUninstallButton(apps.mojom.InstallSource.kUser); + + uninstallButton.$$('#uninstallButton').click(); + await fakeHandler.flushPipesForTesting(); + assertFalse( + !!app_management.AppManagementStore.getInstance().data.apps[app.id]); + }); + + test('Disabled by policy', async () => { + await setupUninstallButton(apps.mojom.InstallSource.kPolicy); + uninstallButton.$$('#uninstallButton').click(); + await fakeHandler.flushPipesForTesting(); + // Disabled by policy, clicking should not remove app. + assertTrue( + !!app_management.AppManagementStore.getInstance().data.apps[app.id]); + }); + + test('System app, button hidden', async () => { + await setupUninstallButton(apps.mojom.InstallSource.kSystem); + assertFalse(!!uninstallButton.$$('#uninstallButton')); + await fakeHandler.flushPipesForTesting(); + // Disabled by policy, clicking should not remove app. + assertTrue( + !!app_management.AppManagementStore.getInstance().data.apps[app.id]); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js index ee177e7..a61fad3 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -435,6 +435,153 @@ } }; +// Test fixture for the app management app detail view element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementAppDetailViewTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/app_detail_view.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/app_detail_view_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementAppDetailViewTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management app item element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementAppItemTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/app_item.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/app_item_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementAppItemTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management permission item element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementPermissionItemTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/permission_item.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/permission_item_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementPermissionItemTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management pin to shelf item element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementPinToShelfItemTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/pin_to_shelf_item.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/pin_to_shelf_item_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementPinToShelfItemTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management toggle row element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementToggleRowTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/toggle_row.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/toggle_row_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementToggleRowTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management uninstall button element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementUninstallButtonTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/uninstall_button.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/uninstall_button_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementUninstallButtonTest', 'MAYBE_AllJsTests', () => { + mocha.run(); +}); + +// Test fixture for the app management main view element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementMainViewTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/main_view.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/main_view_test.js', + ]); + } +}; + +TEST_F('OSSettingsAppManagementMainViewTest', 'AllJsTests', () => { + mocha.run(); +}); + // Text fixture for the app management dom switch element. // eslint-disable-next-line no-var var OSSettingsAppManagementDomSwitchTest = @@ -543,6 +690,29 @@ mocha.run(); }); +// Test fixture for the app management chrome app detail view element. +// eslint-disable-next-line no-var +var OSSettingsAppManagementChromeAppDetailViewTest = + class extends OSSettingsAppManagementBrowserTest { + /** @override */ + get browsePreload() { + return super.browsePreload + 'app_management/chrome_app_detail_view.html'; + } + + /** @override */ + get extraLibraries() { + return super.extraLibraries.concat([ + 'app_management/chrome_app_detail_view_test.js', + ]); + } +}; + +TEST_F( + 'OSSettingsAppManagementChromeAppDetailViewTest', 'MAYBE_AllJsTests', + () => { + mocha.run(); + }); + // Test fixture for the app management managed app view. // eslint-disable-next-line no-var var OSSettingsAppManagementManagedAppTest =
diff --git a/chrome/updater/app/app_server.h b/chrome/updater/app/app_server.h index 4a2b926..1a12bc3d 100644 --- a/chrome/updater/app/app_server.h +++ b/chrome/updater/app/app_server.h
@@ -10,10 +10,10 @@ #include "base/bind.h" #include "base/memory/scoped_refptr.h" #include "chrome/updater/app/app.h" +#include "chrome/updater/configurator.h" namespace updater { -class Configurator; class UpdateServiceInternal; class GlobalPrefs; class LocalPrefs; @@ -31,6 +31,8 @@ protected: ~AppServer() override; + scoped_refptr<const Configurator> config() const { return config_; } + // Overrides of App. void Uninitialize() override;
diff --git a/chrome/updater/app/server/mac/server.mm b/chrome/updater/app/server/mac/server.mm index 6ed52a1..ba294d81 100644 --- a/chrome/updater/app/server/mac/server.mm +++ b/chrome/updater/app/server/mac/server.mm
@@ -114,7 +114,8 @@ void AppServerMac::TaskCompleted() { main_task_runner_->PostDelayedTask( FROM_HERE, base::BindOnce(&AppServerMac::AcknowledgeTaskCompletion, this), - base::TimeDelta::FromSeconds(10)); + base::TimeDelta::FromSeconds(config() ? config()->ServerKeepAliveSeconds() + : kServerKeepAliveSeconds)); } void AppServerMac::AcknowledgeTaskCompletion() {
diff --git a/chrome/updater/configurator.cc b/chrome/updater/configurator.cc index c49041f1..371ccd7 100644 --- a/chrome/updater/configurator.cc +++ b/chrome/updater/configurator.cc
@@ -6,10 +6,12 @@ #include <utility> +#include "base/numerics/ranges.h" #include "base/rand_util.h" #include "base/version.h" #include "build/build_config.h" #include "chrome/updater/activity.h" +#include "chrome/updater/constants.h" #include "chrome/updater/crx_downloader_factory.h" #include "chrome/updater/external_constants.h" #include "chrome/updater/patcher.h" @@ -54,6 +56,11 @@ return base::RandDouble() * external_constants_->InitialDelay(); } +int Configurator::ServerKeepAliveSeconds() const { + return base::ClampToRange(external_constants_->ServerKeepAliveSeconds(), 1, + kServerKeepAliveSeconds); +} + int Configurator::NextCheckDelay() const { return 5 * kDelayOneHour; }
diff --git a/chrome/updater/configurator.h b/chrome/updater/configurator.h index 2476879..4f2b5129 100644 --- a/chrome/updater/configurator.h +++ b/chrome/updater/configurator.h
@@ -69,6 +69,7 @@ bool IsPerUserInstall() const override; std::unique_ptr<update_client::ProtocolHandlerFactory> GetProtocolHandlerFactory() const override; + int ServerKeepAliveSeconds() const; private: friend class base::RefCountedThreadSafe<Configurator>;
diff --git a/chrome/updater/constants.cc b/chrome/updater/constants.cc index 084fabbe..5a42723b 100644 --- a/chrome/updater/constants.cc +++ b/chrome/updater/constants.cc
@@ -49,6 +49,7 @@ const char kDevOverrideKeyUrl[] = "url"; const char kDevOverrideKeyUseCUP[] = "use_cup"; const char kDevOverrideKeyInitialDelay[] = "initial_delay"; +const char kDevOverrideKeyServerKeepAliveSeconds[] = "server_keep_alive"; // Developer override file name, relative to app data directory. const char kDevOverrideFileName[] = "overrides.json";
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h index e39541a..61ac7948 100644 --- a/chrome/updater/constants.h +++ b/chrome/updater/constants.h
@@ -127,6 +127,7 @@ extern const char kDevOverrideKeyUrl[]; extern const char kDevOverrideKeyUseCUP[]; extern const char kDevOverrideKeyInitialDelay[]; +extern const char kDevOverrideKeyServerKeepAliveSeconds[]; // File name of developer overrides file. extern const char kDevOverrideFileName[]; @@ -210,6 +211,7 @@ constexpr int kErrorFailedToMoveDownloadedFile = 5; constexpr double kInitialDelay = 60; +constexpr int kServerKeepAliveSeconds = 10; } // namespace updater
diff --git a/chrome/updater/external_constants.cc b/chrome/updater/external_constants.cc index 78be61b8..5986961 100644 --- a/chrome/updater/external_constants.cc +++ b/chrome/updater/external_constants.cc
@@ -26,6 +26,10 @@ bool UseCUP() const override { return true; } double InitialDelay() const override { return kInitialDelay; } + + int ServerKeepAliveSeconds() const override { + return kServerKeepAliveSeconds; + } }; } // namespace
diff --git a/chrome/updater/external_constants.h b/chrome/updater/external_constants.h index 3ca2371..f501964 100644 --- a/chrome/updater/external_constants.h +++ b/chrome/updater/external_constants.h
@@ -31,6 +31,9 @@ // such as update checks. virtual double InitialDelay() const = 0; + // Minimum number of of seconds the server needs to stay alive. + virtual int ServerKeepAliveSeconds() const = 0; + protected: std::unique_ptr<ExternalConstants> next_provider_; };
diff --git a/chrome/updater/external_constants_builder.cc b/chrome/updater/external_constants_builder.cc index f655f930..1a8c4c52 100644 --- a/chrome/updater/external_constants_builder.cc +++ b/chrome/updater/external_constants_builder.cc
@@ -57,6 +57,19 @@ return *this; } +ExternalConstantsBuilder& ExternalConstantsBuilder::SetServerKeepAliveSeconds( + int server_keep_alive_seconds) { + overrides_.SetIntKey(kDevOverrideKeyServerKeepAliveSeconds, + server_keep_alive_seconds); + return *this; +} + +ExternalConstantsBuilder& +ExternalConstantsBuilder::ClearServerKeepAliveSeconds() { + overrides_.RemoveKey(kDevOverrideKeyServerKeepAliveSeconds); + return *this; +} + bool ExternalConstantsBuilder::Overwrite() { base::FilePath base_path; if (!GetBaseDirectory(&base_path)) {
diff --git a/chrome/updater/external_constants_builder.h b/chrome/updater/external_constants_builder.h index 4d6760c..310e3a1a 100644 --- a/chrome/updater/external_constants_builder.h +++ b/chrome/updater/external_constants_builder.h
@@ -38,6 +38,10 @@ ExternalConstantsBuilder& SetInitialDelay(double initial_delay); ExternalConstantsBuilder& ClearInitialDelay(); + ExternalConstantsBuilder& SetServerKeepAliveSeconds( + int server_keep_alive_seconds); + ExternalConstantsBuilder& ClearServerKeepAliveSeconds(); + // Write the external constants overrides file in the default location // with the values that have been previously set, replacing any file // previously there. The builder remains usable, does not forget its state,
diff --git a/chrome/updater/external_constants_builder_unittest.cc b/chrome/updater/external_constants_builder_unittest.cc index ccd56669..b901bec0 100644 --- a/chrome/updater/external_constants_builder_unittest.cc +++ b/chrome/updater/external_constants_builder_unittest.cc
@@ -65,13 +65,15 @@ EXPECT_EQ(urls[0], GURL(UPDATE_CHECK_URL)); EXPECT_EQ(verifier->InitialDelay(), kInitialDelay); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds); } TEST_F(ExternalConstantsBuilderTests, TestOverridingEverything) { ExternalConstantsBuilder builder; builder.SetUpdateURL(std::vector<std::string>{"https://www.example.com"}) .SetUseCUP(false) - .SetInitialDelay(123); + .SetInitialDelay(123) + .SetServerKeepAliveSeconds(2); EXPECT_TRUE(builder.Overwrite()); std::unique_ptr<ExternalConstantsOverrider> verifier = @@ -85,6 +87,7 @@ EXPECT_EQ(urls[0], GURL("https://www.example.com")); EXPECT_EQ(verifier->InitialDelay(), 123); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 2); } TEST_F(ExternalConstantsBuilderTests, TestPartialOverrideWithMultipleURLs) { @@ -106,6 +109,7 @@ EXPECT_EQ(urls[1], GURL("https://www.example.com")); EXPECT_EQ(verifier->InitialDelay(), kInitialDelay); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds); } TEST_F(ExternalConstantsBuilderTests, TestClearedEverything) { @@ -118,6 +122,7 @@ .ClearUpdateURL() .ClearUseCUP() .ClearInitialDelay() + .ClearServerKeepAliveSeconds() .Overwrite()); std::unique_ptr<ExternalConstantsOverrider> verifier = @@ -130,6 +135,7 @@ EXPECT_EQ(urls[0], GURL(UPDATE_CHECK_URL)); EXPECT_EQ(verifier->InitialDelay(), kInitialDelay); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), kServerKeepAliveSeconds); } TEST_F(ExternalConstantsBuilderTests, TestOverSet) { @@ -138,9 +144,11 @@ .SetUpdateURL(std::vector<std::string>{"https://www.google.com"}) .SetUseCUP(true) .SetInitialDelay(123.4) + .SetServerKeepAliveSeconds(2) .SetUpdateURL(std::vector<std::string>{"https://www.example.com"}) .SetUseCUP(false) .SetInitialDelay(937.6) + .SetServerKeepAliveSeconds(3) .Overwrite()); // Only the second set of values should be observed. @@ -154,6 +162,7 @@ EXPECT_EQ(urls[0], GURL("https://www.example.com")); EXPECT_EQ(verifier->InitialDelay(), 937.6); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 3); } TEST_F(ExternalConstantsBuilderTests, TestReuseBuilder) { @@ -162,6 +171,7 @@ builder.SetUpdateURL(std::vector<std::string>{"https://www.google.com"}) .SetUseCUP(false) .SetInitialDelay(123.4) + .SetServerKeepAliveSeconds(3) .SetUpdateURL(std::vector<std::string>{"https://www.example.com"}) .Overwrite()); @@ -176,9 +186,13 @@ EXPECT_EQ(urls[0], GURL("https://www.example.com")); EXPECT_EQ(verifier->InitialDelay(), 123.4); + EXPECT_EQ(verifier->ServerKeepAliveSeconds(), 3); // But now we can use the builder again: - EXPECT_TRUE(builder.SetInitialDelay(92.3).ClearUpdateURL().Overwrite()); + EXPECT_TRUE(builder.SetInitialDelay(92.3) + .SetServerKeepAliveSeconds(4) + .ClearUpdateURL() + .Overwrite()); // We need a new overrider to verify because it only loads once. std::unique_ptr<ExternalConstantsOverrider> verifier2 = @@ -193,6 +207,7 @@ EXPECT_EQ(verifier2->InitialDelay(), 92.3); // Updated; update should be seen. + EXPECT_EQ(verifier2->ServerKeepAliveSeconds(), 4); } } // namespace updater
diff --git a/chrome/updater/external_constants_override.cc b/chrome/updater/external_constants_override.cc index d69971a..a1578e7 100644 --- a/chrome/updater/external_constants_override.cc +++ b/chrome/updater/external_constants_override.cc
@@ -98,6 +98,20 @@ return initial_delay_value.GetDouble(); } +int ExternalConstantsOverrider::ServerKeepAliveSeconds() const { + if (!override_values_.contains(kDevOverrideKeyServerKeepAliveSeconds)) { + return next_provider_->ServerKeepAliveSeconds(); + } + + const base::Value& server_keep_alive_seconds_value = + override_values_.at(kDevOverrideKeyServerKeepAliveSeconds); + CHECK(server_keep_alive_seconds_value.is_int()) + << "Unexpected type of override[" << kDevOverrideKeyServerKeepAliveSeconds + << "]: " + << base::Value::GetTypeName(server_keep_alive_seconds_value.type()); + return server_keep_alive_seconds_value.GetInt(); +} + // static std::unique_ptr<ExternalConstantsOverrider> ExternalConstantsOverrider::FromDefaultJSONFile(
diff --git a/chrome/updater/external_constants_override.h b/chrome/updater/external_constants_override.h index 644f9bf0..f9e83f50 100644 --- a/chrome/updater/external_constants_override.h +++ b/chrome/updater/external_constants_override.h
@@ -39,6 +39,7 @@ std::vector<GURL> UpdateURL() const override; bool UseCUP() const override; double InitialDelay() const override; + int ServerKeepAliveSeconds() const override; private: const base::flat_map<std::string, base::Value> override_values_;
diff --git a/chrome/updater/external_constants_override_unittest.cc b/chrome/updater/external_constants_override_unittest.cc index b56ffcf..0a172c4 100644 --- a/chrome/updater/external_constants_override_unittest.cc +++ b/chrome/updater/external_constants_override_unittest.cc
@@ -30,6 +30,7 @@ EXPECT_TRUE(urls[0].is_valid()); EXPECT_EQ(overrider.InitialDelay(), kInitialDelay); + EXPECT_EQ(overrider.ServerKeepAliveSeconds(), kServerKeepAliveSeconds); } TEST_F(ExternalConstantsOverriderTest, TestFullOverrides) { @@ -40,6 +41,7 @@ overrides[kDevOverrideKeyUseCUP] = base::Value(false); overrides[kDevOverrideKeyUrl] = base::Value(std::move(url_list)); overrides[kDevOverrideKeyInitialDelay] = base::Value(137.1); + overrides[kDevOverrideKeyServerKeepAliveSeconds] = base::Value(1); ExternalConstantsOverrider overrider( std::move(overrides), CreateDefaultExternalConstantsForTesting()); @@ -53,6 +55,7 @@ EXPECT_TRUE(urls[1].is_valid()); EXPECT_EQ(overrider.InitialDelay(), 137.1); + EXPECT_EQ(overrider.ServerKeepAliveSeconds(), 1); } TEST_F(ExternalConstantsOverriderTest, TestOverrideUnwrappedURL) { @@ -69,6 +72,7 @@ // Non-overridden items should fall back to defaults EXPECT_TRUE(overrider.UseCUP()); EXPECT_EQ(overrider.InitialDelay(), kInitialDelay); + EXPECT_EQ(overrider.ServerKeepAliveSeconds(), kServerKeepAliveSeconds); } } // namespace updater
diff --git a/chrome/updater/installer.cc b/chrome/updater/installer.cc index 3335a9ef..7809cb1 100644 --- a/chrome/updater/installer.cc +++ b/chrome/updater/installer.cc
@@ -178,23 +178,13 @@ if (!base::PathExists(application_installer)) return Result(kErrorMissingRunableFile); - // TODO(crbug.com/1014630): handle the installer API. -#if defined(OS_WIN) - return RunApplicationInstaller(application_installer, - install_params->arguments, - std::move(progress_callback)); -#else - const int exit_code = - RunApplicationInstaller(application_installer, install_params->arguments, - std::move(progress_callback)); - // Upon success, when the control flow returns back to the |update_client|, // the prefs are updated asynchronously with the new |pv| and |fingerprint|. // The task sequencing guarantees that the prefs will be updated by the // time another CrxDataCallback is invoked, which needs updated values. - return exit_code == 0 ? Result(update_client::InstallError::NONE) - : Result(kErrorApplicationInstallerFailed, exit_code); -#endif // OS_WIN + return RunApplicationInstaller(application_installer, + install_params->arguments, + std::move(progress_callback)); } void Installer::InstallWithSyncPrimitives( @@ -254,10 +244,11 @@ } #if defined(OS_LINUX) || defined(OS_CHROMEOS) -int Installer::RunApplicationInstaller(const base::FilePath& app_installer, - const std::string& arguments) { +Installer::Result Installer::RunApplicationInstaller( + const base::FilePath& app_installer, + const std::string& arguments) { NOTREACHED(); - return -1; + return Installer::Result(-1); } #endif // defined(OS_LINUX) || defined(OS_CHROMEOS)
diff --git a/chrome/updater/installer.h b/chrome/updater/installer.h index edd0b4a7..d42b324 100644 --- a/chrome/updater/installer.h +++ b/chrome/updater/installer.h
@@ -86,17 +86,9 @@ // creating processes, mounting images, running scripts, and collecting // exit codes. The install progress, if it can be collected, is reported by // invoking the |progress_callback|. -#if defined(OS_WIN) Result RunApplicationInstaller(const base::FilePath& app_installer, const std::string& arguments, ProgressCallback progress_callback); -#else - // TODO(crbug.com/1014630) - consider changing the function to return - // an Installer::Result. - int RunApplicationInstaller(const base::FilePath& app_installer, - const std::string& arguments, - ProgressCallback progress_callback); -#endif // OS_WIN // Deletes recursively the install paths not matching the |pv_| version. void DeleteOlderInstallPaths();
diff --git a/chrome/updater/installer_mac.cc b/chrome/updater/installer_mac.cc index 0bb22d1..307748f 100644 --- a/chrome/updater/installer_mac.cc +++ b/chrome/updater/installer_mac.cc
@@ -5,20 +5,27 @@ #include "chrome/updater/installer.h" #include "base/callback.h" +#include "base/files/file_path.h" #include "base/logging.h" #include "base/strings/strcat.h" +#include "chrome/updater/constants.h" #include "chrome/updater/mac/installer.h" namespace updater { -int Installer::RunApplicationInstaller(const base::FilePath& app_installer, - const std::string& arguments, - ProgressCallback /*progress_callback*/) { +Installer::Result Installer::RunApplicationInstaller( + const base::FilePath& app_installer, + const std::string& arguments, + ProgressCallback /*progress_callback*/) { DVLOG(1) << "Running application install from DMG"; // InstallFromDMG() returns the exit code of the script. 0 is success and // anything else should be an error. - return InstallFromDMG(app_installer, checker_path_, - base::StrCat({pv_.GetString(), " ", arguments})); + const int exit_code = + InstallFromDMG(app_installer, checker_path_, + base::StrCat({pv_.GetString(), " ", arguments})); + + return exit_code == 0 ? Result() + : Result(kErrorApplicationInstallerFailed, exit_code); } } // namespace updater
diff --git a/chrome/updater/test/integration_tests_mac.mm b/chrome/updater/test/integration_tests_mac.mm index ef2cb548..c9e1ddd 100644 --- a/chrome/updater/test/integration_tests_mac.mm +++ b/chrome/updater/test/integration_tests_mac.mm
@@ -108,6 +108,7 @@ .SetUpdateURL(std::vector<std::string>{url.spec()}) .SetUseCUP(false) .SetInitialDelay(0.1) + .SetServerKeepAliveSeconds(1) .Overwrite()); }
diff --git a/chromecast/graphics/rounded_window_corners_aura.cc b/chromecast/graphics/rounded_window_corners_aura.cc index 4954e46..a17ccf4 100644 --- a/chromecast/graphics/rounded_window_corners_aura.cc +++ b/chromecast/graphics/rounded_window_corners_aura.cc
@@ -12,6 +12,8 @@ #include "ui/aura/window.h" #include "ui/gfx/canvas.h" #include "ui/views/layout/layout_provider.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -24,6 +26,7 @@ // of the main view. class BlackCornerView : public views::View { public: + METADATA_HEADER(BlackCornerView); BlackCornerView(int radius, bool on_right, bool on_top) : radius_(radius), on_right_(on_right), on_top_(on_top) {} @@ -32,8 +35,9 @@ void SetColorInversion(bool enable) { // In order to show as black we need to paint white when inversion is on. color_ = enable ? SK_ColorWHITE : SK_ColorBLACK; - SchedulePaint(); + OnPropertyChanged(&color_, views::kPropertyEffectsPaint); } + bool GetColorInversion() const { return color_ == SK_ColorWHITE; } private: void OnPaint(gfx::Canvas* canvas) override { @@ -62,6 +66,10 @@ bool on_top_; }; +BEGIN_METADATA(BlackCornerView, views::View) +ADD_PROPERTY_METADATA(bool, ColorInversion) +END_METADATA + // Aura based implementation of RoundedWindowCorners. class RoundedWindowCornersAura : public RoundedWindowCorners { public:
diff --git a/chromecast/ui/media_control_ui.cc b/chromecast/ui/media_control_ui.cc index 04aecd6..3b9b9e3 100644 --- a/chromecast/ui/media_control_ui.cc +++ b/chromecast/ui/media_control_ui.cc
@@ -16,6 +16,8 @@ #include "ui/gfx/geometry/point.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/background.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #define LOG_VIEW(name) DVLOG(1) << #name << ": " << name->bounds().ToString(); @@ -37,8 +39,11 @@ // A view that invokes an |on_tapped| closure whenever it detects a tap gesture. class TouchView : public views::View { public: + METADATA_HEADER(TouchView); explicit TouchView(base::RepeatingClosure on_tapped) : on_tapped_(std::move(on_tapped)) {} + TouchView(const TouchView&) = delete; + TouchView& operator=(const TouchView&) = delete; private: // views::View implementation: @@ -49,10 +54,11 @@ } base::RepeatingClosure on_tapped_; - - DISALLOW_COPY_AND_ASSIGN(TouchView); }; +BEGIN_METADATA(TouchView, views::View) +END_METADATA + } // namespace MediaControlUi::MediaControlUi(CastWindowManager* window_manager)
diff --git a/chromeos/components/diagnostics_ui/backend/histogram_util.cc b/chromeos/components/diagnostics_ui/backend/histogram_util.cc index c35c5d9..bb3baec 100644 --- a/chromeos/components/diagnostics_ui/backend/histogram_util.cc +++ b/chromeos/components/diagnostics_ui/backend/histogram_util.cc
@@ -5,11 +5,17 @@ #include "chromeos/components/diagnostics_ui/backend/histogram_util.h" #include "base/metrics/histogram_functions.h" +#include "base/time/time.h" namespace chromeos { namespace diagnostics { namespace metrics { +void EmitAppOpenDuration(const base::TimeDelta& time_elapsed) { + base::UmaHistogramLongTimes100("ChromeOS.DiagnosticsUi.OpenDuration", + time_elapsed); +} + void EmitRoutineRunCount(uint16_t routine_count) { base::UmaHistogramCounts100("ChromeOS.DiagnosticsUi.RoutineCount", routine_count);
diff --git a/chromeos/components/diagnostics_ui/backend/histogram_util.h b/chromeos/components/diagnostics_ui/backend/histogram_util.h index bbd1294..d15b780 100644 --- a/chromeos/components/diagnostics_ui/backend/histogram_util.h +++ b/chromeos/components/diagnostics_ui/backend/histogram_util.h
@@ -9,10 +9,16 @@ #include "chromeos/components/diagnostics_ui/mojom/system_routine_controller.mojom.h" +namespace base { +class TimeDelta; +} // namespace base + namespace chromeos { namespace diagnostics { namespace metrics { +void EmitAppOpenDuration(const base::TimeDelta& time_elapsed); + void EmitRoutineRunCount(uint16_t routine_count); void EmitRoutineResult(mojom::RoutineType routine_type,
diff --git a/chromeos/components/diagnostics_ui/diagnostics_ui.cc b/chromeos/components/diagnostics_ui/diagnostics_ui.cc index bbae571..de934408 100644 --- a/chromeos/components/diagnostics_ui/diagnostics_ui.cc +++ b/chromeos/components/diagnostics_ui/diagnostics_ui.cc
@@ -10,6 +10,7 @@ #include "base/containers/span.h" #include "base/memory/ptr_util.h" #include "chromeos/components/diagnostics_ui/backend/diagnostics_manager.h" +#include "chromeos/components/diagnostics_ui/backend/histogram_util.h" #include "chromeos/components/diagnostics_ui/backend/session_log_handler.h" #include "chromeos/components/diagnostics_ui/backend/system_data_provider.h" #include "chromeos/components/diagnostics_ui/backend/system_routine_controller.h" @@ -146,9 +147,14 @@ AddDiagnosticsStrings(html_source.get()); content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), html_source.release()); + + open_timestamp_ = base::Time::Now(); } -DiagnosticsUI::~DiagnosticsUI() = default; +DiagnosticsUI::~DiagnosticsUI() { + const base::TimeDelta time_open = base::Time::Now() - open_timestamp_; + diagnostics::metrics::EmitAppOpenDuration(time_open); +} void DiagnosticsUI::BindInterface( mojo::PendingReceiver<diagnostics::mojom::SystemDataProvider> receiver) {
diff --git a/chromeos/components/diagnostics_ui/diagnostics_ui.h b/chromeos/components/diagnostics_ui/diagnostics_ui.h index 6735bf41..002956d 100644 --- a/chromeos/components/diagnostics_ui/diagnostics_ui.h +++ b/chromeos/components/diagnostics_ui/diagnostics_ui.h
@@ -6,6 +6,7 @@ #define CHROMEOS_COMPONENTS_DIAGNOSTICS_UI_DIAGNOSTICS_UI_H_ #include "base/macros.h" +#include "base/time/time.h" #include "chromeos/components/diagnostics_ui/backend/session_log_handler.h" #include "chromeos/components/diagnostics_ui/mojom/system_data_provider.mojom-forward.h" #include "chromeos/components/diagnostics_ui/mojom/system_routine_controller.mojom-forward.h" @@ -45,6 +46,10 @@ private: WEB_UI_CONTROLLER_TYPE_DECL(); + // Timestamp of when the app was opened. Used to calculate a duration for + // metrics. + base::Time open_timestamp_; + std::unique_ptr<diagnostics::SessionLogHandler> session_log_handler_; std::unique_ptr<diagnostics::DiagnosticsManager> diagnostics_manager_; };
diff --git a/chromeos/services/assistant/platform/audio_input_impl.cc b/chromeos/services/assistant/platform/audio_input_impl.cc index ed7f169..ab9a4832 100644 --- a/chromeos/services/assistant/platform/audio_input_impl.cc +++ b/chromeos/services/assistant/platform/audio_input_impl.cc
@@ -230,8 +230,7 @@ auto now = base::TimeTicks::Now(); if ((now - last_frame_count_report_time_) > base::TimeDelta::FromMinutes(2)) { - VLOG(1) << open_audio_stream_->device_id() - << " captured frames: " << captured_frames_count_; + VLOG(1) << "Captured frames: " << captured_frames_count_; last_frame_count_report_time_ = now; } } @@ -239,7 +238,7 @@ // Runs on audio service thread. void AudioInputImpl::OnCaptureError(const std::string& message) { - LOG(ERROR) << open_audio_stream_->device_id() << " capture error " << message; + LOG(ERROR) << "Capture error " << message; base::AutoLock lock(lock_); for (auto* observer : observers_) observer->OnAudioError(AudioInput::Error::FATAL_ERROR); @@ -280,8 +279,7 @@ void AudioInputImpl::RemoveObserver( assistant_client::AudioInput::Observer* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(observer_sequence_checker_); - if (open_audio_stream_) - VLOG(1) << open_audio_stream_->device_id() << " remove observer"; + VLOG(1) << "Remove observer"; bool have_no_observer = false; { @@ -337,7 +335,7 @@ preferred_device_id_ = device_id; UpdateRecordingState(); - if (open_audio_stream_) + if (HasOpenAudioStream()) state_manager_->RecreateAudioInputStream(); } @@ -347,7 +345,7 @@ hotword_device_id_ = device_id; RecreateStateManager(); - if (open_audio_stream_) + if (HasOpenAudioStream()) state_manager_->RecreateAudioInputStream(); } @@ -378,19 +376,16 @@ } bool AudioInputImpl::IsRecordingForTesting() const { - return !!open_audio_stream_; + return HasOpenAudioStream(); } bool AudioInputImpl::IsUsingHotwordDeviceForTesting() const { return IsRecordingForTesting() // IN-TEST - && open_audio_stream_->device_id() == hotword_device_id_ && - IsHotwordAvailable(); + && GetOpenDeviceId() == hotword_device_id_ && IsHotwordAvailable(); } base::Optional<std::string> AudioInputImpl::GetOpenDeviceIdForTesting() const { - if (!open_audio_stream_) - return base::nullopt; - return open_audio_stream_->device_id(); + return GetOpenDeviceId(); } base::Optional<bool> AudioInputImpl::IsUsingDeadStreamDetectionForTesting() @@ -402,7 +397,7 @@ void AudioInputImpl::StartRecording() { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - DCHECK(!open_audio_stream_); + DCHECK(!HasOpenAudioStream()); RecreateAudioInputStream(IsHotwordAvailable()); } @@ -431,9 +426,9 @@ bool should_start = !is_lid_closed && (should_enable_hotword || mic_open_) && has_observers; - if (!open_audio_stream_ && should_start) + if (!HasOpenAudioStream() && should_start) StartRecording(); - else if (open_audio_stream_ && !should_start) + else if (HasOpenAudioStream() && !should_start) StopRecording(); } @@ -446,6 +441,12 @@ return media::AudioDeviceDescription::kDefaultDeviceId; } +base::Optional<std::string> AudioInputImpl::GetOpenDeviceId() const { + if (!open_audio_stream_) + return base::nullopt; + return open_audio_stream_->device_id(); +} + bool AudioInputImpl::ShouldEnableDeadStreamDetection(bool use_dsp) const { if (use_dsp && !hotword_device_id_.empty()) { // The DSP device won't provide data until it detects a hotword, so @@ -455,5 +456,9 @@ return true; } +bool AudioInputImpl::HasOpenAudioStream() const { + return open_audio_stream_ != nullptr; +} + } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/platform/audio_input_impl.h b/chromeos/services/assistant/platform/audio_input_impl.h index c24b488..e81842d 100644 --- a/chromeos/services/assistant/platform/audio_input_impl.h +++ b/chromeos/services/assistant/platform/audio_input_impl.h
@@ -109,7 +109,9 @@ void UpdateRecordingState(); std::string GetDeviceId(bool use_dsp) const; + base::Optional<std::string> GetOpenDeviceId() const; bool ShouldEnableDeadStreamDetection(bool use_dsp) const; + bool HasOpenAudioStream() const; // User explicitly requested to open microphone. bool mic_open_ = false; @@ -119,7 +121,8 @@ // Guards observers_; base::Lock lock_; - std::vector<assistant_client::AudioInput::Observer*> observers_; + std::vector<assistant_client::AudioInput::Observer*> observers_ + GUARDED_BY(lock_); // This is the total number of frames captured during the life time of this // object. We don't worry about overflow because this count is only used for
diff --git a/chromeos/services/libassistant/audio/audio_input_impl.cc b/chromeos/services/libassistant/audio/audio_input_impl.cc index 447f96f7..d429a68 100644 --- a/chromeos/services/libassistant/audio/audio_input_impl.cc +++ b/chromeos/services/libassistant/audio/audio_input_impl.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/bind.h" +#include "base/callback_forward.h" #include "base/logging.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" @@ -42,19 +43,14 @@ class DspHotwordStateManager : public AudioInputImpl::HotwordStateManager { public: - DspHotwordStateManager(AudioInputImpl* input, - scoped_refptr<base::SequencedTaskRunner> task_runner) - : AudioInputImpl::HotwordStateManager(input), task_runner_(task_runner) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - } + explicit DspHotwordStateManager(AudioInputImpl* input) + : AudioInputImpl::HotwordStateManager(input) {} DspHotwordStateManager(const DspHotwordStateManager&) = delete; DspHotwordStateManager& operator=(const DspHotwordStateManager&) = delete; // HotwordStateManager overrides: - // Runs on main thread. void OnConversationTurnStarted() override { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); if (second_phase_timer_.IsRunning()) { DCHECK(stream_state_ == StreamState::HOTWORD); second_phase_timer_.Stop(); @@ -65,9 +61,7 @@ stream_state_ = StreamState::NORMAL; } - // Runs on main thread. void OnConversationTurnFinished() override { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); input_->RecreateAudioInputStream(true /* use_dsp */); if (stream_state_ == StreamState::HOTWORD) { // If |stream_state_| remains unchanged, that indicates the first stage @@ -77,23 +71,7 @@ stream_state_ = StreamState::HOTWORD; } - // Runs on audio service thread void OnCaptureDataArrived() override { - // Posting to main thread to avoid timer's sequence check error. - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&DspHotwordStateManager::OnCaptureDataArrivedMainThread, - weak_factory_.GetWeakPtr())); - } - - void RecreateAudioInputStream() override { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - input_->RecreateAudioInputStream(stream_state_ == StreamState::HOTWORD); - } - - // Runs on main thread. - void OnCaptureDataArrivedMainThread() { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); if (stream_state_ == StreamState::HOTWORD && !second_phase_timer_.IsRunning()) { RecordDspHotwordDetection(DspHotwordDetectionStatus::HARDWARE_ACCEPTED); @@ -108,6 +86,10 @@ } } + void RecreateAudioInputStream() override { + input_->RecreateAudioInputStream(stream_state_ == StreamState::HOTWORD); + } + private: enum class StreamState { HOTWORD, @@ -129,25 +111,25 @@ base::UmaHistogramEnumeration("Assistant.DspHotwordDetection", status); } - scoped_refptr<base::SequencedTaskRunner> task_runner_; StreamState stream_state_ = StreamState::HOTWORD; base::OneShotTimer second_phase_timer_; - base::WeakPtrFactory<DspHotwordStateManager> weak_factory_{this}; }; class AudioInputBufferImpl : public assistant_client::AudioBuffer { public: - AudioInputBufferImpl(const void* data, uint32_t frame_count) - : data_(data), frame_count_(frame_count) {} + AudioInputBufferImpl(std::vector<int16_t>&& data, uint32_t frame_count) + : data_(std::move(data)), frame_count_(frame_count) {} AudioInputBufferImpl(const AudioInputBufferImpl&) = delete; AudioInputBufferImpl& operator=(const AudioInputBufferImpl&) = delete; + AudioInputBufferImpl(AudioInputBufferImpl&&) = default; + AudioInputBufferImpl& operator=(AudioInputBufferImpl&&) = default; ~AudioInputBufferImpl() override = default; // assistant_client::AudioBuffer overrides: assistant_client::BufferFormat GetFormat() const override { return g_current_format; } - const void* GetData() const override { return data_; } + const void* GetData() const override { return data_.data(); } void* GetWritableData() override { NOTREACHED(); return nullptr; @@ -155,12 +137,129 @@ int GetFrameCount() const override { return frame_count_; } private: - const void* data_; + std::vector<int16_t> data_; int frame_count_; }; +AudioInputBufferImpl ToAudioInputBuffer(const media::AudioBus* audio_source) { + std::vector<int16_t> buffer(audio_source->channels() * + audio_source->frames()); + audio_source->ToInterleaved<media::SignedInt16SampleTypeTraits>( + audio_source->frames(), buffer.data()); + return AudioInputBufferImpl(std::move(buffer), audio_source->frames()); +} + } // namespace +//////////////////////////////////////////////////////////////////////////////// +// AudioCapturer +//////////////////////////////////////////////////////////////////////////////// + +// Helper class that will receive the callbacks from the audio source, +// and forward the audio data to Libassistant. +// Note that all callback methods in this object run on the audio service +// thread, so this class should be treated carefully. +// All public methods can be called from other threads, and the +// |on_capture_callback| will be invoked on the given callback thread. +class AudioCapturer : public media::AudioCapturerSource::CaptureCallback { + public: + explicit AudioCapturer( + base::RepeatingCallback<void()> on_capture_callback, + scoped_refptr<base::SequencedTaskRunner> callback_task_runner) + : on_capture_callback_(on_capture_callback), + callback_task_runner_(callback_task_runner) {} + AudioCapturer(const AudioCapturer&) = delete; + AudioCapturer& operator=(const AudioCapturer&) = delete; + ~AudioCapturer() override = default; + + void AddObserver(assistant_client::AudioInput::Observer* observer) { + base::AutoLock lock(observers_lock_); + observers_.push_back(observer); + } + + void RemoveObserver(assistant_client::AudioInput::Observer* observer) { + base::AutoLock lock(observers_lock_); + base::Erase(observers_, observer); + } + + int num_observers() { + base::AutoLock lock(observers_lock_); + return observers_.size(); + } + + int captured_frames_count() { return captured_frames_count_; } + + private: + // media::AudioCapturerSource::CaptureCallback implementation: + // Runs on audio service thread. + void Capture(const media::AudioBus* audio_source, + base::TimeTicks audio_capture_time, + double volume, + bool key_pressed) override { + DCHECK_EQ(g_current_format.num_channels, audio_source->channels()); + + callback_task_runner_->PostTask(FROM_HERE, on_capture_callback_); + + UpdateCapturedFramesCount(audio_source->frames()); + + AudioInputBufferImpl input_buffer(ToAudioInputBuffer(audio_source)); + int64_t time = ToLibassistantTime(audio_capture_time); + + base::AutoLock lock(observers_lock_); + for (auto* observer : observers_) + observer->OnAudioBufferAvailable(input_buffer, time); + } + + // Runs on audio service thread. + void OnCaptureError(const std::string& message) override { + LOG(ERROR) << "Capture error " << message; + base::AutoLock lock(observers_lock_); + for (auto* observer : observers_) + observer->OnAudioError(assistant_client::AudioInput::Error::FATAL_ERROR); + } + + // Runs on audio service thread. + void OnCaptureMuted(bool is_muted) override {} + + int64_t ToLibassistantTime(base::TimeTicks audio_capture_time) const { + // Only provide accurate timestamp when eraser is enabled, otherwise it + // seems break normal libassistant voice recognition. + if (assistant::features::IsAudioEraserEnabled()) + return audio_capture_time.since_origin().InMicroseconds(); + return 0; + } + + void UpdateCapturedFramesCount(int num_arrived_frames) { + captured_frames_count_ += num_arrived_frames; + if (VLOG_IS_ON(1)) { + auto now = base::TimeTicks::Now(); + if ((now - last_frame_count_report_time_) > + base::TimeDelta::FromMinutes(2)) { + VLOG(1) << "Captured frames: " << captured_frames_count_; + last_frame_count_report_time_ = now; + } + } + } + + // This is the total number of frames captured during the life time of this + // object. We don't worry about overflow because this count is only used for + // logging purposes. If in the future this changes, we should re-evaluate. + int captured_frames_count_ = 0; + base::TimeTicks last_frame_count_report_time_; + + base::Lock observers_lock_; + std::vector<assistant_client::AudioInput::Observer*> observers_ + GUARDED_BY(observers_lock_); + + // |on_capture_callback| must always be called from the main thread. + base::RepeatingCallback<void()> on_capture_callback_; + scoped_refptr<base::SequencedTaskRunner> callback_task_runner_; +}; + +//////////////////////////////////////////////////////////////////////////////// +// AudioInputImpl +//////////////////////////////////////////////////////////////////////////////// + AudioInputImpl::HotwordStateManager::HotwordStateManager( AudioInputImpl* audio_input) : input_(audio_input) {} @@ -175,6 +274,11 @@ weak_factory_(this) { DETACH_FROM_SEQUENCE(observer_sequence_checker_); + audio_capturer_ = std::make_unique<AudioCapturer>( + base::BindRepeating(&AudioInputImpl::OnCaptureDataArrived, + weak_factory_.GetWeakPtr()), + /*callback_task_runner=*/base::SequencedTaskRunnerHandle::Get()); + RecreateStateManager(); if (assistant::features::IsStereoAudioInputEnabled()) g_current_format = kFormatStereo; @@ -189,67 +293,22 @@ void AudioInputImpl::RecreateStateManager() { if (IsHotwordAvailable()) { - state_manager_ = - std::make_unique<DspHotwordStateManager>(this, task_runner_); + state_manager_ = std::make_unique<DspHotwordStateManager>(this); } else { state_manager_ = std::make_unique<HotwordStateManager>(this); } } +void AudioInputImpl::OnCaptureDataArrived() { + state_manager_->OnCaptureDataArrived(); +} + void AudioInputImpl::Initialize(mojom::PlatformDelegate* platform_delegate) { platform_delegate_ = platform_delegate; DCHECK(platform_delegate_); UpdateRecordingState(); } -// Runs on audio service thread. -void AudioInputImpl::Capture(const media::AudioBus* audio_source, - base::TimeTicks audio_capture_time, - double volume, - bool key_pressed) { - DCHECK_EQ(g_current_format.num_channels, audio_source->channels()); - - state_manager_->OnCaptureDataArrived(); - - std::vector<int16_t> buffer(audio_source->channels() * - audio_source->frames()); - audio_source->ToInterleaved<media::SignedInt16SampleTypeTraits>( - audio_source->frames(), buffer.data()); - int64_t time = 0; - // Only provide accurate timestamp when eraser is enabled, otherwise it seems - // break normal libassistant voice recognition. - if (assistant::features::IsAudioEraserEnabled()) - time = audio_capture_time.since_origin().InMicroseconds(); - AudioInputBufferImpl input_buffer(buffer.data(), audio_source->frames()); - { - base::AutoLock lock(lock_); - for (auto* observer : observers_) - observer->OnAudioBufferAvailable(input_buffer, time); - } - - captured_frames_count_ += audio_source->frames(); - if (VLOG_IS_ON(1)) { - auto now = base::TimeTicks::Now(); - if ((now - last_frame_count_report_time_) > - base::TimeDelta::FromMinutes(2)) { - VLOG(1) << open_audio_stream_->device_id() - << " captured frames: " << captured_frames_count_; - last_frame_count_report_time_ = now; - } - } -} - -// Runs on audio service thread. -void AudioInputImpl::OnCaptureError(const std::string& message) { - LOG(ERROR) << open_audio_stream_->device_id() << " capture error " << message; - base::AutoLock lock(lock_); - for (auto* observer : observers_) - observer->OnAudioError(AudioInput::Error::FATAL_ERROR); -} - -// Runs on audio service thread. -void AudioInputImpl::OnCaptureMuted(bool is_muted) {} - // Run on LibAssistant thread. assistant_client::BufferFormat AudioInputImpl::GetFormat() const { return g_current_format; @@ -259,16 +318,11 @@ void AudioInputImpl::AddObserver( assistant_client::AudioInput::Observer* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(observer_sequence_checker_); - VLOG(1) << " add observer"; + VLOG(1) << "Add observer"; - bool have_first_observer = false; - { - base::AutoLock lock(lock_); - observers_.push_back(observer); - have_first_observer = observers_.size() == 1; - } + audio_capturer_->AddObserver(observer); - if (have_first_observer) { + if (audio_capturer_->num_observers() == 1) { // Post to main thread runner to start audio recording. Assistant thread // does not have thread context defined in //base and will fail sequence // check in AudioCapturerSource::Start(). @@ -282,15 +336,11 @@ void AudioInputImpl::RemoveObserver( assistant_client::AudioInput::Observer* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(observer_sequence_checker_); - VLOG(1) << open_audio_stream_->device_id() << " remove observer"; - bool have_no_observer = false; - { - base::AutoLock lock(lock_); - base::Erase(observers_, observer); - have_no_observer = observers_.size() == 0; - } + VLOG(1) << "Remove observer"; - if (have_no_observer) { + audio_capturer_->RemoveObserver(observer); + + if (audio_capturer_->num_observers() == 0) { task_runner_->PostTask(FROM_HERE, base::BindOnce(&AudioInputImpl::UpdateRecordingState, weak_factory_.GetWeakPtr())); @@ -337,7 +387,7 @@ preferred_device_id_ = device_id; UpdateRecordingState(); - if (open_audio_stream_) + if (HasOpenAudioStream()) state_manager_->RecreateAudioInputStream(); } @@ -348,7 +398,7 @@ hotword_device_id_ = device_id; RecreateStateManager(); - if (open_audio_stream_) + if (HasOpenAudioStream()) state_manager_->RecreateAudioInputStream(); } @@ -369,7 +419,7 @@ open_audio_stream_ = std::make_unique<AudioInputStream>( platform_delegate_, GetDeviceId(use_dsp), ShouldEnableDeadStreamDetection(use_dsp), GetFormat(), - /*capture_callback=*/this); + /*capture_callback=*/audio_capturer_.get()); VLOG(1) << open_audio_stream_->device_id() << " start recording"; } @@ -380,19 +430,16 @@ } bool AudioInputImpl::IsRecordingForTesting() const { - return !!open_audio_stream_; + return HasOpenAudioStream(); } bool AudioInputImpl::IsUsingHotwordDeviceForTesting() const { return IsRecordingForTesting() // IN-TEST - && open_audio_stream_->device_id() == hotword_device_id_ && - IsHotwordAvailable(); + && GetOpenDeviceId() == hotword_device_id_ && IsHotwordAvailable(); } base::Optional<std::string> AudioInputImpl::GetOpenDeviceIdForTesting() const { - if (!open_audio_stream_) - return base::nullopt; - return open_audio_stream_->device_id(); + return GetOpenDeviceId(); } base::Optional<bool> AudioInputImpl::IsUsingDeadStreamDetectionForTesting() @@ -404,7 +451,7 @@ void AudioInputImpl::StartRecording() { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - DCHECK(!open_audio_stream_); + DCHECK(!HasOpenAudioStream()); RecreateAudioInputStream(IsHotwordAvailable()); } @@ -412,8 +459,8 @@ DCHECK(task_runner_->RunsTasksInCurrentSequence()); if (open_audio_stream_) { VLOG(1) << open_audio_stream_->device_id() << " stop recording"; - VLOG(1) << open_audio_stream_->device_id() - << " ending captured frames: " << captured_frames_count_; + VLOG(1) << open_audio_stream_->device_id() << " ending captured frames: " + << audio_capturer_->captured_frames_count(); open_audio_stream_.reset(); } } @@ -421,12 +468,7 @@ void AudioInputImpl::UpdateRecordingState() { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - bool has_observers = false; - { - base::AutoLock lock(lock_); - has_observers = observers_.size() > 0; - } - + bool has_observers = (audio_capturer_->num_observers() > 0); bool is_lid_closed = (lid_state_ == mojom::LidState::kClosed); bool should_enable_hotword = hotword_enabled_ && preferred_device_id_.has_value(); @@ -446,9 +488,9 @@ << " has_delegate: " << has_delegate << "\n" << " => should_start: " << should_start; - if (!open_audio_stream_ && should_start) + if (!HasOpenAudioStream() && should_start) StartRecording(); - else if (open_audio_stream_ && !should_start) + else if (HasOpenAudioStream() && !should_start) StopRecording(); } @@ -461,6 +503,12 @@ return media::AudioDeviceDescription::kDefaultDeviceId; } +base::Optional<std::string> AudioInputImpl::GetOpenDeviceId() const { + if (!open_audio_stream_) + return base::nullopt; + return open_audio_stream_->device_id(); +} + bool AudioInputImpl::ShouldEnableDeadStreamDetection(bool use_dsp) const { if (use_dsp && hotword_device_id_.has_value()) { // The DSP device won't provide data until it detects a hotword, so @@ -470,5 +518,9 @@ return true; } +bool AudioInputImpl::HasOpenAudioStream() const { + return open_audio_stream_ != nullptr; +} + } // namespace libassistant } // namespace chromeos
diff --git a/chromeos/services/libassistant/audio/audio_input_impl.h b/chromeos/services/libassistant/audio/audio_input_impl.h index f1c1987..fca1f0b 100644 --- a/chromeos/services/libassistant/audio/audio_input_impl.h +++ b/chromeos/services/libassistant/audio/audio_input_impl.h
@@ -27,10 +27,10 @@ namespace libassistant { class AudioInputStream; +class AudioCapturer; class COMPONENT_EXPORT(LIBASSISTANT_SERVICE) AudioInputImpl - : public assistant_client::AudioInput, - public media::AudioCapturerSource::CaptureCallback { + : public assistant_client::AudioInput { public: explicit AudioInputImpl(const base::Optional<std::string>& device_id); AudioInputImpl(const AudioInputImpl&) = delete; @@ -53,18 +53,8 @@ AudioInputImpl* input_; }; - void RecreateStateManager(); - void Initialize(mojom::PlatformDelegate* platform_delegate); - // media::AudioCapturerSource::CaptureCallback overrides: - void Capture(const media::AudioBus* audio_source, - base::TimeTicks audio_capture_time, - double volume, - bool key_pressed) override; - void OnCaptureError(const std::string& message) override; - void OnCaptureMuted(bool is_muted) override; - // assistant_client::AudioInput overrides. These function are called by // assistant from assistant thread, for which we should not assume any // //base related thread context to be in place. @@ -103,12 +93,17 @@ base::Optional<bool> IsUsingDeadStreamDetectionForTesting() const; private: + void RecreateStateManager(); + void OnCaptureDataArrived(); + void StartRecording(); void StopRecording(); void UpdateRecordingState(); std::string GetDeviceId(bool use_dsp) const; + base::Optional<std::string> GetOpenDeviceId() const; bool ShouldEnableDeadStreamDetection(bool use_dsp) const; + bool HasOpenAudioStream() const; // User explicitly requested to open microphone. bool mic_open_ = false; @@ -116,16 +111,6 @@ // Whether hotword is currently enabled. bool hotword_enabled_ = true; - // Guards observers_; - base::Lock lock_; - std::vector<assistant_client::AudioInput::Observer*> observers_; - - // This is the total number of frames captured during the life time of this - // object. We don't worry about overflow because this count is only used for - // logging purposes. If in the future this changes, we should re-evaluate. - int captured_frames_count_ = 0; - base::TimeTicks last_frame_count_report_time_; - // To be initialized on assistant thread the first call to AddObserver. // It ensures that AddObserver / RemoveObserver are called on the same // sequence. @@ -134,6 +119,7 @@ scoped_refptr<base::SequencedTaskRunner> task_runner_; std::unique_ptr<HotwordStateManager> state_manager_; + std::unique_ptr<AudioCapturer> audio_capturer_; // Owned by |LibassistantService|. mojom::PlatformDelegate* platform_delegate_ = nullptr;
diff --git a/chromeos/ui/frame/frame_header.cc b/chromeos/ui/frame/frame_header.cc index c9e234a..f691b12 100644 --- a/chromeos/ui/frame/frame_header.cc +++ b/chromeos/ui/frame/frame_header.cc
@@ -18,6 +18,8 @@ #include "ui/gfx/font_list.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/scoped_canvas.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/native_widget_aura.h" #include "ui/views/widget/widget.h" @@ -68,6 +70,99 @@ } // namespace +FrameHeader::FrameAnimatorView::FrameAnimatorView(views::View* parent) + : parent_(parent) { + SetPaintToLayer(ui::LAYER_NOT_DRAWN); + parent_->AddChildViewAt(this, 0); + parent_->AddObserver(this); +} + +FrameHeader::FrameAnimatorView::~FrameAnimatorView() { + StopAnimation(); + // A child view should always be removed first. + parent_->RemoveObserver(this); +} + +void FrameHeader::FrameAnimatorView::StartAnimation(base::TimeDelta duration) { + aura::Window* window = + parent_->GetWidget() ? parent_->GetWidget()->GetNativeWindow() : nullptr; + if (layer_owner_ || !window || + window->layer()->GetAnimator()->is_animating()) { + // If the frame animation is already running or the widget + // hasn't been initialized yet, just update the content of the + // new layer. + parent_->SchedulePaint(); + return; + } + + // Make sure the this view is at the bottom of root view's children. + parent_->ReorderChildView(this, 0); + + std::unique_ptr<ui::LayerTreeOwner> old_layer_owner = + std::make_unique<ui::LayerTreeOwner>(window->RecreateLayer()); + ui::Layer* old_layer = old_layer_owner->root(); + ui::Layer* new_layer = window->layer(); + new_layer->SetName(old_layer->name()); + old_layer->SetName(old_layer->name() + ":Old"); + old_layer->SetTransform(gfx::Transform()); + // Layer in maximized / fullscreen / snapped state is set to + // opaque, which can prevent resterizing the new layer immediately. + old_layer->SetFillsBoundsOpaquely(false); + + layer_owner_ = std::move(old_layer_owner); + + AddLayerBeneathView(old_layer); + + // The old layer is on top and should fade out. + old_layer->SetOpacity(1.f); + new_layer->SetOpacity(1.f); + { + ui::ScopedLayerAnimationSettings settings(old_layer->GetAnimator()); + settings.SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); + settings.AddObserver(this); + settings.SetTransitionDuration(duration); + old_layer->SetOpacity(0.f); + settings.SetTweenType(gfx::Tween::EASE_OUT); + } +} + +std::unique_ptr<ui::Layer> FrameHeader::FrameAnimatorView::RecreateLayer() { + // A layer may be recreated for another animation (maximize/restore). + // Just cancel the animation if that happens during animation. + StopAnimation(); + return views::View::RecreateLayer(); +} + +void FrameHeader::FrameAnimatorView::OnChildViewReordered( + views::View* observed_view, + views::View* child) { + // Stop animation if the child view order has changed during animation. + StopAnimation(); +} + +void FrameHeader::FrameAnimatorView::OnViewBoundsChanged( + views::View* observed_view) { + // Stop animation if the frame size changed during animation. + StopAnimation(); + SetBoundsRect(parent_->GetLocalBounds()); +} + +void FrameHeader::FrameAnimatorView::OnImplicitAnimationsCompleted() { + RemoveLayerBeneathView(layer_owner_->root()); + layer_owner_ = nullptr; +} + +void FrameHeader::FrameAnimatorView::StopAnimation() { + if (layer_owner_) { + layer_owner_->root()->GetAnimator()->StopAnimating(); + layer_owner_ = nullptr; + } +} + +BEGIN_METADATA(FrameHeader, FrameAnimatorView, views::View) +END_METADATA + /////////////////////////////////////////////////////////////////////////////// // FrameHeader, public: @@ -89,111 +184,6 @@ caption_button_container_->GetMinimumSize().width(); } -// An invisible view that drives the frame's animation. This holds the animating -// layer as a layer beneath this view so that it's behind all other child layers -// of the window to avoid hiding their contents. -class FrameHeader::FrameAnimatorView : public views::View, - public views::ViewObserver, - public ui::ImplicitAnimationObserver { - public: - FrameAnimatorView(views::View* parent) - : parent_(parent) { - SetPaintToLayer(ui::LAYER_NOT_DRAWN); - parent_->AddChildViewAt(this, 0); - parent_->AddObserver(this); - } - FrameAnimatorView(const FrameAnimatorView&) = delete; - FrameAnimatorView& operator=(const FrameAnimatorView&) = delete; - ~FrameAnimatorView() override { - StopAnimation(); - // A child view should always be removed first. - parent_->RemoveObserver(this); - } - - void StartAnimation(base::TimeDelta duration) { - aura::Window* window = parent_->GetWidget() - ? parent_->GetWidget()->GetNativeWindow() - : nullptr; - if (layer_owner_ || !window || - window->layer()->GetAnimator()->is_animating()) { - // If the frame animation is already running or the widget - // hasn't been initialized yet, just update the content of the - // new layer. - parent_->SchedulePaint(); - return; - } - - // Make sure the this view is at the bottom of root view's children. - parent_->ReorderChildView(this, 0); - - std::unique_ptr<ui::LayerTreeOwner> old_layer_owner = - std::make_unique<ui::LayerTreeOwner>(window->RecreateLayer()); - ui::Layer* old_layer = old_layer_owner->root(); - ui::Layer* new_layer = window->layer(); - new_layer->SetName(old_layer->name()); - old_layer->SetName(old_layer->name() + ":Old"); - old_layer->SetTransform(gfx::Transform()); - // Layer in maximized / fullscreen / snapped state is set to - // opaque, which can prevent resterizing the new layer immediately. - old_layer->SetFillsBoundsOpaquely(false); - - layer_owner_ = std::move(old_layer_owner); - - AddLayerBeneathView(old_layer); - - // The old layer is on top and should fade out. - old_layer->SetOpacity(1.f); - new_layer->SetOpacity(1.f); - { - ui::ScopedLayerAnimationSettings settings(old_layer->GetAnimator()); - settings.SetPreemptionStrategy( - ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); - settings.AddObserver(this); - settings.SetTransitionDuration(duration); - old_layer->SetOpacity(0.f); - settings.SetTweenType(gfx::Tween::EASE_OUT); - } - } - - // views::Views: - const char* GetClassName() const override { return "FrameAnimatorView"; } - std::unique_ptr<ui::Layer> RecreateLayer() override { - // A layer may be recreated for another animation (maximize/restore). - // Just cancel the animation if that happens during animation. - StopAnimation(); - return views::View::RecreateLayer(); - } - - // ViewObserver:: - void OnChildViewReordered(views::View* observed_view, - views::View* child) override { - // Stop animation if the child view order has changed during animation. - StopAnimation(); - } - void OnViewBoundsChanged(views::View* observed_view) override { - // Stop animation if the frame size changed during animation. - StopAnimation(); - SetBoundsRect(parent_->GetLocalBounds()); - } - - // ui::ImplicitAnimationObserver overrides: - void OnImplicitAnimationsCompleted() override { - RemoveLayerBeneathView(layer_owner_->root()); - layer_owner_ = nullptr; - } - - private: - void StopAnimation() { - if (layer_owner_) { - layer_owner_->root()->GetAnimator()->StopAnimating(); - layer_owner_ = nullptr; - } - } - - views::View* parent_; - std::unique_ptr<ui::LayerTreeOwner> layer_owner_; -}; - void FrameHeader::PaintHeader(gfx::Canvas* canvas) { painted_ = true; DoPaintHeader(canvas);
diff --git a/chromeos/ui/frame/frame_header.h b/chromeos/ui/frame/frame_header.h index b9e9405..c03d169 100644 --- a/chromeos/ui/frame/frame_header.h +++ b/chromeos/ui/frame/frame_header.h
@@ -27,6 +27,11 @@ class Rect; } // namespace gfx +namespace ui { +class Layer; +class LayerTreeOwner; +} // namespace ui + namespace views { enum class CaptionButtonLayoutSize; class View; @@ -40,6 +45,39 @@ // Helper class for managing the window header. class COMPONENT_EXPORT(CHROMEOS_UI_FRAME) FrameHeader { public: + // An invisible view that drives the frame's animation. This holds the + // animating layer as a layer beneath this view so that it's behind all other + // child layers of the window to avoid hiding their contents. + class FrameAnimatorView : public views::View, + public views::ViewObserver, + public ui::ImplicitAnimationObserver { + public: + METADATA_HEADER(FrameAnimatorView); + explicit FrameAnimatorView(views::View* parent); + FrameAnimatorView(const FrameAnimatorView&) = delete; + FrameAnimatorView& operator=(const FrameAnimatorView&) = delete; + ~FrameAnimatorView() override; + + void StartAnimation(base::TimeDelta duration); + + // views::Views: + std::unique_ptr<ui::Layer> RecreateLayer() override; + + // ViewObserver: + void OnChildViewReordered(views::View* observed_view, + views::View* child) override; + void OnViewBoundsChanged(views::View* observed_view) override; + + // ui::ImplicitAnimationObserver overrides: + void OnImplicitAnimationsCompleted() override; + + private: + void StopAnimation(); + + views::View* parent_; + std::unique_ptr<ui::LayerTreeOwner> layer_owner_; + }; + enum Mode { MODE_ACTIVE, MODE_INACTIVE }; static FrameHeader* Get(views::Widget* widget); @@ -127,7 +165,6 @@ void StartTransitionAnimation(base::TimeDelta duration); private: - class FrameAnimatorView; FRIEND_TEST_ALL_PREFIXES(ash::DefaultFrameHeaderTest, BackButtonAlignment); FRIEND_TEST_ALL_PREFIXES(ash::DefaultFrameHeaderTest, TitleIconAlignment); FRIEND_TEST_ALL_PREFIXES(ash::DefaultFrameHeaderTest, FrameColors);
diff --git a/components/BUILD.gn b/components/BUILD.gn index 92f972e..e5a09bc5 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -836,6 +836,7 @@ "//components/signin/public/android:junit", "//components/variations/android:components_variations_junit_tests", "//components/webapk/android/libs/client:junit", + "//components/webapps/browser/android:junit", ] } }
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 9000bbf5..1bcfa67e 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -55,12 +55,6 @@ "AutofillDownstreamCvcPromptUseGooglePayLogo", base::FEATURE_DISABLED_BY_DEFAULT}; -// When enabled, autofill payments bubbles' result will be recorded as either -// 'accepted', 'cancelled', 'closed', 'not interacted' or 'lost focus'. -const base::Feature kAutofillEnableFixedPaymentsBubbleLogging{ - "AutofillEnableFixedPaymentsBubbleLogging", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls whether we show a Google-issued card in the suggestions list. const base::Feature kAutofillEnableGoogleIssuedCard{ "AutofillEnableGoogleIssuedCard", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -87,11 +81,6 @@ "AutofillEnableSaveCardInfoBarAccountIndicationFooter", base::FEATURE_DISABLED_BY_DEFAULT}; -// When enabled, all payments related bubbles will not be dismissed upon page -// navigation. -const base::Feature kAutofillEnableStickyPaymentsBubble{ - "AutofillEnableStickyPaymentsBubble", base::FEATURE_ENABLED_BY_DEFAULT}; - // When enabled, Autofill data related icons will be shown in the status // chip in toolbar along with the avatar toolbar button. const base::Feature kAutofillEnableToolbarStatusChip{
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index 77f30fab..82c39b64 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -24,14 +24,12 @@ extern const base::Feature kAutofillCreditCardAuthentication; extern const base::Feature kAutofillCreditCardUploadFeedback; extern const base::Feature kAutofillDownstreamCvcPromptUseGooglePayLogo; -extern const base::Feature kAutofillEnableFixedPaymentsBubbleLogging; extern const base::Feature kAutofillEnableGoogleIssuedCard; extern const base::Feature kAutofillEnableOfferNotification; extern const base::Feature kAutofillEnableOffersInClankKeyboardAccessory; extern const base::Feature kAutofillEnableOffersInDownstream; extern const base::Feature kAutofillEnableSaveCardInfoBarAccountIndicationFooter; -extern const base::Feature kAutofillEnableStickyPaymentsBubble; extern const base::Feature kAutofillEnableToolbarStatusChip; extern const base::Feature kAutofillEnableVirtualCard; extern const base::Feature kAutofillSaveCardDismissOnNavigation;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java index ee143d1..ad525c5b 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java
@@ -31,7 +31,8 @@ import java.util.List; /** - * Render test for {@link RadioButtonWithDescription}, {@link RadioButtonWithEditText} and + * Render test for {@link RadioButtonWithDescription}, {@link RadioButtonWithEditText}, {@link + * RadioButtonWithDescriptionAndAuxButton} and * {@link RadioButtonWithDescriptionLayout}. */ @RunWith(ParameterizedRunner.class) @@ -41,8 +42,9 @@ private static List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); - private static final int REVISION = 1; - private static final String REVISION_DESCRIPTION = "Updated EditText hint color for a11y"; + private static final int REVISION = 2; + private static final String REVISION_DESCRIPTION = + "Added RadioButtonWithDescriptionAndAuxButton to the test."; @Rule public RenderTestRule mRenderTestRule = RenderTestRule.Builder.withPublicCorpus() @@ -61,6 +63,10 @@ private RadioButtonWithEditText mRadioButtonWithEditText3; private RadioButtonWithEditText mRadioButtonWithEditText4; + private RadioButtonWithDescriptionAndAuxButton mRadioButtonWithDescriptonAndAuxButton1; + private RadioButtonWithDescriptionAndAuxButton mRadioButtonWithDescriptonAndAuxButton2; + private RadioButtonWithDescriptionAndAuxButton mRadioButtonWithDescriptonAndAuxButton3; + private final int mFakeBgColor; public RadioButtonRenderTest(boolean nightModeEnabled) { @@ -88,6 +94,12 @@ mRadioButtonWithEditText2 = content.findViewById(R.id.test_radio_edit_text_2); mRadioButtonWithEditText3 = content.findViewById(R.id.test_radio_edit_text_3); mRadioButtonWithEditText4 = content.findViewById(R.id.test_radio_edit_text_4); + mRadioButtonWithDescriptonAndAuxButton1 = + content.findViewById(R.id.test_radio_description_and_aux_button_1); + mRadioButtonWithDescriptonAndAuxButton2 = + content.findViewById(R.id.test_radio_description_and_aux_button_2); + mRadioButtonWithDescriptonAndAuxButton3 = + content.findViewById(R.id.test_radio_description_and_aux_button_3); }); Assert.assertNotNull(mLayout); @@ -98,6 +110,9 @@ Assert.assertNotNull(mRadioButtonWithEditText2); Assert.assertNotNull(mRadioButtonWithEditText3); Assert.assertNotNull(mRadioButtonWithEditText4); + Assert.assertNotNull(mRadioButtonWithDescriptonAndAuxButton1); + Assert.assertNotNull(mRadioButtonWithDescriptonAndAuxButton2); + Assert.assertNotNull(mRadioButtonWithDescriptonAndAuxButton3); } @Test @@ -111,5 +126,11 @@ mRenderTestRule.render(mRadioButtonWithEditText2, "test_radio_edit_text_2"); mRenderTestRule.render(mRadioButtonWithEditText3, "test_radio_edit_text_3"); mRenderTestRule.render(mRadioButtonWithEditText4, "test_radio_edit_text_4"); + mRenderTestRule.render( + mRadioButtonWithDescriptonAndAuxButton1, "test_radio_description_and_aux_button_1"); + mRenderTestRule.render( + mRadioButtonWithDescriptonAndAuxButton2, "test_radio_description_and_aux_button_2"); + mRenderTestRule.render( + mRadioButtonWithDescriptonAndAuxButton3, "test_radio_description_and_aux_button_3"); } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButton.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButton.java index 172221fe5..fe2cfdc 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButton.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButton.java
@@ -54,7 +54,6 @@ * }</pre> * </p> * - * TODO(crbug.com/1097310): Add render tests in RadioButtonRenderTest.java for this widget. */ public class RadioButtonWithDescriptionAndAuxButton extends RadioButtonWithDescription { /**
diff --git a/components/browser_ui/widget/android/test/java/res/layout/radio_button_render_test.xml b/components/browser_ui/widget/android/test/java/res/layout/radio_button_render_test.xml index 7b63622d..6579dcc5 100644 --- a/components/browser_ui/widget/android/test/java/res/layout/radio_button_render_test.xml +++ b/components/browser_ui/widget/android/test/java/res/layout/radio_button_render_test.xml
@@ -84,5 +84,29 @@ android:paddingBottom="8dp" android:inputType="text" android:hint="@string/test_uri" /> + + <!-- RadioButtonWithDescriptionAndAuxButton - With primary, without description. --> + <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionAndAuxButton + android:id="@+id/test_radio_description_and_aux_button_1" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:primaryText="@string/test_string" /> + + <!-- RadioButtonWithDescriptionAndAuxButton - With primary and description. --> + <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionAndAuxButton + android:id="@+id/test_radio_description_and_aux_button_2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + app:primaryText="@string/test_string" + app:descriptionText="@string/test_string" /> + + <!-- RadioButtonWithDescriptionAndAuxButton - With background override. --> + <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionAndAuxButton + android:id="@+id/test_radio_description_and_aux_button_3" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/background_color_non_empty" + app:primaryText="@string/test_string" + app:descriptionText="@string/test_string" /> </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout> </FrameLayout>
diff --git a/components/components_strings.grd b/components/components_strings.grd index 6a8f5af0f..d9e22ae8 100644 --- a/components/components_strings.grd +++ b/components/components_strings.grd
@@ -511,9 +511,6 @@ <message name="IDS_UNZIP_SERVICE_DISPLAY_NAME" desc="The display name (in the system task manager, etc) of the service process used for unzipping files."> Unzip Service </message> - <message name="IDS_WEB_APP_ORIGIN_ASSOCIATION_PARSER_SERVICE_DISPLAY_NAME" desc="The display name (in the system task manager, etc) of the service process used for web app origin association parsing."> - Web App Origin Association Parser Service - </message> </messages> </release> </grit>
diff --git a/components/crx_file/crx_creator.cc b/components/crx_file/crx_creator.cc index 8ec6bb3..eebe9b50 100644 --- a/components/crx_file/crx_creator.cc +++ b/components/crx_file/crx_creator.cc
@@ -57,11 +57,10 @@ return read == 0; } -} // namespace - -CreatorResult Create(const base::FilePath& output_path, - const base::FilePath& zip_path, - crypto::RSAPrivateKey* signing_key) { +CreatorResult SignArchiveAndCreateHeader(const base::FilePath& output_path, + base::File* file, + crypto::RSAPrivateKey* signing_key, + CrxFileHeader* header) { // Get the public key. std::vector<uint8_t> public_key; signing_key->ExportPublicKey(&public_key); @@ -87,27 +86,29 @@ signer->Update( reinterpret_cast<const uint8_t*>(signed_header_data_str.data()), signed_header_data_str.size()); - base::File file(zip_path, base::File::FLAG_OPEN | base::File::FLAG_READ); - if (!file.IsValid()) + + if (!file->IsValid()) return CreatorResult::ERROR_FILE_NOT_READABLE; std::vector<uint8_t> signature; const CreatorResult signing_result = - ReadAndSignArchive(&file, signer.get(), &signature); + ReadAndSignArchive(file, signer.get(), &signature); if (signing_result != CreatorResult::OK) return signing_result; - - // Create CRXFileHeader. - CrxFileHeader header; - AsymmetricKeyProof* proof = header.add_sha256_with_rsa(); + AsymmetricKeyProof* proof = header->add_sha256_with_rsa(); proof->set_public_key(public_key_str); proof->set_signature(std::string(signature.begin(), signature.end())); - header.set_signed_header_data(signed_header_data_str); + header->set_signed_header_data(signed_header_data_str); + return CreatorResult::OK; +} + +CreatorResult WriteCRX(const CrxFileHeader& header, + const base::FilePath& output_path, + base::File* file) { const std::string header_str = header.SerializeAsString(); const int header_size = header_str.size(); const uint8_t header_size_octets[] = {header_size, header_size >> 8, header_size >> 16, header_size >> 24}; - // Write CRX. const uint8_t format_version_octets[] = {3, 0, 0, 0}; base::File crx(output_path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); @@ -120,10 +121,44 @@ !WriteBuffer(&crx, reinterpret_cast<const char*>(header_size_octets), base::size(header_size_octets)) || !WriteBuffer(&crx, header_str.c_str(), header_str.length()) || - !WriteArchive(&crx, &file)) { + !WriteArchive(&crx, file)) { return CreatorResult::ERROR_FILE_WRITE_FAILURE; } return CreatorResult::OK; } +} // namespace + +CreatorResult CreateCrxWithVerifiedContentsInHeaderForTesting( + const base::FilePath& output_path, + const base::FilePath& zip_path, + crypto::RSAPrivateKey* signing_key, + const std::string& verified_contents) { + CrxFileHeader header; + base::File file(zip_path, base::File::FLAG_OPEN | base::File::FLAG_READ); + const CreatorResult signing_result = + SignArchiveAndCreateHeader(output_path, &file, signing_key, &header); + if (signing_result != CreatorResult::OK) + return signing_result; + + // Inject the verified contents into the header. + header.set_verified_contents(verified_contents); + const CreatorResult result = WriteCRX(header, output_path, &file); + return result; +} + +CreatorResult Create(const base::FilePath& output_path, + const base::FilePath& zip_path, + crypto::RSAPrivateKey* signing_key) { + CrxFileHeader header; + base::File file(zip_path, base::File::FLAG_OPEN | base::File::FLAG_READ); + const CreatorResult signing_result = + SignArchiveAndCreateHeader(output_path, &file, signing_key, &header); + if (signing_result != CreatorResult::OK) + return signing_result; + + const CreatorResult result = WriteCRX(header, output_path, &file); + return result; +} + } // namespace crx_file
diff --git a/components/crx_file/crx_creator.h b/components/crx_file/crx_creator.h index a8c2094..a4a3109 100644 --- a/components/crx_file/crx_creator.h +++ b/components/crx_file/crx_creator.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_CRX_FILE_CRX_CREATOR_H_ #define COMPONENTS_CRX_FILE_CRX_CREATOR_H_ +#include <string> + namespace base { class FilePath; } // namespace base @@ -23,6 +25,14 @@ ERROR_FILE_WRITE_FAILURE, }; +// Similar to `Create` method but also injects `verified_contents` into the +// header. This should only be used for testing. +CreatorResult CreateCrxWithVerifiedContentsInHeaderForTesting( + const base::FilePath& output_path, + const base::FilePath& zip_path, + crypto::RSAPrivateKey* signing_key, + const std::string& verified_contents); + // Create a CRX3 file at |output_path|, using the contents of the ZIP archive // located at |zip_path| and signing with (and deriving the CRX ID from) // |signing_key|.
diff --git a/components/crx_file/crx_creator_unittest.cc b/components/crx_file/crx_creator_unittest.cc index d2d4a70..eeb9494 100644 --- a/components/crx_file/crx_creator_unittest.cc +++ b/components/crx_file/crx_creator_unittest.cc
@@ -24,6 +24,12 @@ .AppendASCII(file); } +// Gzip compression of UTF-8 encoded string `sample_verified_contents`. +constexpr char kTestCompressedVerifiedContents[] = + "\x1f\x8b\x08\x00\xbb\xf7\x1a`\x02\xff+N\xcc-\xc8I\x8d/" + "K-\xcaL\xcbLM\x89O\xce\xcf+I\xcd+)" + "\x06\x00\x8a\x10\xc9\x01\x18\x00\x00\x00"; + } // namespace namespace crx_file { @@ -59,4 +65,41 @@ EXPECT_TRUE(base::DeleteFile(temp_file)); } +TEST_F(CrxCreatorTest, VerifyCrxWithVerifiedContents) { + // Set up a signing key. + auto signing_key = crypto::RSAPrivateKey::Create(4096); + std::vector<uint8_t> public_key; + signing_key->ExportPublicKey(&public_key); + std::string expected_public_key; + base::Base64Encode(std::string(public_key.begin(), public_key.end()), + &expected_public_key); + + // Create a CRX File. + base::FilePath temp_file; + EXPECT_TRUE(base::CreateTemporaryFile(&temp_file)); + std::string test_compressed_verified_contents( + kTestCompressedVerifiedContents); + EXPECT_EQ(CreatorResult::OK, + CreateCrxWithVerifiedContentsInHeaderForTesting( + temp_file, TestFile("sample.zip"), signing_key.get(), + test_compressed_verified_contents)); + + // Test that the created file can be verified. + const std::vector<std::vector<uint8_t>> keys; + const std::vector<uint8_t> hash; + std::string public_key_in_crx; + std::vector<uint8_t> compressed_verified_contents; + EXPECT_EQ(VerifierResult::OK_FULL, + Verify(temp_file, VerifierFormat::CRX3, keys, hash, + &public_key_in_crx, nullptr, &compressed_verified_contents)); + EXPECT_EQ(expected_public_key, public_key_in_crx); + std::vector<uint8_t> expected_verified_contents; + expected_verified_contents.assign(test_compressed_verified_contents.begin(), + test_compressed_verified_contents.end()); + EXPECT_EQ(compressed_verified_contents, expected_verified_contents); + + // Delete the file. + EXPECT_TRUE(base::DeleteFile(temp_file)); +} + } // namespace crx_file
diff --git a/components/enterprise/browser/reporting/report_generator.cc b/components/enterprise/browser/reporting/report_generator.cc index 3f8878f..f04ad67 100644 --- a/components/enterprise/browser/reporting/report_generator.cc +++ b/components/enterprise/browser/reporting/report_generator.cc
@@ -58,6 +58,7 @@ policy::GetBrowserDeviceIdentifier().release()); #if defined(OS_IOS) basic_request->set_device_model(policy::GetDeviceModel()); + basic_request->set_brand_name(policy::GetDeviceManufacturer()); #endif // defined(OS_IOS) #endif // BUILDFLAG(IS_CHROMEOS_ASH) }
diff --git a/components/exo/fullscreen_shell_surface.cc b/components/exo/fullscreen_shell_surface.cc index 04efe1b..c2c1d350 100644 --- a/components/exo/fullscreen_shell_surface.cc +++ b/components/exo/fullscreen_shell_surface.cc
@@ -14,6 +14,8 @@ #include "ui/aura/window_occlusion_tracker.h" #include "ui/aura/window_targeter.h" #include "ui/compositor/compositor.h" +#include "ui/views/metadata/metadata_header_macros.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "ui/wm/core/window_util.h" @@ -22,6 +24,7 @@ class FullscreenShellSurface::FullscreenShellView : public views::View { public: + METADATA_HEADER(FullscreenShellView); FullscreenShellView() = default; FullscreenShellView(const FullscreenShellView&) = delete; FullscreenShellView& operator=(const FullscreenShellView&) = delete; @@ -46,6 +49,9 @@ ui::AXTreeID child_ax_tree_id_ = ui::AXTreeIDUnknown(); }; +BEGIN_METADATA(FullscreenShellSurface, FullscreenShellView, views::View) +END_METADATA + FullscreenShellSurface::FullscreenShellSurface() : SurfaceTreeHost("FullscreenShellSurfaceHost") { CreateFullscreenShellSurfaceWidget(ui::SHOW_STATE_FULLSCREEN);
diff --git a/components/js_injection/browser/js_communication_host.cc b/components/js_injection/browser/js_communication_host.cc index f4115b3a..8edd8594 100644 --- a/components/js_injection/browser/js_communication_host.cc +++ b/components/js_injection/browser/js_communication_host.cc
@@ -175,6 +175,15 @@ js_to_browser_messagings_.erase(render_frame_host); } +void JsCommunicationHost::FrameBackForwardCacheStateChanged( + content::RenderFrameHost* render_frame_host) { + auto iter = js_to_browser_messagings_.find(render_frame_host); + if (iter == js_to_browser_messagings_.end()) + return; + for (auto& js_to_browser_messaging_ptr : iter->second) + js_to_browser_messaging_ptr->OnBackForwardCacheStateChanged(); +} + void JsCommunicationHost::NotifyFrameForAllDocumentStartJavaScripts( content::RenderFrameHost* render_frame_host) { for (const auto& script : scripts_) {
diff --git a/components/js_injection/browser/js_communication_host.h b/components/js_injection/browser/js_communication_host.h index 3cd096d..e674cc37 100644 --- a/components/js_injection/browser/js_communication_host.h +++ b/components/js_injection/browser/js_communication_host.h
@@ -81,6 +81,8 @@ // content::WebContentsObserver implementations void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; + void FrameBackForwardCacheStateChanged( + content::RenderFrameHost* render_frame_host) override; private: void NotifyFrameForWebMessageListener( @@ -90,7 +92,6 @@ void NotifyFrameForAddDocumentStartJavaScript( const DocumentStartJavaScript* script, content::RenderFrameHost* render_frame_host); - void NotifyFrameForRemoveDocumentStartJavaScript( int32_t script_id, content::RenderFrameHost* render_frame_host);
diff --git a/components/js_injection/browser/js_to_browser_messaging.cc b/components/js_injection/browser/js_to_browser_messaging.cc index 1ae877cf..2892647 100644 --- a/components/js_injection/browser/js_to_browser_messaging.cc +++ b/components/js_injection/browser/js_to_browser_messaging.cc
@@ -37,10 +37,11 @@ class JsToBrowserMessaging::ReplyProxyImpl : public WebMessageReplyProxy { public: - explicit ReplyProxyImpl( - mojo::PendingAssociatedRemote<mojom::BrowserToJsMessaging> - java_to_js_messaging) - : java_to_js_messaging_(std::move(java_to_js_messaging)) {} + ReplyProxyImpl(content::RenderFrameHost* render_frame_host, + mojo::PendingAssociatedRemote<mojom::BrowserToJsMessaging> + java_to_js_messaging) + : render_frame_host_(render_frame_host), + java_to_js_messaging_(std::move(java_to_js_messaging)) {} ReplyProxyImpl(const ReplyProxyImpl&) = delete; ReplyProxyImpl& operator=(const ReplyProxyImpl&) = delete; ~ReplyProxyImpl() override = default; @@ -49,8 +50,12 @@ void PostMessage(std::unique_ptr<WebMessage> message) override { java_to_js_messaging_->OnPostMessage(message->message); } + bool IsInBackForwardCache() override { + return render_frame_host_->IsInBackForwardCache(); + } private: + content::RenderFrameHost* render_frame_host_; mojo::AssociatedRemote<mojom::BrowserToJsMessaging> java_to_js_messaging_; }; @@ -67,6 +72,11 @@ JsToBrowserMessaging::~JsToBrowserMessaging() = default; +void JsToBrowserMessaging::OnBackForwardCacheStateChanged() { + if (host_) + host_->OnBackForwardCacheStateChanged(); +} + void JsToBrowserMessaging::PostMessage( const base::string16& message, std::vector<blink::MessagePortDescriptor> ports) { @@ -128,8 +138,8 @@ // A RenderFrame may inject JsToBrowserMessaging in the JavaScript context // more than once because of reusing of RenderFrame. host_.reset(); - reply_proxy_ = - std::make_unique<ReplyProxyImpl>(std::move(java_to_js_messaging)); + reply_proxy_ = std::make_unique<ReplyProxyImpl>( + render_frame_host_, std::move(java_to_js_messaging)); } } // namespace js_injection
diff --git a/components/js_injection/browser/js_to_browser_messaging.h b/components/js_injection/browser/js_to_browser_messaging.h index 71690518..ca8fd81 100644 --- a/components/js_injection/browser/js_to_browser_messaging.h +++ b/components/js_injection/browser/js_to_browser_messaging.h
@@ -28,6 +28,8 @@ // Implementation of mojo::JsToBrowserMessaging interface. Receives // PostMessage() call from renderer JsBinding. +// +// This object is destroyed when the associated RenderFrameHost is destroyed. class JsToBrowserMessaging : public mojom::JsToBrowserMessaging { public: JsToBrowserMessaging( @@ -37,6 +39,8 @@ const OriginMatcher& origin_matcher); ~JsToBrowserMessaging() override; + void OnBackForwardCacheStateChanged(); + // mojom::JsToBrowserMessaging implementation. void PostMessage(const base::string16& message, std::vector<blink::MessagePortDescriptor> ports) override;
diff --git a/components/js_injection/browser/web_message_host.h b/components/js_injection/browser/web_message_host.h index 8fa3398..a7b12bf 100644 --- a/components/js_injection/browser/web_message_host.h +++ b/components/js_injection/browser/web_message_host.h
@@ -17,6 +17,10 @@ virtual ~WebMessageHost() = default; virtual void OnPostMessage(std::unique_ptr<WebMessage> message) = 0; + + // Called when the value of associated RenderFrameHost's + // IsInBackForwardCache() changes. + virtual void OnBackForwardCacheStateChanged() {} }; } // namespace js_injection
diff --git a/components/js_injection/browser/web_message_reply_proxy.h b/components/js_injection/browser/web_message_reply_proxy.h index e94171f2..bb96c33 100644 --- a/components/js_injection/browser/web_message_reply_proxy.h +++ b/components/js_injection/browser/web_message_reply_proxy.h
@@ -16,6 +16,10 @@ public: virtual void PostMessage(std::unique_ptr<WebMessage> message) = 0; + // Returns true if the page associated with the channel is in the back + // forward cache. + virtual bool IsInBackForwardCache() = 0; + protected: virtual ~WebMessageReplyProxy() = default; };
diff --git a/components/media_message_center/media_controls_progress_view.cc b/components/media_message_center/media_controls_progress_view.cc index ee8422a..8da9583 100644 --- a/components/media_message_center/media_controls_progress_view.cc +++ b/components/media_message_center/media_controls_progress_view.cc
@@ -14,6 +14,7 @@ #include "ui/views/layout/box_layout.h" #include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout_types.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/view_class_properties.h" namespace media_message_center { @@ -193,4 +194,7 @@ seek_callback_.Run(seek_to_progress); } +BEGIN_METADATA(MediaControlsProgressView, views::View) +END_METADATA + } // namespace media_message_center
diff --git a/components/media_message_center/media_controls_progress_view.h b/components/media_message_center/media_controls_progress_view.h index 9c98656..5b58e79 100644 --- a/components/media_message_center/media_controls_progress_view.h +++ b/components/media_message_center/media_controls_progress_view.h
@@ -7,6 +7,7 @@ #include "base/timer/timer.h" #include "services/media_session/public/mojom/media_session.mojom.h" +#include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/view.h" namespace views { @@ -19,8 +20,12 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaControlsProgressView : public views::View { public: + METADATA_HEADER(MediaControlsProgressView); explicit MediaControlsProgressView( base::RepeatingCallback<void(double)> seek_callback); + MediaControlsProgressView(const MediaControlsProgressView&) = delete; + MediaControlsProgressView& operator=(const MediaControlsProgressView&) = + delete; ~MediaControlsProgressView() override; void UpdateProgress(const media_session::MediaPosition& media_position); @@ -51,8 +56,6 @@ base::RepeatingTimer update_progress_timer_; const base::RepeatingCallback<void(double)> seek_callback_; - - DISALLOW_COPY_AND_ASSIGN(MediaControlsProgressView); }; } // namespace media_message_center
diff --git a/components/media_message_center/media_notification_view_impl.cc b/components/media_message_center/media_notification_view_impl.cc index 1fe8728..ab2e1291 100644 --- a/components/media_message_center/media_notification_view_impl.cc +++ b/components/media_message_center/media_notification_view_impl.cc
@@ -26,6 +26,7 @@ #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/highlight_path_generator.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/style/typography.h" #include "ui/views/view_class_properties.h" @@ -344,7 +345,7 @@ } if (header_row_) - header_row_->SetExpandButtonEnabled(IsExpandable()); + header_row_->SetExpandButtonEnabled(GetExpandable()); UpdateViewForExpandedState(); } @@ -443,7 +444,7 @@ enabled_actions_ = actions; if (header_row_) - header_row_->SetExpandButtonEnabled(IsExpandable()); + header_row_->SetExpandButtonEnabled(GetExpandable()); UpdateViewForExpandedState(); PreferredSizeChanged(); @@ -520,7 +521,7 @@ base::flat_set<MediaSessionAction> visible_actions = GetTopVisibleActions(enabled_actions_, ignored_actions, - GetMaxNumActions(IsActuallyExpanded())); + GetMaxNumActions(GetActuallyExpanded())); for (auto* view : GetButtons()) { views::Button* action_button = views::Button::AsButton(view); @@ -549,7 +550,7 @@ } void MediaNotificationViewImpl::UpdateViewForExpandedState() { - bool expanded = IsActuallyExpanded(); + bool expanded = GetActuallyExpanded(); // Adjust the layout of the |main_row_| based on the expanded state. If the // notification is expanded then the buttons should be below the title/artist @@ -690,7 +691,7 @@ return static_cast<MediaNotificationBackground*>(background()); } -bool MediaNotificationViewImpl::IsExpandable() const { +bool MediaNotificationViewImpl::GetExpandable() const { if (forced_expanded_state_.has_value()) return false; @@ -706,10 +707,10 @@ .size() > kMediaNotificationActionsCount; } -bool MediaNotificationViewImpl::IsActuallyExpanded() const { +bool MediaNotificationViewImpl::GetActuallyExpanded() const { if (forced_expanded_state_.has_value()) return forced_expanded_state_.value(); - return expanded_ && IsExpandable(); + return expanded_ && GetExpandable(); } void MediaNotificationViewImpl::UpdateForegroundColor() { @@ -820,4 +821,9 @@ return buttons; } +BEGIN_METADATA(MediaNotificationViewImpl, views::View) +ADD_READONLY_PROPERTY_METADATA(bool, Expandable) +ADD_READONLY_PROPERTY_METADATA(bool, ActuallyExpanded) +END_METADATA + } // namespace media_message_center
diff --git a/components/media_message_center/media_notification_view_impl.h b/components/media_message_center/media_notification_view_impl.h index 0aec17e..8f09d0a8 100644 --- a/components/media_message_center/media_notification_view_impl.h +++ b/components/media_message_center/media_notification_view_impl.h
@@ -12,6 +12,7 @@ #include "services/media_session/public/mojom/media_session.mojom.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/label.h" +#include "ui/views/metadata/metadata_header_macros.h" namespace message_center { class NotificationHeaderView; @@ -40,6 +41,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewImpl : public MediaNotificationView { public: + METADATA_HEADER(MediaNotificationViewImpl); + // The name of the histogram used when recorded whether the artwork was // present. static const char kArtworkHistogramName[]; @@ -67,6 +70,9 @@ int notification_width, bool should_show_icon, base::Optional<NotificationTheme> theme = base::nullopt); + MediaNotificationViewImpl(const MediaNotificationViewImpl&) = delete; + MediaNotificationViewImpl& operator=(const MediaNotificationViewImpl&) = + delete; ~MediaNotificationViewImpl() override; // views::View: @@ -127,8 +133,8 @@ MediaNotificationBackground* GetMediaNotificationBackground(); - bool IsExpandable() const; - bool IsActuallyExpanded() const; + bool GetExpandable() const; + bool GetActuallyExpanded() const; void UpdateForegroundColor(); @@ -192,8 +198,6 @@ base::Optional<NotificationTheme> theme_; const bool is_cros_; - - DISALLOW_COPY_AND_ASSIGN(MediaNotificationViewImpl); }; } // namespace media_message_center
diff --git a/components/media_message_center/media_notification_view_impl_unittest.cc b/components/media_message_center/media_notification_view_impl_unittest.cc index a1e9940..281461b 100644 --- a/components/media_message_center/media_notification_view_impl_unittest.cc +++ b/components/media_message_center/media_notification_view_impl_unittest.cc
@@ -262,7 +262,7 @@ return header_row()->expand_button()->GetVisible(); } - bool IsActuallyExpanded() const { return view()->IsActuallyExpanded(); } + bool GetActuallyExpanded() const { return view()->GetActuallyExpanded(); } void SimulateButtonClick(MediaSessionAction action) { views::Button* button = GetButtonForAction(action); @@ -694,7 +694,7 @@ view()->SetExpanded(false); testing::Mock::VerifyAndClearExpectations(&container()); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_TRUE(IsActionButtonVisible(MediaSessionAction::kPlay)); EXPECT_TRUE(IsActionButtonVisible(MediaSessionAction::kPreviousTrack)); @@ -766,7 +766,7 @@ view()->SetExpanded(true); testing::Mock::VerifyAndClearExpectations(&container()); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(IsActionButtonVisible(MediaSessionAction::kPlay)); EXPECT_TRUE(IsActionButtonVisible(MediaSessionAction::kPreviousTrack)); @@ -779,15 +779,15 @@ view()->SetExpanded(true); EnableAllActions(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); SimulateHeaderClick(); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); SimulateHeaderClick(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); } TEST_F(MAYBE_MediaNotificationViewImplTest, ActionButtonsHiddenByDefault) { @@ -863,7 +863,7 @@ } TEST_F(MAYBE_MediaNotificationViewImplTest, ExpandableDefaultState) { - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); } @@ -871,7 +871,7 @@ ExpandablePlayPauseActionCountsOnce) { view()->SetExpanded(true); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAction(MediaSessionAction::kPreviousTrack); @@ -879,7 +879,7 @@ EnableAction(MediaSessionAction::kPlay); EnableAction(MediaSessionAction::kPause); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); media_session::mojom::MediaSessionInfoPtr session_info( @@ -888,12 +888,12 @@ media_session::mojom::MediaPlaybackState::kPlaying; view()->UpdateWithMediaSessionInfo(session_info); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAction(MediaSessionAction::kSeekForward); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(expand_button_enabled()); } @@ -901,12 +901,12 @@ BecomeExpandableAndWasNotExpandable) { view()->SetExpanded(true); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAllActions(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(expand_button_enabled()); } @@ -914,17 +914,17 @@ BecomeExpandableButWasAlreadyExpandable) { view()->SetExpanded(true); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAllActions(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(expand_button_enabled()); DisableAction(MediaSessionAction::kSeekForward); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(expand_button_enabled()); } @@ -932,12 +932,12 @@ BecomeNotExpandableAndWasExpandable) { view()->SetExpanded(true); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAllActions(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_TRUE(expand_button_enabled()); DisableAction(MediaSessionAction::kPreviousTrack); @@ -945,7 +945,7 @@ DisableAction(MediaSessionAction::kSeekBackward); DisableAction(MediaSessionAction::kSeekForward); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); } @@ -953,12 +953,12 @@ BecomeNotExpandableButWasAlreadyNotExpandable) { view()->SetExpanded(true); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); EnableAction(MediaSessionAction::kSeekForward); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_FALSE(expand_button_enabled()); } @@ -969,7 +969,7 @@ int button_x = button->GetBoundsInScreen().x(); // When collapsed the button row should be a fixed width. - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); EXPECT_EQ(124, button_row()->width()); EnableAllActions(); @@ -977,7 +977,7 @@ // When expanded the button row should be wider and the play button should // have shifted to the left. - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); EXPECT_LT(124, button_row()->width()); EXPECT_GT(button_x, button->GetBoundsInScreen().x()); } @@ -1396,30 +1396,30 @@ // Force it to be expanded. bool expanded_state = true; view()->SetForcedExpandedState(&expanded_state); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); // Since it's forced, clicking on the header should not toggle the expanded // state. SimulateHeaderClick(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); // Force it to be not expanded. expanded_state = false; view()->SetForcedExpandedState(&expanded_state); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); // Since it's forced, clicking on the header should not toggle the expanded // state. SimulateHeaderClick(); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); // Stop forcing expanded state. view()->SetForcedExpandedState(nullptr); - EXPECT_FALSE(IsActuallyExpanded()); + EXPECT_FALSE(GetActuallyExpanded()); // Clicking on the header should toggle the expanded state. SimulateHeaderClick(); - EXPECT_TRUE(IsActuallyExpanded()); + EXPECT_TRUE(GetActuallyExpanded()); } TEST_F(MAYBE_MediaNotificationViewImplTest, AllowsHidingOfAppIcon) {
diff --git a/components/media_message_center/media_notification_view_modern_impl.cc b/components/media_message_center/media_notification_view_modern_impl.cc index e280530..6a3dbf2 100644 --- a/components/media_message_center/media_notification_view_modern_impl.cc +++ b/components/media_message_center/media_notification_view_modern_impl.cc
@@ -25,6 +25,7 @@ #include "ui/views/border.h" #include "ui/views/controls/button/image_button_factory.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/metadata/metadata_impl_macros.h" #include "ui/views/style/typography.h" #include "ui/views/view_class_properties.h" @@ -601,4 +602,7 @@ item_->OnMediaSessionActionButtonPressed(GetActionFromButtonTag(*button)); } +BEGIN_METADATA(MediaNotificationViewModernImpl, views::View) +END_METADATA + } // namespace media_message_center
diff --git a/components/media_message_center/media_notification_view_modern_impl.h b/components/media_message_center/media_notification_view_modern_impl.h index 96c8213..153bf7cd 100644 --- a/components/media_message_center/media_notification_view_modern_impl.h +++ b/components/media_message_center/media_notification_view_modern_impl.h
@@ -15,6 +15,7 @@ #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" +#include "ui/views/metadata/metadata_header_macros.h" namespace views { class Button; @@ -34,6 +35,8 @@ class COMPONENT_EXPORT(MEDIA_MESSAGE_CENTER) MediaNotificationViewModernImpl : public MediaNotificationView { public: + METADATA_HEADER(MediaNotificationViewModernImpl); + // The name of the histogram used when recording whether the artwork was // present. static const char kArtworkHistogramName[];
diff --git a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc index e5dcd29..da660ca 100644 --- a/components/page_load_metrics/renderer/page_timing_metrics_sender.cc +++ b/components/page_load_metrics/renderer/page_timing_metrics_sender.cc
@@ -24,7 +24,7 @@ const base::Feature kLayoutShiftNormalizationEmitShiftsForKeyMetrics{ "LayoutShiftNormalizationEmitShiftsForKeyMetrics", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; namespace { const int kInitialTimerDelayMillis = 50;
diff --git a/components/password_manager/core/browser/compromised_credentials_observer.cc b/components/password_manager/core/browser/compromised_credentials_observer.cc index b30700f..1364060 100644 --- a/components/password_manager/core/browser/compromised_credentials_observer.cc +++ b/components/password_manager/core/browser/compromised_credentials_observer.cc
@@ -22,20 +22,19 @@ if (change.type() == PasswordStoreChange::UPDATE && !change.password_changed()) continue; - auto reason = RemoveCompromisedCredentialsReason::kUpdate; + auto reason = RemoveInsecureCredentialsReason::kUpdate; if (change.type() == PasswordStoreChange::REMOVE && base::ranges::none_of(changes, [](const auto& change) { return change.type() == PasswordStoreChange::ADD; })) { - reason = RemoveCompromisedCredentialsReason::kRemove; + reason = RemoveInsecureCredentialsReason::kRemove; } remove_callback.Run(change.form().signon_realm, change.form().username_value, reason); - UMA_HISTOGRAM_ENUMERATION( - "PasswordManager.RemoveCompromisedCredentials", - reason == RemoveCompromisedCredentialsReason::kUpdate - ? PasswordStoreChange::UPDATE - : PasswordStoreChange::REMOVE); + UMA_HISTOGRAM_ENUMERATION("PasswordManager.RemoveCompromisedCredentials", + reason == RemoveInsecureCredentialsReason::kUpdate + ? PasswordStoreChange::UPDATE + : PasswordStoreChange::REMOVE); } }
diff --git a/components/password_manager/core/browser/compromised_credentials_observer.h b/components/password_manager/core/browser/compromised_credentials_observer.h index 4d9e754..36a59a88 100644 --- a/components/password_manager/core/browser/compromised_credentials_observer.h +++ b/components/password_manager/core/browser/compromised_credentials_observer.h
@@ -17,7 +17,7 @@ using RemoveCompromisedCallback = base::RepeatingCallback<void(const std::string&, const base::string16&, - RemoveCompromisedCredentialsReason)>; + RemoveInsecureCredentialsReason)>; // Called when the content of the password store changes. // Removes rows from the compromised credentials database if the login
diff --git a/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc b/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc index 3a4dc22a..9dfc6ea3 100644 --- a/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc +++ b/components/password_manager/core/browser/compromised_credentials_observer_unittest.cc
@@ -44,9 +44,8 @@ TEST_F(CompromisedCredentialsObserverTest, DeletePassword) { const PasswordForm form = TestForm(kUsername); - EXPECT_CALL(remove_callback(), - Run(form.signon_realm, form.username_value, - RemoveCompromisedCredentialsReason::kRemove)); + EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, + RemoveInsecureCredentialsReason::kRemove)); ProcessLoginsChanged({PasswordStoreChange(PasswordStoreChange::REMOVE, form)}, remove_callback().Get()); histogram_tester().ExpectUniqueSample(kHistogramName, @@ -64,9 +63,8 @@ TEST_F(CompromisedCredentialsObserverTest, UpdatePassword) { const PasswordForm form = TestForm(kUsername); - EXPECT_CALL(remove_callback(), - Run(form.signon_realm, form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); + EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, + RemoveInsecureCredentialsReason::kUpdate)); ProcessLoginsChanged( {PasswordStoreChange(PasswordStoreChange::UPDATE, form, 1000, true)}, remove_callback().Get()); @@ -76,9 +74,8 @@ TEST_F(CompromisedCredentialsObserverTest, UpdateTwice) { const PasswordForm form = TestForm(kUsername); - EXPECT_CALL(remove_callback(), - Run(form.signon_realm, form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); + EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, + RemoveInsecureCredentialsReason::kUpdate)); ProcessLoginsChanged( {PasswordStoreChange(PasswordStoreChange::UPDATE, TestForm(kUsernameNew), 1000, false), @@ -101,9 +98,8 @@ PasswordStoreChange remove(PasswordStoreChange::REMOVE, form); form.password_value = base::ASCIIToUTF16("new_password_12345"); PasswordStoreChange add(PasswordStoreChange::ADD, form); - EXPECT_CALL(remove_callback(), - Run(form.signon_realm, form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); + EXPECT_CALL(remove_callback(), Run(form.signon_realm, form.username_value, + RemoveInsecureCredentialsReason::kUpdate)); ProcessLoginsChanged({remove, add}, remove_callback().Get()); histogram_tester().ExpectUniqueSample(kHistogramName, PasswordStoreChange::UPDATE, 1); @@ -115,7 +111,7 @@ PasswordStoreChange add(PasswordStoreChange::ADD, TestForm(kUsernameNew)); EXPECT_CALL(remove_callback(), Run(old_form.signon_realm, old_form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); + RemoveInsecureCredentialsReason::kUpdate)); ProcessLoginsChanged({remove, add}, remove_callback().Get()); histogram_tester().ExpectUniqueSample(kHistogramName, PasswordStoreChange::UPDATE, 1); @@ -130,11 +126,10 @@ PasswordStoreChange add(PasswordStoreChange::ADD, TestForm(kUsernameNew)); EXPECT_CALL(remove_callback(), Run(old_form.signon_realm, old_form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); - EXPECT_CALL(remove_callback(), - Run(conflicting_new_form.signon_realm, - conflicting_new_form.username_value, - RemoveCompromisedCredentialsReason::kUpdate)); + RemoveInsecureCredentialsReason::kUpdate)); + EXPECT_CALL(remove_callback(), Run(conflicting_new_form.signon_realm, + conflicting_new_form.username_value, + RemoveInsecureCredentialsReason::kUpdate)); ProcessLoginsChanged({remove_old, remove_conflicting, add}, remove_callback().Get()); histogram_tester().ExpectUniqueSample(kHistogramName,
diff --git a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc index ac6067e..1865aee6 100644 --- a/components/password_manager/core/browser/form_fetcher_impl_unittest.cc +++ b/components/password_manager/core/browser/form_fetcher_impl_unittest.cc
@@ -421,7 +421,7 @@ const std::vector<CompromisedCredentials> credentials = { CompromisedCredentials( form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false))}; + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) ->OnGetCompromisedCredentials(credentials); EXPECT_THAT(form_fetcher_->GetCompromisedCredentials(), @@ -491,7 +491,7 @@ TEST_P(FormFetcherImplTest, FetchCompromised) { CompromisedCredentials credentials( form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); std::vector<CompromisedCredentials> list = {credentials}; EXPECT_CALL(*mock_store_, GetMatchingCompromisedCredentialsImpl(form_digest_.signon_realm)) @@ -813,7 +813,7 @@ const std::vector<CompromisedCredentials> credentials = { CompromisedCredentials( form_digest_.signon_realm, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false))}; + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false))}; static_cast<CompromisedCredentialsConsumer*>(form_fetcher_.get()) ->OnGetCompromisedCredentials(credentials);
diff --git a/components/password_manager/core/browser/insecure_credentials_table.cc b/components/password_manager/core/browser/insecure_credentials_table.cc index 797fd2be..e48be03f 100644 --- a/components/password_manager/core/browser/insecure_credentials_table.cc +++ b/components/password_manager/core/browser/insecure_credentials_table.cc
@@ -22,8 +22,7 @@ int parent_key = s->ColumnInt64(0); std::string signon_realm = s->ColumnString(1); base::string16 username = s->ColumnString16(2); - CompromiseType insecurity_type = - static_cast<CompromiseType>(s->ColumnInt64(3)); + InsecureType insecurity_type = static_cast<InsecureType>(s->ColumnInt64(3)); base::Time create_time = base::Time::FromDeltaSinceWindowsEpoch( (base::TimeDelta::FromMicroseconds(s->ColumnInt64(4)))); bool is_muted = !!s->ColumnInt64(5); @@ -43,7 +42,7 @@ CompromisedCredentials::CompromisedCredentials(std::string signon_realm, base::string16 username, base::Time create_time, - CompromiseType insecurity_type, + InsecureType insecurity_type, IsMuted is_muted) : signon_realm(std::move(signon_realm)), username(std::move(username)), @@ -123,7 +122,7 @@ bool InsecureCredentialsTable::RemoveRow( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) { + RemoveInsecureCredentialsReason reason) { DCHECK(db_); if (signon_realm.empty()) return false; @@ -215,7 +214,7 @@ "WHERE insecurity_type = ? ", kTableName) .c_str())); - s.BindInt(0, static_cast<int>(CompromiseType::kLeaked)); + s.BindInt(0, static_cast<int>(InsecureType::kLeaked)); if (s.Step()) { int count = s.ColumnInt(0); base::UmaHistogramCounts100( @@ -228,7 +227,7 @@ } s.Reset(true); - s.BindInt(0, static_cast<int>(CompromiseType::kPhished)); + s.BindInt(0, static_cast<int>(InsecureType::kPhished)); if (s.Step()) { int count = s.ColumnInt(0); base::UmaHistogramCounts100(
diff --git a/components/password_manager/core/browser/insecure_credentials_table.h b/components/password_manager/core/browser/insecure_credentials_table.h index a12b21a..c3b0e14 100644 --- a/components/password_manager/core/browser/insecure_credentials_table.h +++ b/components/password_manager/core/browser/insecure_credentials_table.h
@@ -19,12 +19,15 @@ namespace password_manager { +struct CompromisedCredentials; + using BulkCheckDone = base::StrongAlias<class BulkCheckDoneTag, bool>; using IsMuted = base::StrongAlias<class IsMutedTag, bool>; +using InsecureCredential = CompromisedCredentials; // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. -enum class CompromiseType { +enum class InsecureType { // If the credentials was leaked by a data breach. kLeaked = 0, // If the credentials was entered on a phishing site. @@ -36,7 +39,7 @@ kMaxValue = kReused }; -enum class RemoveCompromisedCredentialsReason { +enum class RemoveInsecureCredentialsReason { // If the password was updated in the password store. kUpdate = 0, // If the password is removed from the password store. @@ -54,7 +57,7 @@ CompromisedCredentials(std::string signon_realm, base::string16 username, base::Time create_time, - CompromiseType compromise_type, + InsecureType insecure_type, IsMuted is_muted); CompromisedCredentials(const CompromisedCredentials& rhs); CompromisedCredentials(CompromisedCredentials&& rhs); @@ -71,7 +74,7 @@ // The date when the record was created. base::Time create_time; // The type of the credentials that was compromised. - CompromiseType compromise_type = CompromiseType::kLeaked; + InsecureType compromise_type = InsecureType::kLeaked; // Whether the problem was explicitly muted by the user. IsMuted is_muted{false}; // The store in which those credentials are stored. @@ -102,7 +105,7 @@ // Also logs the compromise type in UMA. bool RemoveRow(const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason); + RemoveInsecureCredentialsReason reason); // Gets all the rows in the database for |signon_realm|. std::vector<CompromisedCredentials> GetRows(
diff --git a/components/password_manager/core/browser/insecure_credentials_table_unittest.cc b/components/password_manager/core/browser/insecure_credentials_table_unittest.cc index 1d4dcb6..983cae4d 100644 --- a/components/password_manager/core/browser/insecure_credentials_table_unittest.cc +++ b/components/password_manager/core/browser/insecure_credentials_table_unittest.cc
@@ -88,7 +88,7 @@ std::unique_ptr<LoginDatabase> login_db_; CompromisedCredentials test_data_{kTestDomain, base::ASCIIToUTF16(kUsername), base::Time::FromTimeT(1), - CompromiseType::kLeaked, IsMuted(false)}; + InsecureType::kLeaked, IsMuted(false)}; PasswordForm test_form_ = TestForm(); }; @@ -169,13 +169,13 @@ } TEST_F(InsecureCredentialsTableTest, - SameSignonRealmAndUsernameAndDifferentCompromiseType) { + SameSignonRealmAndUsernameAndDifferentInsecureType) { EXPECT_THAT(login_db()->AddLogin(test_form()), SizeIs(1)); CompromisedCredentials compromised_credentials1 = test_data(); CompromisedCredentials compromised_credentials2 = test_data(); - compromised_credentials2.compromise_type = CompromiseType::kPhished; + compromised_credentials2.compromise_type = InsecureType::kPhished; CompromisedCredentials compromised_credentials3 = test_data(); - compromised_credentials3.compromise_type = CompromiseType::kWeak; + compromised_credentials3.compromise_type = InsecureType::kWeak; EXPECT_TRUE(db()->AddRow(compromised_credentials1)); EXPECT_TRUE(db()->AddRow(compromised_credentials2)); @@ -197,7 +197,7 @@ EXPECT_THAT(GetParentIds(db()->GetAllRows()), ElementsAre(1)); EXPECT_TRUE(db()->RemoveRow(test_data().signon_realm, test_data().username, - RemoveCompromisedCredentialsReason::kUpdate)); + RemoveInsecureCredentialsReason::kUpdate)); EXPECT_THAT(db()->GetAllRows(), IsEmpty()); EXPECT_THAT(db()->GetRows(test_data().signon_realm), IsEmpty()); @@ -216,7 +216,7 @@ test_form().url = GURL(test_form().signon_realm); test_form().username_value = test_data().username = base::ASCIIToUTF16(kUsername3); - test_data().compromise_type = CompromiseType::kPhished; + test_data().compromise_type = InsecureType::kPhished; EXPECT_THAT(login_db()->AddLogin(test_form()), SizeIs(1)); EXPECT_TRUE(db()->AddRow(test_data())); @@ -252,7 +252,7 @@ EXPECT_THAT(login_db()->AddLogin(test_form()), SizeIs(1)); CompromisedCredentials compromised_credentials1 = test_data(); CompromisedCredentials compromised_credentials2 = test_data(); - compromised_credentials2.compromise_type = CompromiseType::kReused; + compromised_credentials2.compromise_type = InsecureType::kReused; EXPECT_TRUE(db()->AddRow(compromised_credentials1)); EXPECT_TRUE(db()->AddRow(compromised_credentials2));
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper.cc b/components/password_manager/core/browser/leak_detection_delegate_helper.cc index 5215a29..89f7d51 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_helper.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_helper.cc
@@ -59,7 +59,7 @@ form->IsUsingAccountStore() ? *account_store_ : *profile_store_; store.AddCompromisedCredentials(CompromisedCredentials( form->signon_realm, form->username_value, base::Time::Now(), - CompromiseType::kLeaked, IsMuted(false))); + InsecureType::kLeaked, IsMuted(false))); } }
diff --git a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc index ad504a5..85f8b2f 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_helper_unittest.cc
@@ -202,11 +202,11 @@ EXPECT_CALL(*store_, AddCompromisedCredentialsImpl(CompromisedCredentials( GetSignonRealm(GURL(kLeakedOrigin)), ASCIIToUTF16(kLeakedUsername), base::Time::Now(), - CompromiseType::kLeaked, IsMuted(false)))); + InsecureType::kLeaked, IsMuted(false)))); EXPECT_CALL(*store_, AddCompromisedCredentialsImpl(CompromisedCredentials( GetSignonRealm(GURL(kOtherOrigin)), ASCIIToUTF16(kLeakedUsername), base::Time::Now(), - CompromiseType::kLeaked, IsMuted(false)))); + InsecureType::kLeaked, IsMuted(false)))); InitiateGetCredentialLeakType(); } @@ -221,7 +221,7 @@ AddCompromisedCredentialsImpl(CompromisedCredentials( GetSignonRealm(GURL(kOtherOrigin)), ASCIIToUTF16(kLeakedUsernameNonCanonicalized), - base::Time::Now(), CompromiseType::kLeaked, IsMuted(false)))); + base::Time::Now(), InsecureType::kLeaked, IsMuted(false)))); InitiateGetCredentialLeakType(); }
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc index 1ac5475..cbf2a6a 100644 --- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc +++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -347,7 +347,7 @@ const CompromisedCredentials compromised_credentials( GetSignonRealm(form.url), form.username_value, base::Time::Now(), - CompromiseType::kLeaked, IsMuted(false)); + InsecureType::kLeaked, IsMuted(false)); EXPECT_CALL(*store(), AddCompromisedCredentialsImpl(compromised_credentials)); WaitForPasswordStore(); }
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc index f25faf7..3663af4 100644 --- a/components/password_manager/core/browser/login_database_unittest.cc +++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -2610,10 +2610,10 @@ ignore_result(db().AddLogin(form)); CompromisedCredentials credential1{form.signon_realm, form.username_value, - base::Time(), CompromiseType::kLeaked, + base::Time(), InsecureType::kLeaked, IsMuted(false)}; CompromisedCredentials credential2 = credential1; - credential2.compromise_type = CompromiseType::kPhished; + credential2.compromise_type = InsecureType::kPhished; db().insecure_credentials_table().AddRow(credential1); db().insecure_credentials_table().AddRow(credential2);
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h index bcf9ac8..ed8d6b2 100644 --- a/components/password_manager/core/browser/mock_password_store.h +++ b/components/password_manager/core/browser/mock_password_store.h
@@ -78,7 +78,7 @@ MOCK_METHOD3(RemoveCompromisedCredentialsImpl, PasswordStoreChangeList(const std::string&, const base::string16&, - RemoveCompromisedCredentialsReason)); + RemoveInsecureCredentialsReason)); MOCK_METHOD0(GetAllCompromisedCredentialsImpl, std::vector<CompromisedCredentials>()); MOCK_METHOD1(
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc index a28d924..e633a7d1 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
@@ -443,13 +443,13 @@ Fetch(); CompromisedCredentials profile_store_compromised_credentials( form_digest_.signon_realm, base::ASCIIToUTF16("profile_username"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); profile_store_compromised_credentials.in_store = PasswordForm::Store::kProfileStore; CompromisedCredentials account_store_compromised_credentials( form_digest_.signon_realm, base::ASCIIToUTF16("account_username"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); account_store_compromised_credentials.in_store = PasswordForm::Store::kAccountStore;
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc index 0fe5130f..28d2096 100644 --- a/components/password_manager/core/browser/password_store.cc +++ b/components/password_manager/core/browser/password_store.cc
@@ -96,7 +96,7 @@ // Returns if credentials contains Phished issues. bool HasPhishedCredentials( const std::vector<CompromisedCredentials>& credentials) { - return base::Contains(credentials, CompromiseType::kPhished, + return base::Contains(credentials, InsecureType::kPhished, &CompromisedCredentials::compromise_type); } @@ -417,7 +417,7 @@ void PasswordStore::RemoveCompromisedCredentials( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) { + RemoveInsecureCredentialsReason reason) { DCHECK(main_task_runner_->RunsTasksInCurrentSequence()); auto callback = base::BindOnce(&PasswordStore::RemoveCompromisedCredentialsImpl, this, @@ -751,7 +751,7 @@ base::span<const CompromisedCredentials> credentials) { RemoveCompromisedCredentialsImpl( form.signon_realm, form.username_value, - RemoveCompromisedCredentialsReason::kSyncUpdate); + RemoveInsecureCredentialsReason::kSyncUpdate); return AddCompromisedCredentialsSync(credentials); } @@ -777,7 +777,7 @@ base::BindRepeating( [](scoped_refptr<PasswordStore> store, const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) { + RemoveInsecureCredentialsReason reason) { auto callback = base::BindOnce( &PasswordStore::RemoveCompromisedCredentialsImpl, store, signon_realm, username, reason);
diff --git a/components/password_manager/core/browser/password_store.h b/components/password_manager/core/browser/password_store.h index 677225f..5b61ed1 100644 --- a/components/password_manager/core/browser/password_store.h +++ b/components/password_manager/core/browser/password_store.h
@@ -286,7 +286,7 @@ // |username|. void RemoveCompromisedCredentials(const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason); + RemoveInsecureCredentialsReason reason); // Retrieves all compromised credentials and notifies |consumer| on // completion. The request will be cancelled if the consumer is destroyed. @@ -552,7 +552,7 @@ virtual PasswordStoreChangeList RemoveCompromisedCredentialsImpl( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) = 0; + RemoveInsecureCredentialsReason reason) = 0; virtual std::vector<CompromisedCredentials> GetAllCompromisedCredentialsImpl() = 0; virtual std::vector<CompromisedCredentials>
diff --git a/components/password_manager/core/browser/password_store_impl.cc b/components/password_manager/core/browser/password_store_impl.cc index f895106..0c9dfbb 100644 --- a/components/password_manager/core/browser/password_store_impl.cc +++ b/components/password_manager/core/browser/password_store_impl.cc
@@ -262,7 +262,7 @@ PasswordStoreChangeList PasswordStoreImpl::RemoveCompromisedCredentialsImpl( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) { + RemoveInsecureCredentialsReason reason) { DCHECK(background_task_runner()->RunsTasksInCurrentSequence()); if (!login_db_ || !login_db_->insecure_credentials_table().RemoveRow( signon_realm, username, reason)) {
diff --git a/components/password_manager/core/browser/password_store_impl.h b/components/password_manager/core/browser/password_store_impl.h index 807d97d..6d48123b 100644 --- a/components/password_manager/core/browser/password_store_impl.h +++ b/components/password_manager/core/browser/password_store_impl.h
@@ -77,7 +77,7 @@ PasswordStoreChangeList RemoveCompromisedCredentialsImpl( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) override; + RemoveInsecureCredentialsReason reason) override; std::vector<CompromisedCredentials> GetAllCompromisedCredentialsImpl() override; std::vector<CompromisedCredentials> GetMatchingCompromisedCredentialsImpl(
diff --git a/components/password_manager/core/browser/password_store_unittest.cc b/components/password_manager/core/browser/password_store_unittest.cc index 18090ba..c86e284f 100644 --- a/components/password_manager/core/browser/password_store_unittest.cc +++ b/components/password_manager/core/browser/password_store_unittest.cc
@@ -194,7 +194,7 @@ } CompromisedCredentials MakeCompromisedCredentials(const PasswordForm& form, - const CompromiseType& type) { + const InsecureType& type) { return CompromisedCredentials(form.signon_realm, form.username_value, base::Time(), type, IsMuted(false)); } @@ -444,7 +444,7 @@ TEST_F(PasswordStoreTest, CompromisedCredentialsObserverOnRemoveLogin) { CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); @@ -484,7 +484,7 @@ TEST_F(PasswordStoreTest, CompromisedCredentialsObserverOnLoginUpdated) { CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); @@ -523,7 +523,7 @@ TEST_F(PasswordStoreTest, CompromisedCredentialsObserverOnLoginAdded) { CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); @@ -574,7 +574,7 @@ 1}; CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); @@ -612,7 +612,7 @@ CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); scoped_refptr<PasswordStoreImpl> store = CreatePasswordStore(); store->Init(nullptr); @@ -624,16 +624,16 @@ // Expect a notification after removing a credential. EXPECT_CALL(observer, OnCompromisedCredentialsChanged); - store->RemoveCompromisedCredentials( - compromised_credentials.signon_realm, compromised_credentials.username, - RemoveCompromisedCredentialsReason::kRemove); + store->RemoveCompromisedCredentials(compromised_credentials.signon_realm, + compromised_credentials.username, + RemoveInsecureCredentialsReason::kRemove); WaitForPasswordStore(); // Removing the same credential should not result in another notification. EXPECT_CALL(observer, OnCompromisedCredentialsChanged).Times(0); - store->RemoveCompromisedCredentials( - compromised_credentials.signon_realm, compromised_credentials.username, - RemoveCompromisedCredentialsReason::kRemove); + store->RemoveCompromisedCredentials(compromised_credentials.signon_realm, + compromised_credentials.username, + RemoveInsecureCredentialsReason::kRemove); WaitForPasswordStore(); store->ShutdownOnUIThread(); @@ -1558,10 +1558,10 @@ store->AddLogin(*FillPasswordFormWithData(data)); CompromisedCredentials compromised_credentials( "https://example.com/", base::ASCIIToUTF16("username"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); CompromisedCredentials compromised_credentials2( "https://2.example.com/", base::ASCIIToUTF16("username2"), - base::Time::FromTimeT(2), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(2), InsecureType::kLeaked, IsMuted(false)); store->AddCompromisedCredentials(compromised_credentials); store->AddCompromisedCredentials(compromised_credentials2); @@ -1573,9 +1573,9 @@ WaitForPasswordStore(); testing::Mock::VerifyAndClearExpectations(&consumer); - store->RemoveCompromisedCredentials( - compromised_credentials.signon_realm, compromised_credentials.username, - RemoveCompromisedCredentialsReason::kRemove); + store->RemoveCompromisedCredentials(compromised_credentials.signon_realm, + compromised_credentials.username, + RemoveInsecureCredentialsReason::kRemove); EXPECT_CALL(consumer, OnGetCompromisedCredentials( UnorderedElementsAre(compromised_credentials2))); store->GetAllCompromisedCredentials(&consumer); @@ -1600,10 +1600,10 @@ CompromisedCredentials credentials1( kTestWebRealm1, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); CompromisedCredentials credentials2( kTestWebRealm2, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(2), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(2), InsecureType::kLeaked, IsMuted(false)); for (const auto& credentials : {credentials1, credentials2}) store->AddCompromisedCredentials(credentials); @@ -1634,13 +1634,13 @@ CompromisedCredentials credentials1( kTestWebRealm1, base::ASCIIToUTF16("username_value"), - base::Time::FromTimeT(1), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(1), InsecureType::kLeaked, IsMuted(false)); CompromisedCredentials credentials2( kTestAndroidRealm1, base::ASCIIToUTF16("username_value_1"), - base::Time::FromTimeT(2), CompromiseType::kPhished, IsMuted(false)); + base::Time::FromTimeT(2), InsecureType::kPhished, IsMuted(false)); CompromisedCredentials credentials3( kTestWebRealm2, base::ASCIIToUTF16("username_value_2"), - base::Time::FromTimeT(3), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(3), InsecureType::kLeaked, IsMuted(false)); for (const auto& credentials : {credentials1, credentials2, credentials3}) store->AddCompromisedCredentials(credentials); @@ -1669,7 +1669,7 @@ CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username1"), - base::Time::FromTimeT(100), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(100), InsecureType::kLeaked, IsMuted(false)); constexpr PasswordFormData kTestCredential = {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebOrigin1, @@ -1705,7 +1705,7 @@ CompromisedCredentials compromised_credentials( kTestWebRealm1, base::ASCIIToUTF16("username1"), - base::Time::FromTimeT(100), CompromiseType::kLeaked, IsMuted(false)); + base::Time::FromTimeT(100), InsecureType::kLeaked, IsMuted(false)); constexpr PasswordFormData kTestCredential = {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebOrigin1, @@ -1818,10 +1818,10 @@ const std::vector<CompromisedCredentials> compromised_credentials = { CompromisedCredentials(test_form->signon_realm, test_form->username_value, - base::Time(), CompromiseType::kLeaked, + base::Time(), InsecureType::kLeaked, IsMuted(false)), CompromisedCredentials(test_form->signon_realm, test_form->username_value, - base::Time(), CompromiseType::kReused, + base::Time(), InsecureType::kReused, IsMuted(false))}; AddLoginError add_login_error = AddLoginError::kDbError; @@ -1870,7 +1870,7 @@ // Add one compromised credentials that is of typed Leaked and is NOT muted. CompromisedCredentials credential(test_form->signon_realm, test_form->username_value, base::Time(), - CompromiseType::kLeaked, IsMuted(false)); + InsecureType::kLeaked, IsMuted(false)); store->AddCompromisedCredentials(credential); WaitForPasswordStore(); @@ -1881,7 +1881,7 @@ // Add another compromised credentials of type "Reused" new_compromised_credentials.emplace_back(CompromisedCredentials( test_form->signon_realm, test_form->username_value, base::Time(), - CompromiseType::kReused, IsMuted(false))); + InsecureType::kReused, IsMuted(false))); // Update the password store with the new compromised credentials. store->ScheduleTask(base::BindOnce( @@ -1909,7 +1909,7 @@ const PasswordForm form = MakePasswordForm(kTestWebRealm1); ASSERT_EQ(AddChangeForForm(form), db->AddLogin(form, nullptr)); db->insecure_credentials_table().AddRow( - MakeCompromisedCredentials(form, CompromiseType::kPhished)); + MakeCompromisedCredentials(form, InsecureType::kPhished)); } // The LoginDatabase gets destroyed here, later it will be initialized with // data. @@ -1936,9 +1936,9 @@ const PasswordForm form = MakePasswordForm(kTestWebRealm1); ASSERT_EQ(AddChangeForForm(form), db->AddLogin(form, nullptr)); db->insecure_credentials_table().AddRow( - MakeCompromisedCredentials(form, CompromiseType::kLeaked)); + MakeCompromisedCredentials(form, InsecureType::kLeaked)); db->insecure_credentials_table().AddRow( - MakeCompromisedCredentials(form, CompromiseType::kReused)); + MakeCompromisedCredentials(form, InsecureType::kReused)); } // The LoginDatabase gets destroyed here, later it will be initialized with // data. @@ -1965,7 +1965,7 @@ const PasswordForm form = MakePasswordForm(kTestWebRealm1); ASSERT_EQ(AddChangeForForm(form), db->AddLogin(form, nullptr)); db->insecure_credentials_table().AddRow( - MakeCompromisedCredentials(form, CompromiseType::kPhished)); + MakeCompromisedCredentials(form, InsecureType::kPhished)); } // The LoginDatabase gets destroyed here, later it will be initialized with // data.
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 00d521fc..173947e 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -76,19 +76,19 @@ .InMicroseconds()); issue.set_is_muted(compromised_credential.is_muted.value()); switch (compromised_credential.compromise_type) { - case CompromiseType::kLeaked: + case InsecureType::kLeaked: DCHECK(!issues.has_leaked_password_issue()); *issues.mutable_leaked_password_issue() = std::move(issue); break; - case CompromiseType::kPhished: + case InsecureType::kPhished: DCHECK(!issues.has_phished_password_issue()); *issues.mutable_phished_password_issue() = std::move(issue); break; - case CompromiseType::kWeak: + case InsecureType::kWeak: DCHECK(!issues.has_weak_password_issue()); *issues.mutable_weak_password_issue() = std::move(issue); break; - case CompromiseType::kReused: + case InsecureType::kReused: DCHECK(!issues.has_reused_password_issue()); *issues.mutable_reused_password_issue() = std::move(issue); break; @@ -177,7 +177,7 @@ CompromisedCredentials CreateCompromisedCredentials( const std::string& signon_realm, const base::string16& username, - CompromiseType compromise_type, + InsecureType compromise_type, const sync_pb::PasswordSpecificsData::PasswordIssues::PasswordIssue& issue) { return CompromisedCredentials( @@ -205,22 +205,22 @@ const auto& password_issues = password_data.password_issues(); if (password_issues.has_leaked_password_issue()) { compromised_credentials.push_back(CreateCompromisedCredentials( - signon_realm, username, CompromiseType::kLeaked, + signon_realm, username, InsecureType::kLeaked, password_issues.leaked_password_issue())); } if (password_issues.has_reused_password_issue()) { compromised_credentials.push_back(CreateCompromisedCredentials( - signon_realm, username, CompromiseType::kReused, + signon_realm, username, InsecureType::kReused, password_issues.reused_password_issue())); } if (password_issues.has_weak_password_issue()) { compromised_credentials.push_back(CreateCompromisedCredentials( - signon_realm, username, CompromiseType::kWeak, + signon_realm, username, InsecureType::kWeak, password_issues.weak_password_issue())); } if (password_issues.has_phished_password_issue()) { compromised_credentials.push_back(CreateCompromisedCredentials( - signon_realm, username, CompromiseType::kPhished, + signon_realm, username, InsecureType::kPhished, password_issues.phished_password_issue())); } return compromised_credentials;
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc index e3d68c1..7b57eee 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -55,18 +55,18 @@ .signon_realm() == expected_signon_realm; } -bool SpecificsHasExpectedCompromiseTypes( +bool SpecificsHasExpectedInsecureTypes( const sync_pb::PasswordSpecificsData::PasswordIssues& specifics, - const std::vector<CompromiseType>& expected_types) { + const std::vector<InsecureType>& expected_types) { return base::ranges::all_of(expected_types, [&specifics](auto type) { switch (type) { - case CompromiseType::kLeaked: + case InsecureType::kLeaked: return specifics.has_leaked_password_issue(); - case CompromiseType::kPhished: + case InsecureType::kPhished: return specifics.has_phished_password_issue(); - case CompromiseType::kWeak: + case InsecureType::kWeak: return specifics.has_weak_password_issue(); - case CompromiseType::kReused: + case InsecureType::kReused: return specifics.has_reused_password_issue(); } }); @@ -75,8 +75,8 @@ MATCHER_P(EntityDataHasSecurityIssueTypes, expected_issue_types, "") { const auto& password_issues_data = arg->specifics.password().client_only_encrypted_data().password_issues(); - return SpecificsHasExpectedCompromiseTypes(password_issues_data, - expected_issue_types); + return SpecificsHasExpectedInsecureTypes(password_issues_data, + expected_issue_types); } // |*arg| must be of type PasswordForm. @@ -96,7 +96,7 @@ } sync_pb::PasswordSpecificsData_PasswordIssues CreateSpecificsIssues( - const std::vector<CompromiseType>& issue_types) { + const std::vector<InsecureType>& issue_types) { sync_pb::PasswordSpecificsData_PasswordIssues remote_issues; for (auto type : issue_types) { sync_pb::PasswordSpecificsData_PasswordIssues_PasswordIssue remote_issue; @@ -104,16 +104,16 @@ base::Time().ToDeltaSinceWindowsEpoch().InMicroseconds()); remote_issue.set_is_muted(false); switch (type) { - case CompromiseType::kLeaked: + case InsecureType::kLeaked: *remote_issues.mutable_leaked_password_issue() = remote_issue; break; - case CompromiseType::kPhished: + case InsecureType::kPhished: *remote_issues.mutable_phished_password_issue() = remote_issue; break; - case CompromiseType::kWeak: + case InsecureType::kWeak: *remote_issues.mutable_weak_password_issue() = remote_issue; break; - case CompromiseType::kReused: + case InsecureType::kReused: *remote_issues.mutable_reused_password_issue() = remote_issue; break; } @@ -127,7 +127,7 @@ const std::string& username_value, const std::string& password_element, const std::string& signon_realm, - const std::vector<CompromiseType>& issue_types) { + const std::vector<InsecureType>& issue_types) { sync_pb::EntitySpecifics password_specifics; sync_pb::PasswordSpecificsData* password_data = password_specifics.mutable_password() @@ -152,7 +152,7 @@ sync_pb::PasswordSpecifics CreateSpecificsWithSignonRealmAndIssues( const std::string& signon_realm, - const std::vector<CompromiseType>& issue_types) { + const std::vector<InsecureType>& issue_types) { return CreateSpecifics("http://www.origin.com/", "username_element", "username_value", "password_element", signon_realm, issue_types); @@ -178,7 +178,7 @@ std::vector<CompromisedCredentials> MakeCompromisedCredentials( const PasswordForm& form, - const std::vector<CompromiseType>& types) { + const std::vector<InsecureType>& types) { std::vector<CompromisedCredentials> issues; for (auto type : types) { @@ -1236,8 +1236,8 @@ if (!GetParam()) return; ON_CALL(mock_processor(), IsTrackingMetadata()).WillByDefault(Return(true)); - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kWeak}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kWeak}; const std::vector<CompromisedCredentials> kExpectedIssues = MakeCompromisedCredentials(MakePasswordForm(kSignonRealm1), kIssuesTypes); @@ -1268,8 +1268,8 @@ if (!GetParam()) return; ON_CALL(mock_processor(), IsTrackingMetadata()).WillByDefault(Return(true)); - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kReused}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kReused}; const std::vector<CompromisedCredentials> kIssues = MakeCompromisedCredentials(MakePasswordForm(kSignonRealm1), kIssuesTypes); sync_pb::PasswordSpecifics specifics = @@ -1308,8 +1308,8 @@ // be assigned a primary key 1. const int kPrimaryKey1 = 1; const std::string kPrimaryKeyStr1 = "1"; - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kReused}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kReused}; const PasswordForm kForm = MakePasswordForm(kSignonRealm1); fake_db()->AddLoginForPrimaryKey(kPrimaryKey1, kForm); @@ -1331,8 +1331,8 @@ return; const int kPrimaryKey1 = 1000; const std::string kPrimaryKeyStr1 = "1000"; - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kReused}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kReused}; const PasswordForm kForm = MakePasswordForm(kSignonRealm1); sync_pb::PasswordSpecifics specifics1 = @@ -1356,8 +1356,8 @@ return; const int kPrimaryKey1 = 1000; const std::string kPrimaryKeyStr1 = "1000"; - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kReused}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kReused}; const PasswordForm kForm = MakePasswordForm(kSignonRealm1); fake_db()->AddLoginForPrimaryKey(kPrimaryKey1, kForm); @@ -1367,7 +1367,7 @@ base::Optional<sync_pb::PasswordSpecifics> optional_specifics = GetDataFromBridge(/*storage_key=*/kPrimaryKeyStr1); ASSERT_TRUE(optional_specifics.has_value()); - ASSERT_TRUE(SpecificsHasExpectedCompromiseTypes( + ASSERT_TRUE(SpecificsHasExpectedInsecureTypes( optional_specifics.value().client_only_encrypted_data().password_issues(), kIssuesTypes)); } @@ -1382,8 +1382,8 @@ fake_db()->AddLoginForPrimaryKey(kPrimaryKey, MakePasswordForm(kSignonRealm1)); - const std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kLeaked, - CompromiseType::kReused}; + const std::vector<InsecureType> kIssuesTypes = {InsecureType::kLeaked, + InsecureType::kReused}; const std::vector<CompromisedCredentials> kIssues = MakeCompromisedCredentials(MakePasswordForm(kSignonRealm1), kIssuesTypes); @@ -1411,8 +1411,8 @@ // types Leaked and Reused. const std::string kStorageKey = "1000"; const PasswordForm kForm = MakePasswordForm(kSignonRealm1); - std::vector<CompromiseType> kIssuesTypes = { - CompromiseType::kLeaked, CompromiseType::kReused, CompromiseType::kWeak}; + std::vector<InsecureType> kIssuesTypes = { + InsecureType::kLeaked, InsecureType::kReused, InsecureType::kWeak}; const std::vector<CompromisedCredentials> kIssues = MakeCompromisedCredentials(kForm, kIssuesTypes); @@ -1459,12 +1459,12 @@ // compromised credentials, local data get updated. const std::string kStorageKey = "1000"; const PasswordForm kForm = MakePasswordForm(kSignonRealm1); - std::vector<CompromiseType> kRemoteIssuesTypes = {CompromiseType::kReused, - CompromiseType::kWeak}; + std::vector<InsecureType> kRemoteIssuesTypes = {InsecureType::kReused, + InsecureType::kWeak}; const std::vector<CompromisedCredentials> kRemoteIssues = MakeCompromisedCredentials(kForm, kRemoteIssuesTypes); const std::vector<CompromisedCredentials> kLocalIssues = - MakeCompromisedCredentials(kForm, {CompromiseType::kLeaked}); + MakeCompromisedCredentials(kForm, {InsecureType::kLeaked}); fake_db()->AddLoginForPrimaryKey(kPrimaryKey, kForm); fake_db()->AddCompromisedCredentials(kLocalIssues); @@ -1499,8 +1499,8 @@ const int kPrimaryKey = 1000; const std::string kStorageKey = "1000"; PasswordForm kForm = MakePasswordForm(kSignonRealm1); - std::vector<CompromiseType> kIssuesTypes = {CompromiseType::kReused, - CompromiseType::kWeak}; + std::vector<InsecureType> kIssuesTypes = {InsecureType::kReused, + InsecureType::kWeak}; const std::vector<CompromisedCredentials> kIssues = MakeCompromisedCredentials(kForm, kIssuesTypes);
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc index bb65140..ed975be 100644 --- a/components/password_manager/core/browser/test_password_store.cc +++ b/components/password_manager/core/browser/test_password_store.cc
@@ -351,7 +351,7 @@ PasswordStoreChangeList TestPasswordStore::RemoveCompromisedCredentialsImpl( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) { + RemoveInsecureCredentialsReason reason) { const size_t old_size = compromised_credentials_.size(); base::EraseIf(compromised_credentials_, [&](const auto& credential) { return credential.signon_realm == signon_realm &&
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h index 951167b..1039cb40 100644 --- a/components/password_manager/core/browser/test_password_store.h +++ b/components/password_manager/core/browser/test_password_store.h
@@ -121,7 +121,7 @@ PasswordStoreChangeList RemoveCompromisedCredentialsImpl( const std::string& signon_realm, const base::string16& username, - RemoveCompromisedCredentialsReason reason) override; + RemoveInsecureCredentialsReason reason) override; std::vector<CompromisedCredentials> GetAllCompromisedCredentialsImpl() override; std::vector<CompromisedCredentials> GetMatchingCompromisedCredentialsImpl(
diff --git a/components/password_manager/core/browser/ui/compromised_credentials_reader_unittest.cc b/components/password_manager/core/browser/ui/compromised_credentials_reader_unittest.cc index 2b5f242..4dc0df6b 100644 --- a/components/password_manager/core/browser/ui/compromised_credentials_reader_unittest.cc +++ b/components/password_manager/core/browser/ui/compromised_credentials_reader_unittest.cc
@@ -118,7 +118,7 @@ UnorderedElementsAre(account_cred1, account_cred2))); profile_store().RemoveCompromisedCredentials( profile_cred.signon_realm, profile_cred.username, - RemoveCompromisedCredentialsReason::kRemove); + RemoveInsecureCredentialsReason::kRemove); RunUntilIdle(); EXPECT_CALL(mock_observer,
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager.cc b/components/password_manager/core/browser/ui/insecure_credentials_manager.cc index f3fcba9c..5c57db3 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager.cc +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager.cc
@@ -61,15 +61,15 @@ } }; -InsecureCredentialTypeFlags ConvertCompromiseType(CompromiseType type) { +InsecureCredentialTypeFlags ConvertInsecureType(InsecureType type) { switch (type) { - case CompromiseType::kLeaked: + case InsecureType::kLeaked: return InsecureCredentialTypeFlags::kCredentialLeaked; - case CompromiseType::kPhished: + case InsecureType::kPhished: return InsecureCredentialTypeFlags::kCredentialPhished; - case CompromiseType::kWeak: + case InsecureType::kWeak: return InsecureCredentialTypeFlags::kWeakCredential; - case CompromiseType::kReused: + case InsecureType::kReused: return InsecureCredentialTypeFlags::kReusedCredential; } NOTREACHED(); @@ -119,7 +119,7 @@ // Using |= operator to save in a bit mask both Leaked and Phished. credential_to_form.type |= - ConvertCompromiseType(credential.compromise_type); + ConvertInsecureType(credential.compromise_type); // Use the latest time. Relevant when the same credential is both // phished and compromised. @@ -216,7 +216,7 @@ credential.username, /*password=*/{}), create_time(credential.create_time), - insecure_type(ConvertCompromiseType(credential.compromise_type)) {} + insecure_type(ConvertInsecureType(credential.compromise_type)) {} CredentialWithPassword& CredentialWithPassword::operator=( const CredentialWithPassword& other) = default; @@ -267,7 +267,7 @@ GetStoreFor(saved_password) .AddCompromisedCredentials(CompromisedCredentials( saved_password.signon_realm, saved_password.username_value, - base::Time::Now(), CompromiseType::kLeaked, IsMuted(false))); + base::Time::Now(), InsecureType::kLeaked, IsMuted(false))); } } }
diff --git a/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc b/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc index f42b341..b480817 100644 --- a/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc +++ b/components/password_manager/core/browser/ui/insecure_credentials_manager_unittest.cc
@@ -60,7 +60,7 @@ CompromisedCredentials MakeCompromised( std::string signon_realm, base::StringPiece username, - CompromiseType type = CompromiseType::kLeaked) { + InsecureType type = InsecureType::kLeaked) { return CompromisedCredentials(std::move(signon_realm), base::ASCIIToUTF16(username), base::Time(), type, IsMuted(false)); @@ -91,7 +91,7 @@ CredentialWithPassword credential_with_password((CredentialView(form))); credential_with_password.create_time = credential.create_time; credential_with_password.insecure_type = - credential.compromise_type == CompromiseType::kLeaked + credential.compromise_type == InsecureType::kLeaked ? InsecureCredentialTypeFlags::kCredentialLeaked : InsecureCredentialTypeFlags::kCredentialPhished; return credential_with_password; @@ -204,7 +204,7 @@ EXPECT_CALL(observer, OnCompromisedCredentialsChanged(IsEmpty())); store().RemoveCompromisedCredentials( credentials[0].signon_realm, credentials[0].username, - RemoveCompromisedCredentialsReason::kRemove); + RemoveInsecureCredentialsReason::kRemove); RunUntilIdle(); EXPECT_THAT(store().compromised_credentials(), IsEmpty()); @@ -212,7 +212,7 @@ EXPECT_CALL(observer, OnCompromisedCredentialsChanged).Times(0); store().RemoveCompromisedCredentials( credentials[0].signon_realm, credentials[0].username, - RemoveCompromisedCredentialsReason::kRemove); + RemoveInsecureCredentialsReason::kRemove); RunUntilIdle(); // After an observer is removed it should no longer receive notifications. @@ -282,9 +282,9 @@ PasswordForm password = MakeSavedPassword(kExampleCom, kUsername1, kPassword1); CompromisedCredentials leaked = - MakeCompromised(kExampleCom, kUsername1, CompromiseType::kLeaked); + MakeCompromised(kExampleCom, kUsername1, InsecureType::kLeaked); CompromisedCredentials phished = - MakeCompromised(kExampleCom, kUsername1, CompromiseType::kPhished); + MakeCompromised(kExampleCom, kUsername1, InsecureType::kPhished); store().AddLogin(password); store().AddCompromisedCredentials(leaked);
diff --git a/components/password_manager/core/browser/ui/post_save_compromised_helper_unittest.cc b/components/password_manager/core/browser/ui/post_save_compromised_helper_unittest.cc index 6f5d177..b4914dea 100644 --- a/components/password_manager/core/browser/ui/post_save_compromised_helper_unittest.cc +++ b/components/password_manager/core/browser/ui/post_save_compromised_helper_unittest.cc
@@ -30,7 +30,7 @@ base::StringPiece username, PasswordForm::Store store = PasswordForm::Store::kProfileStore) { CompromisedCredentials compromised(kSignonRealm, base::ASCIIToUTF16(username), - base::Time(), CompromiseType::kLeaked, + base::Time(), InsecureType::kLeaked, IsMuted(false)); compromised.in_store = store; return compromised;
diff --git a/components/payments/content/secure_payment_confirmation_app.cc b/components/payments/content/secure_payment_confirmation_app.cc index 0512c0c..a25448a 100644 --- a/components/payments/content/secure_payment_confirmation_app.cc +++ b/components/payments/content/secure_payment_confirmation_app.cc
@@ -12,6 +12,7 @@ #include "base/containers/flat_tree.h" #include "base/feature_list.h" #include "base/json/json_writer.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/strings/strcat.h" #include "base/strings/stringprintf.h" @@ -76,6 +77,14 @@ return output_bytes; } +// Records UMA metric for the system prompt result. +void RecordSystemPromptResult( + const SecurePaymentConfirmationSystemPromptResult result) { + base::UmaHistogramEnumeration( + "PaymentRequest.SecurePaymentConfirmation.Funnel.SystemPromptResult", + result); +} + } // namespace SecurePaymentConfirmationApp::SecurePaymentConfirmationApp( @@ -271,9 +280,14 @@ status_string_stream << status; delegate->OnInstrumentDetailsError(base::StringPrintf( "Authenticator returned %s.", status_string_stream.str().c_str())); + RecordSystemPromptResult( + SecurePaymentConfirmationSystemPromptResult::kCanceled); return; } + RecordSystemPromptResult( + SecurePaymentConfirmationSystemPromptResult::kAccepted); + // Serialize response into a JSON string. Browser will pass this string over // Mojo IPC into Blink, which will parse it into a JavaScript object for the // merchant.
diff --git a/components/payments/content/secure_payment_confirmation_app.h b/components/payments/content/secure_payment_confirmation_app.h index 35d9609..9284f82 100644 --- a/components/payments/content/secure_payment_confirmation_app.h +++ b/components/payments/content/secure_payment_confirmation_app.h
@@ -35,6 +35,15 @@ class PaymentRequestSpec; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. Keep in sync with +// src/tools/metrics/histograms/enums.xml. +enum class SecurePaymentConfirmationSystemPromptResult { + kCanceled = 0, + kAccepted = 1, + kMaxValue = kAccepted, +}; + class SecurePaymentConfirmationApp : public PaymentApp, public content::WebContentsObserver { public:
diff --git a/components/performance_manager/service_worker_context_adapter.cc b/components/performance_manager/service_worker_context_adapter.cc index f75b6c5..908dfec1 100644 --- a/components/performance_manager/service_worker_context_adapter.cc +++ b/components/performance_manager/service_worker_context_adapter.cc
@@ -105,7 +105,7 @@ void ServiceWorkerContextAdapter::RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) { + StatusCodeCallback callback) { NOTIMPLEMENTED(); } @@ -173,7 +173,7 @@ void ServiceWorkerContextAdapter::StartWorkerForScope( const GURL& scope, StartWorkerCallback info_callback, - StartWorkerFailureCallback failure_callback) { + StatusCodeCallback status_callback) { NOTIMPLEMENTED(); }
diff --git a/components/performance_manager/service_worker_context_adapter.h b/components/performance_manager/service_worker_context_adapter.h index eb38a34..b4f9920 100644 --- a/components/performance_manager/service_worker_context_adapter.h +++ b/components/performance_manager/service_worker_context_adapter.h
@@ -49,7 +49,7 @@ void RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) override; + StatusCodeCallback callback) override; void UnregisterServiceWorker(const GURL& scope, ResultCallback callback) override; content::ServiceWorkerExternalRequestResult StartingExternalRequest( @@ -68,10 +68,9 @@ void CheckOfflineCapability(const GURL& url, CheckOfflineCapabilityCallback callback) override; void ClearAllServiceWorkersForTest(base::OnceClosure callback) override; - void StartWorkerForScope( - const GURL& scope, - StartWorkerCallback info_callback, - StartWorkerFailureCallback failure_callback) override; + void StartWorkerForScope(const GURL& scope, + StartWorkerCallback info_callback, + StatusCodeCallback failure_callback) override; void StartServiceWorkerAndDispatchMessage( const GURL& scope, blink::TransferableMessage message,
diff --git a/components/policy/core/common/cloud/cloud_policy_client.cc b/components/policy/core/common/cloud/cloud_policy_client.cc index 24ee0dea..60f30d3 100644 --- a/components/policy/core/common/cloud/cloud_policy_client.cc +++ b/components/policy/core/common/cloud/cloud_policy_client.cc
@@ -11,6 +11,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/containers/contains.h" +#include "base/feature_list.h" #include "base/guid.h" #include "base/json/json_reader.h" #include "base/logging.h" @@ -23,6 +24,7 @@ #include "components/policy/core/common/cloud/encrypted_reporting_job_configuration.h" #include "components/policy/core/common/cloud/realtime_reporting_job_configuration.h" #include "components/policy/core/common/cloud/signing_service.h" +#include "components/policy/core/common/features.h" #include "google_apis/gaia/gaia_constants.h" #include "google_apis/gaia/gaia_urls.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -286,6 +288,7 @@ request->set_os_version(GetOSVersion()); #if defined(OS_IOS) request->set_device_model(GetDeviceModel()); + request->set_brand_name(GetDeviceManufacturer()); #endif // defined(OS_IOS) policy_fetch_request_job_ = service_->CreateJob(std::move(config)); @@ -377,6 +380,17 @@ fetch_request->set_invalidation_payload(invalidation_payload_); } } +#if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) + // Only set browser device identifier for CBCM Chrome cloud policy on + // desktop. + if (base::FeatureList::IsEnabled( + features::kUploadBrowserDeviceIdentifier) && + type_to_fetch.first == + dm_protocol::kChromeMachineLevelUserCloudPolicyType) { + fetch_request->set_allocated_browser_device_identifier( + GetBrowserDeviceIdentifier().release()); + } +#endif } // Add device state keys.
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc index 24fa737..215997d4 100644 --- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc +++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -15,12 +15,14 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/compiler_specific.h" +#include "base/feature_list.h" #include "base/json/json_reader.h" #include "base/memory/ref_counted.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/values.h" #include "build/build_config.h" @@ -32,6 +34,7 @@ #include "components/policy/core/common/cloud/mock_signing_service.h" #include "components/policy/core/common/cloud/realtime_reporting_job_configuration.h" #include "components/policy/core/common/cloud/reporting_job_configuration_base.h" +#include "components/policy/core/common/features.h" #include "components/policy/proto/device_management_backend.pb.h" #include "components/version_info/version_info.h" #include "google_apis/gaia/gaia_urls.h" @@ -309,6 +312,7 @@ enrollment_request->set_os_version(policy::GetOSVersion()); #if defined(OS_IOS) enrollment_request->set_device_model(policy::GetDeviceModel()); + enrollment_request->set_brand_name(policy::GetDeviceManufacturer()); #endif #endif @@ -1021,6 +1025,69 @@ EXPECT_EQ(-12345, client_->fetched_invalidation_version()); } +#if defined(OS_WIN) || defined(OS_MAC) || defined(OS_LINUX) +TEST_F(CloudPolicyClientTest, PolicyFetchWithBrowserDeviceIdentifier) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + features::kUploadBrowserDeviceIdentifier); + + RegisterClient(); + + // Add the policy type that contains browser device identifier. + client_->AddPolicyTypeToFetch( + dm_protocol::kChromeMachineLevelUserCloudPolicyType, std::string()); + + // Make a policy fetch. + ExpectAndCaptureJob(/*response=*/GetPolicyResponse()); + EXPECT_CALL(observer_, OnPolicyFetched); + client_->FetchPolicy(); + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, + job_type_); + + // Collect the policy requests. + ASSERT_TRUE(job_request_.has_policy_request()); + const em::DevicePolicyRequest& policy_request = job_request_.policy_request(); + std::map<std::pair<std::string, std::string>, em::PolicyFetchRequest> + request_map; + for (int i = 0; i < policy_request.requests_size(); ++i) { + const em::PolicyFetchRequest& fetch_request = policy_request.requests(i); + ASSERT_TRUE(fetch_request.has_policy_type()); + std::pair<std::string, std::string> key(fetch_request.policy_type(), + fetch_request.settings_entity_id()); + EXPECT_EQ(0UL, request_map.count(key)); + request_map[key].CopyFrom(fetch_request); + } + + std::map<std::pair<std::string, std::string>, em::PolicyFetchRequest> + expected_requests; + // Expected user policy fetch request. + std::pair<std::string, std::string> user_policy_key( + dm_protocol::kChromeUserPolicyType, std::string()); + expected_requests[user_policy_key] = + GetPolicyRequest().policy_request().requests(0); + // Expected user cloud policy fetch request. + std::pair<std::string, std::string> user_cloud_policy_key( + dm_protocol::kChromeMachineLevelUserCloudPolicyType, std::string()); + em::PolicyFetchRequest policy_fetch_request = + GetPolicyRequest().policy_request().requests(0); + policy_fetch_request.set_policy_type( + dm_protocol::kChromeMachineLevelUserCloudPolicyType); + policy_fetch_request.set_allocated_browser_device_identifier( + GetBrowserDeviceIdentifier().release()); + expected_requests[user_cloud_policy_key] = policy_fetch_request; + + EXPECT_EQ(request_map.size(), expected_requests.size()); + for (auto it = expected_requests.begin(); it != expected_requests.end(); + ++it) { + EXPECT_EQ(1UL, request_map.count(it->first)); + EXPECT_EQ(request_map[it->first].SerializePartialAsString(), + it->second.SerializePartialAsString()); + } +} +#endif + // Tests that previous OAuth token is no longer sent in policy fetch after its // value was cleared. TEST_F(CloudPolicyClientTest, PolicyFetchClearOAuthToken) {
diff --git a/components/policy/core/common/cloud/cloud_policy_util.cc b/components/policy/core/common/cloud/cloud_policy_util.cc index 472f4554..011db2d 100644 --- a/components/policy/core/common/cloud/cloud_policy_util.cc +++ b/components/policy/core/common/cloud/cloud_policy_util.cc
@@ -83,6 +83,14 @@ namespace em = enterprise_management; +std::string GetDeviceManufacturer() { +#if defined(OS_IOS) + return "Apple Inc."; +#else + return std::string(); +#endif +} + std::string GetDeviceModel() { #if defined(OS_IOS) // Obtains the Apple internal device name (e.g. "iPad6,11").
diff --git a/components/policy/core/common/cloud/cloud_policy_util.h b/components/policy/core/common/cloud/cloud_policy_util.h index 332f24f..6a25659 100644 --- a/components/policy/core/common/cloud/cloud_policy_util.h +++ b/components/policy/core/common/cloud/cloud_policy_util.h
@@ -17,6 +17,10 @@ // Returns the model of the device. This function is platform specific. POLICY_EXPORT std::string GetDeviceModel(); +// Returns the brand/manufacturer of the device. This function is platform +// specific. +POLICY_EXPORT std::string GetDeviceManufacturer(); + // Returns the name of the machine. This function is platform specific. POLICY_EXPORT std::string GetMachineName();
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 9518fb11..3b9a3db 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -1928,6 +1928,8 @@ optional string machine_attestation_key = 11; // A string that represents the device model. optional string device_model = 12; + // A string that represents the brand/manufacturer of a device. + optional string brand_name = 13; } // Report user level status on Chrome OS platform. Chrome OS equivalent of @@ -2723,6 +2725,8 @@ optional BrowserDeviceIdentifier browser_device_identifier = 4; // The device model, e.g., iPad6,11 optional string device_model = 5; + // A string that represents the brand/manufacturer of a device. + optional string brand_name = 6; } // Gets an enrollment token to a managed Google Play account for using it with
diff --git a/components/safe_browsing/core/proto/PRESUBMIT.py b/components/safe_browsing/core/proto/PRESUBMIT.py index 1839ab7f6..0fc9e4b6 100644 --- a/components/safe_browsing/core/proto/PRESUBMIT.py +++ b/components/safe_browsing/core/proto/PRESUBMIT.py
@@ -8,6 +8,7 @@ # Warn if the proto file is not modified without also modifying # the WebUI and extension API idl file. proto_path = 'components/safe_browsing/core/proto/csd.proto' + realtime_proto_path = 'components/safe_browsing/core/proto/realtimeapi.proto' web_ui_path = 'components/safe_browsing/content/web_ui/safe_browsing_ui.cc' idl_path = 'chrome/common/extensions/api/safe_browsing_private.idl' @@ -28,4 +29,19 @@ 'without changing the API definition in: \n' ' ' + idl_path + '\n') ) + results.append( + output_api.PresubmitPromptWarning( + 'You modified the one or more of the CSD protos in: \n' + ' ' + proto_path + '\n' + 'Please remember to update the proto file in the internal ' + + 'repository. \n') + ) + if realtime_proto_path in input_api.change.LocalPaths(): + results.append( + output_api.PresubmitPromptWarning( + 'You modified the realtimeapi protos in: \n' + ' ' + realtime_proto_path + '\n' + 'Please remember to update the proto file in the internal ' + + 'repository. \n') + ) return results
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc index c569131..386c8ea 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -318,7 +318,8 @@ // Initial synchronous navigations to about:blank should only be tagged by // the renderer. - DCHECK(!ad_evidence.IndicatesAdSubframe()); + DCHECK(!(navigation_handle->GetURL().IsAboutBlank() && + ad_evidence.IndicatesAdSubframe())); } else { DCHECK(navigation_handle->IsInMainFrame() || base::Contains(ad_frames_, frame_tree_node_id) ||
diff --git a/components/sync/BUILD.gn b/components/sync/BUILD.gn index aacf5b02..960528c 100644 --- a/components/sync/BUILD.gn +++ b/components/sync/BUILD.gn
@@ -291,6 +291,7 @@ "//base:i18n", "//build:branding_buildflags", "//components/keyed_service/core", + "//components/signin/public/identity_manager", "//components/variations/net", "//services/network/public/cpp", "//sql",
diff --git a/components/sync/driver/glue/sync_engine_backend.cc b/components/sync/driver/glue/sync_engine_backend.cc index e23c22b..de870a6 100644 --- a/components/sync/driver/glue/sync_engine_backend.cc +++ b/components/sync/driver/glue/sync_engine_backend.cc
@@ -260,7 +260,7 @@ last_invalidation_versions_ = restored_local_transport_data.invalidation_versions; - authenticated_account_id_ = params.authenticated_account_id; + authenticated_account_id_ = params.authenticated_account_info.account_id; auto nigori_processor = std::make_unique<NigoriModelTypeProcessor>(); nigori_controller_ = std::make_unique<ModelTypeController>( @@ -285,7 +285,6 @@ args.post_factory = std::move(params.http_factory_getter).Run(); args.encryption_observer_proxy = std::move(params.encryption_observer_proxy); args.extensions_activity = params.extensions_activity.get(); - args.authenticated_account_id = params.authenticated_account_id; args.invalidator_client_id = params.invalidator_client_id; args.engine_components_factory = std::move(params.engine_components_factory); args.encryption_handler = sync_encryption_handler_.get();
diff --git a/components/sync/driver/glue/sync_engine_backend.h b/components/sync/driver/glue/sync_engine_backend.h index 97addfb..00cc29c9e 100644 --- a/components/sync/driver/glue/sync_engine_backend.h +++ b/components/sync/driver/glue/sync_engine_backend.h
@@ -26,6 +26,7 @@ #include "components/sync/engine/sync_encryption_handler.h" #include "components/sync/engine/sync_manager.h" #include "components/sync/engine/sync_status_observer.h" +#include "google_apis/gaia/core_account_id.h" #include "url/gurl.h" namespace syncer {
diff --git a/components/sync/driver/glue/sync_engine_impl.cc b/components/sync/driver/glue/sync_engine_impl.cc index 564eb7c0..2e63d2c 100644 --- a/components/sync/driver/glue/sync_engine_impl.cc +++ b/components/sync/driver/glue/sync_engine_impl.cc
@@ -6,11 +6,14 @@ #include <utility> +#include "base/base64.h" #include "base/bind.h" #include "base/command_line.h" #include "base/feature_list.h" #include "base/location.h" #include "base/logging.h" +#include "base/metrics/histogram_functions.h" +#include "base/rand_util.h" #include "base/task_runner_util.h" #include "build/build_config.h" #include "components/invalidation/impl/invalidation_switches.h" @@ -57,6 +60,84 @@ return result; } +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. When adding values, be certain to also +// update the corresponding definition in enums.xml. +enum class SyncTransportDataStartupState { + kValidData = 0, + kEmptyCacheGuid = 1, + kEmptyBirthday = 2, + kGaiaIdMismatch = 3, + kMaxValue = kGaiaIdMismatch +}; + +std::string GenerateCacheGUID() { + // Generate a GUID with 128 bits of randomness. + const int kGuidBytes = 128 / 8; + std::string guid; + base::Base64Encode(base::RandBytesAsString(kGuidBytes), &guid); + return guid; +} + +SyncTransportDataStartupState ValidateSyncTransportData( + const SyncTransportDataPrefs& prefs, + const CoreAccountInfo& core_account_info) { + // If the cache GUID is empty, it most probably is because local sync data + // has been fully cleared. Let's treat this as invalid to make sure all prefs + // are cleared and a new random cache GUID generated. + if (prefs.GetCacheGuid().empty()) { + return SyncTransportDataStartupState::kEmptyCacheGuid; + } + + // If cache GUID is initialized but the birthday isn't, it means the first + // sync cycle never completed (OnEngineInitialized()). This should be a rare + // case and theoretically harmless to resume, but as safety precaution, its + // simpler to regenerate the cache GUID and start from scratch, to avoid + // protocol violations (fetching updates requires that the request either has + // a birthday, or there should be no progress marker). + if (prefs.GetBirthday().empty()) { + return SyncTransportDataStartupState::kEmptyBirthday; + } + + // Make sure the cached account information (gaia ID) is equal to the current + // one (otherwise the data may be corrupt). Note that, for local sync, the + // authenticated account is always empty. + if (prefs.GetGaiaId() != core_account_info.gaia) { + DLOG(WARNING) << "Found mismatching gaia ID in sync preferences"; + return SyncTransportDataStartupState::kGaiaIdMismatch; + } + + // All good: local sync data looks initialized and valid. + return SyncTransportDataStartupState::kValidData; +} + +void ValidateOrInitSyncTransportData(const CoreAccountInfo& core_account_info, + SyncTransportDataPrefs* prefs) { + // The gaia ID in sync prefs was introduced with M81, so having an empty value + // is legitimate and should be populated as a one-off migration. + // TODO(mastiz): Clean up this migration code after a grace period (e.g. 1 + // year). + if (prefs->GetGaiaId().empty()) { + prefs->SetGaiaId(core_account_info.gaia); + } + + const SyncTransportDataStartupState state = + ValidateSyncTransportData(*prefs, core_account_info); + + base::UmaHistogramEnumeration("Sync.LocalSyncTransportDataStartupState", + state); + + if (state != SyncTransportDataStartupState::kValidData) { + // Either the local data is uninitialized or corrupt, so let's throw + // everything away and start from scratch with a new cache GUID, which also + // cascades into datatypes throwing away their dangling sync metadata due to + // cache GUID mismatches. + prefs->ClearAllExceptEncryptionBootstrapToken(); + prefs->SetCacheGuid(GenerateCacheGUID()); + prefs->SetGaiaId(core_account_info.gaia); + } +} + } // namespace SyncEngineImpl::SyncEngineImpl( @@ -89,9 +170,11 @@ void SyncEngineImpl::Initialize(InitParams params) { DCHECK(params.host); - host_ = params.host; + ValidateOrInitSyncTransportData(params.authenticated_account_info, + prefs_.get()); + sync_task_runner_->PostTask( FROM_HERE, base::BindOnce(&SyncEngineBackend::DoInitialize, backend_, std::move(params), @@ -495,6 +578,11 @@ backend_, payload)); } +// static +std::string SyncEngineImpl::GenerateCacheGUIDForTest() { + return GenerateCacheGUID(); +} + void SyncEngineImpl::OnCookieJarChangedDoneOnFrontendLoop( base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/sync/driver/glue/sync_engine_impl.h b/components/sync/driver/glue/sync_engine_impl.h index ab99dd3..ba74304 100644 --- a/components/sync/driver/glue/sync_engine_impl.h +++ b/components/sync/driver/glue/sync_engine_impl.h
@@ -111,6 +111,8 @@ // InvalidationsListener implementation. void OnInvalidationReceived(const std::string& payload) override; + static std::string GenerateCacheGUIDForTest(); + private: friend class SyncEngineBackend;
diff --git a/components/sync/driver/glue/sync_engine_impl_unittest.cc b/components/sync/driver/glue/sync_engine_impl_unittest.cc index 2ae9ff34..4e60f4f 100644 --- a/components/sync/driver/glue/sync_engine_impl_unittest.cc +++ b/components/sync/driver/glue/sync_engine_impl_unittest.cc
@@ -53,6 +53,7 @@ static const base::FilePath::CharType kTestSyncDir[] = FILE_PATH_LITERAL("sync-test"); +constexpr char kTestGaiaId[] = "test_gaia_id"; class TestSyncEngineHost : public SyncEngineHostStub { public: @@ -228,13 +229,15 @@ } // Synchronously initializes the backend. - void InitializeBackend(bool expect_success) { + void InitializeBackend(bool expect_success = true, + const std::string& gaia_id = kTestGaiaId) { host_.SetExpectSuccess(expect_success); SyncEngine::InitParams params; params.host = &host_; params.http_factory_getter = base::BindOnce(&CreateHttpBridgeFactory); - params.authenticated_account_id = CoreAccountId("account_id"); + params.authenticated_account_info.gaia = gaia_id; + params.authenticated_account_info.account_id = CoreAccountId("account_id"); params.sync_manager_factory = std::move(fake_manager_factory_); backend_->Initialize(std::move(params)); @@ -345,7 +348,7 @@ // Test basic initialization with no initial types (first time initialization). // Only the nigori should be configured. TEST_F(SyncEngineImplTest, InitShutdown) { - InitializeBackend(true); + InitializeBackend(); EXPECT_EQ(ControlTypes(), fake_manager_->GetAndResetDownloadedTypes()); EXPECT_EQ(ControlTypes(), fake_manager_->InitialSyncEndedTypes()); } @@ -353,7 +356,7 @@ // Test first time sync scenario. All types should be properly configured. TEST_F(SyncEngineImplTest, FirstTimeSync) { - InitializeBackend(true); + InitializeBackend(); EXPECT_EQ(ControlTypes(), fake_manager_->GetAndResetDownloadedTypes()); EXPECT_EQ(ControlTypes(), fake_manager_->InitialSyncEndedTypes()); @@ -370,7 +373,7 @@ TEST_F(SyncEngineImplTest, Restart) { fake_manager_factory_->set_progress_marker_types(enabled_types_); fake_manager_factory_->set_initial_sync_ended_types(enabled_types_); - InitializeBackend(true); + InitializeBackend(); EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); EXPECT_EQ(enabled_types_, fake_manager_->InitialSyncEndedTypes()); @@ -382,7 +385,7 @@ TEST_F(SyncEngineImplTest, DisableTypes) { // Simulate first time sync. - InitializeBackend(true); + InitializeBackend(); ModelTypeSet ready_types = ConfigureDataTypes(); // Nigori is always downloaded so won't be ready. EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); @@ -402,7 +405,7 @@ TEST_F(SyncEngineImplTest, AddTypes) { // Simulate first time sync. - InitializeBackend(true); + InitializeBackend(); ModelTypeSet ready_types = ConfigureDataTypes(); // Nigori is always downloaded so won't be ready. EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); @@ -425,7 +428,7 @@ // And and disable in the same configuration. TEST_F(SyncEngineImplTest, AddDisableTypes) { // Simulate first time sync. - InitializeBackend(true); + InitializeBackend(); ModelTypeSet ready_types = ConfigureDataTypes(); // Nigori is always downloaded so won't be ready. EXPECT_EQ(Difference(ControlTypes(), ModelTypeSet(NIGORI)), ready_types); @@ -458,7 +461,7 @@ enabled_types_.PutAll(new_types); // Does nothing. - InitializeBackend(true); + InitializeBackend(); EXPECT_TRUE(fake_manager_->GetAndResetDownloadedTypes().Empty()); EXPECT_EQ(old_types, fake_manager_->InitialSyncEndedTypes()); @@ -484,7 +487,7 @@ // Bringing up the backend should download the new types without downloading // any old types. - InitializeBackend(true); + InitializeBackend(); EXPECT_EQ(new_types, fake_manager_->GetAndResetDownloadedTypes()); EXPECT_EQ(enabled_types_, fake_manager_->InitialSyncEndedTypes()); } @@ -498,12 +501,12 @@ // download retry logic will not be invoked. TEST_F(SyncEngineImplTest, SilentlyFailToDownloadControlTypes) { fake_manager_factory_->set_configure_fail_types(ModelTypeSet::All()); - InitializeBackend(false); + InitializeBackend(/*expect_success=*/false); } // Test that local refresh requests are delivered to sync. TEST_F(SyncEngineImplTest, ForwardLocalRefreshRequest) { - InitializeBackend(true); + InitializeBackend(); ModelTypeSet set1 = ModelTypeSet::All(); backend_->TriggerRefresh(set1); @@ -518,7 +521,7 @@ // Test that configuration on signin sends the proper GU source. TEST_F(SyncEngineImplTest, DownloadControlTypesNewClient) { - InitializeBackend(true); + InitializeBackend(); EXPECT_EQ(CONFIGURE_REASON_NEW_CLIENT, fake_manager_->GetAndResetConfigureReason()); } @@ -527,7 +530,7 @@ TEST_F(SyncEngineImplTest, DownloadControlTypesRestart) { fake_manager_factory_->set_progress_marker_types(enabled_types_); fake_manager_factory_->set_initial_sync_ended_types(enabled_types_); - InitializeBackend(true); + InitializeBackend(); EXPECT_EQ(CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, fake_manager_->GetAndResetConfigureReason()); } @@ -539,7 +542,7 @@ TEST_F(SyncEngineImplTest, DisableThenPurgeType) { ModelTypeSet error_types(BOOKMARKS); - InitializeBackend(true); + InitializeBackend(); // First enable the types. ModelTypeSet ready_types = ConfigureDataTypes(); @@ -561,7 +564,7 @@ // StopSyncingForShutdown. This is needed for datatype deactivation during // DataTypeManager shutdown. TEST_F(SyncEngineImplTest, ModelTypeConnectorValidDuringShutdown) { - InitializeBackend(true); + InitializeBackend(); backend_->StopSyncingForShutdown(); // Verify that call to DeactivateDataType doesn't assert. backend_->DeactivateDataType(AUTOFILL); @@ -584,7 +587,7 @@ invalidation_enabled_types.Remove(SESSIONS); #endif - InitializeBackend(true); + InitializeBackend(); EXPECT_CALL( invalidator_, UpdateInterestedTopics( @@ -602,7 +605,7 @@ // |enabled_types_|. enabled_types_.Remove(SESSIONS); - InitializeBackend(true); + InitializeBackend(); EXPECT_CALL(invalidator_, UpdateInterestedTopics(backend_.get(), ModelTypeSetToTopicSet(Difference( @@ -620,7 +623,7 @@ // |enabled_types_|. enabled_types_.Put(SESSIONS); - InitializeBackend(true); + InitializeBackend(); ConfigureDataTypes(); EXPECT_CALL(invalidator_, @@ -648,7 +651,7 @@ fake_manager_factory_->set_should_fail_on_init(true); // Sync manager will report initialization failure and gets destroyed during // the error handling. - InitializeBackend(false); + InitializeBackend(/*expect_success=*/false); backend_->StopSyncingForShutdown(); // This line would post the task causing the crash before the fix, because @@ -711,6 +714,62 @@ ConfigureDataTypes(); } +TEST_F(SyncEngineImplTest, GenerateCacheGUID) { + const std::string guid1 = SyncEngineImpl::GenerateCacheGUIDForTest(); + const std::string guid2 = SyncEngineImpl::GenerateCacheGUIDForTest(); + EXPECT_EQ(24U, guid1.size()); + EXPECT_EQ(24U, guid2.size()); + EXPECT_NE(guid1, guid2); +} + +TEST_F(SyncEngineImplTest, ShouldPopulateAccountIdCachedInPrefs) { + const std::string kTestCacheGuid = "test_cache_guid"; + const std::string kTestBirthday = "test_birthday"; + + SyncTransportDataPrefs transport_data_prefs(&pref_service_); + transport_data_prefs.SetCacheGuid(kTestCacheGuid); + transport_data_prefs.SetBirthday(kTestBirthday); + + InitializeBackend(); + + ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); + EXPECT_EQ(kTestGaiaId, transport_data_prefs.GetGaiaId()); +} + +TEST_F(SyncEngineImplTest, + ShouldNotPopulateAccountIdCachedInPrefsWithLocalSync) { + const std::string kTestCacheGuid = "test_cache_guid"; + const std::string kTestBirthday = "test_birthday"; + + SyncTransportDataPrefs transport_data_prefs(&pref_service_); + transport_data_prefs.SetCacheGuid(kTestCacheGuid); + transport_data_prefs.SetBirthday(kTestBirthday); + + InitializeBackend(/*expect_success=*/true, /*gaia_id=*/std::string()); + + ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); + EXPECT_TRUE(transport_data_prefs.GetGaiaId().empty()); +} + +// Verifies that local sync transport data is thrown away if there is a mismatch +// between the account ID cached in SyncPrefs and the actual one. +TEST_F(SyncEngineImplTest, + ShouldClearLocalSyncTransportDataDueToAccountIdMismatch) { + const std::string kTestCacheGuid = "test_cache_guid"; + const std::string kTestBirthday = "test_birthday"; + + SyncTransportDataPrefs transport_data_prefs(&pref_service_); + transport_data_prefs.SetCacheGuid(kTestCacheGuid); + transport_data_prefs.SetBirthday(kTestBirthday); + transport_data_prefs.SetGaiaId("corrupt_gaia_id"); + + InitializeBackend(); + + EXPECT_EQ(kTestGaiaId, transport_data_prefs.GetGaiaId()); + EXPECT_NE(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); + EXPECT_NE(kTestBirthday, transport_data_prefs.GetBirthday()); +} + } // namespace } // namespace syncer
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc index c117fa2..04780cc8 100644 --- a/components/sync/driver/profile_sync_service.cc +++ b/components/sync/driver/profile_sync_service.cc
@@ -8,7 +8,6 @@ #include <utility> #include "base/barrier_closure.h" -#include "base/base64.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -18,7 +17,6 @@ #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" -#include "base/rand_util.h" #include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -70,21 +68,6 @@ kMaxValue = OBSOLETE_NOT_ALLOWED_BY_PLATFORM }; -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. When adding values, be certain to also -// update the corresponding definition in enums.xml. -enum class LocalSyncTransportDataStartupState { - kValidData = 0, - kEmptyCacheGuid = 1, - kEmptyBirthday = 2, - kGaiaIdMismatch = 3, - kMaxValue = kGaiaIdMismatch -}; - -void LogSyncTransportDataState(LocalSyncTransportDataStartupState status) { - UMA_HISTOGRAM_ENUMERATION("Sync.LocalSyncTransportDataStartupState", status); -} - void RecordSyncInitialState(SyncService::DisableReasonSet disable_reasons, bool first_setup_complete) { SyncInitialState sync_state = CAN_START; @@ -143,53 +126,6 @@ network_time_update_callback); } -std::string GenerateCacheGUID() { - // Generate a GUID with 128 bits of randomness. - const int kGuidBytes = 128 / 8; - std::string guid; - base::Base64Encode(base::RandBytesAsString(kGuidBytes), &guid); - return guid; -} - -bool IsLocalSyncTransportDataValid(const SyncTransportDataPrefs& sync_prefs, - const CoreAccountInfo& core_account_info) { - // If the cache GUID is empty, it most probably is because local sync data - // has been fully cleared via ClearLocalSyncTransportData() due to - // ShutdownReason::DISABLE_SYNC. Let's return false here anyway to make sure - // all prefs are cleared and a new random cache GUID generated. - if (sync_prefs.GetCacheGuid().empty()) { - LogSyncTransportDataState( - LocalSyncTransportDataStartupState::kEmptyCacheGuid); - return false; - } - - // If cache GUID is initialized but the birthday isn't, it means the first - // sync cycle never completed (OnEngineInitialized()). This should be a rare - // case and theoretically harmless to resume, but as safety precaution, its - // simpler to regenerate the cache GUID and start from scratch, to avoid - // protocol violations (fetching updates requires that the request either has - // a birthday, or there should be no progress marker). - if (sync_prefs.GetBirthday().empty()) { - LogSyncTransportDataState( - LocalSyncTransportDataStartupState::kEmptyBirthday); - return false; - } - - // Make sure the cached account information (gaia ID) is equal to the current - // one (otherwise the data may be corrupt). Note that, for local sync - // (IsLocalSyncEnabled()), the authenticated account is always empty. - if (sync_prefs.GetGaiaId() != core_account_info.gaia) { - DLOG(WARNING) << "Found mismatching gaia ID in sync preferences"; - LogSyncTransportDataState( - LocalSyncTransportDataStartupState::kGaiaIdMismatch); - return false; - } - - // All good: local sync data looks initialized and valid. - LogSyncTransportDataState(LocalSyncTransportDataStartupState::kValidData); - return true; -} - } // namespace ProfileSyncService::InitParams::InitParams() = default; @@ -545,27 +481,6 @@ last_actionable_error_ = SyncProtocolError(); } - // The gaia ID in sync prefs was introduced with M81, so having an empty value - // is legitimate and should be populated as a one-off migration. - // TODO(mastiz): Clean up this migration code after a grace period (e.g. 1 - // year). - if (sync_transport_data_prefs_.GetGaiaId().empty()) { - sync_transport_data_prefs_.SetGaiaId(authenticated_account_info.gaia); - } - - // TODO(crbug.com/938894): Move this logic to SyncEngineImpl, possibly Init(). - // The caveat is that observers need to be notified in certain cases. - if (!IsLocalSyncTransportDataValid(sync_transport_data_prefs_, - authenticated_account_info)) { - // Either the local data is uninitialized or corrupt, so let's throw - // everything away and start from scratch with a new cache GUID, which also - // cascades into datatypes throwing away their dangling sync metadata due to - // cache GUID mismatches. - ClearLocalTransportDataAndNotify(); - sync_transport_data_prefs_.SetCacheGuid(GenerateCacheGUID()); - sync_transport_data_prefs_.SetGaiaId(authenticated_account_info.gaia); - } - SyncEngine::InitParams params; params.host = this; params.encryption_observer_proxy = crypto_.GetEncryptionObserverProxy(); @@ -576,7 +491,7 @@ params.http_factory_getter = base::BindOnce( create_http_post_provider_factory_cb_, MakeUserAgentForSync(channel_), url_loader_factory_->Clone(), network_time_update_callback_); - params.authenticated_account_id = authenticated_account_info.account_id; + params.authenticated_account_info = authenticated_account_info; if (!base::FeatureList::IsEnabled(switches::kSyncE2ELatencyMeasurement)) { invalidation::InvalidationService* invalidator = sync_client_->GetInvalidationService(); @@ -887,6 +802,12 @@ // we can say we successfully "synced". is_first_time_sync_configure_ = is_first_time_sync_configure; + if (is_first_time_sync_configure_) { + // This can also happen if previous sync transport data was considered + // invalid, so notify higher layers just in case to trigger cleanup logic. + sync_client_->OnLocalSyncTransportDataCleared(); + } + UpdateEngineInitUMA(success); if (!success) { @@ -1179,11 +1100,6 @@ return sync_client_.get(); } -// static -std::string ProfileSyncService::GenerateCacheGUIDForTest() { - return GenerateCacheGUID(); -} - void ProfileSyncService::AddObserver(SyncServiceObserver* observer) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); observers_.AddObserver(observer);
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h index fb47063..55c2b20 100644 --- a/components/sync/driver/profile_sync_service.h +++ b/components/sync/driver/profile_sync_service.h
@@ -249,8 +249,6 @@ SyncClient* GetSyncClientForTest(); - static std::string GenerateCacheGUIDForTest(); - private: // Passed as an argument to StopImpl to control whether or not the sync // engine should clear its data when it shuts down. See StopImpl for more
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc index 32edb2bd..c0c0174d 100644 --- a/components/sync/driver/profile_sync_service_unittest.cc +++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -1121,14 +1121,6 @@ ShutdownAndDeleteService(); } -TEST_F(ProfileSyncServiceTest, GenerateCacheGUID) { - const std::string guid1 = ProfileSyncService::GenerateCacheGUIDForTest(); - const std::string guid2 = ProfileSyncService::GenerateCacheGUIDForTest(); - EXPECT_EQ(24U, guid1.size()); - EXPECT_EQ(24U, guid2.size()); - EXPECT_NE(guid1, guid2); -} - // Regression test for crbug.com/1043642, can be removed once // ProfileSyncService usages after shutdown are addressed. TEST_F(ProfileSyncServiceTest, ShouldProvideDisableReasonsAfterShutdown) { @@ -1139,19 +1131,6 @@ EXPECT_FALSE(service()->GetDisableReasons().Empty()); } -TEST_F(ProfileSyncServiceTest, ShouldPopulateAccountIdCachedInPrefs) { - SyncTransportDataPrefs transport_data_prefs(prefs()); - - SignIn(); - CreateService(ProfileSyncService::MANUAL_START); - InitializeForNthSync(); - ASSERT_EQ(SyncService::TransportState::ACTIVE, - service()->GetTransportState()); - ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); - EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser), - transport_data_prefs.GetGaiaId()); -} - #if defined(OS_ANDROID) TEST_F(ProfileSyncServiceTest, DecoupleFromMasterSyncIfInitializedSignedOut) { base::test::ScopedFeatureList feature_list; @@ -1189,43 +1168,6 @@ } #endif // defined(OS_ANDROID) -TEST_F(ProfileSyncServiceTest, - ShouldNotPopulateAccountIdCachedInPrefsWithLocalSync) { - SyncTransportDataPrefs transport_data_prefs(prefs()); - - SignIn(); - CreateServiceWithLocalSyncBackend(); - InitializeForNthSync(); - ASSERT_EQ(SyncService::TransportState::ACTIVE, - service()->GetTransportState()); - ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); - EXPECT_TRUE(transport_data_prefs.GetGaiaId().empty()); -} - -// Verifies that local sync transport data is thrown away if there is a mismatch -// between the account ID cached in SyncPrefs and the actual one. -TEST_F(ProfileSyncServiceTest, - ShouldClearLocalSyncTransportDataDueToAccountIdMismatch) { - SyncTransportDataPrefs transport_data_prefs(prefs()); - - SignIn(); - CreateService(ProfileSyncService::MANUAL_START); - PopulatePrefsForNthSync(); - ASSERT_EQ(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); - - // Manually override the authenticated account ID, which should be detected - // during initialization. - transport_data_prefs.SetGaiaId("corrupt_gaia_id"); - - service()->Initialize(); - - ASSERT_EQ(SyncService::TransportState::ACTIVE, - service()->GetTransportState()); - EXPECT_NE(kTestCacheGuid, transport_data_prefs.GetCacheGuid()); - EXPECT_EQ(signin::GetTestGaiaIdForEmail(kTestUser), - transport_data_prefs.GetGaiaId()); -} - TEST_F(ProfileSyncServiceTestWithSyncInvalidationsServiceCreated, ShouldSendDataTypesToSyncInvalidationsService) { SignIn();
diff --git a/components/sync/driver/sync_auth_manager.cc b/components/sync/driver/sync_auth_manager.cc index f3a352a..22a295b 100644 --- a/components/sync/driver/sync_auth_manager.cc +++ b/components/sync/driver/sync_auth_manager.cc
@@ -156,7 +156,6 @@ const CoreAccountInfo& account_info = sync_account_.account_info; SyncCredentials credentials; - credentials.account_id = account_info.account_id; credentials.email = account_info.email; credentials.access_token = access_token_;
diff --git a/components/sync/driver/sync_auth_manager_unittest.cc b/components/sync/driver/sync_auth_manager_unittest.cc index d8efcf8..af6ceed 100644 --- a/components/sync/driver/sync_auth_manager_unittest.cc +++ b/components/sync/driver/sync_auth_manager_unittest.cc
@@ -65,7 +65,6 @@ auto auth_manager = CreateAuthManagerForLocalSync(); EXPECT_TRUE(auth_manager->GetActiveAccountInfo().account_info.IsEmpty()); syncer::SyncCredentials credentials = auth_manager->GetCredentials(); - EXPECT_TRUE(credentials.account_id.empty()); EXPECT_TRUE(credentials.email.empty()); EXPECT_TRUE(credentials.access_token.empty()); EXPECT_TRUE(auth_manager->access_token().empty());
diff --git a/components/sync/engine/DEPS b/components/sync/engine/DEPS index c6e62c89..ddb3859 100644 --- a/components/sync/engine/DEPS +++ b/components/sync/engine/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+components/signin/public/identity_manager/account_info.h", "+components/sync/base", "+components/sync/protocol", "+components/sync/test",
diff --git a/components/sync/engine/sync_credentials.h b/components/sync/engine/sync_credentials.h index 66f7fef..d5ed46a 100644 --- a/components/sync/engine/sync_credentials.h +++ b/components/sync/engine/sync_credentials.h
@@ -7,8 +7,6 @@ #include <string> -#include "google_apis/gaia/core_account_id.h" - namespace syncer { // Contains everything needed to talk to and identify a user account. @@ -17,9 +15,6 @@ SyncCredentials(const SyncCredentials& other) = default; ~SyncCredentials() = default; - // Account_id of signed in account. - CoreAccountId account_id; - // The email associated with this account. std::string email;
diff --git a/components/sync/engine/sync_engine.h b/components/sync/engine/sync_engine.h index f12ae7d..0109e59 100644 --- a/components/sync/engine/sync_engine.h +++ b/components/sync/engine/sync_engine.h
@@ -16,6 +16,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/time/time.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/sync/base/extensions_activity.h" #include "components/sync/base/model_type.h" #include "components/sync/base/weak_handle.h" @@ -26,6 +27,7 @@ #include "components/sync/engine/sync_credentials.h" #include "components/sync/engine/sync_encryption_handler.h" #include "components/sync/engine/sync_manager_factory.h" +#include "google_apis/gaia/core_account_id.h" #include "url/gurl.h" namespace syncer { @@ -59,7 +61,7 @@ WeakHandle<JsEventHandler> event_handler; GURL service_url; SyncEngine::HttpPostProviderFactoryGetter http_factory_getter; - CoreAccountId authenticated_account_id; + CoreAccountInfo authenticated_account_info; std::string invalidator_client_id; std::unique_ptr<SyncManagerFactory> sync_manager_factory; bool enable_local_sync_backend = false;
diff --git a/components/sync/engine/sync_manager.h b/components/sync/engine/sync_manager.h index e944f33..1e8d35d0 100644 --- a/components/sync/engine/sync_manager.h +++ b/components/sync/engine/sync_manager.h
@@ -110,8 +110,6 @@ // Must outlive SyncManager. ExtensionsActivity* extensions_activity; - CoreAccountId authenticated_account_id; - // Unqiuely identifies this client to the invalidation notification server. std::string invalidator_client_id;
diff --git a/components/sync/engine/sync_manager_impl.cc b/components/sync/engine/sync_manager_impl.cc index e46650a5..1ad00c7 100644 --- a/components/sync/engine/sync_manager_impl.cc +++ b/components/sync/engine/sync_manager_impl.cc
@@ -148,9 +148,6 @@ DCHECK(!args->cache_guid.empty()); DCHECK(args->post_factory); DCHECK(!args->poll_interval.is_zero()); - if (!args->enable_local_sync_backend) { - DCHECK(!args->authenticated_account_id.empty()); - } DCHECK(args->cancelation_signal); DVLOG(1) << "SyncManager starting Init..."; @@ -174,8 +171,6 @@ sync_encryption_handler_->AddObserver(&debug_info_event_listener_); sync_encryption_handler_->AddObserver(&js_sync_encryption_handler_observer_); - DVLOG(1) << "AccountId: " << args->authenticated_account_id; - allstatus_.SetHasKeystoreKey( !sync_encryption_handler_->GetKeystoreKeysHandler()->NeedKeystoreKey()); @@ -311,7 +306,7 @@ void SyncManagerImpl::UpdateCredentials(const SyncCredentials& credentials) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(initialized_); - DCHECK(!credentials.account_id.empty()); + cycle_context_->set_account_name(credentials.email); observing_network_connectivity_changes_ = true;
diff --git a/components/sync/engine/sync_manager_impl_unittest.cc b/components/sync/engine/sync_manager_impl_unittest.cc index b157639a..fecc4d0 100644 --- a/components/sync/engine/sync_manager_impl_unittest.cc +++ b/components/sync/engine/sync_manager_impl_unittest.cc
@@ -184,8 +184,6 @@ args.post_factory = std::make_unique<TestHttpPostProviderFactory>(); args.encryption_observer_proxy = std::move(encryption_observer); args.extensions_activity = extensions_activity_.get(); - if (!enable_local_sync_backend) - args.authenticated_account_id = CoreAccountId("account_id"); args.cache_guid = "fake_cache_guid"; args.invalidator_client_id = "fake_invalidator_client_id"; args.enable_local_sync_backend = enable_local_sync_backend;
diff --git a/components/sync/test/engine/fake_sync_engine.cc b/components/sync/test/engine/fake_sync_engine.cc index dabe6de..ec2f30e4 100644 --- a/components/sync/test/engine/fake_sync_engine.cc +++ b/components/sync/test/engine/fake_sync_engine.cc
@@ -35,7 +35,7 @@ void FakeSyncEngine::Initialize(InitParams params) { DCHECK(params.host); - authenticated_account_id_ = params.authenticated_account_id; + authenticated_account_id_ = params.authenticated_account_info.account_id; host_ = params.host; if (allow_init_completion_) { @@ -49,13 +49,9 @@ void FakeSyncEngine::TriggerRefresh(const ModelTypeSet& types) {} -void FakeSyncEngine::UpdateCredentials(const SyncCredentials& credentials) { - authenticated_account_id_ = credentials.account_id; -} +void FakeSyncEngine::UpdateCredentials(const SyncCredentials& credentials) {} -void FakeSyncEngine::InvalidateCredentials() { - authenticated_account_id_ = CoreAccountId(); -} +void FakeSyncEngine::InvalidateCredentials() {} std::string FakeSyncEngine::GetCacheGuid() const { return "fake_engine_cache_guid";
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc index 510ab967..4addf978 100644 --- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc +++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -223,12 +223,22 @@ // If the current_image_ is nullptr, it means there is no change on the // primary plane. So we just need to schedule the last submitted image. auto* image = current_image_ ? current_image_ : submitted_image_; + // |image| can be null if there was a fullscreen overlay last frame (e.g. + // no primary plane). If the fullscreen quad suddenly fails the fullscreen + // overlay check this frame (e.g. TestPageFlip failing) and then gets + // promoted via a different strategy like single-on-top, the quad's damage + // is still removed from the primary plane's damage. With no damage, we + // never invoke |BeginPaint| which initializes a new image. Since there + // still really isn't any primary plane content, it's fine to early-exit. + if (!image && primary_plane_waiting_on_paint_) + return; DCHECK(image); image->BeginPresent(); presenter_->SchedulePrimaryPlane(plane.value(), image, image == submitted_image_); } else { + primary_plane_waiting_on_paint_ = true; current_frame_has_no_primary_plane_ = true; // Even if there is no primary plane, |current_image_| may be non-null if // an overlay just transitioned from an underlay strategy to a fullscreen @@ -535,6 +545,7 @@ SkSurface* SkiaOutputDeviceBufferQueue::BeginPaint( std::vector<GrBackendSemaphore>* end_semaphores) { + primary_plane_waiting_on_paint_ = false; if (!current_image_) current_image_ = GetNextImage(); if (!current_image_->sk_surface())
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.h b/components/viz/service/display_embedder/skia_output_device_buffer_queue.h index 05ca1cd..4e7c76ad 100644 --- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.h +++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.h
@@ -135,6 +135,9 @@ std::unique_ptr<OutputPresenter::Image> background_image_ = nullptr; // Set to true if background has been scheduled in a frame. bool background_image_is_scheduled_ = false; + // Whether |SchedulePrimaryPlane| needs to wait for a paint before scheduling + // This works around an edge case for unpromoting fullscreen quads. + bool primary_plane_waiting_on_paint_ = false; }; } // namespace viz
diff --git a/components/webapps/browser/BUILD.gn b/components/webapps/browser/BUILD.gn index 98f6437..fb0292a 100644 --- a/components/webapps/browser/BUILD.gn +++ b/components/webapps/browser/BUILD.gn
@@ -47,12 +47,18 @@ if (is_android) { sources += [ + "android/add_to_homescreen_coordinator.cc", + "android/add_to_homescreen_coordinator.h", "android/add_to_homescreen_data_fetcher.cc", "android/add_to_homescreen_data_fetcher.h", "android/add_to_homescreen_installer.cc", "android/add_to_homescreen_installer.h", + "android/add_to_homescreen_mediator.cc", + "android/add_to_homescreen_mediator.h", "android/add_to_homescreen_params.cc", "android/add_to_homescreen_params.h", + "android/app_banner_manager_android.cc", + "android/app_banner_manager_android.h", "android/features.cc", "android/features.h", "android/installable/installable_ambient_badge_infobar.cc", @@ -75,9 +81,13 @@ "//components/favicon/content", "//components/favicon/core", "//components/favicon_base", + "//components/feature_engagement", "//components/infobars/android", "//components/infobars/content", "//components/strings", + "//components/url_formatter", + "//components/version_info", + "//components/version_info/android:channel_getter", "//components/webapps/common:mojo_bindings", "//services/device/public/mojom", "//ui/base",
diff --git a/components/webapps/browser/android/BUILD.gn b/components/webapps/browser/android/BUILD.gn index fb2d71a5..06f6bc7 100644 --- a/components/webapps/browser/android/BUILD.gn +++ b/components/webapps/browser/android/BUILD.gn
@@ -4,11 +4,20 @@ import("//build/config/android/config.gni") import("//build/config/android/rules.gni") +import("//build/config/locales.gni") +import("//tools/grit/grit_rule.gni") android_library("java") { resources_package = "org.chromium.components.webapps" sources = [ + "java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java", + "java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java", "java/src/org/chromium/components/webapps/AddToHomescreenInstaller.java", + "java/src/org/chromium/components/webapps/AddToHomescreenMediator.java", + "java/src/org/chromium/components/webapps/AddToHomescreenProperties.java", + "java/src/org/chromium/components/webapps/AddToHomescreenViewBinder.java", + "java/src/org/chromium/components/webapps/AddToHomescreenViewDelegate.java", + "java/src/org/chromium/components/webapps/AppBannerManager.java", "java/src/org/chromium/components/webapps/AppData.java", "java/src/org/chromium/components/webapps/AppDetailsDelegate.java", "java/src/org/chromium/components/webapps/WebappsIconUtils.java", @@ -25,6 +34,7 @@ "//content/public/android:content_java", "//third_party/android_deps:androidx_annotation_annotation_java", "//ui/android:ui_no_recycler_view_java", + "//url:gurl_java", ] srcjar_deps = [ ":webapps_java_enums_srcjar" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] @@ -32,7 +42,10 @@ generate_jni("webapps_jni_headers") { sources = [ + "java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java", "java/src/org/chromium/components/webapps/AddToHomescreenInstaller.java", + "java/src/org/chromium/components/webapps/AddToHomescreenMediator.java", + "java/src/org/chromium/components/webapps/AppBannerManager.java", "java/src/org/chromium/components/webapps/WebappsIconUtils.java", "java/src/org/chromium/components/webapps/WebappsUtils.java", "java/src/org/chromium/components/webapps/installable/InstallableAmbientBadgeInfoBar.java", @@ -49,14 +62,45 @@ android_resources("java_resources") { sources = [ + "java/res/drawable-hdpi/google_play.png", + "java/res/drawable-hdpi/star_gray.png", + "java/res/drawable-hdpi/star_green.png", + "java/res/drawable-mdpi/google_play.png", + "java/res/drawable-mdpi/star_gray.png", + "java/res/drawable-mdpi/star_green.png", + "java/res/drawable-xhdpi/google_play.png", + "java/res/drawable-xhdpi/star_gray.png", + "java/res/drawable-xhdpi/star_green.png", + "java/res/drawable-xxhdpi/google_play.png", + "java/res/drawable-xxhdpi/star_gray.png", + "java/res/drawable-xxhdpi/star_green.png", + "java/res/drawable-xxxhdpi/google_play.png", + "java/res/drawable-xxxhdpi/star_gray.png", + "java/res/drawable-xxxhdpi/star_green.png", + "java/res/drawable/rating_bar.xml", + "java/res/layout/add_to_homescreen_dialog.xml", "java/res/mipmap-hdpi/shortcut_icon_shadow.png", "java/res/mipmap-mdpi/shortcut_icon_shadow.png", "java/res/mipmap-xhdpi/shortcut_icon_shadow.png", "java/res/mipmap-xxhdpi/shortcut_icon_shadow.png", "java/res/mipmap-xxxhdpi/shortcut_icon_shadow.png", "java/res/values/dimens.xml", + "java/res/values/styles.xml", ] - deps = [ "//components/webapk/android/libs/common:splash_resources" ] + deps = [ + ":webapps_strings_grd", + "//components/browser_ui/strings/android:browser_ui_strings_grd", + "//components/browser_ui/styles/android:java_resources", + "//components/webapk/android/libs/common:splash_resources", + ] +} + +java_strings_grd("webapps_strings_grd") { + grd_file = "android_webapps_strings.grd" + outputs = [ "values/android_webapps_strings.xml" ] + + process_file_template( + android_bundle_locales_as_resources, + [ "values-{{source_name_part}}/android_webapps_strings.xml" ]) } source_set("unit_tests") { @@ -80,3 +124,26 @@ "//url", ] } + +java_library("junit") { + # Skip platform checks since Robolectric depends on requires_android targets. + bypass_platform_checks = true + testonly = true + sources = [ + "java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java", + "java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java", + "java/src/org/chromium/components/webapps/AddToHomescreenViewBinderTest.java", + ] + deps = [ + ":java", + "//base:base_java", + "//base:base_java_test_support", + "//base:base_junit_test_support", + "//base/test:test_support_java", + "//third_party/android_deps:androidx_test_runner_java", + "//third_party/android_deps:robolectric_all_java", + "//third_party/junit", + "//third_party/mockito:mockito_java", + "//ui/android:ui_no_recycler_view_java", + ] +}
diff --git a/components/webapps/browser/android/DEPS b/components/webapps/browser/android/DEPS index 5ff2298..77f7601e 100644 --- a/components/webapps/browser/android/DEPS +++ b/components/webapps/browser/android/DEPS
@@ -4,7 +4,10 @@ "+components/favicon/content", "+components/favicon/core", "+components/favicon_base", + "+components/feature_engagement", "+components/strings", + "+components/url_formatter", + "+components/version_info", "+components/webapk/android/libs/client", "+content/public/android", "+content/public/test",
diff --git a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc b/components/webapps/browser/android/add_to_homescreen_coordinator.cc similarity index 83% rename from chrome/browser/android/webapps/add_to_homescreen_coordinator.cc rename to components/webapps/browser/android/add_to_homescreen_coordinator.cc index d9c0b4d5..bc6f08f 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_coordinator.cc +++ b/components/webapps/browser/android/add_to_homescreen_coordinator.cc
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/webapps/add_to_homescreen_coordinator.h" +#include "components/webapps/browser/android/add_to_homescreen_coordinator.h" #include <utility> #include "base/callback.h" #include "base/memory/weak_ptr.h" -#include "chrome/android/chrome_jni_headers/AddToHomescreenCoordinator_jni.h" -#include "chrome/browser/android/webapps/add_to_homescreen_mediator.h" #include "components/webapps/browser/android/add_to_homescreen_installer.h" +#include "components/webapps/browser/android/add_to_homescreen_mediator.h" #include "components/webapps/browser/android/add_to_homescreen_params.h" +#include "components/webapps/browser/android/webapps_jni_headers/AddToHomescreenCoordinator_jni.h" #include "components/webapps/browser/banners/app_banner_manager.h" #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/android/webapps/add_to_homescreen_coordinator.h b/components/webapps/browser/android/add_to_homescreen_coordinator.h similarity index 83% rename from chrome/browser/android/webapps/add_to_homescreen_coordinator.h rename to components/webapps/browser/android/add_to_homescreen_coordinator.h index ca34fe8..a40077b 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_coordinator.h +++ b/components/webapps/browser/android/add_to_homescreen_coordinator.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 CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_COORDINATOR_H_ -#define CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_COORDINATOR_H_ +#ifndef COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_COORDINATOR_H_ +#define COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_COORDINATOR_H_ #include <memory> @@ -36,4 +36,4 @@ } // namespace webapps -#endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_COORDINATOR_H_ +#endif // COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_COORDINATOR_H_
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc b/components/webapps/browser/android/add_to_homescreen_mediator.cc similarity index 96% rename from chrome/browser/android/webapps/add_to_homescreen_mediator.cc rename to components/webapps/browser/android/add_to_homescreen_mediator.cc index 420994b..bfc4332d 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_mediator.cc +++ b/components/webapps/browser/android/add_to_homescreen_mediator.cc
@@ -2,17 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/android/webapps/add_to_homescreen_mediator.h" +#include "components/webapps/browser/android/add_to_homescreen_mediator.h" #include <utility> #include "base/android/jni_string.h" #include "base/metrics/histogram_macros.h" -#include "chrome/android/chrome_jni_headers/AddToHomescreenMediator_jni.h" -#include "chrome/browser/android/webapk/webapk_metrics.h" -#include "chrome/browser/banners/app_banner_manager_android.h" #include "components/url_formatter/elide_url.h" #include "components/webapps/browser/android/add_to_homescreen_params.h" +#include "components/webapps/browser/android/app_banner_manager_android.h" +#include "components/webapps/browser/android/webapps_jni_headers/AddToHomescreenMediator_jni.h" #include "components/webapps/browser/banners/app_banner_metrics.h" #include "components/webapps/browser/banners/app_banner_settings_helper.h" #include "components/webapps/browser/installable/installable_metrics.h"
diff --git a/chrome/browser/android/webapps/add_to_homescreen_mediator.h b/components/webapps/browser/android/add_to_homescreen_mediator.h similarity index 92% rename from chrome/browser/android/webapps/add_to_homescreen_mediator.h rename to components/webapps/browser/android/add_to_homescreen_mediator.h index a9a6f29..0156679 100644 --- a/chrome/browser/android/webapps/add_to_homescreen_mediator.h +++ b/components/webapps/browser/android/add_to_homescreen_mediator.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 CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_MEDIATOR_H_ -#define CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_MEDIATOR_H_ +#ifndef COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_MEDIATOR_H_ +#define COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_MEDIATOR_H_ #include <memory> @@ -28,7 +28,7 @@ class AddToHomescreenInstaller; // AddToHomescreenMediator is the C++ counterpart of -// org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenMediator +// org.chromium.components.webapps.addtohomescreen.AddToHomescreenMediator // in Java. It uses AddToHomescreenInstaller for installing the current app. // This class is owned, constructed, and destroyed by its Java counter-part. class AddToHomescreenMediator : public AddToHomescreenDataFetcher::Observer { @@ -113,4 +113,4 @@ } // namespace webapps -#endif // CHROME_BROWSER_ANDROID_WEBAPPS_ADD_TO_HOMESCREEN_MEDIATOR_H_ +#endif // COMPONENTS_WEBAPPS_BROWSER_ANDROID_ADD_TO_HOMESCREEN_MEDIATOR_H_
diff --git a/components/webapps/browser/android/android_webapps_strings.grd b/components/webapps/browser/android/android_webapps_strings.grd new file mode 100644 index 0000000..3c482955 --- /dev/null +++ b/components/webapps/browser/android/android_webapps_strings.grd
@@ -0,0 +1,189 @@ +<?xml version="1.0" encoding="utf-8"?> + +<grit latest_public_release="0" current_release="1" + output_all_resource_defines="false" source_lang_id="en" enc_check="möl"> + <outputs> + <output filename="values-af/android_webapps_strings.xml" lang="af" type="android" /> + <output filename="values-am/android_webapps_strings.xml" lang="am" type="android" /> + <output filename="values-ar/android_webapps_strings.xml" lang="ar" type="android" /> + <output filename="values-as/android_webapps_strings.xml" lang="as" type="android" /> + <output filename="values-az/android_webapps_strings.xml" lang="az" type="android" /> + <output filename="values-be/android_webapps_strings.xml" lang="be" type="android" /> + <output filename="values-bg/android_webapps_strings.xml" lang="bg" type="android" /> + <output filename="values-bn/android_webapps_strings.xml" lang="bn" type="android" /> + <output filename="values-bs/android_webapps_strings.xml" lang="bs" type="android" /> + <output filename="values-ca/android_webapps_strings.xml" lang="ca" type="android" /> + <output filename="values-cs/android_webapps_strings.xml" lang="cs" type="android" /> + <output filename="values-da/android_webapps_strings.xml" lang="da" type="android" /> + <output filename="values-de/android_webapps_strings.xml" lang="de" type="android" /> + <output filename="values-el/android_webapps_strings.xml" lang="el" type="android" /> + <output filename="values/android_webapps_strings.xml" lang="en" type="android" /> + <output filename="values-en-rGB/android_webapps_strings.xml" lang="en-GB" type="android" /> + <output filename="values-es/android_webapps_strings.xml" lang="es" type="android" /> + <output filename="values-es-rUS/android_webapps_strings.xml" lang="es-419" type="android" /> + <output filename="values-et/android_webapps_strings.xml" lang="et" type="android" /> + <output filename="values-eu/android_webapps_strings.xml" lang="eu" type="android" /> + <output filename="values-fa/android_webapps_strings.xml" lang="fa" type="android" /> + <output filename="values-fi/android_webapps_strings.xml" lang="fi" type="android" /> + <output filename="values-tl/android_webapps_strings.xml" lang="fil" type="android" /> + <output filename="values-fr/android_webapps_strings.xml" lang="fr" type="android" /> + <output filename="values-fr-rCA/android_webapps_strings.xml" lang="fr-CA" type="android" /> + <output filename="values-gl/android_webapps_strings.xml" lang="gl" type="android" /> + <output filename="values-gu/android_webapps_strings.xml" lang="gu" type="android" /> + <output filename="values-hi/android_webapps_strings.xml" lang="hi" type="android" /> + <output filename="values-hr/android_webapps_strings.xml" lang="hr" type="android" /> + <output filename="values-hu/android_webapps_strings.xml" lang="hu" type="android" /> + <output filename="values-hy/android_webapps_strings.xml" lang="hy" type="android" /> + <output filename="values-in/android_webapps_strings.xml" lang="id" type="android" /> + <output filename="values-is/android_webapps_strings.xml" lang="is" type="android" /> + <output filename="values-it/android_webapps_strings.xml" lang="it" type="android" /> + <output filename="values-iw/android_webapps_strings.xml" lang="iw" type="android" /> + <output filename="values-ja/android_webapps_strings.xml" lang="ja" type="android" /> + <output filename="values-ka/android_webapps_strings.xml" lang="ka" type="android" /> + <output filename="values-kk/android_webapps_strings.xml" lang="kk" type="android" /> + <output filename="values-km/android_webapps_strings.xml" lang="km" type="android" /> + <output filename="values-kn/android_webapps_strings.xml" lang="kn" type="android" /> + <output filename="values-ko/android_webapps_strings.xml" lang="ko" type="android" /> + <output filename="values-ky/android_webapps_strings.xml" lang="ky" type="android" /> + <output filename="values-lo/android_webapps_strings.xml" lang="lo" type="android" /> + <output filename="values-lt/android_webapps_strings.xml" lang="lt" type="android" /> + <output filename="values-lv/android_webapps_strings.xml" lang="lv" type="android" /> + <output filename="values-mk/android_webapps_strings.xml" lang="mk" type="android" /> + <output filename="values-ml/android_webapps_strings.xml" lang="ml" type="android" /> + <output filename="values-mn/android_webapps_strings.xml" lang="mn" type="android" /> + <output filename="values-mr/android_webapps_strings.xml" lang="mr" type="android" /> + <output filename="values-ms/android_webapps_strings.xml" lang="ms" type="android" /> + <output filename="values-my/android_webapps_strings.xml" lang="my" type="android" /> + <output filename="values-ne/android_webapps_strings.xml" lang="ne" type="android" /> + <output filename="values-nl/android_webapps_strings.xml" lang="nl" type="android" /> + <output filename="values-nb/android_webapps_strings.xml" lang="no" type="android" /> + <output filename="values-or/android_webapps_strings.xml" lang="or" type="android" /> + <output filename="values-pa/android_webapps_strings.xml" lang="pa" type="android" /> + <output filename="values-pl/android_webapps_strings.xml" lang="pl" type="android" /> + <output filename="values-pt-rBR/android_webapps_strings.xml" lang="pt-BR" type="android" /> + <output filename="values-pt-rPT/android_webapps_strings.xml" lang="pt-PT" type="android" /> + <output filename="values-ro/android_webapps_strings.xml" lang="ro" type="android" /> + <output filename="values-ru/android_webapps_strings.xml" lang="ru" type="android" /> + <output filename="values-si/android_webapps_strings.xml" lang="si" type="android" /> + <output filename="values-sk/android_webapps_strings.xml" lang="sk" type="android" /> + <output filename="values-sl/android_webapps_strings.xml" lang="sl" type="android" /> + <output filename="values-sq/android_webapps_strings.xml" lang="sq" type="android" /> + <output filename="values-sr/android_webapps_strings.xml" lang="sr" type="android" /> + <output filename="values-b+sr+Latn/android_webapps_strings.xml" lang="sr-Latn" type="android" /> + <output filename="values-sv/android_webapps_strings.xml" lang="sv" type="android" /> + <output filename="values-sw/android_webapps_strings.xml" lang="sw" type="android" /> + <output filename="values-ta/android_webapps_strings.xml" lang="ta" type="android" /> + <output filename="values-te/android_webapps_strings.xml" lang="te" type="android" /> + <output filename="values-th/android_webapps_strings.xml" lang="th" type="android" /> + <output filename="values-tr/android_webapps_strings.xml" lang="tr" type="android" /> + <output filename="values-uk/android_webapps_strings.xml" lang="uk" type="android" /> + <output filename="values-ur/android_webapps_strings.xml" lang="ur" type="android" /> + <output filename="values-uz/android_webapps_strings.xml" lang="uz" type="android" /> + <output filename="values-vi/android_webapps_strings.xml" lang="vi" type="android" /> + <output filename="values-zh-rCN/android_webapps_strings.xml" lang="zh-CN" type="android" /> + <output filename="values-zh-rHK/android_webapps_strings.xml" lang="zh-HK" type="android" /> + <output filename="values-zh-rTW/android_webapps_strings.xml" lang="zh-TW" type="android" /> + <output filename="values-zu/android_webapps_strings.xml" lang="zu" type="android" /> + </outputs> + <translations> + <file lang="af" path="translations/android_webapps_strings_af.xtb" /> + <file lang="am" path="translations/android_webapps_strings_am.xtb" /> + <file lang="ar" path="translations/android_webapps_strings_ar.xtb" /> + <file lang="as" path="translations/android_webapps_strings_as.xtb" /> + <file lang="az" path="translations/android_webapps_strings_az.xtb" /> + <file lang="be" path="translations/android_webapps_strings_be.xtb" /> + <file lang="bg" path="translations/android_webapps_strings_bg.xtb" /> + <file lang="bn" path="translations/android_webapps_strings_bn.xtb" /> + <file lang="bs" path="translations/android_webapps_strings_bs.xtb" /> + <file lang="ca" path="translations/android_webapps_strings_ca.xtb" /> + <file lang="cs" path="translations/android_webapps_strings_cs.xtb" /> + <file lang="da" path="translations/android_webapps_strings_da.xtb" /> + <file lang="de" path="translations/android_webapps_strings_de.xtb" /> + <file lang="el" path="translations/android_webapps_strings_el.xtb" /> + <file lang="en-GB" path="translations/android_webapps_strings_en-GB.xtb" /> + <file lang="es" path="translations/android_webapps_strings_es.xtb" /> + <file lang="es-419" path="translations/android_webapps_strings_es-419.xtb" /> + <file lang="et" path="translations/android_webapps_strings_et.xtb" /> + <file lang="eu" path="translations/android_webapps_strings_eu.xtb" /> + <file lang="fa" path="translations/android_webapps_strings_fa.xtb" /> + <file lang="fi" path="translations/android_webapps_strings_fi.xtb" /> + <file lang="fil" path="translations/android_webapps_strings_fil.xtb" /> + <file lang="fr" path="translations/android_webapps_strings_fr.xtb" /> + <file lang="fr-CA" path="translations/android_webapps_strings_fr-CA.xtb" /> + <file lang="gl" path="translations/android_webapps_strings_gl.xtb" /> + <file lang="gu" path="translations/android_webapps_strings_gu.xtb" /> + <file lang="hi" path="translations/android_webapps_strings_hi.xtb" /> + <file lang="hr" path="translations/android_webapps_strings_hr.xtb" /> + <file lang="hu" path="translations/android_webapps_strings_hu.xtb" /> + <file lang="hy" path="translations/android_webapps_strings_hy.xtb" /> + <file lang="id" path="translations/android_webapps_strings_id.xtb" /> + <file lang="is" path="translations/android_webapps_strings_is.xtb" /> + <file lang="it" path="translations/android_webapps_strings_it.xtb" /> + <file lang="iw" path="translations/android_webapps_strings_iw.xtb" /> + <file lang="ja" path="translations/android_webapps_strings_ja.xtb" /> + <file lang="ka" path="translations/android_webapps_strings_ka.xtb" /> + <file lang="kk" path="translations/android_webapps_strings_kk.xtb" /> + <file lang="km" path="translations/android_webapps_strings_km.xtb" /> + <file lang="kn" path="translations/android_webapps_strings_kn.xtb" /> + <file lang="ko" path="translations/android_webapps_strings_ko.xtb" /> + <file lang="ky" path="translations/android_webapps_strings_ky.xtb" /> + <file lang="lo" path="translations/android_webapps_strings_lo.xtb" /> + <file lang="lt" path="translations/android_webapps_strings_lt.xtb" /> + <file lang="lv" path="translations/android_webapps_strings_lv.xtb" /> + <file lang="mk" path="translations/android_webapps_strings_mk.xtb" /> + <file lang="ml" path="translations/android_webapps_strings_ml.xtb" /> + <file lang="mn" path="translations/android_webapps_strings_mn.xtb" /> + <file lang="mr" path="translations/android_webapps_strings_mr.xtb" /> + <file lang="ms" path="translations/android_webapps_strings_ms.xtb" /> + <file lang="my" path="translations/android_webapps_strings_my.xtb" /> + <file lang="ne" path="translations/android_webapps_strings_ne.xtb" /> + <file lang="nl" path="translations/android_webapps_strings_nl.xtb" /> + <file lang="no" path="translations/android_webapps_strings_no.xtb" /> + <file lang="or" path="translations/android_webapps_strings_or.xtb" /> + <file lang="pa" path="translations/android_webapps_strings_pa.xtb" /> + <file lang="pl" path="translations/android_webapps_strings_pl.xtb" /> + <file lang="pt-BR" path="translations/android_webapps_strings_pt-BR.xtb" /> + <file lang="pt-PT" path="translations/android_webapps_strings_pt-PT.xtb" /> + <file lang="ro" path="translations/android_webapps_strings_ro.xtb" /> + <file lang="ru" path="translations/android_webapps_strings_ru.xtb" /> + <file lang="si" path="translations/android_webapps_strings_si.xtb" /> + <file lang="sk" path="translations/android_webapps_strings_sk.xtb" /> + <file lang="sl" path="translations/android_webapps_strings_sl.xtb" /> + <file lang="sq" path="translations/android_webapps_strings_sq.xtb" /> + <file lang="sr" path="translations/android_webapps_strings_sr.xtb" /> + <file lang="sr-Latn" path="translations/android_webapps_strings_sr-Latn.xtb" /> + <file lang="sv" path="translations/android_webapps_strings_sv.xtb" /> + <file lang="sw" path="translations/android_webapps_strings_sw.xtb" /> + <file lang="ta" path="translations/android_webapps_strings_ta.xtb" /> + <file lang="te" path="translations/android_webapps_strings_te.xtb" /> + <file lang="th" path="translations/android_webapps_strings_th.xtb" /> + <file lang="tr" path="translations/android_webapps_strings_tr.xtb" /> + <file lang="uk" path="translations/android_webapps_strings_uk.xtb" /> + <file lang="ur" path="translations/android_webapps_strings_ur.xtb" /> + <file lang="uz" path="translations/android_webapps_strings_uz.xtb" /> + <file lang="vi" path="translations/android_webapps_strings_vi.xtb" /> + <file lang="zh-CN" path="translations/android_webapps_strings_zh-CN.xtb" /> + <file lang="zh-HK" path="translations/android_webapps_strings_zh-HK.xtb" /> + <file lang="zh-TW" path="translations/android_webapps_strings_zh-TW.xtb" /> + <file lang="zu" path="translations/android_webapps_strings_zu.xtb" /> + </translations> + <release allow_pseudo="false" seq="1"> + <messages fallback_to_english="true"> + <!-- App banner accessibility string, used for touch exploration --> + <message name="IDS_APP_BANNER_VIEW_NATIVE_APP_INSTALL_ACCESSIBILITY" desc="Accessibility text: Indicates that clicking on the button will either purchase the app or install it."> + Get the app from the Google Play Store: <ph name="APP_ACTION">%s<ex>Install</ex></ph> + </message> + + <message name="IDS_APP_BANNER_INSTALL" desc="A button in an app banner to confirm adding a site to homescreen"> + Install + </message> + + <message name="IDS_MENU_ADD_TO_HOMESCREEN" desc="Menu item for adding a shortcut to the Home screen (default title). [CHAR-LIMIT=27]"> + Add to Home screen + </message> + <message name="IDS_MENU_ADD_TO_HOMESCREEN_INSTALL" desc="Menu item for adding a shortcut to the Home screen. [CHAR-LIMIT=27]"> + Install app + </message> + </messages> + </release> +</grit>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_HOMESCREEN_INSTALL.png.sha1 b/components/webapps/browser/android/android_webapps_strings_grd/IDS_MENU_ADD_TO_HOMESCREEN_INSTALL.png.sha1 similarity index 100% rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_HOMESCREEN_INSTALL.png.sha1 rename to components/webapps/browser/android/android_webapps_strings_grd/IDS_MENU_ADD_TO_HOMESCREEN_INSTALL.png.sha1
diff --git a/chrome/browser/banners/app_banner_manager_android.cc b/components/webapps/browser/android/app_banner_manager_android.cc similarity index 95% rename from chrome/browser/banners/app_banner_manager_android.cc rename to components/webapps/browser/android/app_banner_manager_android.cc index 5c1e6c09..6fcf084 100644 --- a/chrome/browser/banners/app_banner_manager_android.cc +++ b/components/webapps/browser/android/app_banner_manager_android.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 "chrome/browser/banners/app_banner_manager_android.h" +#include "components/webapps/browser/android/app_banner_manager_android.h" #include "base/android/jni_android.h" #include "base/android/jni_string.h" @@ -13,8 +13,6 @@ #include "base/strings/string16.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/android/webapps/add_to_homescreen_coordinator.h" -#include "chrome/browser/banners/android/jni_headers/AppBannerManager_jni.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/tracker.h" #include "components/infobars/content/content_infobar_manager.h" @@ -23,10 +21,12 @@ #include "components/version_info/android/channel_getter.h" #include "components/version_info/channel.h" #include "components/version_info/version_info.h" +#include "components/webapps/browser/android/add_to_homescreen_coordinator.h" #include "components/webapps/browser/android/add_to_homescreen_params.h" #include "components/webapps/browser/android/features.h" #include "components/webapps/browser/android/shortcut_info.h" #include "components/webapps/browser/android/webapps_icon_utils.h" +#include "components/webapps/browser/android/webapps_jni_headers/AppBannerManager_jni.h" #include "components/webapps/browser/android/webapps_utils.h" #include "components/webapps/browser/banners/app_banner_metrics.h" #include "components/webapps/browser/banners/app_banner_settings_helper.h" @@ -267,12 +267,12 @@ break; case AddToHomescreenInstaller::Event::UI_SHOWN: - RecordDidShowBanner(); - TrackDisplayEvent(a2hs_params.app_type == - AddToHomescreenParams::AppType::NATIVE - ? DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED - : DISPLAY_EVENT_WEB_APP_BANNER_CREATED); - break; + RecordDidShowBanner(); + TrackDisplayEvent(a2hs_params.app_type == + AddToHomescreenParams::AppType::NATIVE + ? DISPLAY_EVENT_NATIVE_APP_BANNER_CREATED + : DISPLAY_EVENT_WEB_APP_BANNER_CREATED); + break; case AddToHomescreenInstaller::Event::UI_CANCELLED: TrackDismissEvent(DISMISS_EVENT_DISMISSED); @@ -352,10 +352,11 @@ // AppBannerManager#fetchAppDetails() only works on Beta and Stable because // the called Google Play API uses an old way of checking whether the Chrome // app is first party. See http://b/147780265 - // Run AppBannerManager#fetchAppDetails() for local builds regardless of Android channel to avoid - // having to set android_channel GN flag for manual testing. Do not run - // AppBannerManager#fetchAppDetails() for non-official local builds to ensure that tests use - // gIgnoreChromeChannelForTesting rather than relying on the local build exemption. + // Run AppBannerManager#fetchAppDetails() for local builds regardless of + // Android channel to avoid having to set android_channel GN flag for manual + // testing. Do not run AppBannerManager#fetchAppDetails() for non-official + // local builds to ensure that tests use gIgnoreChromeChannelForTesting rather + // than relying on the local build exemption. version_info::Channel channel = version_info::android::GetChannel(); bool local_build = channel == version_info::Channel::UNKNOWN && version_info::IsOfficialBuild();
diff --git a/chrome/browser/banners/app_banner_manager_android.h b/components/webapps/browser/android/app_banner_manager_android.h similarity index 96% rename from chrome/browser/banners/app_banner_manager_android.h rename to components/webapps/browser/android/app_banner_manager_android.h index 9143f66f..4387c31 100644 --- a/chrome/browser/banners/app_banner_manager_android.h +++ b/components/webapps/browser/android/app_banner_manager_android.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 CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_ANDROID_H_ -#define CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_ANDROID_H_ +#ifndef COMPONENTS_WEBAPPS_BROWSER_ANDROID_APP_BANNER_MANAGER_ANDROID_H_ +#define COMPONENTS_WEBAPPS_BROWSER_ANDROID_APP_BANNER_MANAGER_ANDROID_H_ #include <map> #include <memory> @@ -179,4 +179,4 @@ } // namespace webapps -#endif // CHROME_BROWSER_BANNERS_APP_BANNER_MANAGER_ANDROID_H_ +#endif // COMPONENTS_WEBAPPS_BROWSER_ANDROID_APP_BANNER_MANAGER_ANDROID_H_
diff --git a/chrome/android/java/res/drawable-hdpi/google_play.png b/components/webapps/browser/android/java/res/drawable-hdpi/google_play.png similarity index 100% rename from chrome/android/java/res/drawable-hdpi/google_play.png rename to components/webapps/browser/android/java/res/drawable-hdpi/google_play.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/star_gray.png b/components/webapps/browser/android/java/res/drawable-hdpi/star_gray.png similarity index 100% rename from chrome/android/java/res/drawable-hdpi/star_gray.png rename to components/webapps/browser/android/java/res/drawable-hdpi/star_gray.png Binary files differ
diff --git a/chrome/android/java/res/drawable-hdpi/star_green.png b/components/webapps/browser/android/java/res/drawable-hdpi/star_green.png similarity index 100% rename from chrome/android/java/res/drawable-hdpi/star_green.png rename to components/webapps/browser/android/java/res/drawable-hdpi/star_green.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/google_play.png b/components/webapps/browser/android/java/res/drawable-mdpi/google_play.png similarity index 100% rename from chrome/android/java/res/drawable-mdpi/google_play.png rename to components/webapps/browser/android/java/res/drawable-mdpi/google_play.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/star_gray.png b/components/webapps/browser/android/java/res/drawable-mdpi/star_gray.png similarity index 100% rename from chrome/android/java/res/drawable-mdpi/star_gray.png rename to components/webapps/browser/android/java/res/drawable-mdpi/star_gray.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/star_green.png b/components/webapps/browser/android/java/res/drawable-mdpi/star_green.png similarity index 100% rename from chrome/android/java/res/drawable-mdpi/star_green.png rename to components/webapps/browser/android/java/res/drawable-mdpi/star_green.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/google_play.png b/components/webapps/browser/android/java/res/drawable-xhdpi/google_play.png similarity index 100% rename from chrome/android/java/res/drawable-xhdpi/google_play.png rename to components/webapps/browser/android/java/res/drawable-xhdpi/google_play.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/star_gray.png b/components/webapps/browser/android/java/res/drawable-xhdpi/star_gray.png similarity index 100% rename from chrome/android/java/res/drawable-xhdpi/star_gray.png rename to components/webapps/browser/android/java/res/drawable-xhdpi/star_gray.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/star_green.png b/components/webapps/browser/android/java/res/drawable-xhdpi/star_green.png similarity index 100% rename from chrome/android/java/res/drawable-xhdpi/star_green.png rename to components/webapps/browser/android/java/res/drawable-xhdpi/star_green.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/google_play.png b/components/webapps/browser/android/java/res/drawable-xxhdpi/google_play.png similarity index 100% rename from chrome/android/java/res/drawable-xxhdpi/google_play.png rename to components/webapps/browser/android/java/res/drawable-xxhdpi/google_play.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/star_gray.png b/components/webapps/browser/android/java/res/drawable-xxhdpi/star_gray.png similarity index 100% rename from chrome/android/java/res/drawable-xxhdpi/star_gray.png rename to components/webapps/browser/android/java/res/drawable-xxhdpi/star_gray.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/star_green.png b/components/webapps/browser/android/java/res/drawable-xxhdpi/star_green.png similarity index 100% rename from chrome/android/java/res/drawable-xxhdpi/star_green.png rename to components/webapps/browser/android/java/res/drawable-xxhdpi/star_green.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/google_play.png b/components/webapps/browser/android/java/res/drawable-xxxhdpi/google_play.png similarity index 100% rename from chrome/android/java/res/drawable-xxxhdpi/google_play.png rename to components/webapps/browser/android/java/res/drawable-xxxhdpi/google_play.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/star_gray.png b/components/webapps/browser/android/java/res/drawable-xxxhdpi/star_gray.png similarity index 100% rename from chrome/android/java/res/drawable-xxxhdpi/star_gray.png rename to components/webapps/browser/android/java/res/drawable-xxxhdpi/star_gray.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/star_green.png b/components/webapps/browser/android/java/res/drawable-xxxhdpi/star_green.png similarity index 100% rename from chrome/android/java/res/drawable-xxxhdpi/star_green.png rename to components/webapps/browser/android/java/res/drawable-xxxhdpi/star_green.png Binary files differ
diff --git a/chrome/android/java/res/drawable/rating_bar.xml b/components/webapps/browser/android/java/res/drawable/rating_bar.xml similarity index 100% rename from chrome/android/java/res/drawable/rating_bar.xml rename to components/webapps/browser/android/java/res/drawable/rating_bar.xml
diff --git a/chrome/android/java/res/layout/add_to_homescreen_dialog.xml b/components/webapps/browser/android/java/res/layout/add_to_homescreen_dialog.xml similarity index 100% rename from chrome/android/java/res/layout/add_to_homescreen_dialog.xml rename to components/webapps/browser/android/java/res/layout/add_to_homescreen_dialog.xml
diff --git a/components/webapps/browser/android/java/res/values/styles.xml b/components/webapps/browser/android/java/res/values/styles.xml new file mode 100644 index 0000000..19a74e4 --- /dev/null +++ b/components/webapps/browser/android/java/res/values/styles.xml
@@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2021 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. --> + +<resources xmlns:tools="http://schemas.android.com/tools"> + <style name="TextAppearance.AddToHomeScreenEditText"> + <item name="android:textSize">18sp</item> + </style> + <style name="TextAppearance.AddToHomeScreenWebAppName" + parent="TextAppearance.TextLarge.Primary"> + <item name="android:textSize">20sp</item> + </style> +</resources>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java similarity index 89% rename from chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java index 533f0cf..47c67ceb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.app.Activity; import android.content.Context; @@ -13,9 +13,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.browser.banners.AppBannerManager; -import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; -import org.chromium.chrome.browser.webapps.AddToHomescreenViewDelegate; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager; @@ -32,16 +29,14 @@ */ @JNINamespace("webapps") public class AddToHomescreenCoordinator { - @VisibleForTesting - Context mActivityContext; - @VisibleForTesting - ModalDialogManager mModalDialogManager; + private Context mActivityContext; + private ModalDialogManager mModalDialogManager; private WindowAndroid mWindowAndroid; // May be null during tests. - WebContents mWebContents; + private WebContents mWebContents; @VisibleForTesting - AddToHomescreenCoordinator(WebContents webContents, Context activityContext, + public AddToHomescreenCoordinator(WebContents webContents, Context activityContext, WindowAndroid windowAndroid, ModalDialogManager modalDialogManager) { mActivityContext = activityContext; mWindowAndroid = windowAndroid; @@ -63,7 +58,7 @@ } @VisibleForTesting - boolean showForAppMenu(@StringRes int titleId) { + public boolean showForAppMenu(@StringRes int titleId) { // Don't start if there is no visible URL to add. if (mWebContents == null || mWebContents.getVisibleUrl().isEmpty()) { return false; @@ -124,4 +119,12 @@ return new AddToHomescreenDialogView( mActivityContext, mModalDialogManager, installStrings, delegate); } + + protected ModalDialogManager getModalDialogManagerForTests() { + return mModalDialogManager; + } + + protected Context getContextForTests() { + return mActivityContext; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogView.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java similarity index 92% rename from chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogView.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java index b4c2676..748a754a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogView.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.annotation.TargetApi; import android.content.Context; @@ -24,10 +24,6 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.banners.AppBannerManager; -import org.chromium.chrome.browser.webapps.AddToHomescreenViewDelegate; -import org.chromium.components.webapps.AppType; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties; @@ -41,7 +37,8 @@ * data is not yet fetched, and accepting the dialog is disabled until all data is available and in * its place on the screen. */ -class AddToHomescreenDialogView implements View.OnClickListener, ModalDialogProperties.Controller { +public class AddToHomescreenDialogView + implements View.OnClickListener, ModalDialogProperties.Controller { private PropertyModel mDialogModel; private ModalDialogManager mModalDialogManager; @VisibleForTesting @@ -64,7 +61,8 @@ private boolean mCanSubmit; - AddToHomescreenDialogView(Context context, ModalDialogManager modalDialogManager, + @VisibleForTesting + public AddToHomescreenDialogView(Context context, ModalDialogManager modalDialogManager, AppBannerManager.InstallStringPair installStrings, AddToHomescreenViewDelegate delegate) { assert delegate != null; @@ -133,7 +131,9 @@ mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.APP); } - void setTitle(String title) { + // @VisibleForTests implies that a method should only be accessed from tests or within private + // scope, but this is needed by AddToHomescreenViewBinder. + protected void setTitle(String title) { mAppNameView.setText(title); mShortcutTitleInput.setText(title); } @@ -181,7 +181,9 @@ mPlayLogoView.setImageResource(R.drawable.google_play); } - void setCanSubmit(boolean canSubmit) { + // @VisibleForTests implies that a method should only be accessed from tests or within private + // scope, but this is needed by AddToHomescreenViewBinder. + protected void setCanSubmit(boolean canSubmit) { mCanSubmit = canSubmit; updateInstallButton(); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogViewTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java similarity index 97% rename from chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogViewTest.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java index 1f16844..dfa173ba 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogViewTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.app.Activity; import android.view.View; @@ -18,10 +18,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.banners.AppBannerManager; -import org.chromium.chrome.browser.webapps.AddToHomescreenViewDelegate; -import org.chromium.components.webapps.AppType; import org.chromium.ui.modaldialog.DialogDismissalCause; import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.modaldialog.ModalDialogProperties;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java similarity index 90% rename from chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java index 98f052f..6c3e1f40 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java
@@ -2,27 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.graphics.Bitmap; import android.util.Pair; +import androidx.annotation.NonNull; import androidx.annotation.StringRes; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; -import org.chromium.chrome.browser.webapps.AddToHomescreenViewDelegate; -import org.chromium.components.webapps.AppData; -import org.chromium.components.webapps.AppType; -import org.chromium.components.webapps.WebappsIconUtils; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; -import javax.annotation.Nonnull; - /** * The mediator class in the MVC architecture of the add-to-homescreen component. The C++ * counterpart of this class calls various Java set methods ({@link #setIcon}, @@ -43,7 +37,7 @@ mNativeAddToHomescreenMediator = AddToHomescreenMediatorJni.get().initialize(this); } - void startForAppMenu(@Nonnull WebContents webContents, @StringRes int titleId) { + void startForAppMenu(@NonNull WebContents webContents, @StringRes int titleId) { if (mNativeAddToHomescreenMediator == 0) return; AddToHomescreenMediatorJni.get().startForAppMenu(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediatorTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java similarity index 93% rename from chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediatorTest.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java index b409fc6..6d2c217 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenMediatorTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import static org.mockito.Mockito.when; @@ -21,9 +21,6 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.JniMocker; -import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; -import org.chromium.components.webapps.AppData; -import org.chromium.components.webapps.AppType; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenProperties.java similarity index 97% rename from chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenProperties.java index 7de4b240..77b2d1b 100644 --- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenProperties.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenProperties.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps; +package org.chromium.components.webapps; import android.graphics.Bitmap; import android.util.Pair;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinder.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinder.java similarity index 92% rename from chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinder.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinder.java index 1daf8960..b123b6a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinder.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinder.java
@@ -2,12 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.graphics.Bitmap; import android.util.Pair; -import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinderTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinderTest.java similarity index 92% rename from chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinderTest.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinderTest.java index a2e66ca54..bc504f9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenViewBinderTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewBinderTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps.addtohomescreen; +package org.chromium.components.webapps; import android.graphics.Bitmap; import android.util.Pair; @@ -12,8 +12,6 @@ import org.mockito.Mockito; import org.chromium.base.test.BaseRobolectricTestRunner; -import org.chromium.chrome.browser.webapps.AddToHomescreenProperties; -import org.chromium.components.webapps.AppType; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
diff --git a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenViewDelegate.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewDelegate.java similarity index 94% rename from chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenViewDelegate.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewDelegate.java index 9f5693b..10e66aea 100644 --- a/chrome/browser/webapps/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenViewDelegate.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenViewDelegate.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.webapps; +package org.chromium.components.webapps; /** * Used by {@link AddToHomescreenDialogView} to propagate view events to {@link
diff --git a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java similarity index 94% rename from chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java rename to components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java index cd8c03a4..b6678a4c 100644 --- a/chrome/browser/banners/android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AppBannerManager.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.banners; +package org.chromium.components.webapps; import android.content.Context; import android.text.TextUtils; @@ -15,9 +15,6 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.components.webapps.AppData; -import org.chromium.components.webapps.AppDetailsDelegate; -import org.chromium.components.webapps.WebappsUtils; import org.chromium.content_public.browser.WebContents; /** @@ -170,19 +167,19 @@ /** Sets constants (in days) the banner should be blocked for after dismissing and ignoring. */ @VisibleForTesting - static void setDaysAfterDismissAndIgnoreForTesting(int dismissDays, int ignoreDays) { + public static void setDaysAfterDismissAndIgnoreForTesting(int dismissDays, int ignoreDays) { AppBannerManagerJni.get().setDaysAfterDismissAndIgnoreToTrigger(dismissDays, ignoreDays); } /** Sets a constant (in days) that gets added to the time when the current time is requested. */ @VisibleForTesting - static void setTimeDeltaForTesting(int days) { + public static void setTimeDeltaForTesting(int days) { AppBannerManagerJni.get().setTimeDeltaForTesting(days); } /** Sets the total required engagement to trigger the banner. */ @VisibleForTesting - static void setTotalEngagementForTesting(double engagement) { + public static void setTotalEngagementForTesting(double engagement) { AppBannerManagerJni.get().setTotalEngagementToTrigger(engagement); }
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_af.xtb b/components/webapps/browser/android/translations/android_webapps_strings_af.xtb new file mode 100644 index 0000000..0861004f --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_af.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="af"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_am.xtb b/components/webapps/browser/android/translations/android_webapps_strings_am.xtb new file mode 100644 index 0000000..6c985cb8 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_am.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="am"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ar.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ar.xtb new file mode 100644 index 0000000..e8b5562 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ar.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ar"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_as.xtb b/components/webapps/browser/android/translations/android_webapps_strings_as.xtb new file mode 100644 index 0000000..3ad7206d --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_as.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="as"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_az.xtb b/components/webapps/browser/android/translations/android_webapps_strings_az.xtb new file mode 100644 index 0000000..6d09f4cd --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_az.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="az"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_be.xtb b/components/webapps/browser/android/translations/android_webapps_strings_be.xtb new file mode 100644 index 0000000..09e9a3ad --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_be.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="be"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_bg.xtb b/components/webapps/browser/android/translations/android_webapps_strings_bg.xtb new file mode 100644 index 0000000..ebab473 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_bg.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bg"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_bn.xtb b/components/webapps/browser/android/translations/android_webapps_strings_bn.xtb new file mode 100644 index 0000000..a66cc1fc --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_bn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bn"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_bs.xtb b/components/webapps/browser/android/translations/android_webapps_strings_bs.xtb new file mode 100644 index 0000000..7b6fabc --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_bs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="bs"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ca.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ca.xtb new file mode 100644 index 0000000..1438d89 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ca.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ca"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_cs.xtb b/components/webapps/browser/android/translations/android_webapps_strings_cs.xtb new file mode 100644 index 0000000..2d95130 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_cs.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="cs"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_da.xtb b/components/webapps/browser/android/translations/android_webapps_strings_da.xtb new file mode 100644 index 0000000..751fa4a8 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_da.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="da"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_de.xtb b/components/webapps/browser/android/translations/android_webapps_strings_de.xtb new file mode 100644 index 0000000..91de7f51 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_de.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="de"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_el.xtb b/components/webapps/browser/android/translations/android_webapps_strings_el.xtb new file mode 100644 index 0000000..6e5e7d8 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_el.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="el"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_en-GB.xtb b/components/webapps/browser/android/translations/android_webapps_strings_en-GB.xtb new file mode 100644 index 0000000..0fb2133 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_en-GB.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="en-GB"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_es-419.xtb b/components/webapps/browser/android/translations/android_webapps_strings_es-419.xtb new file mode 100644 index 0000000..2fe4770 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_es-419.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es-419"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_es.xtb b/components/webapps/browser/android/translations/android_webapps_strings_es.xtb new file mode 100644 index 0000000..64022ec --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_es.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="es"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_et.xtb b/components/webapps/browser/android/translations/android_webapps_strings_et.xtb new file mode 100644 index 0000000..5244dfd --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_et.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="et"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_eu.xtb b/components/webapps/browser/android/translations/android_webapps_strings_eu.xtb new file mode 100644 index 0000000..981c85fb --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_eu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="eu"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_fa.xtb b/components/webapps/browser/android/translations/android_webapps_strings_fa.xtb new file mode 100644 index 0000000..18626f8 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_fa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fa"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_fi.xtb b/components/webapps/browser/android/translations/android_webapps_strings_fi.xtb new file mode 100644 index 0000000..4691cd5 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_fi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fi"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_fil.xtb b/components/webapps/browser/android/translations/android_webapps_strings_fil.xtb new file mode 100644 index 0000000..443630e7 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_fil.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fil"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_fr-CA.xtb b/components/webapps/browser/android/translations/android_webapps_strings_fr-CA.xtb new file mode 100644 index 0000000..6330f524 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_fr-CA.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr-CA"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_fr.xtb b/components/webapps/browser/android/translations/android_webapps_strings_fr.xtb new file mode 100644 index 0000000..63026a3 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_fr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="fr"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_gl.xtb b/components/webapps/browser/android/translations/android_webapps_strings_gl.xtb new file mode 100644 index 0000000..ad1197a --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_gl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gl"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_gu.xtb b/components/webapps/browser/android/translations/android_webapps_strings_gu.xtb new file mode 100644 index 0000000..7d8a4df1 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_gu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="gu"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb b/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb new file mode 100644 index 0000000..a6ddd5d --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_hi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hi"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_hr.xtb b/components/webapps/browser/android/translations/android_webapps_strings_hr.xtb new file mode 100644 index 0000000..26f99d0 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_hr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hr"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_hu.xtb b/components/webapps/browser/android/translations/android_webapps_strings_hu.xtb new file mode 100644 index 0000000..7ef9a5e0 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_hu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hu"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_hy.xtb b/components/webapps/browser/android/translations/android_webapps_strings_hy.xtb new file mode 100644 index 0000000..2ae4ee1 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_hy.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="hy"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_id.xtb b/components/webapps/browser/android/translations/android_webapps_strings_id.xtb new file mode 100644 index 0000000..aa34783 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_id.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="id"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_is.xtb b/components/webapps/browser/android/translations/android_webapps_strings_is.xtb new file mode 100644 index 0000000..b93d5071 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_is.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="is"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_it.xtb b/components/webapps/browser/android/translations/android_webapps_strings_it.xtb new file mode 100644 index 0000000..a6ac8d46 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_it.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="it"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_iw.xtb b/components/webapps/browser/android/translations/android_webapps_strings_iw.xtb new file mode 100644 index 0000000..86b5533 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_iw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="iw"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ja.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ja.xtb new file mode 100644 index 0000000..23139e6 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ja.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ja"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ka.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ka.xtb new file mode 100644 index 0000000..57c55dd --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ka.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ka"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_kk.xtb b/components/webapps/browser/android/translations/android_webapps_strings_kk.xtb new file mode 100644 index 0000000..84420c1 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_kk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kk"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_km.xtb b/components/webapps/browser/android/translations/android_webapps_strings_km.xtb new file mode 100644 index 0000000..fe55255 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_km.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="km"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_kn.xtb b/components/webapps/browser/android/translations/android_webapps_strings_kn.xtb new file mode 100644 index 0000000..cc3643a2 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_kn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="kn"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ko.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ko.xtb new file mode 100644 index 0000000..e0fc370 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ko.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ko"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ky.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ky.xtb new file mode 100644 index 0000000..71a0883 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ky.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ky"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_lo.xtb b/components/webapps/browser/android/translations/android_webapps_strings_lo.xtb new file mode 100644 index 0000000..eb6216c --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_lo.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lo"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_lt.xtb b/components/webapps/browser/android/translations/android_webapps_strings_lt.xtb new file mode 100644 index 0000000..5804ae2a --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_lt.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lt"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_lv.xtb b/components/webapps/browser/android/translations/android_webapps_strings_lv.xtb new file mode 100644 index 0000000..a0a1c477 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_lv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="lv"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_mk.xtb b/components/webapps/browser/android/translations/android_webapps_strings_mk.xtb new file mode 100644 index 0000000..2949071 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_mk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mk"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ml.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ml.xtb new file mode 100644 index 0000000..f7db315 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ml.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ml"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_mn.xtb b/components/webapps/browser/android/translations/android_webapps_strings_mn.xtb new file mode 100644 index 0000000..a2218675 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_mn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mn"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_mr.xtb b/components/webapps/browser/android/translations/android_webapps_strings_mr.xtb new file mode 100644 index 0000000..098d29c --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_mr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="mr"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ms.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ms.xtb new file mode 100644 index 0000000..1fb470a --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ms.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ms"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_my.xtb b/components/webapps/browser/android/translations/android_webapps_strings_my.xtb new file mode 100644 index 0000000..674ca27 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_my.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="my"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ne.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ne.xtb new file mode 100644 index 0000000..30c7e065 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ne.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ne"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_nl.xtb b/components/webapps/browser/android/translations/android_webapps_strings_nl.xtb new file mode 100644 index 0000000..e782410 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_nl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="nl"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_no.xtb b/components/webapps/browser/android/translations/android_webapps_strings_no.xtb new file mode 100644 index 0000000..913638b --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_no.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="no"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_or.xtb b/components/webapps/browser/android/translations/android_webapps_strings_or.xtb new file mode 100644 index 0000000..fe2ddbc9 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_or.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="or"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_pa.xtb b/components/webapps/browser/android/translations/android_webapps_strings_pa.xtb new file mode 100644 index 0000000..5c7ac50 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_pa.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pa"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_pl.xtb b/components/webapps/browser/android/translations/android_webapps_strings_pl.xtb new file mode 100644 index 0000000..4519e3d --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_pl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pl"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_pt-BR.xtb b/components/webapps/browser/android/translations/android_webapps_strings_pt-BR.xtb new file mode 100644 index 0000000..e95eb56b --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_pt-BR.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-BR"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_pt-PT.xtb b/components/webapps/browser/android/translations/android_webapps_strings_pt-PT.xtb new file mode 100644 index 0000000..1dcf557a --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_pt-PT.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="pt-PT"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ro.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ro.xtb new file mode 100644 index 0000000..9e43493 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ro.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ro"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ru.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ru.xtb new file mode 100644 index 0000000..c4a621b --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ru.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ru"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_si.xtb b/components/webapps/browser/android/translations/android_webapps_strings_si.xtb new file mode 100644 index 0000000..712d890 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_si.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="si"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sk.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sk.xtb new file mode 100644 index 0000000..00750d31 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sk"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sl.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sl.xtb new file mode 100644 index 0000000..489b7e46 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sl.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sl"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sq.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sq.xtb new file mode 100644 index 0000000..3fecfc5 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sq.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sq"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sr-Latn.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sr-Latn.xtb new file mode 100644 index 0000000..14178c3 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sr-Latn.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sr-Latn"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sr.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sr.xtb new file mode 100644 index 0000000..38f6f35 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sr"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sv.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sv.xtb new file mode 100644 index 0000000..ddea3dc --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sv.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sv"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_sw.xtb b/components/webapps/browser/android/translations/android_webapps_strings_sw.xtb new file mode 100644 index 0000000..b7750886 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_sw.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="sw"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ta.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ta.xtb new file mode 100644 index 0000000..ef90687 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ta.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ta"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_te.xtb b/components/webapps/browser/android/translations/android_webapps_strings_te.xtb new file mode 100644 index 0000000..48c714b --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_te.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="te"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_th.xtb b/components/webapps/browser/android/translations/android_webapps_strings_th.xtb new file mode 100644 index 0000000..fae31966 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_th.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="th"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_tr.xtb b/components/webapps/browser/android/translations/android_webapps_strings_tr.xtb new file mode 100644 index 0000000..9a29951 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_tr.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="tr"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_uk.xtb b/components/webapps/browser/android/translations/android_webapps_strings_uk.xtb new file mode 100644 index 0000000..f0db52c --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_uk.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uk"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_ur.xtb b/components/webapps/browser/android/translations/android_webapps_strings_ur.xtb new file mode 100644 index 0000000..ffd34cf8 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_ur.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="ur"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_uz.xtb b/components/webapps/browser/android/translations/android_webapps_strings_uz.xtb new file mode 100644 index 0000000..1d58ed4c --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_uz.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="uz"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_vi.xtb b/components/webapps/browser/android/translations/android_webapps_strings_vi.xtb new file mode 100644 index 0000000..b2957da --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_vi.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="vi"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_zh-CN.xtb b/components/webapps/browser/android/translations/android_webapps_strings_zh-CN.xtb new file mode 100644 index 0000000..26e8b40 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_zh-CN.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-CN"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_zh-HK.xtb b/components/webapps/browser/android/translations/android_webapps_strings_zh-HK.xtb new file mode 100644 index 0000000..3ecd9e3 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_zh-HK.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-HK"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_zh-TW.xtb b/components/webapps/browser/android/translations/android_webapps_strings_zh-TW.xtb new file mode 100644 index 0000000..935ef485 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_zh-TW.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zh-TW"> +</translationbundle>
diff --git a/components/webapps/browser/android/translations/android_webapps_strings_zu.xtb b/components/webapps/browser/android/translations/android_webapps_strings_zu.xtb new file mode 100644 index 0000000..f9c1cd3 --- /dev/null +++ b/components/webapps/browser/android/translations/android_webapps_strings_zu.xtb
@@ -0,0 +1,4 @@ +<?xml version="1.0" ?> +<!DOCTYPE translationbundle> +<translationbundle lang="zu"> +</translationbundle>
diff --git a/components/webapps/services/web_app_origin_association/BUILD.gn b/components/webapps/services/web_app_origin_association/BUILD.gn index 8a111d7..8f5be8b 100644 --- a/components/webapps/services/web_app_origin_association/BUILD.gn +++ b/components/webapps/services/web_app_origin_association/BUILD.gn
@@ -26,10 +26,7 @@ "web_app_origin_association_parser_service.h", ] - deps = [ - "//components/strings", - "//content/public/browser", - ] + deps = [ "//content/public/browser" ] public_deps = [ "//components/webapps/services/web_app_origin_association/public/mojom",
diff --git a/components/webapps/services/web_app_origin_association/DEPS b/components/webapps/services/web_app_origin_association/DEPS index dd4d5f8..e841ea2 100644 --- a/components/webapps/services/web_app_origin_association/DEPS +++ b/components/webapps/services/web_app_origin_association/DEPS
@@ -1,5 +1,4 @@ include_rules = [ "+content/public/browser", - "+components/strings", "+mojo/public", ]
diff --git a/components/webapps/services/web_app_origin_association/web_app_origin_association_parser_service.cc b/components/webapps/services/web_app_origin_association/web_app_origin_association_parser_service.cc index d91c59b..6072807 100644 --- a/components/webapps/services/web_app_origin_association/web_app_origin_association_parser_service.cc +++ b/components/webapps/services/web_app_origin_association/web_app_origin_association_parser_service.cc
@@ -4,7 +4,6 @@ #include "components/webapps/services/web_app_origin_association/web_app_origin_association_parser_service.h" -#include "components/strings/grit/components_strings.h" #include "content/public/browser/service_process_host.h" namespace webapps { @@ -14,8 +13,7 @@ return content::ServiceProcessHost::Launch< webapps::mojom::WebAppOriginAssociationParser>( content::ServiceProcessHost::Options() - .WithDisplayName( - IDS_WEB_APP_ORIGIN_ASSOCIATION_PARSER_SERVICE_DISPLAY_NAME) + .WithDisplayName("Web App Origin Association Parser Service") .Pass()); }
diff --git a/content/browser/browsing_data/browsing_data_browsertest_utils.cc b/content/browser/browsing_data/browsing_data_browsertest_utils.cc index 14753d0..0ed4b23d 100644 --- a/content/browser/browsing_data/browsing_data_browsertest_utils.cc +++ b/content/browser/browsing_data/browsing_data_browsertest_utils.cc
@@ -36,8 +36,8 @@ namespace { -void AddServiceWorkerCallback(bool success) { - ASSERT_TRUE(success); +void AddServiceWorkerCallback(blink::ServiceWorkerStatusCode status) { + ASSERT_EQ(status, blink::ServiceWorkerStatusCode::kOk); } void GetServiceWorkersCallback(
diff --git a/content/browser/indexed_db/indexed_db_context_impl.h b/content/browser/indexed_db/indexed_db_context_impl.h index 3ba7765..752f9f0 100644 --- a/content/browser/indexed_db/indexed_db_context_impl.h +++ b/content/browser/indexed_db/indexed_db_context_impl.h
@@ -30,7 +30,6 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/remote_set.h" #include "storage/browser/quota/quota_manager_proxy.h" -#include "storage/browser/quota/special_storage_policy.h" #include "url/origin.h" namespace base { @@ -209,10 +208,6 @@ class IndexedDBGetUsageAndQuotaCallback; - static void ClearSessionOnlyOrigins( - const base::FilePath& indexeddb_path, - scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy); - ~IndexedDBContextImpl() override; void ShutdownOnIDBSequence(); @@ -247,7 +242,6 @@ // If true, nothing (not even session-only data) should be deleted on exit. bool force_keep_session_state_; - const scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy_; const scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy_; std::unique_ptr<std::set<url::Origin>> origin_set_; std::map<url::Origin, int64_t> origin_size_map_;
diff --git a/content/browser/payments/payment_app_installer.cc b/content/browser/payments/payment_app_installer.cc index 98eaff51..12ea4ad 100644 --- a/content/browser/payments/payment_app_installer.cc +++ b/content/browser/payments/payment_app_installer.cc
@@ -125,12 +125,12 @@ FinishInstallation(false); } - void OnRegisterServiceWorkerResult(bool success) { + void OnRegisterServiceWorkerResult(blink::ServiceWorkerStatusCode status) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (AbortInstallIfWebContentsOrBrowserContextIsGone()) return; - if (!success) { + if (status != blink::ServiceWorkerStatusCode::kOk) { LOG(ERROR) << "Failed to install the web payment app " << sw_url_.spec(); FinishInstallation(false); }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index cf83965..801245a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -5508,8 +5508,7 @@ // The mojom reply callback with kSuccess causes the renderer to create the // renderer-side objects. - main_frame->render_view_host()->DispatchRenderViewCreated(); - main_frame->RenderFrameCreated(); + main_frame->render_view_host()->RenderViewCreated(main_frame); } void RenderFrameHostImpl::CreatePortal(
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index c96b4cc..ea68f16 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -2476,11 +2476,16 @@ new_instance, recovering_without_early_commit); // If RenderViewHost was created along with the speculative RenderFrameHost, - // ensure that RenderViewCreated is fired for it. It is important to do this - // after speculative_render_frame_host_ is assigned, so that observers - // processing RenderViewCreated can find it via - // RenderViewHostImpl::GetMainFrame(). - if (speculative_render_frame_host_) { + // ensure that RenderViewCreated() is fired for it. It is important to do + // this after speculative_render_frame_host_ is assigned, so that observers + // processing RenderViewCreated() can find it via + // RenderViewHostImpl::GetMainFrame(). Note that RenderViewHostImpl will not + // do this itself when the main frame is not present when the RenderView is + // created, as it defers that task to us here. Also RenderViewHostImpl will + // only notify the first time RenderViewCreated() is called, so it's + // acceptable to call it here unconditionally every time we make a + // speculative frame in the view. + if (speculative_render_frame_host_ && !frame_tree_node_->parent()) { speculative_render_frame_host_->render_view_host() ->DispatchRenderViewCreated(); }
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index e85c386..c3d7f0e 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -499,24 +499,13 @@ // or else there will be a leak in the renderer process. GetAgentSchedulingGroup().CreateView(std::move(params)); - // Let our delegate know that we created a RenderView. - DispatchRenderViewCreated(); + // Set the bit saying we've made the RenderView in the renderer and notify + // content public observers. + RenderViewCreated(main_rfh); - // If there is a main frame in this RenderViewHost, then the renderer-side - // main frame will be created along with the RenderView. The RenderFrameHost - // initializes its RenderWidgetHost as well, if it exists. Otherwise we must - // mark the non-frame-attached RenderWidgetHost as live in order for the - // RenderViewHost to be considered live. - if (main_rfh) - main_rfh->RenderFrameCreated(); - else - GetWidget()->SetRendererWidgetCreatedForInactiveRenderView(); - - GetWidget()->delegate()->SendScreenRects(); - // This must be posted after the RenderViewHost is marked live, which is done - // above by RenderFrameCreated() or set_renderer_initialized(). + // This must be posted after the RenderViewHost is marked live, with + // `renderer_view_created_`. PostRenderViewReady(); - return true; } @@ -585,8 +574,7 @@ } bool RenderViewHostImpl::IsRenderViewLive() { - return GetProcess()->IsInitializedAndNotDead() && - GetWidget()->renderer_initialized(); + return GetProcess()->IsInitializedAndNotDead() && renderer_view_created_; } void RenderViewHostImpl::SetBackgroundOpaque(bool opaque) { @@ -608,11 +596,28 @@ return delegate_->GetOrCreateWebPreferences(); } -void RenderViewHostImpl::DispatchRenderViewCreated() { - if (has_notified_about_creation_) - return; +void RenderViewHostImpl::RenderViewCreated( + RenderFrameHostImpl* local_main_frame) { + renderer_view_created_ = true; + if (local_main_frame) { + // Emebedders hears about the view being created in the renderer, then about + // the frame. - // Only send RenderViewCreated if there is a current or pending main frame + // The delegate's notification about the RenderView being created is not + // actually sent until/unless the main frame is also created and present for + // the RenderView. It is not sent for an inactive RenderView since that type + // of RenderView did not historically exist before site isolation. + DispatchRenderViewCreated(); + + // If there is a main frame in this RenderViewHost, then the renderer-side + // main frame will be created along with the RenderView. The RenderFrameHost + // initializes its RenderWidgetHost as well, if it exists. + local_main_frame->RenderFrameCreated(); + } +} + +void RenderViewHostImpl::DispatchRenderViewCreated() { + // We only send RenderViewCreated if there is a current or pending main frame // RenderFrameHost (current or pending). Don't send notifications if this is // an inactive RVH that is either used by subframe RFHs or not used by any // RFHs at all (e.g., when created for the opener chain). @@ -623,11 +628,17 @@ // // TODO(alexmos, creis): Revisit this as part of migrating RenderViewCreated // usage to RenderFrameCreated. See https://crbug.com/763548. - if (!GetMainFrame()) - return; + DCHECK(GetMainFrame()); - delegate_->RenderViewCreated(this); - has_notified_about_creation_ = true; + // This is only done the first time a RenderView is created. Note that if a + // process and RenderView are recreated, no notification would be sent. This + // does allow the RenderFrameHostManager to call this method every time it + // makes a speculative frame, in the case that we avoided sending the dispatch + // due to GetMainFrame() being null when the RenderView was made. + if (!has_notified_about_creation_) { + delegate_->RenderViewCreated(this); + has_notified_about_creation_ = true; + } } void RenderViewHostImpl::ClosePage() { @@ -675,9 +686,7 @@ void RenderViewHostImpl::RenderProcessExited( RenderProcessHost* host, const ChildProcessTerminationInfo& info) { - if (!GetWidget()->renderer_initialized()) - return; - + renderer_view_created_ = false; GetWidget()->RendererExited(); delegate_->RenderViewTerminated(this, info.status, info.exit_code); // |this| might have been deleted. Do not add code here.
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index cd324fbc..9ac4773b 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -166,6 +166,13 @@ return is_waiting_for_page_close_completion_; } + // Called when the RenderView in the renderer process has been created, at + // which point IsRenderViewLive() becomes true, and the mojo connections to + // the renderer process for this view now exist. This will also call + // DispatchRenderViewCreated() to tell the content embedder, if + // `local_main_frame` exists. + void RenderViewCreated(RenderFrameHostImpl* local_main_frame); + // Generate RenderViewCreated events for observers through the delegate. // These events are only generated for active RenderViewHosts (which have a // RenderFrameHost for the main frame) as well as inactive RenderViewHosts @@ -394,6 +401,10 @@ // Routing ID for this RenderViewHost. const int routing_id_; + // Whether the renderer-side RenderView is created. Becomes false when the + // renderer crashes. + bool renderer_view_created_ = false; + // Routing ID for the main frame's RenderFrameHost. int main_frame_routing_id_;
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index 1b9b2c1a..98fe575 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -683,10 +683,6 @@ SynchronizeVisualProperties(); } -void RenderWidgetHostImpl::SetRendererWidgetCreatedForInactiveRenderView() { - renderer_widget_created_ = true; -} - void RenderWidgetHostImpl::Init() { DCHECK(renderer_widget_created_); DCHECK(waiting_for_init_); @@ -2057,6 +2053,8 @@ // This flag is set when creating the renderer widget. waiting_for_init_ = false; + blink_widget_.reset(); + // After the renderer crashes, the view is destroyed and so the // RenderWidgetHost cannot track its visibility anymore. We assume such // RenderWidgetHost to be invisible for the sake of internal accounting - be
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h index a60325e..a4bcbee 100644 --- a/content/browser/renderer_host/render_widget_host_impl.h +++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -377,16 +377,6 @@ // RendererWidgetCreated(). void Init(); - // OH NO DO NOT CALL THIS. - // This is called from RenderViewHost in order to mark itself as "live" even - // though there is actually no Widget created in the renderer, as there is no - // main frame attached to the RenderViewHost. - // TODO(crbug.com/419087): Remove this, and have RenderViewHost track its own - // live-ness. Then checks for a null `view_` in this class can just check - // `renderer_widget_created_` instead. And have RenderViewHost tell this class - // when the main frame goes away and thus the renderer widget along with it. - void SetRendererWidgetCreatedForInactiveRenderView(); - // Returns true if the frame content needs be stored before being evicted. bool ShouldShowStaleContentOnEviction();
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm index b81f913..c1b9ca0 100644 --- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm +++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -320,43 +320,11 @@ class MockRenderWidgetHostImpl : public RenderWidgetHostImpl { public: - ~MockRenderWidgetHostImpl() override {} - - // Extracts |latency_info| and stores it in |lastWheelEventLatencyInfo|. - void ForwardWheelEventWithLatencyInfo ( - const blink::WebMouseWheelEvent& wheel_event, - const ui::LatencyInfo& ui_latency) override { - RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo ( - wheel_event, ui_latency); - lastWheelEventLatencyInfo = ui::LatencyInfo(ui_latency); - } - - MOCK_METHOD0(Focus, void()); - MOCK_METHOD0(Blur, void()); - - ui::LatencyInfo lastWheelEventLatencyInfo; - static std::unique_ptr<MockRenderWidgetHostImpl> Create( - RenderWidgetHostDelegate* delegate, - AgentSchedulingGroupHost& agent_scheduling_group_host, - int32_t routing_id) { - return base::WrapUnique(new MockRenderWidgetHostImpl( - delegate, agent_scheduling_group_host, routing_id)); - } - - MockWidgetInputHandler* input_handler() { return &input_handler_; } - MockWidgetInputHandler::MessageVector GetAndResetDispatchedMessages() { - return input_handler_.GetAndResetDispatchedMessages(); - } - - blink::mojom::WidgetInputHandler* GetWidgetInputHandler() override { - return &input_handler_; - } - - private: MockRenderWidgetHostImpl( RenderWidgetHostDelegate* delegate, AgentSchedulingGroupHost& agent_scheduling_group_host, - int32_t routing_id) + int32_t routing_id, + bool for_frame_widget) : RenderWidgetHostImpl(/*frame_tree=*/nullptr, /*self_owned=*/false, delegate, @@ -368,9 +336,13 @@ mojo::AssociatedRemote<blink::mojom::WidgetHost> widget_host; BindWidgetInterfaces(widget_host.BindNewEndpointAndPassDedicatedReceiver(), TestRenderWidgetHost::CreateStubWidgetRemote()); - - SetRendererWidgetCreatedForInactiveRenderView(); - lastWheelEventLatencyInfo = ui::LatencyInfo(); + if (for_frame_widget) { + mojo::AssociatedRemote<blink::mojom::FrameWidgetHost> frame_widget_host; + BindFrameWidgetInterfaces( + frame_widget_host.BindNewEndpointAndPassDedicatedReceiver(), + TestRenderWidgetHost::CreateStubFrameWidgetRemote()); + } + RendererWidgetCreated(for_frame_widget); ON_CALL(*this, Focus()) .WillByDefault( @@ -380,9 +352,38 @@ testing::Invoke(this, &MockRenderWidgetHostImpl::BlurImpl)); } + ~MockRenderWidgetHostImpl() override = default; + + // Extracts |latency_info| and stores it in |last_wheel_event_latency_info_|. + void ForwardWheelEventWithLatencyInfo( + const blink::WebMouseWheelEvent& wheel_event, + const ui::LatencyInfo& ui_latency) override { + RenderWidgetHostImpl::ForwardWheelEventWithLatencyInfo(wheel_event, + ui_latency); + last_wheel_event_latency_info_ = ui::LatencyInfo(ui_latency); + } + + MOCK_METHOD0(Focus, void()); + MOCK_METHOD0(Blur, void()); + + MockWidgetInputHandler* input_handler() { return &input_handler_; } + MockWidgetInputHandler::MessageVector GetAndResetDispatchedMessages() { + return input_handler_.GetAndResetDispatchedMessages(); + } + + blink::mojom::WidgetInputHandler* GetWidgetInputHandler() override { + return &input_handler_; + } + + const ui::LatencyInfo& LastWheelEventLatencyInfo() const { + return last_wheel_event_latency_info_; + } + + private: void FocusImpl() { RenderWidgetHostImpl::Focus(); } void BlurImpl() { RenderWidgetHostImpl::Blur(); } + ui::LatencyInfo last_wheel_event_latency_info_; MockWidgetInputHandler input_handler_; DISALLOW_COPY_AND_ASSIGN(MockRenderWidgetHostImpl); @@ -491,14 +492,10 @@ process_host_->Init(); agent_scheduling_group_host_ = std::make_unique<AgentSchedulingGroupHost>(*process_host_); - host_ = MockRenderWidgetHostImpl::Create(&delegate_, - *agent_scheduling_group_host_, - process_host_->GetNextRoutingID()); - // MockRenderWidgetHostImpl already bound the Widget mojom interfaces. - mojo::AssociatedRemote<blink::mojom::FrameWidgetHost> frame_widget_host; - host_->BindFrameWidgetInterfaces( - frame_widget_host.BindNewEndpointAndPassDedicatedReceiver(), - TestRenderWidgetHost::CreateStubFrameWidgetRemote()); + host_ = std::make_unique<MockRenderWidgetHostImpl>( + &delegate_, *agent_scheduling_group_host_, + process_host_->GetNextRoutingID(), + /*for_frame_widget=*/true); host_->set_owner_delegate(&mock_owner_delegate_); rwhv_mac_ = new RenderWidgetHostViewMac(host_.get()); rwhv_cocoa_.reset([rwhv_mac_->GetInProcessNSView() retain]); @@ -950,7 +947,7 @@ // properly in scrollWheel function. NSEvent* wheelEvent1 = MockScrollWheelEventWithPhase(@selector(phaseBegan),3); [rwhv_mac_->GetInProcessNSView() scrollWheel:wheelEvent1]; - ASSERT_TRUE(host_->lastWheelEventLatencyInfo.FindLatency( + ASSERT_TRUE(host_->LastWheelEventLatencyInfo().FindLatency( ui::INPUT_EVENT_LATENCY_UI_COMPONENT, nullptr)); MockWidgetInputHandler::MessageVector events = @@ -965,7 +962,7 @@ // in scrollWheel. NSEvent* wheelEvent2 = MockScrollWheelEventWithPhase(@selector(phaseEnded),0); [rwhv_mac_->GetInProcessNSView() scrollWheel:wheelEvent2]; - ASSERT_TRUE(host_->lastWheelEventLatencyInfo.FindLatency( + ASSERT_TRUE(host_->LastWheelEventLatencyInfo().FindLatency( ui::INPUT_EVENT_LATENCY_UI_COMPONENT, nullptr)); events = host_->GetAndResetDispatchedMessages(); @@ -986,7 +983,7 @@ events[0]->ToEvent()->CallCallback( blink::mojom::InputEventResultState::kConsumed); - ASSERT_TRUE(host_->lastWheelEventLatencyInfo.source_event_type() == + ASSERT_TRUE(host_->LastWheelEventLatencyInfo().source_event_type() == ui::SourceEventType::WHEEL); } @@ -1323,9 +1320,9 @@ AgentSchedulingGroupHost agent_scheduling_group_host(process_host); MockRenderWidgetHostDelegate delegate; int32_t routing_id = process_host.GetNextRoutingID(); - std::unique_ptr<MockRenderWidgetHostImpl> host = - MockRenderWidgetHostImpl::Create(&delegate, agent_scheduling_group_host, - routing_id); + auto host = std::make_unique<MockRenderWidgetHostImpl>( + &delegate, agent_scheduling_group_host, routing_id, + /*for_frame_widget=*/false); RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host.get()); base::RunLoop().RunUntilIdle(); @@ -1386,9 +1383,9 @@ AgentSchedulingGroupHost agent_scheduling_group_host(process_host); MockRenderWidgetHostDelegate delegate; int32_t routing_id = process_host.GetNextRoutingID(); - std::unique_ptr<MockRenderWidgetHostImpl> host = - MockRenderWidgetHostImpl::Create(&delegate, agent_scheduling_group_host, - routing_id); + auto host = std::make_unique<MockRenderWidgetHostImpl>( + &delegate, agent_scheduling_group_host, routing_id, + /*for_frame_widget=*/false); RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host.get()); base::RunLoop().RunUntilIdle(); @@ -1445,9 +1442,9 @@ MockRenderWidgetHostDelegate delegate; AgentSchedulingGroupHost agent_scheduling_group_host(process_host); int32_t routing_id = process_host.GetNextRoutingID(); - std::unique_ptr<MockRenderWidgetHostImpl> host = - MockRenderWidgetHostImpl::Create(&delegate, agent_scheduling_group_host, - routing_id); + auto host = std::make_unique<MockRenderWidgetHostImpl>( + &delegate, agent_scheduling_group_host, routing_id, + /*for_frame_widget=*/false); RenderWidgetHostViewMac* view = new RenderWidgetHostViewMac(host.get()); base::RunLoop().RunUntilIdle(); @@ -1754,9 +1751,9 @@ child_process_host_->Init(); child_agent_scheduling_group_host_ = std::make_unique<AgentSchedulingGroupHost>(*child_process_host_); - child_widget_ = MockRenderWidgetHostImpl::Create( + child_widget_ = std::make_unique<MockRenderWidgetHostImpl>( &delegate_, *child_agent_scheduling_group_host_, - child_process_host_->GetNextRoutingID()); + child_process_host_->GetNextRoutingID(), /*for_frame_widget=*/false); child_view_ = new TestRenderWidgetHostView(child_widget_.get()); base::RunLoop().RunUntilIdle(); }
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc index d1be1e49..6992734f 100644 --- a/content/browser/service_worker/service_worker_browsertest.cc +++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -118,9 +118,16 @@ run_loop.Run(); } -void ExpectResultAndRun(bool expected, - base::RepeatingClosure continuation, - bool actual) { +void ExpectRegisterResultAndRun(blink::ServiceWorkerStatusCode expected, + base::RepeatingClosure continuation, + blink::ServiceWorkerStatusCode actual) { + EXPECT_EQ(expected, actual); + continuation.Run(); +} + +void ExpectUnregisterResultAndRun(bool expected, + base::RepeatingClosure continuation, + bool actual) { EXPECT_EQ(expected, actual); continuation.Run(); } @@ -560,7 +567,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); const base::string16 title1 = base::ASCIIToUTF16("save-data=on"); @@ -574,7 +582,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -605,7 +614,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); const base::string16 title = base::ASCIIToUTF16("PASS"); @@ -624,7 +634,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -651,7 +662,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); NavigateToURLBlockUntilNavigationsComplete( @@ -663,7 +675,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -680,7 +693,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); const base::string16 title1 = base::ASCIIToUTF16("reload=false"); @@ -698,7 +712,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -724,7 +739,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kNone); public_context()->RegisterServiceWorker( worker_url, options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); // Navigate to a new page and request a sub resource. This should succeed @@ -813,7 +829,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( https_server.GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); EXPECT_EQ(1, service_worker_served_count); @@ -854,7 +871,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( https_server.GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -872,7 +890,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); const base::string16 title = base::ASCIIToUTF16("Title"); @@ -891,7 +910,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kPageUrl), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -949,7 +969,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); base::RunLoop run_loop; @@ -1215,7 +1236,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( worker_url, options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); } @@ -2033,7 +2055,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL("/"), - base::BindOnce(&ExpectResultAndRun, false, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, false, + run_loop.QuitClosure())); run_loop.Run(); } @@ -2046,7 +2069,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL("/does/not/exist"), options, - base::BindOnce(&ExpectResultAndRun, false, run_loop.QuitClosure())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kErrorNetwork, + run_loop.QuitClosure())); run_loop.Run(); } EXPECT_EQ(0, CountRenderProcessHosts()); @@ -2060,7 +2085,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, + run_loop.QuitClosure())); run_loop.Run(); } EXPECT_EQ(1, CountRenderProcessHosts()); @@ -2075,7 +2102,9 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, + run_loop.QuitClosure())); run_loop.Run(); } @@ -2088,7 +2117,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kScope), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } EXPECT_GE(1, CountRenderProcessHosts()) << "Unregistering doesn't stop the " @@ -2232,7 +2262,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(GetWorkerURL()), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); } @@ -2574,7 +2605,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( cross_origin_server_.GetURL(script), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); } @@ -2878,7 +2910,8 @@ blink::mojom::ServiceWorkerUpdateViaCache::kImports); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(script_url), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); }
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index 1024772..25c46b24 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -91,14 +91,13 @@ base::BindOnce(WorkerStarted, std::move(callback))); } -void DidStartWorker( - scoped_refptr<ServiceWorkerVersion> version, - ServiceWorkerContext::StartWorkerCallback info_callback, - ServiceWorkerContext::StartWorkerFailureCallback error_callback, - blink::ServiceWorkerStatusCode start_worker_status) { +void DidStartWorker(scoped_refptr<ServiceWorkerVersion> version, + ServiceWorkerContext::StartWorkerCallback info_callback, + ServiceWorkerContext::StatusCodeCallback failure_callback, + blink::ServiceWorkerStatusCode start_worker_status) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (start_worker_status != blink::ServiceWorkerStatusCode::kOk) { - std::move(error_callback).Run(start_worker_status); + std::move(failure_callback).Run(start_worker_status); return; } EmbeddedWorkerInstance* instance = version->embedded_worker(); @@ -109,7 +108,7 @@ void FoundRegistrationForStartWorker( ServiceWorkerContext::StartWorkerCallback info_callback, - ServiceWorkerContext::StartWorkerFailureCallback failure_callback, + ServiceWorkerContext::StatusCodeCallback failure_callback, blink::ServiceWorkerStatusCode service_worker_status, scoped_refptr<ServiceWorkerRegistration> registration) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -460,11 +459,14 @@ void ServiceWorkerContextWrapper::RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) { + StatusCodeCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!context_core_) { GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), false)); + FROM_HERE, + base::BindOnce( + std::move(callback), + blink::ServiceWorkerStatusCode::kErrorStartWorkerFailed)); return; } blink::mojom::ServiceWorkerRegistrationOptions options_to_pass( @@ -478,7 +480,10 @@ network::mojom::ReferrerPolicy::kDefault, /*outgoing_referrer=*/script_url, blink::mojom::InsecureRequestsPolicy::kDoNotUpgrade), - WrapResultCallbackToTakeStatusCode(std::move(callback))); + base::BindOnce( + [](StatusCodeCallback callback, blink::ServiceWorkerStatusCode status, + const std::string&, int64_t) { std::move(callback).Run(status); }, + std::move(callback))); } void ServiceWorkerContextWrapper::UnregisterServiceWorker( @@ -646,7 +651,7 @@ void ServiceWorkerContextWrapper::StartWorkerForScope( const GURL& scope, StartWorkerCallback info_callback, - StartWorkerFailureCallback failure_callback) { + StatusCodeCallback failure_callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); FindRegistrationForScopeImpl( scope, /*include_installing_version=*/true,
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index d3d27a5..e1873d3b7 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -152,7 +152,7 @@ void RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) override; + StatusCodeCallback callback) override; void UnregisterServiceWorker(const GURL& scope, ResultCallback callback) override; ServiceWorkerExternalRequestResult StartingExternalRequest( @@ -172,10 +172,9 @@ CheckOfflineCapabilityCallback callback) override; void ClearAllServiceWorkersForTest(base::OnceClosure callback) override; - void StartWorkerForScope( - const GURL& scope, - StartWorkerCallback info_callback, - StartWorkerFailureCallback failure_callback) override; + void StartWorkerForScope(const GURL& scope, + StartWorkerCallback info_callback, + StatusCodeCallback failure_callback) override; void StartServiceWorkerAndDispatchMessage( const GURL& scope, blink::TransferableMessage message, @@ -470,7 +469,7 @@ void StartServiceWorkerAndDispatchMessageOnUIThread( const GURL& scope, blink::TransferableMessage message, - ResultCallback result_callback); + ResultCallback callback); void DeleteForOriginOnUIThread( const url::Origin& origin, ResultCallback callback,
diff --git a/content/browser/service_worker/service_worker_version_browsertest.cc b/content/browser/service_worker/service_worker_version_browsertest.cc index 679bb7ce..a3a5f3d 100644 --- a/content/browser/service_worker/service_worker_version_browsertest.cc +++ b/content/browser/service_worker/service_worker_version_browsertest.cc
@@ -130,9 +130,16 @@ std::move(quit), status); } -void ExpectResultAndRun(bool expected, - base::RepeatingClosure continuation, - bool actual) { +void ExpectRegisterResultAndRun(blink::ServiceWorkerStatusCode expected, + base::RepeatingClosure continuation, + blink::ServiceWorkerStatusCode actual) { + EXPECT_EQ(expected, actual); + continuation.Run(); +} + +void ExpectUnregisterResultAndRun(bool expected, + base::RepeatingClosure continuation, + bool actual) { EXPECT_EQ(expected, actual); continuation.Run(); } @@ -1252,7 +1259,8 @@ observer->Init(); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); int64_t registration_id = observer->registration_id(); @@ -1299,7 +1307,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kScope), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); } @@ -1323,7 +1332,8 @@ observer->Init(); public_context()->RegisterServiceWorker( embedded_test_server()->GetURL(kWorkerUrl), options, - base::BindOnce(&ExpectResultAndRun, true, base::DoNothing())); + base::BindOnce(&ExpectRegisterResultAndRun, + blink::ServiceWorkerStatusCode::kOk, base::DoNothing())); observer->Wait(); int64_t registration_id = observer->registration_id(); @@ -1341,7 +1351,8 @@ base::RunLoop run_loop; public_context()->UnregisterServiceWorker( embedded_test_server()->GetURL(kScope), - base::BindOnce(&ExpectResultAndRun, true, run_loop.QuitClosure())); + base::BindOnce(&ExpectUnregisterResultAndRun, true, + run_loop.QuitClosure())); run_loop.Run(); }
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5f66077..0e95069 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -8568,6 +8568,15 @@ base::trace_event::TracedValue::Build( {{"old", base::trace_event::ValueToString(old_state)}, {"new", base::trace_event::ValueToString(new_state)}})); + const bool was_in_back_forward_cache = + old_state == LifecycleState::kInBackForwardCache; + const bool is_in_back_forward_cache = + new_state == LifecycleState::kInBackForwardCache; + if (was_in_back_forward_cache != is_in_back_forward_cache) { + observers_.NotifyObservers( + &WebContentsObserver::FrameBackForwardCacheStateChanged, + render_frame_host); + } if (render_frame_host->GetParent()) return;
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h index 8d688ea6..71c7786 100644 --- a/content/public/browser/service_worker_context.h +++ b/content/public/browser/service_worker_context.h
@@ -87,15 +87,15 @@ base::OnceCallback<void(OfflineCapability capability, int64_t registration_id)>; + using StatusCodeCallback = + base::OnceCallback<void(blink::ServiceWorkerStatusCode status_code)>; + using StartServiceWorkerForNavigationHintCallback = base::OnceCallback<void( StartServiceWorkerForNavigationHintResult result)>; using StartWorkerCallback = base::OnceCallback< void(int64_t version_id, int process_id, int thread_id)>; - using StartWorkerFailureCallback = - base::OnceCallback<void(blink::ServiceWorkerStatusCode status_code)>; - // Returns BrowserThread::UI always. // TODO(https://crbug.com/1138155): Remove this. static content::BrowserThread::ID GetCoreThreadId(); @@ -125,7 +125,7 @@ virtual void RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) = 0; + StatusCodeCallback callback) = 0; // Equivalent to calling ServiceWorkerRegistration#unregister on the // registration for |scope|. |callback| is passed true when the JS promise is @@ -204,10 +204,9 @@ // // There is no guarantee about whether the callback is called synchronously or // asynchronously. - virtual void StartWorkerForScope( - const GURL& scope, - StartWorkerCallback info_callback, - StartWorkerFailureCallback failure_callback) = 0; + virtual void StartWorkerForScope(const GURL& scope, + StartWorkerCallback info_callback, + StatusCodeCallback failure_callback) = 0; // Starts the active worker of the registration for the given |scope| and // dispatches the given |message| to the service worker. |result_callback|
diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 9ab0a26..5ce0d19b 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h
@@ -389,6 +389,11 @@ virtual void FrameSizeChanged(RenderFrameHost* render_frame_host, const gfx::Size& frame_size) {} + // Invoked when the state of render_frame_host->IsInBackForwardCache() + // changes. + virtual void FrameBackForwardCacheStateChanged( + RenderFrameHost* render_frame_host) {} + // This method is invoked when the title of the WebContents is set. Note that // |entry| may be null if the web page whose title changed has not yet had a // NavigationEntry assigned to it.
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc index 6bc7162..27bde9f 100644 --- a/content/public/test/browser_test_base.cc +++ b/content/public/test/browser_test_base.cc
@@ -959,8 +959,7 @@ mojo_rule->host_pattern = rule.host_pattern; mojo_rule->replacement = rule.replacement; mojo_rule->host_resolver_flags = rule.host_resolver_flags; - mojo_rule->canonical_name = - !rule.dns_aliases.empty() ? rule.dns_aliases.front() : std::string(); + mojo_rule->dns_aliases = rule.dns_aliases; mojo_rules.push_back(std::move(mojo_rule)); } }
diff --git a/content/public/test/fake_service_worker_context.cc b/content/public/test/fake_service_worker_context.cc index 224a3fa6..528715b 100644 --- a/content/public/test/fake_service_worker_context.cc +++ b/content/public/test/fake_service_worker_context.cc
@@ -28,7 +28,7 @@ void FakeServiceWorkerContext::RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) { + StatusCodeCallback callback) { NOTREACHED(); } void FakeServiceWorkerContext::UnregisterServiceWorker( @@ -84,7 +84,7 @@ void FakeServiceWorkerContext::StartWorkerForScope( const GURL& scope, ServiceWorkerContext::StartWorkerCallback info_callback, - ServiceWorkerContext::StartWorkerFailureCallback failure_callback) { + ServiceWorkerContext::StatusCodeCallback failure_callback) { NOTREACHED(); } void FakeServiceWorkerContext::StartServiceWorkerForNavigationHint(
diff --git a/content/public/test/fake_service_worker_context.h b/content/public/test/fake_service_worker_context.h index b78354d..38de95b 100644 --- a/content/public/test/fake_service_worker_context.h +++ b/content/public/test/fake_service_worker_context.h
@@ -36,7 +36,7 @@ void RegisterServiceWorker( const GURL& script_url, const blink::mojom::ServiceWorkerRegistrationOptions& options, - ResultCallback callback) override; + StatusCodeCallback callback) override; void UnregisterServiceWorker(const GURL& scope, ResultCallback callback) override; ServiceWorkerExternalRequestResult StartingExternalRequest( @@ -60,8 +60,7 @@ void StartWorkerForScope( const GURL& scope, ServiceWorkerContext::StartWorkerCallback info_callback, - ServiceWorkerContext::StartWorkerFailureCallback failure_callback) - override; + ServiceWorkerContext::StatusCodeCallback failure_callback) override; void StartServiceWorkerAndDispatchMessage( const GURL& scope, blink::TransferableMessage message,
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc index b5531d44..f0962fa 100644 --- a/content/public/test/network_service_test_helper.cc +++ b/content/public/test/network_service_test_helper.cc
@@ -127,7 +127,7 @@ DCHECK(ip_address.AssignFromIPLiteral(rule->replacement)); host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement, rule->host_resolver_flags, - rule->canonical_name); + rule->dns_aliases); break; } case network::mojom::ResolverType::kResolverTypeDirectLookup: @@ -136,7 +136,7 @@ default: host_resolver->AddRuleWithFlags(rule->host_pattern, rule->replacement, rule->host_resolver_flags, - rule->canonical_name); + rule->dns_aliases); break; } }
diff --git a/content/test/data/tree_parser_util.js b/content/test/data/tree_parser_util.js index 42986cd..b99e2cc1 100644 --- a/content/test/data/tree_parser_util.js +++ b/content/test/data/tree_parser_util.js
@@ -211,3 +211,5 @@ flatten: flatten }; })(); + +document.scriptExecuted = true;
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index dd5516a7..6a9a0f6 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc
@@ -268,10 +268,17 @@ int proxy_route_id, bool window_was_created_with_opener) { DCHECK(!IsRenderViewLive()); + // Mark the RenderView as live, though there's nothing to do here since we + // don't yet use mojo to talk to the RenderView. + renderer_view_created_ = true; - RenderFrameHostImpl* main_frame = - static_cast<RenderFrameHostImpl*>(GetMainFrame()); - if (main_frame && is_active()) { + // When the RenderViewHost has a main frame host attached, the RenderView + // in the renderer creates the main frame along with it. We mimic that here by + // creating the mojo connections and calling RenderFrameCreated(). + RenderFrameHostImpl* main_frame = RenderFrameHostImpl::FromID( + GetProcess()->GetID(), main_frame_routing_id_); + DCHECK_EQ(!!main_frame, is_active()); + if (main_frame) { // Pretend that we started a renderer process and created the renderer Frame // with its Widget. We bind all the mojom interfaces, but they all just talk // into the void. @@ -289,12 +296,9 @@ // This also initializes the RenderWidgetHost attached to the frame. main_frame->RenderFrameCreated(); - } else { - GetWidget()->SetRendererWidgetCreatedForInactiveRenderView(); } - - DCHECK(IsRenderViewLive()); opener_frame_token_ = opener_frame_token; + DCHECK(IsRenderViewLive()); return true; }
diff --git a/docs/accessibility/select_to_speak.md b/docs/accessibility/select_to_speak.md index b6b6e46..44641f6f 100644 --- a/docs/accessibility/select_to_speak.md +++ b/docs/accessibility/select_to_speak.md
@@ -49,6 +49,8 @@ - The status tray button, ash/system/accessibility/select_to_speak_tray.h +- Floating panel, system/accessibility/select_to_speak_menu_bubble_controller.h + In addition, there are settings for STS in chrome/browser/resources/settings/a11y_page/manage_a11y_page.* @@ -129,6 +131,9 @@ Walking back down through the children occurs in NodeUtils.findAllMatching, and results in a list of AutomationNodes that can be sent for speech. +If the rect size is below a certain threshold, all nodes within overlapped +block parent are selected. + ##### With search + s select_to_speak.js requests focus information from the Automation API. The @@ -187,6 +192,98 @@ when a user wants to change state. The STS extension is the source of truth for STS state. +### Navigation features + +When `select-to-speak-navigation-control` flag is enabled, STS will display a +floating control panel when activated. The control panel hosts controls for +pause/resume, updating reading speed, navigating by sentence or paragraph, +and deactivating STS. + +#### Floating control panel + +The panel is implemented as a native ASH component +[select_to_speak_menu_bubble_controller.h](https://source.chromium.org/chromium/chromium/src/+/master:ash/system/accessibility/select_to_speak_menu_bubble_controller.h). +Similar to focus rings, the STS component extension communicates with the panel +via the `chrome.accessibilityPrivate` API. The +`chrome.accessibilityPrivate.updateSelectToSpeakPanel` API controls the +visibility and button states, and panel actions are communicated back to the +extension by adding a listener to +`chrome.accessibilityPrivate.onSelectToSpeakPanelAction`. + +When the panel is displayed, STS will no longer dismiss itself when TTS +playback is complete. The user must quit STS either from the panel or +the tray button. + +##### Keyboard shortcuts + +When the panel is displayed, it is initially focused and captures keypresses to +implement keyboard shortcuts: + +* Space - activates currently focused button, which is 'Pause/Resume' + initially. +* Left Arrow - Navigate to previous sentence (for RTL languages, this is Right + Arrow) +* Right Arrow - Navigate to next sentence (for RTL languages, this is Left + Arrow) +* Up Arrow - Navigate to previous paragraph +* Down Arrow - Navigate to next paragraph + +If the panel loses focus, keyboard shortcuts will no longer work. User can press +Search+S keyboard shortcut (with no text selection) to restore focus to the +panel. + +##### Disallowed nodes + +The panel is not shown when STS is activated on nodes where navigation features +do not add value, such as in system UI or top-level windows. + +* System UI nodes - any nodes that have a `root` with role `desktop` +* Root nodes that are children of the root `desktop` node + +#### Pause/Resume + +Since `chrome.tts.pause` and `chrome.tts.resume` are not consistently +implemented across all TTS engines, STS implements pause/resume functionality +using the `chrome.tts.stop` and `chrome.tts.speak` APIs. While TTS is playing, +STS keeps track of the current word offset, and when TTS is resumed, it will +call `speak` with text trimmed to the start of the last spoken word. + +Resuming TTS behaves differently depending on the context: + +* If TTS was paused within the user-selected text, resuming will play until + the end of the selected text. +* If TTS stopped when it reached the end of the selected text, but before the + end of the paragraph, resuming will continue from that point to the end of + the paragraph. +* If TTS stopped when it reached the end of a paragraph, resuming will speak + the next paragraph. + +#### Paragraph navigation + +Users can navigate to adjacent paragraphs from the current block parent when +Select-to-speak is active. A 'paragraph' is any block element as defined by +[ParagraphUtils.isBlock](https://source.chromium.org/chromium/chromium/src/+/master:chrome/browser/resources/chromeos/accessibility/select_to_speak/paragraph_utils.js) +and the navigation occurs in DOM-order. + +#### Sentence navigation + +Paragraphs are split into sentences based on the `sentenceStarts` property of +an AutomationNode. Users can skip to previous and next sentences using similar +technique as pause/resume (`stop` then `speak` with trimmed text). See +[sentence_utils.js](https://source.chromium.org/chromium/chromium/src/+/master:chrome/browser/resources/chromeos/accessibility/select_to_speak/sentence_utils.js) +for logic on breaking node groups into sentences. + +#### Reading speed + +Users can slow down or speed up TTS speaking rate using the floating control +panel. The rate the user selects in the panel is multiplied by the system +default TTS rate. So if the user selects 1.2x reading speed in the panel and +has a system default of 2.0x, the effective TTS rate will be 2.4x. + +When users adjust reading speed, `chrome.tts.stop` is called, and +`chrome.tts.speak` is then called with text trimmed to the current word +position, passing in the new effective TTS rate as an option. + ### Special case: Google Drive apps Google Drive apps require a few work-arounds to work correctly with STS. @@ -218,3 +315,5 @@ - Per word highlighting, [go/chrome-sts-sentences-and-words](go/chrome-sts-sentences-and-words) and [go/chromeos-sts-highlight](go/chromeos-sts-highlight) + +- Navigation features, [go/enhanced-sts-dd](go/enhanced-sts-dd) \ No newline at end of file
diff --git a/docs/webui_explainer.md b/docs/webui_explainer.md index 2434243..3b84308 100644 --- a/docs/webui_explainer.md +++ b/docs/webui_explainer.md
@@ -258,8 +258,10 @@ ```c++ void OvenHandler::RegisterMessages() { - web_ui()->RegisterMessageCallback("bakeDonuts", - base::Bind(&OvenHandler::HandleBakeDonuts, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "bakeDonuts", + base::BindRepeating(&OvenHandler::HandleBakeDonuts, + base::Unretained(this))); } void OvenHandler::HandleBakeDonuts(const base::ListValue* args) { @@ -727,7 +729,8 @@ v8::Local<v8::Object> chrome = GetOrCreateChromeObject(isolate, context); chrome->Set(gin::StringToSymbol(isolate, "send"), gin::CreateFunctionTemplate( - isolate, base::Bind(&WebUIExtension::Send))->GetFunction()); + isolate, + base::BindRepeating(&WebUIExtension::Send))->GetFunction()); ``` The `chrome.send()` method takes a message name and argument list.
diff --git a/extensions/browser/service_worker_task_queue.cc b/extensions/browser/service_worker_task_queue.cc index 26ceb0c..43e6b018 100644 --- a/extensions/browser/service_worker_task_queue.cc +++ b/extensions/browser/service_worker_task_queue.cc
@@ -424,7 +424,7 @@ void ServiceWorkerTaskQueue::DidRegisterServiceWorker( const SequencedContextId& context_id, base::Time start_time, - bool success) { + blink::ServiceWorkerStatusCode status_code) { ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); const ExtensionId& extension_id = context_id.first.extension_id(); DCHECK(registry); @@ -438,6 +438,7 @@ WorkerState* worker_state = GetWorkerState(context_id); DCHECK(worker_state); + const bool success = status_code == blink::ServiceWorkerStatusCode::kOk; UMA_HISTOGRAM_BOOLEAN("Extensions.ServiceWorkerBackground.RegistrationStatus", success);
diff --git a/extensions/browser/service_worker_task_queue.h b/extensions/browser/service_worker_task_queue.h index 440d6ece..95a48033f 100644 --- a/extensions/browser/service_worker_task_queue.h +++ b/extensions/browser/service_worker_task_queue.h
@@ -154,7 +154,7 @@ void DidRegisterServiceWorker(const SequencedContextId& context_id, base::Time start_time, - bool success); + blink::ServiceWorkerStatusCode status); void DidUnregisterServiceWorker(const ExtensionId& extension_id, ActivationSequence sequence, bool success);
diff --git a/fuchsia/base/agent_impl.cc b/fuchsia/base/agent_impl.cc index 4ecd277..f4d6496 100644 --- a/fuchsia/base/agent_impl.cc +++ b/fuchsia/base/agent_impl.cc
@@ -15,12 +15,8 @@ AgentImpl::ComponentStateBase::ComponentStateBase( base::StringPiece component_id) : component_id_(component_id) { - fidl::InterfaceHandle<::fuchsia::io::Directory> directory; - outgoing_directory_.GetOrCreateDirectory("svc")->Serve( - fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE, - directory.NewRequest().TakeChannel()); - service_provider_ = std::make_unique<base::fuchsia::ServiceProviderImpl>( - std::move(directory)); + service_provider_ = base::ServiceProviderImpl::CreateForOutgoingDirectory( + &outgoing_directory_); // Tear down this instance when the client disconnects from the directory. service_provider_->SetOnLastClientDisconnectedClosure(base::BindOnce(
diff --git a/fuchsia/base/agent_impl.h b/fuchsia/base/agent_impl.h index 918282cd..8a1d4d93 100644 --- a/fuchsia/base/agent_impl.h +++ b/fuchsia/base/agent_impl.h
@@ -91,7 +91,7 @@ const std::string component_id_; AgentImpl* agent_impl_ = nullptr; sys::OutgoingDirectory outgoing_directory_; - std::unique_ptr<base::fuchsia::ServiceProviderImpl> service_provider_; + std::unique_ptr<base::ServiceProviderImpl> service_provider_; std::vector<base::RepeatingCallback<bool()>> keepalive_callbacks_; DISALLOW_COPY_AND_ASSIGN(ComponentStateBase);
diff --git a/fuchsia/runners/web/web_runner_smoke_test.cc b/fuchsia/runners/web/web_runner_smoke_test.cc index 68c5130..f66a055b 100644 --- a/fuchsia/runners/web/web_runner_smoke_test.cc +++ b/fuchsia/runners/web/web_runner_smoke_test.cc
@@ -32,14 +32,8 @@ test_server_.RegisterRequestHandler(base::BindRepeating( &WebRunnerSmokeTest::HandleRequest, base::Unretained(this))); ASSERT_TRUE(test_server_.Start()); - - fidl::InterfaceHandle<fuchsia::io::Directory> directory; - outgoing_directory_.GetOrCreateDirectory("svc")->Serve( - fuchsia::io::OPEN_RIGHT_READABLE | fuchsia::io::OPEN_RIGHT_WRITABLE, - directory.NewRequest().TakeChannel()); - - service_provider_ = std::make_unique<base::fuchsia::ServiceProviderImpl>( - std::move(directory)); + service_provider_ = base::ServiceProviderImpl::CreateForOutgoingDirectory( + &outgoing_directory_); } fuchsia::sys::LaunchInfo LaunchInfoWithServices() { @@ -86,7 +80,7 @@ base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; sys::OutgoingDirectory outgoing_directory_; - std::unique_ptr<base::fuchsia::ServiceProviderImpl> service_provider_; + std::unique_ptr<base::ServiceProviderImpl> service_provider_; net::EmbeddedTestServer test_server_;
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index 238f698..9013217f 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -691,6 +691,14 @@ includable_only: true } builders { + name: "chromium/try/gpu-fyi-try-lacros-amd-rel" + includable_only: true + } + builders { + name: "chromium/try/gpu-fyi-try-lacros-intel-rel" + includable_only: true + } + builders { name: "chromium/try/gpu-fyi-try-linux-amd-rel" includable_only: true }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 1211ffe..905babb 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -4538,6 +4538,64 @@ } } builders { + name: "GPU FYI Lacros x64 Builder" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.gpu.fyi\",\"perf_dashboard_machine_group\":\"ChromiumGPUFYI\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "GPU FYI Linux Builder" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -5862,6 +5920,122 @@ } } builders { + name: "Lacros FYI x64 Release (AMD)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.gpu.fyi\",\"perf_dashboard_machine_group\":\"ChromiumGPUFYI\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { + name: "Lacros FYI x64 Release (Intel)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:2" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.gpu.fyi\",\"perf_dashboard_machine_group\":\"ChromiumGPUFYI\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 21600 + build_numbers: YES + service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "Leak Detection Linux" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -21756,11 +21930,11 @@ cipd_version: "refs/heads/master" cmd: "recipes" } - properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\",\"xcode_build_version\":\"12c33\"}" + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\",\"xcode_build_version\":\"12d4e\"}" execution_timeout_secs: 36000 caches { - name: "xcode_ios_12c33" - path: "xcode_ios_12c33.app" + name: "xcode_ios_12d4e" + path: "xcode_ios_12d4e.app" } build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -25582,7 +25756,7 @@ cipd_version: "refs/heads/master" cmd: "recipes" } - properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}" + properties: "{\"$build/code_coverage\":{\"coverage_test_types\":[\"overall\",\"unit\"],\"use_clang_coverage\":true},\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}" execution_timeout_secs: 72000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -36804,6 +36978,128 @@ } } builders { + name: "gpu-fyi-try-lacros-amd-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.linux.amd.try" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}" + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { + name: "gpu-fyi-try-lacros-intel-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "pool:luci.chromium.gpu.linux.intel.try" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}" + execution_timeout_secs: 21600 + expiration_secs: 7200 + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "gpu-fyi-try-linux-amd-rel" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -40614,7 +40910,7 @@ cipd_version: "refs/heads/master" cmd: "recipes" } - properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12c33\"}" + properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12d4e\"}" execution_timeout_secs: 14400 expiration_secs: 7200 caches { @@ -40622,8 +40918,8 @@ path: "win_toolchain" } caches { - name: "xcode_ios_12c33" - path: "xcode_ios_12c33.app" + name: "xcode_ios_12d4e" + path: "xcode_ios_12d4e.app" } build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index 91f6d1d1..d1ee28d 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -7518,6 +7518,21 @@ category: "ChromeOS|arm|kevin" short_name: "kvn" } + builders { + name: "buildbucket/luci.chromium.ci/Lacros FYI x64 Release (AMD)" + category: "Lacros|AMD" + short_name: "amd" + } + builders { + name: "buildbucket/luci.chromium.ci/GPU FYI Lacros x64 Builder" + category: "Lacros|Builder" + short_name: "rel" + } + builders { + name: "buildbucket/luci.chromium.ci/Lacros FYI x64 Release (Intel)" + category: "Lacros|Intel" + short_name: "int" + } header { oncalls { name: "Chromium" @@ -12284,6 +12299,12 @@ name: "buildbucket/luci.chromium.try/gpu-fyi-try-chromeos-kevin" } builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-lacros-amd-rel" + } + builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-lacros-intel-rel" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-amd-rel" } builders { @@ -13354,6 +13375,12 @@ name: "buildbucket/luci.chromium.try/fuchsia_x64" } builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-lacros-amd-rel" + } + builders { + name: "buildbucket/luci.chromium.try/gpu-fyi-try-lacros-intel-rel" + } + builders { name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-amd-rel" } builders {
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 6add2b47..5feaa01c 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -1106,6 +1106,16 @@ } } job { + id: "GPU FYI Lacros x64 Builder" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "GPU FYI Lacros x64 Builder" + } +} +job { id: "GPU FYI Linux Builder" realm: "ci" acl_sets: "ci" @@ -1336,6 +1346,34 @@ } } job { + id: "Lacros FYI x64 Release (AMD)" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Lacros FYI x64 Release (AMD)" + } +} +job { + id: "Lacros FYI x64 Release (Intel)" + realm: "ci" + acls { + role: TRIGGERER + granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + } + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Lacros FYI x64 Release (Intel)" + } +} +job { id: "Leak Detection Linux" realm: "ci" acl_sets: "ci" @@ -6689,6 +6727,7 @@ triggers: "Deterministic Linux (dbg)" triggers: "Fuchsia ARM64" triggers: "Fuchsia x64" + triggers: "GPU FYI Lacros x64 Builder" triggers: "GPU FYI Linux Builder" triggers: "GPU FYI Linux Builder (dbg)" triggers: "GPU FYI Linux Ozone Builder"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 22a0525..b701c7b 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -141,7 +141,7 @@ # (current default) xc12 gm seed x12a7209 = xcode_enum("12a7209"), # latest Xcode 12 beta version. - x12c33 = xcode_enum("12c33"), + x12d4e = xcode_enum("12d4e"), ) ################################################################################
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index 895bf8bb..84e7c1a 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -3546,6 +3546,7 @@ ), cores = 24, os = os.MAC_ANY, + coverage_test_types = ["overall", "unit"], use_clang_coverage = True, ) @@ -3665,7 +3666,7 @@ category = "iOS|iOS14", short_name = "sdk14", ), - xcode = xcode.x12c33, + xcode = xcode.x12d4e, ) ci.fyi_mac_builder( @@ -4053,6 +4054,14 @@ ) ci.gpu_fyi_linux_builder( + name = "GPU FYI Lacros x64 Builder", + console_view_entry = consoles.console_view_entry( + category = "Lacros|Builder", + short_name = "rel", + ), +) + +ci.gpu_fyi_linux_builder( name = "GPU FYI Linux Builder", console_view_entry = consoles.console_view_entry( category = "Linux|Builder", @@ -4150,6 +4159,24 @@ ) ci.gpu_fyi_thin_tester( + name = "Lacros FYI x64 Release (AMD)", + console_view_entry = consoles.console_view_entry( + category = "Lacros|AMD", + short_name = "amd", + ), + triggered_by = ["GPU FYI Lacros x64 Builder"], +) + +ci.gpu_fyi_thin_tester( + name = "Lacros FYI x64 Release (Intel)", + console_view_entry = consoles.console_view_entry( + category = "Lacros|Intel", + short_name = "int", + ), + triggered_by = ["GPU FYI Lacros x64 Builder"], +) + +ci.gpu_fyi_thin_tester( name = "Linux FYI Debug (NVIDIA)", console_view_entry = consoles.console_view_entry( category = "Linux|Nvidia",
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star index 2f94e795..8b261dae 100644 --- a/infra/config/subprojects/chromium/gpu.try.star +++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -159,6 +159,16 @@ ) gpu_linux_builder( + name = "gpu-fyi-try-lacros-amd-rel", + pool = "luci.chromium.gpu.linux.amd.try", +) + +gpu_linux_builder( + name = "gpu-fyi-try-lacros-intel-rel", + pool = "luci.chromium.gpu.linux.intel.try", +) + +gpu_linux_builder( name = "gpu-fyi-try-linux-amd-rel", pool = "luci.chromium.gpu.linux.amd.try", )
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star index 57f890a..a7fb86a 100644 --- a/infra/config/subprojects/chromium/try.star +++ b/infra/config/subprojects/chromium/try.star
@@ -1446,7 +1446,7 @@ try_.chromium_mac_ios_builder( name = "ios14-sdk-simulator", - xcode = xcode.x12c33, + xcode = xcode.x12d4e, ) try_.chromium_updater_mac_builder(
diff --git a/ios/chrome/browser/flags/BUILD.gn b/ios/chrome/browser/flags/BUILD.gn index 5836667..965672b 100644 --- a/ios/chrome/browser/flags/BUILD.gn +++ b/ios/chrome/browser/flags/BUILD.gn
@@ -59,6 +59,7 @@ "//ios/chrome/browser/ui/fullscreen:feature_flags", "//ios/chrome/browser/ui/infobars:feature_flags", "//ios/chrome/browser/ui/ntp:feature_flags", + "//ios/chrome/browser/ui/start_surface:feature_flags", "//ios/chrome/browser/ui/tab_switcher/tab_grid:features", "//ios/chrome/browser/ui/table_view:feature_flags", "//ios/chrome/browser/ui/toolbar_container:feature_flags",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 7c20e1c..c1ae8b63 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -68,6 +68,7 @@ #import "ios/chrome/browser/ui/fullscreen/fullscreen_features.h" #import "ios/chrome/browser/ui/infobars/infobar_feature.h" #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h" +#import "ios/chrome/browser/ui/start_surface/start_surface_features.h" #import "ios/chrome/browser/ui/tab_switcher/tab_grid/features.h" #import "ios/chrome/browser/ui/table_view/feature_flags.h" #import "ios/chrome/browser/ui/toolbar_container/toolbar_container_features.h" @@ -607,6 +608,9 @@ flag_descriptions::kSharedHighlightingUseBlocklistIOSDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(shared_highlighting::kSharedHighlightingUseBlocklist)}, + {"start-surface", flag_descriptions::kStartSurfaceName, + flag_descriptions::kStartSurfaceDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kStartSurface)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 5971e0fc..3bc6c92 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -414,6 +414,11 @@ const char kSyncSandboxDescription[] = "Connects to the testing server for Chrome Sync."; +const char kStartSurfaceName[] = "Start Surface"; +const char kStartSurfaceDescription[] = + "Enable showing the Start Surface when launching Chrome via clicking the " + "icon or the app switcher."; + const char kToolbarContainerName[] = "Use Toolbar Containers"; const char kToolbarContainerDescription[] = "When enabled, the toolbars and their fullscreen animations will be "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 8d65b69..7a1bfcc2 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -353,6 +353,10 @@ extern const char kSnapshotDrawViewName[]; extern const char kSnapshotDrawViewDescription[]; +// Title and description for the flag to enable the Start Surface. +extern const char kStartSurfaceName[]; +extern const char kStartSurfaceDescription[]; + // Title and description for the flag to control if Chrome Sync should use the // sandbox servers. extern const char kSyncSandboxName[];
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm b/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm index 2826913..82f15ff5 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_check_manager_unittest.mm
@@ -52,7 +52,7 @@ using password_manager::CredentialWithPassword; using password_manager::MockBulkLeakCheckService; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::InsecureCredentialTypeFlags; using password_manager::IsLeaked; using password_manager::LeakCheckCredential; @@ -105,7 +105,7 @@ base::StringPiece signon_realm, base::StringPiece username, base::TimeDelta time_since_creation = base::TimeDelta(), - CompromiseType compromise_type = CompromiseType::kLeaked) { + InsecureType compromise_type = InsecureType::kLeaked) { return CompromisedCredentials( std::string(signon_realm), base::ASCIIToUTF16(username), base::Time::Now() - time_since_creation, compromise_type, @@ -191,7 +191,7 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); EXPECT_THAT( manager().GetCompromisedCredentials(), @@ -293,7 +293,7 @@ EXPECT_CALL(observer, CompromisedCredentialsChanged).Times(0); store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kPhished)); + InsecureType::kPhished)); RunUntilIdle(); } @@ -328,7 +328,7 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); EXPECT_THAT( manager().GetCompromisedCredentials(), @@ -411,7 +411,7 @@ store().AddCompromisedCredentials( MakeCompromised(kExampleCom, kUsername1, base::TimeDelta::FromMinutes(1), - CompromiseType::kLeaked)); + InsecureType::kLeaked)); RunUntilIdle(); manager().EditCompromisedPasswordForm(form, kPassword2);
diff --git a/ios/chrome/browser/policy/reporting/report_generator_ios_unittest.mm b/ios/chrome/browser/policy/reporting/report_generator_ios_unittest.mm index e6c9ae5..a04ba27 100644 --- a/ios/chrome/browser/policy/reporting/report_generator_ios_unittest.mm +++ b/ios/chrome/browser/policy/reporting/report_generator_ios_unittest.mm
@@ -142,6 +142,7 @@ policy::GetBrowserDeviceIdentifier()->SerializePartialAsString(), basic_request->browser_device_identifier().SerializePartialAsString()); EXPECT_NE(std::string(), basic_request->device_model()); + EXPECT_NE(std::string(), basic_request->brand_name()); // Verify the OS report EXPECT_TRUE(basic_request->has_os_report());
diff --git a/ios/chrome/browser/safe_browsing/BUILD.gn b/ios/chrome/browser/safe_browsing/BUILD.gn index bd214fe..5177030 100644 --- a/ios/chrome/browser/safe_browsing/BUILD.gn +++ b/ios/chrome/browser/safe_browsing/BUILD.gn
@@ -55,6 +55,8 @@ "//components/safe_browsing/ios/password_protection", "//components/security_interstitials/core", "//components/security_interstitials/core:unsafe_resource", + "//components/sync/protocol", + "//components/sync_user_events", "//ios/chrome/browser", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/content_settings", @@ -184,16 +186,22 @@ "//components/safe_browsing/core/db:v4_get_hash_protocol_manager", "//components/safe_browsing/core/db:v4_protocol_manager_util", "//components/safe_browsing/core/db:v4_test_util", + "//components/safe_browsing/core/password_protection:password_protection_metrics_util", "//components/safe_browsing/ios/browser:allow_list", "//components/security_interstitials/core", "//components/security_interstitials/core:unsafe_resource", + "//components/signin/public/identity_manager", + "//components/signin/public/identity_manager:test_support", + "//components/sync/protocol", "//components/sync_preferences", "//components/sync_preferences:test_support", + "//components/sync_user_events:test_support", "//components/unified_consent", "//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/passwords", "//ios/chrome/browser/prerender", "//ios/chrome/browser/prerender:test_support", + "//ios/chrome/browser/sync", "//ios/chrome/browser/web:test_support", "//ios/chrome/test:test_support", "//ios/web/public", @@ -204,6 +212,8 @@ "//services/network/public/mojom", "//testing/gmock", "//testing/gtest", + "//ui/base", + "//url", ] configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h index 2742697..ce4e8de 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.h
@@ -9,14 +9,20 @@ #include "components/password_manager/core/browser/password_reuse_detector.h" #import "components/safe_browsing/ios/password_protection/password_protection_service.h" +#include "components/sync/protocol/gaia_password_reuse.pb.h" class ChromeBrowserState; +class GURL; class PrefService; namespace password_manager { class PasswordStore; } +namespace web { +class WebState; +} + namespace safe_browsing { class ChromePasswordProtectionService : public PasswordProtectionService { @@ -119,6 +125,16 @@ PasswordType password_type, const LoginReputationClientResponse* response) override; + // Records a Chrome Sync event that sync password reuse was detected. + void MaybeLogPasswordReuseDetectedEvent(web::WebState* web_state); + + // Records a Chrome Sync event with the result of the user's interaction with + // the warning dialog. + void MaybeLogPasswordReuseDialogInteraction( + int64_t navigation_id, + sync_pb::GaiaPasswordReuse::PasswordReuseDialogInteraction:: + InteractionResult interaction_result); + private: password_manager::PasswordStore* GetStoreForReusedCredential( const password_manager::MatchingReusedCredential& reused_credential);
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm index 273ba07..c1551eb2 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service.mm
@@ -4,21 +4,83 @@ #import "ios/chrome/browser/safe_browsing/chrome_password_protection_service.h" +#include <memory> + +#include "base/time/time.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/password_store.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/sync/protocol/gaia_password_reuse.pb.h" +#include "components/sync/protocol/user_event_specifics.pb.h" +#include "components/sync_user_events/user_event_service.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#include "ios/chrome/browser/sync/ios_user_event_service_factory.h" +#include "ios/web/public/navigation/navigation_item.h" +#include "ios/web/public/navigation/navigation_manager.h" +#include "ios/web/public/thread/web_thread.h" +#import "ios/web/public/web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +using sync_pb::GaiaPasswordReuse; +using sync_pb::UserEventSpecifics; +using InteractionResult = + GaiaPasswordReuse::PasswordReuseDialogInteraction::InteractionResult; +using PasswordReuseDialogInteraction = + GaiaPasswordReuse::PasswordReuseDialogInteraction; using PasswordReuseEvent = safe_browsing::LoginReputationClientRequest::PasswordReuseEvent; +using SafeBrowsingStatus = + GaiaPasswordReuse::PasswordReuseDetected::SafeBrowsingStatus; namespace safe_browsing { +namespace { + +// Given a |web_state|, returns a timestemp of its last committed +// navigation. +int64_t GetLastCommittedNavigationTimestamp(web::WebState* web_state) { + if (!web_state) + return 0; + web::NavigationItem* navigation = + web_state->GetNavigationManager()->GetLastCommittedItem(); + return navigation ? navigation->GetTimestamp() + .ToDeltaSinceWindowsEpoch() + .InMicroseconds() + : 0; +} + +// Return a new UserEventSpecifics w/o the navigation_id populated +std::unique_ptr<UserEventSpecifics> GetNewUserEventSpecifics() { + auto specifics = std::make_unique<UserEventSpecifics>(); + specifics->set_event_time_usec( + base::Time::Now().ToDeltaSinceWindowsEpoch().InMicroseconds()); + return specifics; +} + +// Return a new UserEventSpecifics w/ the navigation_id populated +std::unique_ptr<UserEventSpecifics> GetUserEventSpecificsWithNavigationId( + int64_t navigation_id) { + if (navigation_id <= 0) + return nullptr; + + auto specifics = GetNewUserEventSpecifics(); + specifics->set_navigation_id(navigation_id); + return specifics; +} + +// Return a new UserEventSpecifics populated from the web_state +std::unique_ptr<UserEventSpecifics> GetUserEventSpecifics( + web::WebState* web_state) { + return GetUserEventSpecificsWithNavigationId( + GetLastCommittedNavigationTimestamp(web_state)); +} + +} // namespace + ChromePasswordProtectionService::ChromePasswordProtectionService( ChromeBrowserState* browser_state) : PasswordProtectionService(nullptr, nullptr, nullptr), @@ -75,7 +137,7 @@ password_store->AddCompromisedCredentials( password_manager::CompromisedCredentials( credential.signon_realm, credential.username, base::Time::Now(), - password_manager::CompromiseType::kPhished, + password_manager::InsecureType::kPhished, password_manager::IsMuted(false))); } } @@ -95,7 +157,7 @@ } password_store->RemoveCompromisedCredentials( credential.signon_realm, credential.username, - password_manager::RemoveCompromisedCredentialsReason:: + password_manager::RemoveInsecureCredentialsReason:: kMarkSiteAsLegitimate); } } @@ -257,7 +319,62 @@ web::WebState* web_state, RequestOutcome outcome, PasswordType password_type, - const LoginReputationClientResponse* response) {} + const LoginReputationClientResponse* response) { + // TODO(crbug.com/1147967): Complete PhishGuard iOS implementation. +} + +void ChromePasswordProtectionService::MaybeLogPasswordReuseDetectedEvent( + web::WebState* web_state) { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + + if (IsIncognito()) + return; + + syncer::UserEventService* user_event_service = + IOSUserEventServiceFactory::GetForBrowserState(browser_state_); + if (!user_event_service) + return; + + std::unique_ptr<UserEventSpecifics> specifics = + GetUserEventSpecifics(web_state); + if (!specifics) + return; + + auto* const status = specifics->mutable_gaia_password_reuse_event() + ->mutable_reuse_detected() + ->mutable_status(); + status->set_enabled(IsSafeBrowsingEnabled()); + + status->set_safe_browsing_reporting_population(SafeBrowsingStatus::NONE); + + user_event_service->RecordUserEvent(std::move(specifics)); +} + +void ChromePasswordProtectionService::MaybeLogPasswordReuseDialogInteraction( + int64_t navigation_id, + InteractionResult interaction_result) { + DCHECK_CURRENTLY_ON(web::WebThread::UI); + + if (IsIncognito()) + return; + + syncer::UserEventService* user_event_service = + IOSUserEventServiceFactory::GetForBrowserState(browser_state_); + if (!user_event_service) + return; + + std::unique_ptr<UserEventSpecifics> specifics = + GetUserEventSpecificsWithNavigationId(navigation_id); + if (!specifics) + return; + + PasswordReuseDialogInteraction* const dialog_interaction = + specifics->mutable_gaia_password_reuse_event() + ->mutable_dialog_interaction(); + dialog_interaction->set_interaction_result(interaction_result); + + user_event_service->RecordUserEvent(std::move(specifics)); +} password_manager::PasswordStore* ChromePasswordProtectionService::GetStoreForReusedCredential(
diff --git a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm index 6c5208e..2e65630 100644 --- a/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm +++ b/ios/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/safe_browsing/chrome_password_protection_service.h" #include <memory> +#include <string> #include <vector> #include "base/memory/scoped_refptr.h" @@ -12,23 +13,70 @@ #include "base/values.h" #include "components/keyed_service/core/service_access_type.h" #include "components/password_manager/core/browser/mock_password_store.h" +#include "components/password_manager/core/browser/password_manager_metrics_util.h" #include "components/password_manager/core/browser/password_reuse_detector.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/safe_browsing/core/password_protection/metrics_util.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "components/sync/protocol/gaia_password_reuse.pb.h" +#include "components/sync_user_events/fake_user_event_service.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#include "ios/chrome/browser/sync/ios_user_event_service_factory.h" #import "ios/chrome/browser/web/chrome_web_test.h" +#include "ios/web/public/navigation/referrer.h" +#import "ios/web/public/test/fakes/fake_navigation_manager.h" +#import "ios/web/public/test/fakes/fake_web_state.h" +#import "ios/web/public/web_state.h" #include "testing/gmock/include/gmock/gmock.h" +#include "ui/base/page_transition_types.h" +#include "url/gurl.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif using ::testing::_; +using password_manager::metrics_util::PasswordType; using password_manager::MockPasswordStore; +using sync_pb::GaiaPasswordReuse; +using sync_pb::UserEventSpecifics; +using PasswordReuseDialogInteraction = + GaiaPasswordReuse::PasswordReuseDialogInteraction; +using PasswordReuseLookup = GaiaPasswordReuse::PasswordReuseLookup; namespace safe_browsing { +namespace { + +const char kTestEmail[] = "foo@example.com"; + +constexpr struct { + // The response from the password protection service. + RequestOutcome request_outcome; + // The enum to log in the user event for that response. + PasswordReuseLookup::LookupResult lookup_result; +} kTestCasesWithoutVerdict[]{ + {RequestOutcome::MATCHED_ALLOWLIST, PasswordReuseLookup::WHITELIST_HIT}, + {RequestOutcome::URL_NOT_VALID_FOR_REPUTATION_COMPUTING, + PasswordReuseLookup::URL_UNSUPPORTED}, + {RequestOutcome::CANCELED, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::TIMEDOUT, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::DISABLED_DUE_TO_INCOGNITO, + PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::REQUEST_MALFORMED, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::FETCH_FAILED, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::RESPONSE_MALFORMED, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::SERVICE_DESTROYED, PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::DISABLED_DUE_TO_FEATURE_DISABLED, + PasswordReuseLookup::REQUEST_FAILURE}, + {RequestOutcome::DISABLED_DUE_TO_USER_POPULATION, + PasswordReuseLookup::REQUEST_FAILURE}}; + +} // namespace + class FakeChromePasswordProtectionService : public ChromePasswordProtectionService { public: @@ -36,13 +84,20 @@ TestChromeBrowserState* browser_state) : ChromePasswordProtectionService(browser_state), is_incognito_(false), + is_account_signed_in_(false), is_no_hosted_domain_found_(false) {} bool IsIncognito() override { return is_incognito_; } + bool IsPrimaryAccountSignedIn() const override { + return is_account_signed_in_; + } bool IsPrimaryAccountGmail() const override { return is_no_hosted_domain_found_; } void SetIsIncognito(bool is_incognito) { is_incognito_ = is_incognito; } + void SetIsAccountSignedIn(bool is_account_signed_in) { + is_account_signed_in_ = is_account_signed_in; + } void SetIsNoHostedDomainFound(bool is_no_hosted_domain_found) { is_no_hosted_domain_found_ = is_no_hosted_domain_found; } @@ -52,6 +107,7 @@ private: bool is_incognito_; + bool is_account_signed_in_; bool is_no_hosted_domain_found_; }; @@ -60,10 +116,30 @@ ChromePasswordProtectionServiceTest() : ChromeWebTest() { service_ = std::make_unique<FakeChromePasswordProtectionService>( chrome_browser_state_.get()); + + auto navigation_manager = std::make_unique<web::FakeNavigationManager>(); + fake_navigation_manager_ = navigation_manager.get(); + fake_web_state_.SetNavigationManager(std::move(navigation_manager)); + fake_web_state_.SetBrowserState(chrome_browser_state_.get()); + + IOSUserEventServiceFactory::GetInstance()->SetTestingFactory( + chrome_browser_state_.get(), + base::BindRepeating( + &ChromePasswordProtectionServiceTest::CreateFakeUserEventService, + base::Unretained(this))); } ~ChromePasswordProtectionServiceTest() override = default; + void NavigateAndCommit(const GURL& url) { + fake_navigation_manager_->AddItem( + url, ui::PageTransition::PAGE_TRANSITION_TYPED); + web::NavigationItem* item = fake_navigation_manager_->GetItemAtIndex( + fake_navigation_manager_->GetItemCount() - 1); + item->SetTimestamp(base::Time::Now()); + fake_navigation_manager_->SetLastCommittedItem(item); + } + MockPasswordStore* GetProfilePasswordStore() const { return static_cast<MockPasswordStore*>( IOSChromePasswordStoreFactory::GetForBrowserState( @@ -71,8 +147,35 @@ .get()); } + syncer::FakeUserEventService* GetUserEventService() const { + return static_cast<syncer::FakeUserEventService*>( + IOSUserEventServiceFactory::GetForBrowserState( + chrome_browser_state_.get())); + } + + std::unique_ptr<KeyedService> CreateFakeUserEventService( + web::BrowserState* browser_state) { + return std::make_unique<syncer::FakeUserEventService>(); + } + + CoreAccountInfo SetPrimaryAccount(const std::string& email) { + identity_test_env_.MakeAccountAvailable(email); + return identity_test_env_.SetPrimaryAccount(email); + } + + void SetUpSyncAccount(const std::string& hosted_domain, + const CoreAccountInfo& account_info) { + identity_test_env_.SimulateSuccessfulFetchOfAccountInfo( + account_info.account_id, account_info.email, account_info.gaia, + hosted_domain, "full_name", "given_name", "locale", + "http://picture.example.com/picture.jpg"); + } + protected: std::unique_ptr<FakeChromePasswordProtectionService> service_; + web::FakeWebState fake_web_state_; + web::FakeNavigationManager* fake_navigation_manager_; + signin::IdentityTestEnvironment identity_test_env_; }; // All pinging is disabled when safe browsing is disabled. @@ -255,10 +358,75 @@ EXPECT_CALL(*GetProfilePasswordStore(), RemoveCompromisedCredentialsImpl( _, _, - password_manager::RemoveCompromisedCredentialsReason:: + password_manager::RemoveInsecureCredentialsReason:: kMarkSiteAsLegitimate)) .Times(2); service_->RemovePhishedSavedPasswordCredential(credentials); } +TEST_F(ChromePasswordProtectionServiceTest, + VerifyPasswordReuseUserEventNotRecordedDueToIncognito) { + // Configure sync account type to GMAIL. + CoreAccountInfo account_info = SetPrimaryAccount(kTestEmail); + SetUpSyncAccount(kNoHostedDomainFound, account_info); + service_->SetIsIncognito(true); + ASSERT_TRUE(service_->IsIncognito()); + + // Nothing should be logged because of incognito. + NavigateAndCommit(GURL("https:www.example.com/")); + + // PasswordReuseDetected + service_->MaybeLogPasswordReuseDetectedEvent(web_state()); + EXPECT_TRUE(GetUserEventService()->GetRecordedUserEvents().empty()); + service_->MaybeLogPasswordReuseLookupEvent( + web_state(), RequestOutcome::MATCHED_ALLOWLIST, + PasswordType::PRIMARY_ACCOUNT_PASSWORD, nullptr); + EXPECT_TRUE(GetUserEventService()->GetRecordedUserEvents().empty()); + + // PasswordReuseLookup + unsigned long t = 0; + for (const auto& it : kTestCasesWithoutVerdict) { + service_->MaybeLogPasswordReuseLookupEvent( + web_state(), it.request_outcome, PasswordType::PRIMARY_ACCOUNT_PASSWORD, + nullptr); + ASSERT_TRUE(GetUserEventService()->GetRecordedUserEvents().empty()) << t; + t++; + } + + // PasswordReuseDialogInteraction + service_->MaybeLogPasswordReuseDialogInteraction( + 1000 /* navigation_id */, + PasswordReuseDialogInteraction::WARNING_ACTION_TAKEN); + ASSERT_TRUE(GetUserEventService()->GetRecordedUserEvents().empty()); +} + +TEST_F(ChromePasswordProtectionServiceTest, + VerifyPasswordReuseDetectedUserEventRecorded) { + // Configure sync account type to GMAIL. + CoreAccountInfo account_info = SetPrimaryAccount(kTestEmail); + SetUpSyncAccount(kNoHostedDomainFound, account_info); + service_->SetIsAccountSignedIn(true); + NavigateAndCommit(GURL("https://www.example.com/")); + + // Case 1: safe_browsing_enabled = true + chrome_browser_state_->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, + true); + service_->MaybeLogPasswordReuseDetectedEvent(&fake_web_state_); + ASSERT_EQ(1ul, GetUserEventService()->GetRecordedUserEvents().size()); + GaiaPasswordReuse event = GetUserEventService() + ->GetRecordedUserEvents()[0] + .gaia_password_reuse_event(); + EXPECT_TRUE(event.reuse_detected().status().enabled()); + + // Case 2: safe_browsing_enabled = false + chrome_browser_state_->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, + false); + service_->MaybeLogPasswordReuseDetectedEvent(&fake_web_state_); + ASSERT_EQ(2ul, GetUserEventService()->GetRecordedUserEvents().size()); + event = GetUserEventService() + ->GetRecordedUserEvents()[1] + .gaia_password_reuse_event(); + EXPECT_FALSE(event.reuse_detected().status().enabled()); +} + } // namespace safe_browsing
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm index eca11a5..0b80b9a 100644 --- a/ios/chrome/browser/ui/main/scene_controller.mm +++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -618,10 +618,14 @@ // 1- New tab / Navigation startup parameters are specified. // 2- Load URL User activity is queud. // 3- Move tab user activity is queued. +// 4- Only incognito mode is available. // In these cases if a restore prompt was shown, it may be dismissed immediately // and the user will not have a chance to restore the session. - (BOOL)shouldShowRestorePrompt { - BOOL shouldShow = !self.startupParameters; + BOOL shouldShow = + !self.startupParameters && + !IsIncognitoModeForced( + self.mainInterface.browser->GetBrowserState()->GetPrefs()); if (shouldShow && base::ios::IsSceneStartupSupported()) { if (@available(iOS 13, *)) { for (NSUserActivity* activity in self.sceneState.connectionOptions
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm index f61c601..ecaa8bb 100644 --- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_coordinator.mm
@@ -33,6 +33,7 @@ #import "ios/chrome/browser/ui/settings/google_services/sync_error_settings_command_handler.h" #import "ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller.h" #import "ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.h" +#import "ios/chrome/browser/ui/table_view/table_view_utils.h" #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" #import "ios/public/provider/chrome/browser/signin/chrome_identity_browser_opener.h" #include "ios/public/provider/chrome/browser/signin/chrome_identity_service.h" @@ -102,7 +103,7 @@ self.mediator.commandHandler = self; self.mediator.syncErrorHandler = self; self.viewController = [[ManageSyncSettingsTableViewController alloc] - initWithStyle:UITableViewStyleGrouped]; + initWithStyle:ChromeTableViewStyle()]; self.viewController.serviceDelegate = self.mediator; self.viewController.presentationDelegate = self; self.viewController.modelDelegate = self.mediator;
diff --git a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm index 7eca44a0..e14837f 100644 --- a/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_issues_mediator_unittest.mm
@@ -38,7 +38,7 @@ using password_manager::PasswordForm; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::TestPasswordStore; // Sets test password store and returns pointer to it. @@ -58,7 +58,7 @@ base::StringPiece username) { return CompromisedCredentials(std::string(signon_realm), base::ASCIIToUTF16(username), base::Time::Now(), - CompromiseType::kLeaked, + InsecureType::kLeaked, password_manager::IsMuted(false)); } } // namespace
diff --git a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm index 41d6e2d..ad050bdd 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_mediator_unittest.mm
@@ -40,7 +40,7 @@ using password_manager::PasswordForm; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::TestPasswordStore; // Sets test password store and returns pointer to it.
diff --git a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm index 15e52851..5985e16 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm
@@ -48,7 +48,7 @@ #error "This file requires ARC support." #endif -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::TestPasswordStore; using password_manager::MockBulkLeakCheckService; using ::testing::Return; @@ -235,7 +235,7 @@ base::StringPiece username) { return password_manager::CompromisedCredentials( std::string(signon_realm), base::ASCIIToUTF16(username), - base::Time::Now(), CompromiseType::kLeaked, + base::Time::Now(), InsecureType::kLeaked, password_manager::IsMuted(false)); }
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm index 4d8a332..0575fc1 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_coordinator.mm
@@ -92,12 +92,9 @@ #pragma mark - ChromeCoordinator - (void)start { - UITableViewStyle style = base::FeatureList::IsEnabled(kSettingsRefresh) - ? ChromeTableViewStyle() - : UITableViewStyleGrouped; - SafetyCheckTableViewController* viewController = - [[SafetyCheckTableViewController alloc] initWithStyle:style]; + [[SafetyCheckTableViewController alloc] + initWithStyle:ChromeTableViewStyle()]; self.viewController = viewController; scoped_refptr<IOSChromePasswordCheckManager> passwordCheckManager =
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm index 05381b2..c37df10 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm
@@ -103,7 +103,7 @@ }; using password_manager::CompromisedCredentials; -using password_manager::CompromiseType; +using password_manager::InsecureType; using password_manager::TestPasswordStore; using l10n_util::GetNSString; @@ -199,7 +199,7 @@ base::StringPiece username) { return password_manager::CompromisedCredentials( std::string(signon_realm), base::ASCIIToUTF16(username), - base::Time::Now(), CompromiseType::kLeaked, + base::Time::Now(), InsecureType::kLeaked, password_manager::IsMuted(false)); }
diff --git a/ios/chrome/browser/ui/start_surface/BUILD.gn b/ios/chrome/browser/ui/start_surface/BUILD.gn new file mode 100644 index 0000000..36a149dd --- /dev/null +++ b/ios/chrome/browser/ui/start_surface/BUILD.gn
@@ -0,0 +1,14 @@ +# Copyright 2021 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("feature_flags") { + sources = [ + "start_surface_features.h", + "start_surface_features.mm", + ] + + configs += [ "//build/config/compiler:enable_arc" ] + + deps = [ "//base" ] +}
diff --git a/ios/chrome/browser/ui/start_surface/OWNERS b/ios/chrome/browser/ui/start_surface/OWNERS new file mode 100644 index 0000000..483685a --- /dev/null +++ b/ios/chrome/browser/ui/start_surface/OWNERS
@@ -0,0 +1 @@ +gogerald@chromium.org \ No newline at end of file
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_features.h b/ios/chrome/browser/ui/start_surface/start_surface_features.h new file mode 100644 index 0000000..a63b0ce --- /dev/null +++ b/ios/chrome/browser/ui/start_surface/start_surface_features.h
@@ -0,0 +1,15 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_FEATURES_H_ +#define IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_FEATURES_H_ + +#include "base/feature_list.h" + +// The feature to enable or disable the Start Surface. +extern const base::Feature kStartSurface; + +bool IsStartSurfaceEnabled(); + +#endif // IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_FEATURES_H_.
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_features.mm b/ios/chrome/browser/ui/start_surface/start_surface_features.mm new file mode 100644 index 0000000..c61b9aa --- /dev/null +++ b/ios/chrome/browser/ui/start_surface/start_surface_features.mm
@@ -0,0 +1,16 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/start_surface/start_surface_features.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +const base::Feature kStartSurface{"StartSurface", + base::FEATURE_DISABLED_BY_DEFAULT}; + +bool IsStartSurfaceEnabled() { + return base::FeatureList::IsEnabled(kStartSurface); +}
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm index 8d5ad4b9..f185c0c 100644 --- a/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view_controller.mm
@@ -11,6 +11,7 @@ #import "ios/chrome/browser/ui/commands/omnibox_commands.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_animator.h" #import "ios/chrome/browser/ui/gestures/view_revealing_vertical_pan_handler.h" +#import "ios/chrome/browser/ui/thumb_strip/thumb_strip_feature.h" #import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller+subclassing.h" #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button.h" #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h" @@ -312,6 +313,9 @@ self.view.locationBarContainer.layer.cornerRadius = self.view.locationBarHeight.constant / 2; } + if (!ShowThumbStripInTraitCollection(self.traitCollection)) { + self.view.topCornersRounded = NO; + } } - (CGFloat)clampedFontSizeMultiplier {
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm index 620eb55..b31f0d97 100644 --- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -595,7 +595,7 @@ stringWithFormat:@"%d", windowNumber]))); return grey_allOf( grey_anyOf(grey_accessibilityLabel(navBar.backItem.title), - grey_buttonTitle(@"Back"), + grey_accessibilityLabel(@"Back"), grey_buttonTitle(@"Back"), grey_descendant(grey_buttonTitle(navBar.backItem.title)), nil), grey_kindOfClassName(@"_UIButtonBarButton"), grey_ancestor(grey_kindOfClass([UINavigationBar class])), nil);
diff --git a/media/base/status_codes.h b/media/base/status_codes.h index 8e13c79..45eee646 100644 --- a/media/base/status_codes.h +++ b/media/base/status_codes.h
@@ -176,6 +176,13 @@ // Frame operation errors: 0x0A kUnsupportedFrameFormatError = 0x00000A01, + // DecoderStream errors: 0x0B + kDecoderStreamInErrorState = 0x00000B00, + kDecoderStreamReinitFailed = 0x00000B01, + // This is a temporary error for use while the demuxer doesn't return a + // proper status. + kDecoderStreamDemuxerError = 0x00000B02, + // DecodeStatus temporary codes. These names were chosen to match the // DecodeStatus enum, so that un-converted code can DecodeStatus::OK/etc. // Note that OK must result in Status::is_ok(), since converted code will
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc index d5cf649..a9371a6d 100644 --- a/media/blink/webmediaplayer_impl.cc +++ b/media/blink/webmediaplayer_impl.cc
@@ -3607,8 +3607,7 @@ if (IsHidden()) { if (ShouldPausePlaybackWhenHidden()) { PauseVideoIfNeeded(); - } else if (!is_background_status_change_scheduled_) { - is_background_status_change_scheduled_ = true; + } else if (update_background_status_cb_.IsCancelled()) { // Only trigger updates when we don't have one already scheduled. update_background_status_cb_.Reset( base::Bind(&WebMediaPlayerImpl::DisableVideoTrackIfNeeded, @@ -3624,7 +3623,6 @@ } } else { update_background_status_cb_.Cancel(); - is_background_status_change_scheduled_ = false; EnableVideoTrackIfNeeded(); } } @@ -3664,8 +3662,6 @@ void WebMediaPlayerImpl::DisableVideoTrackIfNeeded() { DCHECK(IsHidden()); - is_background_status_change_scheduled_ = false; - // Don't change video track while the pipeline is resuming or seeking. if (is_pipeline_resuming_ || seeking_) return;
diff --git a/media/blink/webmediaplayer_impl.h b/media/blink/webmediaplayer_impl.h index 60535ceb..1b427e4 100644 --- a/media/blink/webmediaplayer_impl.h +++ b/media/blink/webmediaplayer_impl.h
@@ -994,11 +994,9 @@ OverlayInfo overlay_info_; - base::CancelableOnceClosure update_background_status_cb_; - - // We cannot use `update_background_status_cb_.IsCancelled()` as that changes - // when the callback is run, even if not explicitly cancelled. - bool is_background_status_change_scheduled_ = false; + // TODO(crbug.com/1141533): Convert to base::CancelableOnceClosure. Previous + // attempts to do so have led to test flakiness. + base::CancelableClosure update_background_status_cb_; mojo::Remote<mojom::MediaMetricsProvider> media_metrics_provider_; mojo::Remote<mojom::PlaybackEventsRecorder> playback_events_recorder_;
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index 514d527..e38820a 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -636,7 +636,7 @@ bool IsVideoTrackDisabled() const { return wmpi_->video_track_disabled_; } bool IsDisableVideoTrackPending() const { - return wmpi_->is_background_status_change_scheduled_; + return !wmpi_->update_background_status_cb_.IsCancelled(); } gfx::Size GetNaturalSize() const {
diff --git a/media/filters/audio_decoder_stream_unittest.cc b/media/filters/audio_decoder_stream_unittest.cc index 483b0fa..9e6475c 100644 --- a/media/filters/audio_decoder_stream_unittest.cc +++ b/media/filters/audio_decoder_stream_unittest.cc
@@ -110,8 +110,7 @@ } void OnAudioBufferReadDone(base::OnceClosure closure, - AudioDecoderStream::ReadStatus status, - scoped_refptr<AudioBuffer> audio_buffer) { + AudioDecoderStream::ReadResult result) { std::move(closure).Run(); }
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc index c4b4c80..61c500c2 100644 --- a/media/filters/decoder_stream.cc +++ b/media/filters/decoder_stream.cc
@@ -78,17 +78,14 @@ return "AudioDecoderStream::PrepareOutput"; } -template <DemuxerStream::Type StreamType> -const char* GetStatusString( - typename DecoderStream<StreamType>::ReadStatus status) { - switch (status) { - case DecoderStream<StreamType>::OK: +const char* GetStatusString(const Status& status) { + // TODO(crbug.com/1129662): Replace this with generic Status-to-string. + switch (status.code()) { + case StatusCode::kOk: return "okay"; - case DecoderStream<StreamType>::ABORTED: + case StatusCode::kAborted: return "aborted"; - case DecoderStream<StreamType>::DEMUXER_READ_ABORTED: - return "demuxer_read_aborted"; - case DecoderStream<StreamType>::DECODE_ERROR: + default: return "decode_error"; } @@ -130,7 +127,7 @@ } if (read_cb_) { read_cb_ = BindToCurrentLoop(std::move(read_cb_)); - SatisfyRead(ABORTED, nullptr); + SatisfyRead(StatusCode::kAborted); } if (reset_cb_) task_runner_->PostTask(FROM_HERE, std::move(reset_cb_)); @@ -189,20 +186,22 @@ TRACE_EVENT_ASYNC_BEGIN0("media", GetReadTraceString<StreamType>(), this); if (state_ == STATE_ERROR) { read_cb_ = BindToCurrentLoop(std::move(read_cb)); - SatisfyRead(DECODE_ERROR, nullptr); + // TODO(crbug.com/1129662): Consider attaching a caused-by of the original + // error as well. + SatisfyRead(StatusCode::kDecoderStreamInErrorState); return; } if (state_ == STATE_END_OF_STREAM && ready_outputs_.empty() && unprepared_outputs_.empty()) { read_cb_ = BindToCurrentLoop(std::move(read_cb)); - SatisfyRead(OK, StreamTraits::CreateEOSOutput()); + SatisfyRead(StreamTraits::CreateEOSOutput()); return; } if (!ready_outputs_.empty()) { read_cb_ = BindToCurrentLoop(std::move(read_cb)); - SatisfyRead(OK, ready_outputs_.front()); + SatisfyRead(ready_outputs_.front()); ready_outputs_.pop_front(); MaybePrepareAnotherOutput(); } else { @@ -224,7 +223,7 @@ if (read_cb_) { read_cb_ = BindToCurrentLoop(std::move(read_cb_)); - SatisfyRead(ABORTED, nullptr); + SatisfyRead(StatusCode::kAborted); } ClearOutputs(); @@ -440,12 +439,11 @@ } template <DemuxerStream::Type StreamType> -void DecoderStream<StreamType>::SatisfyRead(ReadStatus status, - scoped_refptr<Output> output) { +void DecoderStream<StreamType>::SatisfyRead(ReadResult result) { DCHECK(read_cb_); TRACE_EVENT_ASYNC_END1("media", GetReadTraceString<StreamType>(), this, - "status", GetStatusString<StreamType>(status)); - std::move(read_cb_).Run(status, std::move(output)); + "status", GetStatusString(result.code())); + std::move(read_cb_).Run(std::move(result)); } template <DemuxerStream::Type StreamType> @@ -567,7 +565,7 @@ if (end_of_stream) { state_ = STATE_END_OF_STREAM; if (ready_outputs_.empty() && unprepared_outputs_.empty() && read_cb_) - SatisfyRead(OK, StreamTraits::CreateEOSOutput()); + SatisfyRead(StreamTraits::CreateEOSOutput()); return; } @@ -594,14 +592,14 @@ state_ = STATE_REINITIALIZING_DECODER; SelectDecoder(); } else { - media_log_->NotifyError(std::move(status)); + media_log_->NotifyError(status); MEDIA_LOG(ERROR, media_log_) << GetStreamTypeString() << " decode error!"; state_ = STATE_ERROR; ClearOutputs(); if (read_cb_) - SatisfyRead(DECODE_ERROR, nullptr); + SatisfyRead(std::move(status)); } return; } @@ -653,7 +651,7 @@ // If |ready_outputs_| was non-empty, the read would have already been // satisifed by Read(). DCHECK(ready_outputs_.empty()); - SatisfyRead(OK, std::move(output)); + SatisfyRead(std::move(output)); return; } @@ -743,7 +741,7 @@ pending_buffers_.clear(); ClearOutputs(); if (read_cb_) - SatisfyRead(DECODE_ERROR, nullptr); + SatisfyRead(StatusCode::kDecoderStreamDemuxerError); } // Decoding has been stopped. @@ -819,7 +817,7 @@ if (status == DemuxerStream::kAborted) { if (read_cb_) - SatisfyRead(DEMUXER_READ_ABORTED, nullptr); + SatisfyRead(StatusCode::kAborted); return; } @@ -862,7 +860,7 @@ if (state_ == STATE_ERROR) { MEDIA_LOG(ERROR, media_log_) << GetStreamTypeString() << " decoder reinitialization failed"; - SatisfyRead(DECODE_ERROR, nullptr); + SatisfyRead(StatusCode::kDecoderStreamReinitFailed); return; } @@ -981,7 +979,7 @@ if (!read_cb_) ready_outputs_.emplace_back(std::move(output)); else - SatisfyRead(OK, std::move(output)); + SatisfyRead(std::move(output)); MaybePrepareAnotherOutput();
diff --git a/media/filters/decoder_stream.h b/media/filters/decoder_stream.h index 27a00ee..6fe5739 100644 --- a/media/filters/decoder_stream.h +++ b/media/filters/decoder_stream.h
@@ -46,13 +46,6 @@ using Output = typename StreamTraits::OutputType; using DecoderConfig = typename StreamTraits::DecoderConfigType; - enum ReadStatus { - OK, // Everything went as planned. - ABORTED, // Read aborted due to Reset() during pending read. - DEMUXER_READ_ABORTED, // Demuxer returned aborted read. - DECODE_ERROR, // Decoder returned decode error. - }; - // Callback to create a list of decoders. using CreateDecodersCB = base::RepeatingCallback<std::vector<std::unique_ptr<Decoder>>()>; @@ -61,7 +54,8 @@ using InitCB = base::OnceCallback<void(bool success)>; // Indicates completion of a DecoderStream read. - using ReadCB = base::OnceCallback<void(ReadStatus, scoped_refptr<Output>)>; + using ReadResult = StatusOr<scoped_refptr<Output>>; + using ReadCB = base::OnceCallback<void(ReadResult)>; DecoderStream(std::unique_ptr<DecoderStreamTraits<StreamType>> traits, scoped_refptr<base::SequencedTaskRunner> task_runner, @@ -186,8 +180,8 @@ std::unique_ptr<Decoder> selected_decoder, std::unique_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream); - // Satisfy pending |read_cb_| with |status| and |output|. - void SatisfyRead(ReadStatus status, scoped_refptr<Output> output); + // Satisfy pending |read_cb_| with |result|. + void SatisfyRead(ReadResult result); // Decodes |buffer| and returns the result via OnDecodeOutputReady(). // Saves |buffer| into |pending_buffers_| if appropriate.
diff --git a/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc index 667afda..9293b3b 100644 --- a/media/filters/video_decoder_stream_unittest.cc +++ b/media/filters/video_decoder_stream_unittest.cc
@@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/gmock_callback_support.h" +#include "base/test/mock_callback.h" #include "base/test/task_environment.h" #include "build/build_config.h" #include "media/base/fake_demuxer_stream.h" @@ -353,11 +354,13 @@ } // Callback for VideoDecoderStream::Read(). - void FrameReady(VideoDecoderStream::ReadStatus status, - scoped_refptr<VideoFrame> frame) { + void FrameReady(VideoDecoderStream::ReadResult result) { DCHECK(pending_read_); + last_read_status_code_ = result.code(); + scoped_refptr<VideoFrame> frame = last_read_status_code_ == StatusCode::kOk + ? std::move(result).value() + : nullptr; frame_read_ = frame; - last_read_status_ = status; if (frame && !frame->metadata().end_of_stream) { EXPECT_EQ(*frame->metadata().frame_duration, demuxer_stream_->duration()); @@ -539,7 +542,7 @@ bool pending_stop_; int num_decoded_bytes_unreported_; scoped_refptr<VideoFrame> frame_read_; - VideoDecoderStream::ReadStatus last_read_status_; + StatusCode last_read_status_code_; // Decryptor has no key to decrypt a frame. bool has_no_key_; @@ -813,7 +816,7 @@ decoder_->SatisfySingleDecode(); base::RunLoop().RunUntilIdle(); ASSERT_FALSE(pending_read_); - EXPECT_EQ(last_read_status_, VideoDecoderStream::OK); + EXPECT_EQ(last_read_status_code_, StatusCode::kOk); // The read output should indicate end of stream. ASSERT_TRUE(frame_read_.get()); @@ -836,7 +839,8 @@ base::RunLoop().RunUntilIdle(); ASSERT_FALSE(pending_read_); - EXPECT_EQ(last_read_status_, VideoDecoderStream::DECODE_ERROR); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } // No Reset() before initialization is successfully completed. @@ -1024,7 +1028,7 @@ ASSERT_EQ(GetDecoderName(1), decoder_->GetDisplayName()); ASSERT_FALSE(pending_read_); - ASSERT_EQ(VideoDecoderStream::OK, last_read_status_); + ASSERT_EQ(last_read_status_code_, StatusCode::kOk); // Check that we fell back to Decoder2. ASSERT_GT(decoder_->total_bytes_decoded(), 0); @@ -1064,7 +1068,7 @@ // A frame should have been emitted. EXPECT_FALSE(pending_read_); - EXPECT_EQ(last_read_status_, VideoDecoderStream::OK); + EXPECT_EQ(last_read_status_code_, StatusCode::kOk); EXPECT_FALSE(frame_read_->metadata().end_of_stream); EXPECT_GT(decoder_->total_bytes_decoded(), 0); @@ -1138,7 +1142,8 @@ // No decoders left, expect failure. EXPECT_EQ(decoder_, nullptr); EXPECT_FALSE(pending_read_); - EXPECT_EQ(VideoDecoderStream::DECODE_ERROR, last_read_status_); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } // This tests verifies that we properly fallback to a new decoder if the first @@ -1159,7 +1164,7 @@ // Verify that the first frame was decoded successfully. EXPECT_FALSE(pending_read_); EXPECT_GT(decoder_->total_bytes_decoded(), 0); - EXPECT_EQ(VideoDecoderStream::OK, last_read_status_); + EXPECT_EQ(last_read_status_code_, StatusCode::kOk); // Continue up to the point of reinitialization. EnterPendingState(DEMUXER_READ_CONFIG_CHANGE); @@ -1183,7 +1188,7 @@ // Verify that fallback happened. EXPECT_EQ(GetDecoderName(0), decoder_->GetDisplayName()); EXPECT_FALSE(pending_read_); - EXPECT_EQ(VideoDecoderStream::OK, last_read_status_); + EXPECT_EQ(last_read_status_code_, StatusCode::kOk); EXPECT_GT(decoder_->total_bytes_decoded(), 0); } @@ -1220,7 +1225,8 @@ // No decoders left. EXPECT_EQ(decoder_, nullptr); EXPECT_FALSE(pending_read_); - EXPECT_EQ(VideoDecoderStream::DECODE_ERROR, last_read_status_); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } TEST_P(VideoDecoderStreamTest, @@ -1373,7 +1379,7 @@ ASSERT_EQ(GetDecoderName(2), decoder_->GetDisplayName()); ASSERT_FALSE(pending_read_); - ASSERT_EQ(VideoDecoderStream::OK, last_read_status_); + ASSERT_EQ(last_read_status_code_, StatusCode::kOk); // Can't check previously selected decoder(s) right now, they might have been // destroyed already. @@ -1398,7 +1404,7 @@ ASSERT_EQ(GetDecoderName(2), decoder_->GetDisplayName()); ASSERT_FALSE(pending_read_); - ASSERT_EQ(VideoDecoderStream::OK, last_read_status_); + ASSERT_EQ(last_read_status_code_, StatusCode::kOk); // Can't check previously selected decoder(s) right now, they might have been // destroyed already. @@ -1420,7 +1426,7 @@ decoder_->SimulateError(); // The error must surface from Read() as DECODE_ERROR. - while (last_read_status_ == VideoDecoderStream::OK) { + while (last_read_status_code_ == StatusCode::kOk) { ReadOneFrame(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(pending_read_); @@ -1429,7 +1435,8 @@ // Verify the error was surfaced, rather than falling back to other decoders. ASSERT_EQ(GetDecoderName(0), decoder_->GetDisplayName()); EXPECT_FALSE(pending_read_); - ASSERT_EQ(VideoDecoderStream::DECODE_ERROR, last_read_status_); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } TEST_P(VideoDecoderStreamTest, DecoderErrorWhenNotReading) { @@ -1448,12 +1455,13 @@ decoder_->SimulateError(); // The error must surface from Read() as DECODE_ERROR. - while (last_read_status_ == VideoDecoderStream::OK) { + while (last_read_status_code_ == StatusCode::kOk) { ReadOneFrame(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(pending_read_); } - EXPECT_EQ(VideoDecoderStream::DECODE_ERROR, last_read_status_); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } TEST_P(VideoDecoderStreamTest, ReinitializeFailure_Once) { @@ -1514,12 +1522,13 @@ ReadUntilDecoderReinitialized(); // The error will surface from Read() as DECODE_ERROR. - while (last_read_status_ == VideoDecoderStream::OK) { + while (last_read_status_code_ == StatusCode::kOk) { ReadOneFrame(); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(pending_read_); } - EXPECT_EQ(VideoDecoderStream::DECODE_ERROR, last_read_status_); + EXPECT_NE(last_read_status_code_, StatusCode::kOk); + EXPECT_NE(last_read_status_code_, StatusCode::kAborted); } TEST_P(VideoDecoderStreamTest, Destroy_DuringFallbackDecoderSelection) {
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc index 9435558..44f2e48 100644 --- a/media/renderers/audio_renderer_impl.cc +++ b/media/renderers/audio_renderer_impl.cc
@@ -817,9 +817,9 @@ play_delay_cb_for_testing_ = std::move(cb); } -void AudioRendererImpl::DecodedAudioReady(AudioDecoderStream::ReadStatus status, - scoped_refptr<AudioBuffer> buffer) { - DVLOG(2) << __func__ << "(" << status << ")"; +void AudioRendererImpl::DecodedAudioReady( + AudioDecoderStream::ReadResult result) { + DVLOG(2) << __func__ << "(" << result.code() << ")"; DCHECK(task_runner_->BelongsToCurrentThread()); base::AutoLock auto_lock(lock_); @@ -828,18 +828,14 @@ CHECK(pending_read_); pending_read_ = false; - if (status == AudioDecoderStream::ABORTED || - status == AudioDecoderStream::DEMUXER_READ_ABORTED) { - HandleAbortedReadOrDecodeError(PIPELINE_OK); + if (result.has_error()) { + HandleAbortedReadOrDecodeError(result.code() == StatusCode::kAborted + ? PIPELINE_OK + : PIPELINE_ERROR_DECODE); return; } - if (status == AudioDecoderStream::DECODE_ERROR) { - HandleAbortedReadOrDecodeError(PIPELINE_ERROR_DECODE); - return; - } - - DCHECK_EQ(status, AudioDecoderStream::OK); + scoped_refptr<AudioBuffer> buffer = std::move(result).value(); DCHECK(buffer); if (state_ == kFlushing) {
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h index 0b8cc28..1d3202c 100644 --- a/media/renderers/audio_renderer_impl.h +++ b/media/renderers/audio_renderer_impl.h
@@ -139,8 +139,7 @@ OutputDeviceInfo output_device_info); // Callback from the audio decoder delivering decoded audio samples. - void DecodedAudioReady(AudioDecoderStream::ReadStatus status, - scoped_refptr<AudioBuffer> buffer); + void DecodedAudioReady(AudioDecoderStream::ReadResult result); // Handles buffers that come out of decoder (MSE: after passing through // |buffer_converter_|).
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc index faabcaa..10568c1d 100644 --- a/media/renderers/video_renderer_impl.cc +++ b/media/renderers/video_renderer_impl.cc
@@ -548,28 +548,35 @@ } } -void VideoRendererImpl::FrameReady(VideoDecoderStream::ReadStatus status, - scoped_refptr<VideoFrame> frame) { +void VideoRendererImpl::FrameReady(VideoDecoderStream::ReadResult result) { DCHECK(task_runner_->BelongsToCurrentThread()); base::AutoLock auto_lock(lock_); DCHECK_EQ(state_, kPlaying); CHECK(pending_read_); pending_read_ = false; - if (status == VideoDecoderStream::DECODE_ERROR) { - DCHECK(!frame); - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&VideoRendererImpl::OnPlaybackError, - weak_factory_.GetWeakPtr(), PIPELINE_ERROR_DECODE)); - return; + // Can happen when demuxers are preparing for a new Seek(). + switch (result.code()) { + case StatusCode::kOk: + break; + case StatusCode::kAborted: + // TODO(liberato): This used to check specifically for the value + // DEMUXER_READ_ABORTED, which was more specific than |kAborted|. + // However, since it's a dcheck, this seems okay. + return; + default: + DCHECK(result.has_error()); + // Anything other than `kOk` or `kAborted` is treated as an error. + task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&VideoRendererImpl::OnPlaybackError, + weak_factory_.GetWeakPtr(), PIPELINE_ERROR_DECODE)); + return; } - // Can happen when demuxers are preparing for a new Seek(). - if (!frame) { - DCHECK_EQ(status, VideoDecoderStream::DEMUXER_READ_ABORTED); - return; - } + DCHECK(result.has_value()); + scoped_refptr<VideoFrame> frame = std::move(result).value(); + DCHECK(frame); last_frame_ready_time_ = tick_clock_->NowTicks(); last_decoder_stream_avg_duration_ = video_decoder_stream_->AverageDuration();
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h index bd449072..27f61ec 100644 --- a/media/renderers/video_renderer_impl.h +++ b/media/renderers/video_renderer_impl.h
@@ -112,8 +112,7 @@ // Callback for |video_decoder_stream_| to deliver decoded video frames and // report video decoding status. - void FrameReady(VideoDecoderStream::ReadStatus status, - scoped_refptr<VideoFrame> frame); + void FrameReady(VideoDecoderStream::ReadResult result); // Helper method for enqueueing a frame to |alogorithm_|. void AddReadyFrame_Locked(scoped_refptr<VideoFrame> frame);
diff --git a/mojo/public/cpp/bindings/type_converter.h b/mojo/public/cpp/bindings/type_converter.h index c0e5b99..e7dbc8c 100644 --- a/mojo/public/cpp/bindings/type_converter.h +++ b/mojo/public/cpp/bindings/type_converter.h
@@ -11,10 +11,11 @@ namespace mojo { -// NOTE: TypeConverter is deprecated. Please consider StructTraits / -// UnionTraits / EnumTraits / ArrayTraits / MapTraits / StringTraits if you -// would like to convert between custom types and the wire format of mojom -// types. +// NOTE: When possible, please consider using StructTraits / UnionTraits / +// EnumTraits / ArrayTraits / MapTraits / StringTraits if you would like to +// convert between custom types and the wire format of mojom types. The use of +// TypeConverter should be limited as much as possible: ideally, only use it in +// renderers, e.g., for Blink IDL and Oilpan types. // // Specialize the following class: // template <typename T, typename U> struct TypeConverter;
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc index af9c60a..1e81aa2 100644 --- a/net/dns/mock_host_resolver.cc +++ b/net/dns/mock_host_resolver.cc
@@ -804,13 +804,10 @@ const std::string& host_pattern, const std::string& replacement, HostResolverFlags flags, - const std::string& canonical_name) { + std::vector<std::string> dns_aliases) { DCHECK(!replacement.empty()); - std::vector<std::string> aliases; - if (!canonical_name.empty()) - aliases.emplace_back(canonical_name); Rule rule(Rule::kResolverTypeSystem, host_pattern, ADDRESS_FAMILY_UNSPECIFIED, - flags, replacement, std::move(aliases), 0); + flags, replacement, std::move(dns_aliases), 0); AddRuleInternal(rule); }
diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h index 1acec5e..e329f82b 100644 --- a/net/dns/mock_host_resolver.h +++ b/net/dns/mock_host_resolver.h
@@ -379,7 +379,7 @@ void AddRuleWithFlags(const std::string& host_pattern, const std::string& ip_literal, HostResolverFlags flags, - const std::string& canonical_name = ""); + std::vector<std::string> dns_aliases = {}); // Same as AddRule(), but the replacement is expected to be an IPv4 or IPv6 // literal. This can be used in place of AddRule() to bypass the system's
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc index 4f336d9..53edf23 100644 --- a/net/spdy/spdy_network_transaction_unittest.cc +++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -4247,6 +4247,164 @@ helper.VerifyDataConsumed(); } +TEST_F(SpdyNetworkTransactionTest, + ConnectionPoolingMultipleSocketTagsWithDnsAliases) { + const SocketTag kSocketTag1(SocketTag::UNSET_UID, 1); + const SocketTag kSocketTag2(SocketTag::UNSET_UID, 2); + const SocketTag kSocketTag3(SocketTag::UNSET_UID, 3); + + NormalSpdyTransactionHelper helper(request_, DEFAULT_PRIORITY, log_, nullptr); + + // The first and third requests use the first connection. + spdy::SpdySerializedFrame req1( + spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST)); + spdy_util_.UpdateWithStreamDestruction(1); + spdy::SpdySerializedFrame req3( + spdy_util_.ConstructSpdyGet("https://example.test/request3", 3, LOWEST)); + MockWrite writes1[] = { + CreateMockWrite(req1, 0), + CreateMockWrite(req3, 3), + }; + + spdy::SpdySerializedFrame resp1( + spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); + spdy::SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); + spdy::SpdySerializedFrame resp3( + spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3)); + spdy::SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(3, true)); + MockRead reads1[] = {CreateMockRead(resp1, 1), CreateMockRead(body1, 2), + CreateMockRead(resp3, 4), CreateMockRead(body3, 5), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6)}; + + SequencedSocketData data1(MockConnect(ASYNC, OK), reads1, writes1); + helper.AddData(&data1); + + // Due to the vagaries of how the socket pools work, in this particular case, + // the second ConnectJob will be cancelled, but only after it tries to start + // connecting. This does not happen in the general case of a bunch of requests + // using the same socket tag. + SequencedSocketData data2(MockConnect(SYNCHRONOUS, ERR_IO_PENDING), + base::span<const MockRead>(), + base::span<const MockWrite>()); + helper.AddData(&data2); + + // The second request uses a second connection. + SpdyTestUtil spdy_util2; + spdy::SpdySerializedFrame req2( + spdy_util2.ConstructSpdyGet("https://example.test/request2", 1, LOWEST)); + MockWrite writes2[] = { + CreateMockWrite(req2, 0), + }; + + spdy::SpdySerializedFrame resp2( + spdy_util2.ConstructSpdyGetReply(nullptr, 0, 1)); + spdy::SpdySerializedFrame body2(spdy_util2.ConstructSpdyDataFrame(1, true)); + MockRead reads2[] = {CreateMockRead(resp2, 1), CreateMockRead(body2, 2), + MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; + + SequencedSocketData data3(MockConnect(ASYNC, OK), reads2, writes2); + helper.AddData(&data3); + + // Run a transaction to completion to set up a SPDY session. This can't use + // RunToCompletion(), since it can't call VerifyDataConsumed() yet. + helper.RunPreTestSetup(); + helper.RunDefaultTest(); + TransactionHelperResult out = helper.output(); + EXPECT_THAT(out.rv, IsOk()); + EXPECT_EQ("HTTP/1.1 200", out.status_line); + EXPECT_EQ("hello!", out.response_data); + + // A new SPDY session should have been created. + SpdySessionKey key1(HostPortPair("www.example.org", 443), + ProxyServer::Direct(), PRIVACY_MODE_DISABLED, + SpdySessionKey::IsProxySession::kFalse, SocketTag(), + NetworkIsolationKey(), false /* disable_secure_dns */); + EXPECT_TRUE(helper.session()->spdy_session_pool()->FindAvailableSession( + key1, true /* enable_up_base_pooling */, false /* is_websocket */, + NetLogWithSource())); + + // Set on-demand mode for the next two requests. + helper.session_deps()->host_resolver->set_ondemand_mode(true); + + HttpRequestInfo request2; + request2.socket_tag = kSocketTag2; + request2.method = "GET"; + request2.url = GURL("https://example.test/request2"); + request2.load_flags = 0; + request2.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + auto trans2 = std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, + helper.session()); + TestCompletionCallback callback2; + EXPECT_THAT( + trans2->Start(&request2, callback2.callback(), NetLogWithSource()), + IsError(ERR_IO_PENDING)); + + HttpRequestInfo request3; + request3.socket_tag = kSocketTag3; + request3.method = "GET"; + request3.url = GURL("https://example.test/request3"); + request3.load_flags = 0; + request3.traffic_annotation = + net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS); + auto trans3 = std::make_unique<HttpNetworkTransaction>(DEFAULT_PRIORITY, + helper.session()); + TestCompletionCallback callback3; + EXPECT_THAT( + trans3->Start(&request3, callback3.callback(), NetLogWithSource()), + IsError(ERR_IO_PENDING)); + + // Run the message loop until both requests are waiting on the host resolver. + base::RunLoop().RunUntilIdle(); + ASSERT_TRUE(helper.session_deps()->host_resolver->has_pending_requests()); + + // Complete the second requests's DNS lookup now, which should create an alias + // for the SpdySession immediately, but the task to use the session for the + // second request should run asynchronously, so it hasn't run yet. + helper.session_deps()->host_resolver->ResolveNow(2); + SpdySessionKey key2(HostPortPair("example.test", 443), ProxyServer::Direct(), + PRIVACY_MODE_DISABLED, + SpdySessionKey::IsProxySession::kFalse, kSocketTag2, + NetworkIsolationKey(), false /* disable_secure_dns */); + + // Complete the third requests's DNS lookup now, which should hijack the + // SpdySession from the second request. + helper.session_deps()->host_resolver->ResolveNow(3); + SpdySessionKey key3(HostPortPair("example.test", 443), ProxyServer::Direct(), + PRIVACY_MODE_DISABLED, + SpdySessionKey::IsProxySession::kFalse, kSocketTag3, + NetworkIsolationKey(), false /* disable_secure_dns */); + + // Wait for the second request to get headers. It should create a new H2 + // session to do so. + EXPECT_THAT(callback2.WaitForResult(), IsOk()); + + const HttpResponseInfo* response = trans2->GetResponseInfo(); + ASSERT_TRUE(response); + ASSERT_TRUE(response->headers); + EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); + EXPECT_TRUE(response->was_fetched_via_spdy); + EXPECT_TRUE(response->was_alpn_negotiated); + std::string response_data; + ASSERT_THAT(ReadTransaction(trans2.get(), &response_data), IsOk()); + EXPECT_EQ("hello!", response_data); + + // Wait for the third request to get headers. It should have reused the first + // session. + EXPECT_THAT(callback3.WaitForResult(), IsOk()); + + response = trans3->GetResponseInfo(); + ASSERT_TRUE(response); + ASSERT_TRUE(response->headers); + EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); + EXPECT_TRUE(response->was_fetched_via_spdy); + EXPECT_TRUE(response->was_alpn_negotiated); + ASSERT_THAT(ReadTransaction(trans3.get(), &response_data), IsOk()); + EXPECT_EQ("hello!", response_data); + + helper.VerifyDataConsumed(); +} + #endif // defined(OS_ANDROID) // Regression test for https://crbug.com/727653.
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc index e98a83f..370e39c0 100644 --- a/services/network/host_resolver_unittest.cc +++ b/services/network/host_resolver_unittest.cc
@@ -659,7 +659,7 @@ auto inner_resolver = std::make_unique<net::MockHostResolver>(); inner_resolver->rules()->AddRuleWithFlags("example.com", "123.0.12.24", net::HOST_RESOLVER_CANONNAME, - "canonicalexample.com"); + {"canonicalexample.com"}); HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
diff --git a/services/network/public/mojom/network_service_test.mojom b/services/network/public/mojom/network_service_test.mojom index 5c3ee4b..f1dff9d 100644 --- a/services/network/public/mojom/network_service_test.mojom +++ b/services/network/public/mojom/network_service_test.mojom
@@ -18,12 +18,15 @@ kResolverTypeDirectLookup, }; +// `dns_aliases` is a list of aliases read from DNS records, e.g. CNAME +// aliases, and is intended to preserve the alias chain in reverse, from +// canonical name (i.e. address record name) through to query name. struct Rule { ResolverType resolver_type; string host_pattern; string replacement; int32 host_resolver_flags; - string canonical_name; + array<string> dns_aliases; }; // Testing interface to the network service.
diff --git a/styleguide/objective-c/objective-c.md b/styleguide/objective-c/objective-c.md index cd74cdc7..38524d1 100644 --- a/styleguide/objective-c/objective-c.md +++ b/styleguide/objective-c/objective-c.md
@@ -3,7 +3,7 @@ _For other languages, please see the [Chromium style guides](https://chromium.googlesource.com/chromium/src/+/master/styleguide/styleguide.md)._ Chromium follows the -[Google Objective-C style guide](https://github.com/google/styleguide/blob/gh-pages/objcguide.md) +[Google Objective-C style guide](https://google.github.io/styleguide/objcguide.html) unless an exception is listed below. A checkout should give you @@ -48,5 +48,5 @@ ## #import and #include in the `ios/` directory #import directive can be used to import C++ and Objective-C headers for all -source code in the `ios/` directory. This differs from Google Objective-C Style +source code in the `ios/` directory. This differs from the Google Objective-C Style Guide, which requires using #include directive for C++ headers.
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json index 669f27e5..b3d718e 100644 --- a/testing/buildbot/chromium.angle.json +++ b/testing/buildbot/chromium.angle.json
@@ -12,8 +12,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gles_tests", "resultdb": { @@ -45,8 +44,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gles_tests", "resultdb": { @@ -78,8 +76,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gles_tests", "resultdb": { @@ -300,8 +297,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "resultdb": { @@ -334,8 +330,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "resultdb": { @@ -368,8 +363,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "resultdb": { @@ -402,8 +396,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "resultdb": { @@ -436,8 +429,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "resultdb": { @@ -469,8 +461,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "resultdb": { @@ -503,8 +494,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "resultdb": { @@ -536,8 +526,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "resultdb": { @@ -1382,8 +1371,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -1559,8 +1547,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -1586,8 +1573,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "swarming": { @@ -1614,8 +1600,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -1641,8 +1626,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": { @@ -1668,8 +1652,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate180_tests", "swarming": { @@ -1695,8 +1678,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate270_tests", "swarming": { @@ -1722,8 +1704,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate90_tests", "swarming": { @@ -1749,8 +1730,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_gl_tests", "swarming": { @@ -1777,8 +1757,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "swarming": { @@ -1805,8 +1784,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate180_tests", "swarming": { @@ -1833,8 +1811,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate270_tests", "swarming": { @@ -1861,8 +1838,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate90_tests", "swarming": { @@ -1889,8 +1865,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -1917,8 +1892,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "swarming": { @@ -1945,8 +1919,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "swarming": { @@ -1972,8 +1945,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "swarming": { @@ -1999,8 +1971,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "swarming": { @@ -2026,8 +1997,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "swarming": { @@ -2260,8 +2230,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -2288,8 +2257,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_metal_tests", "swarming": { @@ -2316,8 +2284,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -2344,8 +2311,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_metal_tests", "swarming": { @@ -2372,8 +2338,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -2401,8 +2366,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_metal_tests", "swarming": { @@ -3036,8 +3000,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -3062,8 +3025,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_metal_tests", "swarming": { @@ -3088,8 +3050,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -3114,8 +3075,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_metal_tests", "swarming": { @@ -3140,8 +3100,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -3167,8 +3126,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_metal_tests", "swarming": { @@ -3754,8 +3712,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -3954,8 +3911,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_d3d11_tests", "swarming": { @@ -3982,8 +3938,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -4009,8 +3964,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "swarming": { @@ -4037,8 +3991,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -4064,8 +4017,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -4091,8 +4043,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": { @@ -4118,8 +4069,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate180_tests", "swarming": { @@ -4145,8 +4095,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate270_tests", "swarming": { @@ -4172,8 +4121,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate90_tests", "swarming": { @@ -4199,8 +4147,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_d3d11_tests", "swarming": { @@ -4227,8 +4174,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_gl_tests", "swarming": { @@ -4255,8 +4201,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "swarming": { @@ -4283,8 +4228,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate180_tests", "swarming": { @@ -4311,8 +4255,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate270_tests", "swarming": { @@ -4339,8 +4282,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate90_tests", "swarming": { @@ -4367,8 +4309,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_d3d11_tests", "swarming": { @@ -4395,8 +4336,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -4423,8 +4363,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "swarming": { @@ -4451,8 +4390,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "swarming": { @@ -4478,8 +4416,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "swarming": { @@ -4505,8 +4442,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "swarming": { @@ -4532,8 +4468,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "swarming": { @@ -4843,8 +4778,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_d3d11_tests", "swarming": { @@ -4870,8 +4804,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -4897,8 +4830,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_d3d11_tests", "swarming": { @@ -4929,8 +4861,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -4956,8 +4887,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a07c491..c29824c9 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -33369,11 +33369,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "absl_hardening_tests", @@ -33381,7 +33381,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests_iPhone X 14.3", + "name": "absl_hardening_tests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33401,7 +33401,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33414,11 +33414,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "base_unittests", @@ -33426,7 +33426,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPad Air 2 14.3", + "name": "base_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -33446,7 +33446,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33459,11 +33459,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "base_unittests", @@ -33471,7 +33471,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s Plus 14.3", + "name": "base_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -33491,7 +33491,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33504,11 +33504,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "base_unittests", @@ -33516,7 +33516,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone X 14.3", + "name": "base_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33536,7 +33536,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33549,11 +33549,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "boringssl_crypto_tests", @@ -33561,7 +33561,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests_iPhone X 14.3", + "name": "boringssl_crypto_tests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33581,7 +33581,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33594,11 +33594,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "boringssl_ssl_tests", @@ -33606,7 +33606,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests_iPhone X 14.3", + "name": "boringssl_ssl_tests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33626,7 +33626,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33639,11 +33639,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "components_unittests", @@ -33651,7 +33651,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPad Air 2 14.3", + "name": "components_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -33671,7 +33671,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33684,11 +33684,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "components_unittests", @@ -33696,7 +33696,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s Plus 14.3", + "name": "components_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -33716,7 +33716,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33729,11 +33729,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "components_unittests", @@ -33741,7 +33741,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone X 14.3", + "name": "components_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33761,7 +33761,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33774,11 +33774,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "crypto_unittests", @@ -33786,7 +33786,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests_iPhone X 14.3", + "name": "crypto_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33806,7 +33806,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33819,11 +33819,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "gfx_unittests", @@ -33831,7 +33831,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPad Air 2 14.3", + "name": "gfx_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -33851,7 +33851,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33864,11 +33864,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "gfx_unittests", @@ -33876,7 +33876,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s Plus 14.3", + "name": "gfx_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -33896,7 +33896,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33909,11 +33909,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "gfx_unittests", @@ -33921,7 +33921,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone X 14.3", + "name": "gfx_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33941,7 +33941,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33954,11 +33954,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "google_apis_unittests", @@ -33966,7 +33966,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests_iPhone X 14.3", + "name": "google_apis_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -33986,7 +33986,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -33999,11 +33999,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34012,7 +34012,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34032,7 +34032,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34045,11 +34045,11 @@ "--platform", "iPad Air (3rd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34058,7 +34058,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air (3rd generation) 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air (3rd generation) 14.4", "resultdb": { "enable": true }, @@ -34078,7 +34078,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34091,11 +34091,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34104,7 +34104,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -34124,7 +34124,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34137,11 +34137,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34150,7 +34150,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -34170,7 +34170,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34183,11 +34183,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34196,7 +34196,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34216,7 +34216,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34230,11 +34230,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34243,7 +34243,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -34263,7 +34263,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34277,11 +34277,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34290,7 +34290,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -34310,7 +34310,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34324,11 +34324,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34337,7 +34337,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -34357,7 +34357,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34371,11 +34371,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34384,7 +34384,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34404,7 +34404,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34418,11 +34418,11 @@ "--platform", "iPad Air (3rd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34431,7 +34431,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPad Air (3rd generation) 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPad Air (3rd generation) 14.4", "resultdb": { "enable": true }, @@ -34451,7 +34451,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34465,11 +34465,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34478,7 +34478,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -34498,7 +34498,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34512,11 +34512,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34525,7 +34525,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -34545,7 +34545,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34559,11 +34559,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34572,7 +34572,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34592,7 +34592,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34605,11 +34605,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34618,7 +34618,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -34638,7 +34638,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34651,11 +34651,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34664,7 +34664,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -34684,7 +34684,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34697,11 +34697,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34710,7 +34710,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -34730,7 +34730,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34743,11 +34743,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34756,7 +34756,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34776,7 +34776,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34789,11 +34789,11 @@ "--platform", "iPad Air (3rd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34802,7 +34802,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPad Air (3rd generation) 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPad Air (3rd generation) 14.4", "resultdb": { "enable": true }, @@ -34822,7 +34822,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34835,11 +34835,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34848,7 +34848,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -34868,7 +34868,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34881,11 +34881,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34894,7 +34894,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -34914,7 +34914,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34927,11 +34927,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34940,7 +34940,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -34960,7 +34960,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -34974,11 +34974,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -34987,7 +34987,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -35007,7 +35007,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35021,11 +35021,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35034,7 +35034,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -35054,7 +35054,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35068,11 +35068,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35081,7 +35081,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35101,7 +35101,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35115,11 +35115,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_chrome_unittests", @@ -35127,7 +35127,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPad Air 2 14.3", + "name": "ios_chrome_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -35147,7 +35147,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35160,11 +35160,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_chrome_unittests", @@ -35172,7 +35172,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s Plus 14.3", + "name": "ios_chrome_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -35192,7 +35192,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35205,11 +35205,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_chrome_unittests", @@ -35217,7 +35217,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone X 14.3", + "name": "ios_chrome_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35237,7 +35237,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35250,11 +35250,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35263,7 +35263,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_chrome_web_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -35283,7 +35283,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35296,11 +35296,11 @@ "--platform", "iPad Air (3rd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35309,7 +35309,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPad Air (3rd generation) 14.3", + "name": "ios_chrome_web_eg2tests_module_iPad Air (3rd generation) 14.4", "resultdb": { "enable": true }, @@ -35329,7 +35329,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35342,11 +35342,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35355,7 +35355,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -35375,7 +35375,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35388,11 +35388,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35401,7 +35401,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_web_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35421,7 +35421,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35434,11 +35434,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_components_unittests", @@ -35446,7 +35446,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests_iPhone X 14.3", + "name": "ios_components_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35466,7 +35466,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35479,11 +35479,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_net_unittests", @@ -35491,7 +35491,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests_iPhone X 14.3", + "name": "ios_net_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35511,7 +35511,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35524,11 +35524,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_remoting_unittests", @@ -35536,7 +35536,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests_iPhone X 14.3", + "name": "ios_remoting_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35556,7 +35556,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35569,11 +35569,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35582,7 +35582,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_showcase_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -35602,7 +35602,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35615,11 +35615,11 @@ "--platform", "iPad Air (3rd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35628,7 +35628,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPad Air (3rd generation) 14.3", + "name": "ios_showcase_eg2tests_module_iPad Air (3rd generation) 14.4", "resultdb": { "enable": true }, @@ -35648,7 +35648,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35661,11 +35661,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35674,7 +35674,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPhone 7 14.3", + "name": "ios_showcase_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -35694,7 +35694,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35707,11 +35707,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35720,7 +35720,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPhone X 14.3", + "name": "ios_showcase_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35740,7 +35740,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35753,11 +35753,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_testing_unittests", @@ -35765,7 +35765,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests_iPhone X 14.3", + "name": "ios_testing_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35785,7 +35785,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35798,11 +35798,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_inttests", @@ -35810,7 +35810,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPad Air 2 14.3", + "name": "ios_web_inttests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -35830,7 +35830,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35843,11 +35843,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_inttests", @@ -35855,7 +35855,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s Plus 14.3", + "name": "ios_web_inttests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -35875,7 +35875,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35888,11 +35888,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_inttests", @@ -35900,7 +35900,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone X 14.3", + "name": "ios_web_inttests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -35920,7 +35920,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35933,11 +35933,11 @@ "--platform", "iPad (6th generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35946,7 +35946,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPad (6th generation) 14.3", + "name": "ios_web_shell_eg2tests_module_iPad (6th generation) 14.4", "resultdb": { "enable": true }, @@ -35966,7 +35966,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -35979,11 +35979,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -35992,7 +35992,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -36012,7 +36012,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36025,11 +36025,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -36038,7 +36038,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone 7 14.3", + "name": "ios_web_shell_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -36058,7 +36058,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36071,11 +36071,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -36084,7 +36084,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone X 14.3", + "name": "ios_web_shell_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36104,7 +36104,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36117,11 +36117,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_unittests", @@ -36129,7 +36129,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPad Air 2 14.3", + "name": "ios_web_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -36149,7 +36149,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36162,11 +36162,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_unittests", @@ -36174,7 +36174,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s Plus 14.3", + "name": "ios_web_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -36194,7 +36194,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36207,11 +36207,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_unittests", @@ -36219,7 +36219,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone X 14.3", + "name": "ios_web_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36239,7 +36239,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36252,11 +36252,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_inttests", @@ -36264,7 +36264,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPad Air 2 14.3", + "name": "ios_web_view_inttests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -36284,7 +36284,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36297,11 +36297,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_inttests", @@ -36309,7 +36309,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s Plus 14.3", + "name": "ios_web_view_inttests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -36329,7 +36329,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36342,11 +36342,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_inttests", @@ -36354,7 +36354,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone X 14.3", + "name": "ios_web_view_inttests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36374,7 +36374,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36387,11 +36387,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_unittests", @@ -36399,7 +36399,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPad Air 2 14.3", + "name": "ios_web_view_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -36419,7 +36419,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36432,11 +36432,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_unittests", @@ -36444,7 +36444,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s Plus 14.3", + "name": "ios_web_view_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -36464,7 +36464,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36477,11 +36477,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_unittests", @@ -36489,7 +36489,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone X 14.3", + "name": "ios_web_view_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36509,7 +36509,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36522,11 +36522,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "net_unittests", @@ -36534,7 +36534,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests_iPhone X 14.3", + "name": "net_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36554,7 +36554,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36567,11 +36567,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "services_unittests", @@ -36579,7 +36579,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests_iPhone X 14.3", + "name": "services_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36599,7 +36599,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36612,11 +36612,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "skia_unittests", @@ -36624,7 +36624,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPad Air 2 14.3", + "name": "skia_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -36644,7 +36644,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36657,11 +36657,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "skia_unittests", @@ -36669,7 +36669,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s Plus 14.3", + "name": "skia_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -36689,7 +36689,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36702,11 +36702,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "skia_unittests", @@ -36714,7 +36714,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone X 14.3", + "name": "skia_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36734,7 +36734,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36747,11 +36747,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "sql_unittests", @@ -36759,7 +36759,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests_iPhone X 14.3", + "name": "sql_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36779,7 +36779,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36792,11 +36792,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ui_base_unittests", @@ -36804,7 +36804,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPad Air 2 14.3", + "name": "ui_base_unittests_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -36824,7 +36824,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36837,11 +36837,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ui_base_unittests", @@ -36849,7 +36849,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s Plus 14.3", + "name": "ui_base_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -36869,7 +36869,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36882,11 +36882,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ui_base_unittests", @@ -36894,7 +36894,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone X 14.3", + "name": "ui_base_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36914,7 +36914,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36927,11 +36927,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "url_unittests", @@ -36939,7 +36939,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests_iPhone X 14.3", + "name": "url_unittests_iPhone X 14.4", "resultdb": { "enable": true }, @@ -36959,7 +36959,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -36979,11 +36979,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "absl_hardening_tests", @@ -36991,7 +36991,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "absl_hardening_tests_iPhone 6s 14.3", + "name": "absl_hardening_tests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37011,7 +37011,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37024,11 +37024,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "base_unittests", @@ -37036,7 +37036,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s 14.3", + "name": "base_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37056,7 +37056,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37069,11 +37069,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "base_unittests", @@ -37081,7 +37081,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s Plus 14.3", + "name": "base_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -37101,7 +37101,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37114,11 +37114,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "boringssl_crypto_tests", @@ -37126,7 +37126,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests_iPhone 6s 14.3", + "name": "boringssl_crypto_tests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37146,7 +37146,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37159,11 +37159,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "boringssl_ssl_tests", @@ -37171,7 +37171,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests_iPhone 6s 14.3", + "name": "boringssl_ssl_tests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37191,7 +37191,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37204,11 +37204,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "components_unittests", @@ -37216,7 +37216,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s 14.3", + "name": "components_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37236,7 +37236,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37249,11 +37249,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "components_unittests", @@ -37261,7 +37261,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s Plus 14.3", + "name": "components_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -37281,7 +37281,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37294,11 +37294,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "crypto_unittests", @@ -37306,7 +37306,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests_iPhone 6s 14.3", + "name": "crypto_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37326,7 +37326,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37339,11 +37339,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "gfx_unittests", @@ -37351,7 +37351,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s 14.3", + "name": "gfx_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37371,7 +37371,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37384,11 +37384,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "gfx_unittests", @@ -37396,7 +37396,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s Plus 14.3", + "name": "gfx_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -37416,7 +37416,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37429,11 +37429,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "google_apis_unittests", @@ -37441,7 +37441,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests_iPhone 6s 14.3", + "name": "google_apis_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -37461,7 +37461,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37474,11 +37474,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37487,7 +37487,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -37507,7 +37507,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37520,11 +37520,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37533,7 +37533,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -37553,7 +37553,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37566,11 +37566,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37579,7 +37579,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -37599,7 +37599,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37612,11 +37612,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37625,7 +37625,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -37645,7 +37645,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37659,11 +37659,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37672,7 +37672,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -37692,7 +37692,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37706,11 +37706,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37719,7 +37719,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -37739,7 +37739,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37753,11 +37753,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37766,7 +37766,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -37786,7 +37786,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37800,11 +37800,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37813,7 +37813,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -37833,7 +37833,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37847,11 +37847,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37860,7 +37860,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -37880,7 +37880,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37894,11 +37894,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37907,7 +37907,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -37927,7 +37927,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37940,11 +37940,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37953,7 +37953,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -37973,7 +37973,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -37986,11 +37986,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -37999,7 +37999,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -38019,7 +38019,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38032,11 +38032,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38045,7 +38045,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -38065,7 +38065,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38078,11 +38078,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38091,7 +38091,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -38111,7 +38111,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38124,11 +38124,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38137,7 +38137,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -38157,7 +38157,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38170,11 +38170,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38183,7 +38183,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -38203,7 +38203,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38217,11 +38217,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38230,7 +38230,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -38250,7 +38250,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38264,11 +38264,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38277,7 +38277,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -38297,7 +38297,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38311,11 +38311,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_chrome_unittests", @@ -38323,7 +38323,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s 14.3", + "name": "ios_chrome_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38343,7 +38343,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38356,11 +38356,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_chrome_unittests", @@ -38368,7 +38368,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s Plus 14.3", + "name": "ios_chrome_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -38388,7 +38388,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38401,11 +38401,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38414,7 +38414,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.3", + "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -38434,7 +38434,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38447,11 +38447,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38460,7 +38460,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.3", + "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -38480,7 +38480,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38493,11 +38493,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38506,7 +38506,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_eg2tests_module_iPhone X 14.3", + "name": "ios_chrome_web_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -38526,7 +38526,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38539,11 +38539,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_components_unittests", @@ -38551,7 +38551,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests_iPhone 6s 14.3", + "name": "ios_components_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38571,7 +38571,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38584,11 +38584,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_net_unittests", @@ -38596,7 +38596,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests_iPhone 6s 14.3", + "name": "ios_net_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38616,7 +38616,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38629,11 +38629,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_remoting_unittests", @@ -38641,7 +38641,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests_iPhone 6s 14.3", + "name": "ios_remoting_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38661,7 +38661,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38674,11 +38674,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38687,7 +38687,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPad Air 2 14.3", + "name": "ios_showcase_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -38707,7 +38707,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38720,11 +38720,11 @@ "--platform", "iPhone 7", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38733,7 +38733,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPhone 7 14.3", + "name": "ios_showcase_eg2tests_module_iPhone 7 14.4", "resultdb": { "enable": true }, @@ -38753,7 +38753,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38766,11 +38766,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38779,7 +38779,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_eg2tests_module_iPhone X 14.3", + "name": "ios_showcase_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -38799,7 +38799,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38812,11 +38812,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_testing_unittests", @@ -38824,7 +38824,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests_iPhone 6s 14.3", + "name": "ios_testing_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38844,7 +38844,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38857,11 +38857,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_inttests", @@ -38869,7 +38869,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s 14.3", + "name": "ios_web_inttests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -38889,7 +38889,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38902,11 +38902,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_inttests", @@ -38914,7 +38914,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s Plus 14.3", + "name": "ios_web_inttests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -38934,7 +38934,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38947,11 +38947,11 @@ "--platform", "iPad Air 2", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -38960,7 +38960,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.3", + "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.4", "resultdb": { "enable": true }, @@ -38980,7 +38980,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -38993,11 +38993,11 @@ "--platform", "iPad Pro (12.9-inch) (2nd generation)", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -39006,7 +39006,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.3", + "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.4", "resultdb": { "enable": true }, @@ -39026,7 +39026,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39039,11 +39039,11 @@ "--platform", "iPhone X", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest", "--xcode-parallelization" ], @@ -39052,7 +39052,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_eg2tests_module_iPhone X 14.3", + "name": "ios_web_shell_eg2tests_module_iPhone X 14.4", "resultdb": { "enable": true }, @@ -39072,7 +39072,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39085,11 +39085,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_unittests", @@ -39097,7 +39097,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s 14.3", + "name": "ios_web_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39117,7 +39117,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39130,11 +39130,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_unittests", @@ -39142,7 +39142,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s Plus 14.3", + "name": "ios_web_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -39162,7 +39162,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39175,11 +39175,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_inttests", @@ -39187,7 +39187,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s 14.3", + "name": "ios_web_view_inttests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39207,7 +39207,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39220,11 +39220,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_inttests", @@ -39232,7 +39232,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s Plus 14.3", + "name": "ios_web_view_inttests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -39252,7 +39252,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39265,11 +39265,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_unittests", @@ -39277,7 +39277,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s 14.3", + "name": "ios_web_view_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39297,7 +39297,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39310,11 +39310,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ios_web_view_unittests", @@ -39322,7 +39322,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s Plus 14.3", + "name": "ios_web_view_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -39342,7 +39342,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39355,11 +39355,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "net_unittests", @@ -39367,7 +39367,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests_iPhone 6s 14.3", + "name": "net_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39387,7 +39387,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39400,11 +39400,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "services_unittests", @@ -39412,7 +39412,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests_iPhone 6s 14.3", + "name": "services_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39432,7 +39432,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39445,11 +39445,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "skia_unittests", @@ -39457,7 +39457,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s 14.3", + "name": "skia_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39477,7 +39477,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39490,11 +39490,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "skia_unittests", @@ -39502,7 +39502,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s Plus 14.3", + "name": "skia_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -39522,7 +39522,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39535,11 +39535,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "sql_unittests", @@ -39547,7 +39547,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests_iPhone 6s 14.3", + "name": "sql_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39567,7 +39567,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39580,11 +39580,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ui_base_unittests", @@ -39592,7 +39592,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s 14.3", + "name": "ui_base_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39612,7 +39612,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39625,11 +39625,11 @@ "--platform", "iPhone 6s Plus", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "ui_base_unittests", @@ -39637,7 +39637,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s Plus 14.3", + "name": "ui_base_unittests_iPhone 6s Plus 14.4", "resultdb": { "enable": true }, @@ -39657,7 +39657,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ], @@ -39670,11 +39670,11 @@ "--platform", "iPhone 6s", "--version", - "14.3", + "14.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "12c33", + "12d4e", "--xctest" ], "isolate_name": "url_unittests", @@ -39682,7 +39682,7 @@ "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests_iPhone 6s 14.3", + "name": "url_unittests_iPhone 6s 14.4", "resultdb": { "enable": true }, @@ -39702,7 +39702,7 @@ ], "named_caches": [ { - "name": "xcode_ios_12c33", + "name": "xcode_ios_12d4e", "path": "Xcode.app" } ],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index d776ff8..93308c94 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -2757,8 +2757,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "resultdb": { @@ -2791,8 +2790,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "resultdb": { @@ -2825,8 +2823,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "resultdb": { @@ -2859,8 +2856,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "resultdb": { @@ -2893,8 +2889,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "resultdb": { @@ -2926,8 +2921,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "resultdb": { @@ -2960,8 +2954,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "resultdb": { @@ -2993,8 +2986,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "resultdb": { @@ -3216,8 +3208,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "resultdb": { @@ -3250,8 +3241,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "resultdb": { @@ -3284,8 +3274,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "resultdb": { @@ -3318,8 +3307,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "resultdb": { @@ -3352,8 +3340,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "resultdb": { @@ -3385,8 +3372,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "resultdb": { @@ -3419,8 +3405,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "resultdb": { @@ -3452,8 +3437,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "resultdb": { @@ -6733,8 +6717,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gles_tests", "swarming": { @@ -6763,8 +6746,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gles_tests", "swarming": { @@ -6793,8 +6775,7 @@ "--shard-timeout=500" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gles_tests", "swarming": { @@ -7794,6 +7775,76 @@ "GPU FYI Win x64 DX12 Vulkan Builder": {}, "GPU FYI Win x64 DX12 Vulkan Builder (dbg)": {}, "GPU FYI Win x64 dEQP Builder": {}, + "Lacros FYI x64 Release (AMD)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "1002:7340", + "os": "Ubuntu", + "pool": "chromium.tests.gpu.experimental" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + } + ] + }, + "Lacros FYI x64 Release (Intel)": { + "isolated_scripts": [ + { + "args": [ + "noop_sleep", + "--show-stdout", + "--browser=release", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "noop_sleep_tests", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-19.0.2", + "os": "Ubuntu-19.04", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" + } + ] + }, "Linux FYI Debug (NVIDIA)": { "gtest_tests": [ { @@ -15373,8 +15424,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -15405,8 +15455,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -15432,8 +15481,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "swarming": { @@ -15460,8 +15508,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -15487,8 +15534,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": { @@ -15514,8 +15560,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate180_tests", "swarming": { @@ -15541,8 +15586,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate270_tests", "swarming": { @@ -15568,8 +15612,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate90_tests", "swarming": { @@ -15595,8 +15638,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_gl_tests", "swarming": { @@ -15623,8 +15665,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "swarming": { @@ -15651,8 +15692,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate180_tests", "swarming": { @@ -15679,8 +15719,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate270_tests", "swarming": { @@ -15707,8 +15746,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate90_tests", "swarming": { @@ -15735,8 +15773,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -15763,8 +15800,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "swarming": { @@ -15791,8 +15827,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "swarming": { @@ -15818,8 +15853,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "swarming": { @@ -15845,8 +15879,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "swarming": { @@ -15872,8 +15905,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "swarming": { @@ -23550,8 +23582,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -23578,8 +23609,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_metal_tests", "swarming": { @@ -23606,8 +23636,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -23634,8 +23663,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_metal_tests", "swarming": { @@ -23662,8 +23690,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -23691,8 +23718,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_metal_tests", "swarming": { @@ -23725,8 +23751,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -23751,8 +23776,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_metal_tests", "swarming": { @@ -23777,8 +23801,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -23803,8 +23826,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_metal_tests", "swarming": { @@ -23829,8 +23851,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -23856,8 +23877,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_metal_tests", "swarming": { @@ -34628,8 +34648,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -34659,8 +34678,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_d3d11_tests", "swarming": { @@ -34687,8 +34705,7 @@ "--max-processes=1" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_gl_tests", "swarming": { @@ -34714,8 +34731,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_vulkan_tests", "swarming": { @@ -34742,8 +34758,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -34769,8 +34784,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_gl_tests", "swarming": { @@ -34796,8 +34810,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": { @@ -34823,8 +34836,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate180_tests", "swarming": { @@ -34850,8 +34862,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate270_tests", "swarming": { @@ -34877,8 +34888,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_rotate90_tests", "swarming": { @@ -34904,8 +34914,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_d3d11_tests", "swarming": { @@ -34932,8 +34941,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_gl_tests", "swarming": { @@ -34960,8 +34968,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles31_vulkan_tests", "swarming": { @@ -34988,8 +34995,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate180_tests", "swarming": { @@ -35016,8 +35022,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate270_tests", "swarming": { @@ -35044,8 +35049,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_rotate90_tests", "swarming": { @@ -35072,8 +35076,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_d3d11_tests", "swarming": { @@ -35100,8 +35103,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_gl_tests", "swarming": { @@ -35128,8 +35130,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_vulkan_tests", "swarming": { @@ -35156,8 +35157,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles2_vulkan_tests", "swarming": { @@ -35183,8 +35183,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles31_vulkan_tests", "swarming": { @@ -35210,8 +35209,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles32_vulkan_tests", "swarming": { @@ -35237,8 +35235,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_khr_gles3_vulkan_tests", "swarming": { @@ -38765,8 +38762,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -38793,8 +38789,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_vulkan_tests", "swarming": { @@ -39657,8 +39652,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_egl_d3d11_tests", "swarming": { @@ -39685,8 +39679,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles2_d3d11_tests", "swarming": { @@ -39713,8 +39706,7 @@ "--bot-mode" ], "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + "script": "//third_party/angle/scripts/angle_deqp_test_merge.py" }, "name": "angle_deqp_gles3_d3d11_tests", "swarming": {
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index ad0b655..73ed775 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -1083,17 +1083,17 @@ }, }, # latest Xcode 12 beta version. - 'xcode_12c33': { + 'xcode_12d4e': { '$mixin_append': { 'args': [ '--xcode-build-version', - '12c33' + '12d4e' ], }, 'swarming': { 'named_caches': [ { - 'name': 'xcode_ios_12c33', + 'name': 'xcode_ios_12d4e', 'path': 'Xcode.app', }, ],
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 767e7133..ed1b10f 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -1743,6 +1743,9 @@ '--use-angle=d3d11', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_egl_tests', 'use_isolated_scripts_api': True, }, @@ -1757,6 +1760,9 @@ # Flaky when run with multiple processes. '--max-processes=1', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_egl_tests', 'use_isolated_scripts_api': True, }, @@ -1775,6 +1781,9 @@ 'android_swarming': { 'shards': 4, }, + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_egl_tests', 'use_isolated_scripts_api': True, }, @@ -1787,6 +1796,9 @@ '--use-angle=metal', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_egl_tests', 'use_isolated_scripts_api': True, }, @@ -1808,6 +1820,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -1823,6 +1838,9 @@ '--use-angle=d3d11', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles2_tests', 'use_isolated_scripts_api': True, }, @@ -1835,6 +1853,9 @@ '--use-angle=gl', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles2_tests', 'use_isolated_scripts_api': True, }, @@ -1856,6 +1877,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles2_tests', 'use_isolated_scripts_api': True, }, @@ -1870,6 +1894,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles2_tests', 'use_isolated_scripts_api': True, }, @@ -1891,6 +1918,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles2_tests', 'use_isolated_scripts_api': True, }, @@ -1903,6 +1933,9 @@ '--use-angle=d3d11', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -1918,6 +1951,9 @@ '--use-angle=gl', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -1942,6 +1978,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -1959,6 +1998,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 1, }, @@ -1976,6 +2018,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 1, }, @@ -1993,6 +2038,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 1, }, @@ -2008,6 +2056,9 @@ '--use-angle=d3d11', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -2023,6 +2074,9 @@ '--use-angle=gl', '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 4, }, @@ -2044,6 +2098,9 @@ 'android_swarming': { 'shards': 12, }, + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_gles3_tests', 'use_isolated_scripts_api': True, }, @@ -2058,6 +2115,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 4, }, @@ -2082,6 +2142,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 4, }, @@ -2099,6 +2162,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -2116,6 +2182,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -2133,6 +2202,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'swarming': { 'shards': 2, }, @@ -2151,6 +2223,9 @@ '-v', '--shard-timeout=500', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'desktop_args': [ '--bot-mode', ], @@ -2175,6 +2250,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_khr_gles31_tests', 'use_isolated_scripts_api': True, }, @@ -2193,6 +2271,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_khr_gles32_tests', 'use_isolated_scripts_api': True, }, @@ -2214,6 +2295,9 @@ 'desktop_args': [ '--bot-mode', ], + 'merge': { + 'script': '//third_party/angle/scripts/angle_deqp_test_merge.py', + }, 'test': 'angle_deqp_khr_gles3_tests', 'use_isolated_scripts_api': True, }, @@ -6485,32 +6569,32 @@ 'ios14_beta_simulator_tests': { 'ios_common_tests': { 'variants': [ - 'SIM_IPHONE_X_14_3', + 'SIM_IPHONE_X_14_4', ], }, 'ios_eg2_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_X_14_3', - 'SIM_IPHONE_7_14_3', - 'SIM_IPAD_AIR_3RD_GEN_14_3', - 'SIM_IPAD_6_GEN_14_3', + 'SIM_IPHONE_X_14_4', + 'SIM_IPHONE_7_14_4', + 'SIM_IPAD_AIR_3RD_GEN_14_4', + 'SIM_IPAD_6_GEN_14_4', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ - 'SIM_IPHONE_7_14_3', - 'SIM_IPHONE_X_14_3', - 'SIM_IPAD_PRO_2ND_GEN_14_3', - 'SIM_IPAD_6_GEN_14_3', + 'SIM_IPHONE_7_14_4', + 'SIM_IPHONE_X_14_4', + 'SIM_IPAD_PRO_2ND_GEN_14_4', + 'SIM_IPAD_6_GEN_14_4', ] }, 'ios_screen_size_dependent_tests': { 'variants': [ - 'SIM_IPHONE_6S_PLUS_14_3', - 'SIM_IPHONE_X_14_3', - 'SIM_IPAD_AIR_2_14_3', + 'SIM_IPHONE_6S_PLUS_14_4', + 'SIM_IPHONE_X_14_4', + 'SIM_IPAD_AIR_2_14_4', ], }, }, @@ -6519,32 +6603,32 @@ 'ios_common_tests': { 'variants': [ # Latest beta iOS version Sims - 'SIM_IPHONE_6S_14_3', + 'SIM_IPHONE_6S_14_4', ], }, 'ios_eg2_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ # Latest beta iOS version Sims - 'SIM_IPHONE_7_14_3', - 'SIM_IPAD_AIR_2_14_3', - 'SIM_IPHONE_X_14_3', + 'SIM_IPHONE_7_14_4', + 'SIM_IPAD_AIR_2_14_4', + 'SIM_IPHONE_X_14_4', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ # Latest beta iOS version Sims - 'SIM_IPHONE_X_14_3', - 'SIM_IPAD_AIR_2_14_3', - 'SIM_IPAD_PRO_2ND_GEN_14_3', + 'SIM_IPHONE_X_14_4', + 'SIM_IPAD_AIR_2_14_4', + 'SIM_IPAD_PRO_2ND_GEN_14_4', ] }, 'ios_screen_size_dependent_tests': { 'variants': [ # Latest beta iOS version Sims - 'SIM_IPHONE_6S_PLUS_14_3', - 'SIM_IPHONE_6S_14_3', + 'SIM_IPHONE_6S_PLUS_14_4', + 'SIM_IPHONE_6S_14_4', ], }, },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index f7d142c6a..bbf28b3 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -89,43 +89,43 @@ ], 'identifier': 'iPad Air 2 14.0' }, - 'SIM_IPAD_AIR_2_14_3': { + 'SIM_IPAD_AIR_2_14_4': { 'args': [ '--platform', 'iPad Air 2', '--version', - '14.3' + '14.4' ], - 'identifier': 'iPad Air 2 14.3' + 'identifier': 'iPad Air 2 14.4' }, - 'SIM_IPAD_AIR_3RD_GEN_14_3': { + 'SIM_IPAD_AIR_3RD_GEN_14_4': { 'args': [ '--platform', 'iPad Air (3rd generation)', '--version', - '14.3' + '14.4' ], - 'identifier': 'iPad Air (3rd generation) 14.3' + 'identifier': 'iPad Air (3rd generation) 14.4' }, # In Xcode 12, "iPad Pro (12.9-inch)" requires a generation suffix in # "platform" arg. - 'SIM_IPAD_PRO_2ND_GEN_14_3': { + 'SIM_IPAD_PRO_2ND_GEN_14_4': { 'args': [ '--platform', 'iPad Pro (12.9-inch) (2nd generation)', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPad Pro (12.9-inch) (2nd generation) 14.3' + 'identifier': 'iPad Pro (12.9-inch) (2nd generation) 14.4' }, - 'SIM_IPAD_6_GEN_14_3': { + 'SIM_IPAD_6_GEN_14_4': { 'args': [ '--platform', 'iPad (6th generation)', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPad (6th generation) 14.3' + 'identifier': 'iPad (6th generation) 14.4' }, 'SIM_IPHONE_6S_12_4': { 'args': [ @@ -154,14 +154,14 @@ ], 'identifier': 'iPhone 6s 14.0' }, - 'SIM_IPHONE_6S_14_3': { + 'SIM_IPHONE_6S_14_4': { 'args': [ '--platform', 'iPhone 6s', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPhone 6s 14.3' + 'identifier': 'iPhone 6s 14.4' }, 'SIM_IPHONE_6S_PLUS_13_6': { 'args': [ @@ -190,14 +190,14 @@ ], 'identifier': 'iPhone 6s Plus 14.0' }, - 'SIM_IPHONE_6S_PLUS_14_3': { + 'SIM_IPHONE_6S_PLUS_14_4': { 'args': [ '--platform', 'iPhone 6s Plus', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPhone 6s Plus 14.3' + 'identifier': 'iPhone 6s Plus 14.4' }, 'SIM_IPHONE_7_13_6': { 'args': [ @@ -226,14 +226,14 @@ ], 'identifier': 'iPhone 7 14.0' }, - 'SIM_IPHONE_7_14_3': { + 'SIM_IPHONE_7_14_4': { 'args': [ '--platform', 'iPhone 7', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPhone 7 14.3' + 'identifier': 'iPhone 7 14.4' }, 'SIM_IPHONE_SE_1ST_GEN_13_6': { 'args': [ @@ -298,14 +298,14 @@ ], 'identifier': 'iPhone X 14.0' }, - 'SIM_IPHONE_X_14_3': { + 'SIM_IPHONE_X_14_4': { 'args': [ '--platform', 'iPhone X', '--version', - '14.3', + '14.4', ], - 'identifier': 'iPhone X 14.3' + 'identifier': 'iPhone X 14.4' }, 'WEBLAYER_10_AND_M_IMPL_SKEW_TESTS_NTH_MILESTONE': { 'args': [ @@ -537,4 +537,4 @@ }, 'identifier': 'OCTOPUS_TOT-1', }, -} \ No newline at end of file +}
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 502040c2..5ddd286 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2845,7 +2845,7 @@ 'mac_10.15', 'mac_toolchain', 'out_dir_arg', - 'xcode_12c33', + 'xcode_12d4e', 'xctest', ], 'test_suites': { @@ -2863,7 +2863,7 @@ 'mac_10.15', 'mac_toolchain', 'out_dir_arg', - 'xcode_12c33', + 'xcode_12d4e', 'xctest', ], 'test_suites': { @@ -4064,6 +4064,26 @@ 'GPU FYI Win x64 DX12 Vulkan Builder': {}, 'GPU FYI Win x64 DX12 Vulkan Builder (dbg)': {}, 'GPU FYI Win x64 dEQP Builder' : {}, + 'Lacros FYI x64 Release (AMD)': { + 'os_type': 'linux', + 'browser_config': 'release', + 'mixins': [ + 'linux_amd_rx_5500_xt', + ], + 'test_suites': { + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', + }, + }, + 'Lacros FYI x64 Release (Intel)': { + 'os_type': 'linux', + 'browser_config': 'release', + 'mixins': [ + 'linux_intel_hd_630_stable', + ], + 'test_suites': { + 'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test', + }, + }, 'Linux FYI Debug (NVIDIA)': { 'browser_config': 'debug', 'os_type': 'linux',
diff --git a/testing/trigger_scripts/perf_device_trigger.py b/testing/trigger_scripts/perf_device_trigger.py index 64b75222..f0d3bc5 100755 --- a/testing/trigger_scripts/perf_device_trigger.py +++ b/testing/trigger_scripts/perf_device_trigger.py
@@ -238,7 +238,11 @@ return {} perf_bots = {} for bot in query_result['items']: - alive = (not bot['is_dead'] and not bot['quarantined']) + # Device maintenance is usually quick, and we can wait for it to finish. + # However, if the device is too hot, it can take a long time for it to + # cool down, so check for 'Device temperature' in maintenance_msg. + alive = (not bot['is_dead'] and not bot['quarantined'] and + 'Device temperature' not in bot.get('maintenance_msg', '')) perf_bots[bot['bot_id']] = Bot(bot['bot_id'], alive) return perf_bots
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 68f5ce8..a0be697 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -5994,6 +5994,26 @@ ] } ], + "SchedulePeriodicPurge": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "DiscardableMemoryExperiments", + "enable_features": [ + "SchedulePeriodicPurge" + ] + } + ] + } + ], "SchemefulSameSiteAllOS": [ { "platforms": [
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index 82bef16..a735cd03 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3116,6 +3116,7 @@ kSessionStorageFirstUsedBeforeFcp = 3793, kSessionStorageFirstUsedAfterFcp = 3794, kGravitySensorConstructor = 3795, + kElementInternalsStates = 3796, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 9375570..1798b496 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1552,10 +1552,10 @@ "svg/animation/smil_time_container_test.cc", "svg/animation/svg_smil_element_test.cc", "svg/graphics/svg_image_test.cc", - "svg/svg_external_document_cache_test.cc", "svg/svg_foreign_object_element_test.cc", "svg/svg_path_parser_test.cc", "svg/svg_path_query_test.cc", + "svg/svg_resource_document_content_test.cc", "svg/svg_text_content_element_test.cc", "svg/svg_use_element_test.cc", "svg/unsafe_svg_attribute_sanitization_test.cc",
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index f8bdd3b..3c7e749 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -33,7 +33,7 @@ // instead of including more headers. If that is infeasible, adjust the limit. // For more info, see // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md -#pragma clang max_tokens_here 1000000 +#pragma clang max_tokens_here 1001000 #include <memory> #include <utility>
diff --git a/third_party/blink/renderer/core/frame/frame_overlay.cc b/third_party/blink/renderer/core/frame/frame_overlay.cc index 43acfeb..8921d95 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay.cc
@@ -97,6 +97,14 @@ IntRect FrameOverlay::ComputeInterestRect(const GraphicsLayer* graphics_layer, const IntRect&) const { DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + return IntRect(IntPoint(), Size()); +} + +IntRect FrameOverlay::PaintableRegion( + const GraphicsLayer* graphics_layer) const { + DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); + DCHECK(RuntimeEnabledFeatures::CullRectUpdateEnabled()); return IntRect(IntPoint(), Size()); }
diff --git a/third_party/blink/renderer/core/frame/frame_overlay.h b/third_party/blink/renderer/core/frame/frame_overlay.h index 24af6f7..966657012 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay.h +++ b/third_party/blink/renderer/core/frame/frame_overlay.h
@@ -90,6 +90,7 @@ bool NeedsRepaint(const GraphicsLayer&) const override { return true; } IntRect ComputeInterestRect(const GraphicsLayer*, const IntRect&) const override; + IntRect PaintableRegion(const GraphicsLayer*) const override; void PaintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase,
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index efca669..5845cff5 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -124,6 +124,7 @@ #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" #include "third_party/blink/renderer/core/paint/compositing/compositing_inputs_updater.h" #include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/cull_rect_updater.h" #include "third_party/blink/renderer/core/paint/frame_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_painter.h" @@ -4131,7 +4132,10 @@ frame_view.Lifecycle().AdvanceTo(DocumentLifecycle::kInPaint); }); - PaintInternal(context, global_paint_flags, cull_rect); + { + OverriddenCullRectScope force_cull_rect(*this, cull_rect); + PaintInternal(context, global_paint_flags, cull_rect); + } ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { frame_view.Lifecycle().AdvanceTo(DocumentLifecycle::kPaintClean); @@ -4148,7 +4152,10 @@ frame_view.Lifecycle().AdvanceTo(DocumentLifecycle::kInPaint); }); - FramePainter(*this).PaintContents(context, global_paint_flags, cull_rect); + { + OverriddenCullRectScope force_cull_rect(*this, cull_rect); + FramePainter(*this).PaintContents(context, global_paint_flags, cull_rect); + } ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { frame_view.Lifecycle().AdvanceTo(DocumentLifecycle::kPaintClean); @@ -4158,6 +4165,7 @@ void LocalFrameView::PaintContentsForTest(const CullRect& cull_rect) { AllowThrottlingScope allow_throttling(*this); Lifecycle().AdvanceTo(DocumentLifecycle::kInPaint); + OverriddenCullRectScope force_cull_rect(*this, cull_rect); if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { PaintController& paint_controller = EnsurePaintController(); if (GetLayoutView()->Layer()->SelfOrDescendantNeedsRepaint()) {
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.idl b/third_party/blink/renderer/core/html/custom/element_internals.idl index 0e834be..6140f30 100644 --- a/third_party/blink/renderer/core/html/custom/element_internals.idl +++ b/third_party/blink/renderer/core/html/custom/element_internals.idl
@@ -26,7 +26,8 @@ // Custom state // https://wicg.github.io/custom-state-pseudo-class/#dom-elementinternals-states - [RuntimeEnabled=CustomStatePseudoClass] readonly attribute CustomStateSet states; + [RuntimeEnabled=CustomStatePseudoClass, MeasureAs=ElementInternalsStates] + readonly attribute CustomStateSet states; // Access to shadowRoot from custom elements. See crbug.com/1042130 and // https://github.com/w3c/webcomponents/issues/871#issuecomment-672082936
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc index 701c826c..ed48bd1a 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -1597,18 +1597,11 @@ LayoutUnit available_size, LayoutUnit start_border_scrollbar_padding, LayoutUnit grid_gap) { - // Iterating over all the track sets is typically unnecessary, i.e. if there - // is default alignment. Only compute this on-demand. - struct FreeSpaceAndTrackCount { - LayoutUnit free_space; - wtf_size_t track_count; - }; - auto ComputeFreeSpaceAndTrackCount = [&track_collection, &available_size, - &grid_gap]() -> FreeSpaceAndTrackCount { - // Since we normalized grid lines to be 0-indexed, the end line of the - // implicit grid is equivalent to the total track count. - return {available_size - ComputeTotalTrackSize(track_collection, grid_gap), - track_collection.EndLineOfImplicitGrid()}; + // Determining the free-space is typically unnecessary, i.e. if there is + // default alignment. Only compute this on-demand. + auto FreeSpace = [&track_collection, &available_size, + &grid_gap]() -> LayoutUnit { + return available_size - ComputeTotalTrackSize(track_collection, grid_gap); }; // The default alignment, perform adjustments on top of this. @@ -1625,35 +1618,38 @@ switch (content_alignment.Distribution()) { case ContentDistributionType::kSpaceBetween: { // Default behavior for 'space-between' is to start align content. - const auto result = ComputeFreeSpaceAndTrackCount(); - if (result.track_count < 2 || result.free_space < LayoutUnit()) + const wtf_size_t track_count = track_collection.EndLineOfImplicitGrid(); + const LayoutUnit free_space = FreeSpace(); + if (track_count < 2 || free_space < LayoutUnit()) return geometry; - geometry.gutter_size += result.free_space / (result.track_count - 1); + geometry.gutter_size += free_space / (track_count - 1); return geometry; } case ContentDistributionType::kSpaceAround: { // Default behaviour for 'space-around' is to center content. - const auto result = ComputeFreeSpaceAndTrackCount(); - if (result.track_count < 1 || result.free_space < LayoutUnit()) { - geometry.start_offset += result.free_space / 2; + const wtf_size_t track_count = track_collection.EndLineOfImplicitGrid(); + const LayoutUnit free_space = FreeSpace(); + if (track_count < 1 || free_space < LayoutUnit()) { + geometry.start_offset += free_space / 2; return geometry; } - LayoutUnit track_space = result.free_space / result.track_count; + LayoutUnit track_space = free_space / track_count; geometry.start_offset += track_space / 2; geometry.gutter_size += track_space; return geometry; } case ContentDistributionType::kSpaceEvenly: { // Default behaviour for 'space-evenly' is to center content. - const auto result = ComputeFreeSpaceAndTrackCount(); - if (result.free_space < LayoutUnit()) { - geometry.start_offset += result.free_space / 2; + const wtf_size_t track_count = track_collection.EndLineOfImplicitGrid(); + const LayoutUnit free_space = FreeSpace(); + if (free_space < LayoutUnit()) { + geometry.start_offset += free_space / 2; return geometry; } - LayoutUnit track_space = result.free_space / (result.track_count + 1); + LayoutUnit track_space = free_space / (track_count + 1); geometry.start_offset += track_space; geometry.gutter_size += track_space; return geometry; @@ -1669,8 +1665,7 @@ if (IsLtr(style.Direction())) return geometry; - const auto result = ComputeFreeSpaceAndTrackCount(); - geometry.start_offset += result.free_space; + geometry.start_offset += FreeSpace(); return geometry; } case ContentPosition::kRight: { @@ -1678,20 +1673,17 @@ if (IsRtl(style.Direction())) return geometry; - const auto result = ComputeFreeSpaceAndTrackCount(); - geometry.start_offset += result.free_space; + geometry.start_offset += FreeSpace(); return geometry; break; } case ContentPosition::kCenter: { - const auto result = ComputeFreeSpaceAndTrackCount(); - geometry.start_offset += result.free_space / 2; + geometry.start_offset += FreeSpace() / 2; return geometry; } case ContentPosition::kEnd: case ContentPosition::kFlexEnd: { - const auto result = ComputeFreeSpaceAndTrackCount(); - geometry.start_offset += result.free_space; + geometry.start_offset += FreeSpace(); return geometry; } case ContentPosition::kStart:
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc index f00325c..9d2bf8a 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_clipper.cc
@@ -185,7 +185,7 @@ // - masker/filter not applied when laying out the children // - fill is set to the initial fill paint server (solid, black) // - stroke is set to the initial stroke paint server (none) - PaintInfo info(builder.Context(), LayoutRect::InfiniteIntRect(), + PaintInfo info(builder.Context(), CullRect::Infinite(), PaintPhase::kForeground, kGlobalPaintNormalPhase, kPaintLayerPaintingRenderingClipPathAsMask | kPaintLayerPaintingRenderingResourceSubtree);
diff --git a/third_party/blink/renderer/core/paint/box_model_object_painter.cc b/third_party/blink/renderer/core/paint/box_model_object_painter.cc index 37b0f77e..de7526d1 100644 --- a/third_party/blink/renderer/core/paint/box_model_object_painter.cc +++ b/third_party/blink/renderer/core/paint/box_model_object_painter.cc
@@ -62,7 +62,7 @@ const IntRect& mask_rect, const PhysicalOffset& paint_offset, bool object_has_multiple_boxes) { - PaintInfo paint_info(context, mask_rect, PaintPhase::kTextClip, + PaintInfo paint_info(context, CullRect(mask_rect), PaintPhase::kTextClip, kGlobalPaintNormalPhase, 0); if (flow_box_) { LayoutSize local_offset = ToLayoutSize(flow_box_->Location());
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 724bcc3..66ac9380 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -1586,6 +1586,8 @@ IntRect CompositedLayerMapping::RecomputeInterestRect( const GraphicsLayer* graphics_layer) const { + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + IntRect graphics_layer_bounds(IntPoint(), IntSize(graphics_layer->Size())); FloatClipRect mapping_rect((FloatRect(graphics_layer_bounds))); @@ -1691,6 +1693,8 @@ const IntRect& previous_interest_rect, const IntRect& new_interest_rect, const IntSize& layer_size) { + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + if (previous_interest_rect.IsEmpty() && new_interest_rect.IsEmpty()) return false; @@ -1728,6 +1732,8 @@ IntRect CompositedLayerMapping::ComputeInterestRect( const GraphicsLayer* graphics_layer, const IntRect& previous_interest_rect) const { + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + // Use the previous interest rect if it covers the whole layer. IntRect whole_layer_rect = IntRect(IntPoint(), IntSize(graphics_layer->Size())); @@ -1749,6 +1755,22 @@ return previous_interest_rect; } +IntRect CompositedLayerMapping::PaintableRegion( + const GraphicsLayer* graphics_layer) const { + DCHECK(RuntimeEnabledFeatures::CullRectUpdateEnabled()); + const auto& fragment = OwningLayer().GetLayoutObject().FirstFragment(); + CullRect cull_rect = graphics_layer == scrolling_contents_layer_.get() || + (graphics_layer == foreground_layer_.get() && + scrolling_contents_layer_) + ? fragment.GetContentsCullRect() + : fragment.GetCullRect(); + IntRect layer_rect(IntPoint(), IntSize(graphics_layer->Size())); + if (cull_rect.IsInfinite()) + return layer_rect; + cull_rect.MoveBy(-graphics_layer->GetOffsetFromTransformNode()); + return Intersection(cull_rect.Rect(), layer_rect); +} + LayoutSize CompositedLayerMapping::SubpixelAccumulation() const { return owning_layer_.SubpixelAccumulation().ToLayoutSize(); } @@ -1809,7 +1831,11 @@ const GraphicsLayer* graphics_layer, GraphicsContext& context, GraphicsLayerPaintingPhase graphics_layer_painting_phase, - const IntRect& interest_rect) const { + const IntRect& interest_rect_arg) const { + IntRect interest_rect = RuntimeEnabledFeatures::CullRectUpdateEnabled() + ? PaintableRegion(graphics_layer) + : interest_rect_arg; + FramePaintTiming frame_paint_timing(context, GetLayoutObject().GetFrame()); // https://code.google.com/p/chromium/issues/detail?id=343772
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index 4b28c98..e13b337 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -169,6 +169,7 @@ IntRect ComputeInterestRect( const GraphicsLayer*, const IntRect& previous_interest_rect) const override; + IntRect PaintableRegion(const GraphicsLayer*) const override; LayoutSize SubpixelAccumulation() const final; bool NeedsRepaint(const GraphicsLayer&) const override; void PaintContents(const GraphicsLayer*,
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping_test.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping_test.cc index 684b3d7..b9b9f14 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping_test.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping_test.cc
@@ -22,29 +22,22 @@ #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h" #include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h" #include "third_party/blink/renderer/platform/testing/find_cc_layer.h" +#include "third_party/blink/renderer/platform/testing/paint_test_configurations.h" namespace blink { // TODO(wangxianzhu): Though these tests don't directly apply in // CompositeAfterPaint, we should ensure the cases are tested in -// CompositeAfterPaint mode if applicable. -class CompositedLayerMappingTest : public RenderingTest { +// CompositeAfterPaint mode if applicable. Some interest rect / cull rect +// tests have been migrated for CompositeAfterPaint into +// PaintLayerPainterTestCAP. +class CompositedLayerMappingTest : public RenderingTest, + public PaintTestConfigurations { public: CompositedLayerMappingTest() : RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {} protected: - IntRect RecomputeInterestRect(const GraphicsLayer* graphics_layer) { - return static_cast<CompositedLayerMapping&>(graphics_layer->Client()) - .RecomputeInterestRect(graphics_layer); - } - - IntRect ComputeInterestRect(GraphicsLayer* graphics_layer, - IntRect previous_interest_rect) { - return static_cast<CompositedLayerMapping&>(graphics_layer->Client()) - .ComputeInterestRect(graphics_layer, previous_interest_rect); - } - bool InterestRectChangedEnoughToRepaint(const IntRect& previous_interest_rect, const IntRect& new_interest_rect, const IntSize& layer_size) { @@ -86,7 +79,9 @@ } }; -TEST_F(CompositedLayerMappingTest, SubpixelAccumulationChange) { +INSTANTIATE_PRE_CAP_TEST_SUITE_P(CompositedLayerMappingTest); + +TEST_P(CompositedLayerMappingTest, SubpixelAccumulationChange) { SetBodyInnerHTML(R"HTML( <div id='target' style='will-change: opacity; background: lightblue; position: relative; left: 0.4px; width: 100px; height: 100px'> @@ -111,7 +106,7 @@ GetDocument().View()->SetTracksRasterInvalidations(false); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, SubpixelAccumulationChangeUnderInvalidation) { ScopedPaintUnderInvalidationCheckingForTest test(true); SetBodyInnerHTML(R"HTML( @@ -138,7 +133,7 @@ GetDocument().View()->SetTracksRasterInvalidations(false); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, SubpixelAccumulationChangeIndirectCompositing) { SetBodyInnerHTML(R"HTML( <style> @@ -180,72 +175,74 @@ GetDocument().View()->SetTracksRasterInvalidations(false); } -TEST_F(CompositedLayerMappingTest, SimpleInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 200px; will-change: " - "transform'></div>"); +TEST_P(CompositedLayerMappingTest, SimpleInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' style='width: 200px; height: 200px; + will-change: transform; background: blue'> + </div> + )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); ASSERT_TRUE(paint_layer->GetCompositedLayerMapping()); - EXPECT_EQ(IntRect(0, 0, 200, 200), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 0, 200, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, TallLayerInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 10000px; will-change: " - "transform'></div>"); +TEST_P(CompositedLayerMappingTest, TallLayerInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' style='width: 200px; height: 10000px; + will-change: transform; background: blue'> + </div> + )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to // local, adding 4000px in all directions, then clipping, yields this rect. - EXPECT_EQ(IntRect(0, 0, 200, 4592), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 0, 200, 4592), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, TallCompositedScrolledLayerInterestRect) { +TEST_P(CompositedLayerMappingTest, TallCompositedScrolledLayerInterestRect) { SetBodyInnerHTML(R"HTML( - <div style='width: 200px; height: 1000px;'></div> - <div id='target' - style='width: 200px; height: 10000px; will-change: transform'> - </div> + <div style='width: 200px; height: 1000px;'></div> + <div id='target' style='width: 200px; height: 10000px; + will-change: transform; background: blue'> + </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 8000), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 2992, 200, 7008), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 2992, 200, 7008), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, TallNonCompositedScrolledLayerInterestRect) { +TEST_P(CompositedLayerMappingTest, TallNonCompositedScrolledLayerInterestRect) { SetHtmlInnerHTML(R"HTML( - <div style='width: 200px; height: 11000px;'></div> + <div style='width: 200px; height: 11000px'></div> )HTML"); - UpdateAllLifecyclePhasesForTest(); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 8000), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetDocument().GetLayoutView()->Layer(); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 4000, 800, 7016), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 4000, 800, 7016), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 10000px; will-change: " - "transform'></div>"); +TEST_P(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' style='width: 200px; height: 10000px; + will-change: transform; background: blue'> + </div> + )HTML"); GetDocument().GetSettings()->SetMainFrameClipsContent(false); @@ -253,22 +250,18 @@ PaintLayer* paint_layer = GetPaintLayerByElementId("target"); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); ASSERT_TRUE(paint_layer->GetCompositedLayerMapping()); - // Clipping is disabled in recomputeInterestRect. - EXPECT_EQ(IntRect(0, 0, 200, 10000), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); - EXPECT_EQ( - IntRect(0, 0, 200, 10000), - ComputeInterestRect(paint_layer->GraphicsLayerBacking(), IntRect())); + // Clipping is disabled. + EXPECT_EQ(gfx::Rect(0, 0, 200, 10000), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, VerticalRightLeftWritingModeDocument) { +TEST_P(CompositedLayerMappingTest, VerticalRightLeftWritingModeDocument) { SetBodyInnerHTML(R"HTML( <style>html,body { margin: 0px } html { -webkit-writing-mode: vertical-rl}</style> <div id='target' style='width: 10000px; height: 200px;'></div> )HTML"); - UpdateAllLifecyclePhasesForTest(); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(-5000, 0), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); @@ -279,42 +272,40 @@ // A scroll by -5000px is equivalent to a scroll by (10000 - 5000 - 800)px = // 4200px in non-RTL mode. Expanding the resulting rect by 4000px in each // direction yields this result. - EXPECT_EQ(IntRect(200, 0, 8800, 600), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(200, 0, 8800, 600), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, RotatedInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 200px; will-change: " - "transform; transform: rotateZ(45deg)'></div>"); +TEST_P(CompositedLayerMappingTest, RotatedInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 200px; height: 200px; will-change: transform; + transform: rotateZ(45deg); background: blue'> + </div> + )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 200, 200), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 200, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, RotatedInterestRectNear90Degrees) { - SetBodyInnerHTML( - "<div id='target' style='width: 10000px; height: 200px; will-change: " - "transform; transform: rotateY(89.9999deg)'></div>"); +TEST_P(CompositedLayerMappingTest, RotatedInterestRectNear90Degrees) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 10000px; height: 200px; will-change: transform; + transform-origin: 0 0; transform: rotateY(89.9999deg); + background: blue'> + </div> + )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - // Because the layer is rotated to almost 90 degrees, floating-point error - // leads to a reverse-projected rect that is much much larger than the - // original layer size in certain dimensions. In such cases, we often fall - // back to the 4000px interest rect padding amount. - EXPECT_EQ(IntRect(0, 0, 4000, 200), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 10000, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, LargeScaleInterestRect) { - // It's rotated 90 degrees about the X axis, which means its visual content - // rect is empty, and so the interest rect is the default (0, 0, 4000, 4000) - // intersected with the layer bounds. +TEST_P(CompositedLayerMappingTest, LargeScaleInterestRect) { SetBodyInnerHTML(R"HTML( <style> .container { @@ -348,14 +339,13 @@ </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 1920, 5300), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 1920, 5300), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, PerspectiveInterestRect) { +TEST_P(CompositedLayerMappingTest, PerspectiveInterestRect) { SetBodyInnerHTML(R"HTML(<div style='left: 400px; position: absolute;'> <div id=target style='transform: perspective(1000px) rotateX(-100deg);'> <div style='width: 1200px; height: 835px; background: lightblue; @@ -363,136 +353,196 @@ </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 1202, 837), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 1202, 837), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, RotationInterestRect) { +TEST_P(CompositedLayerMappingTest, RotationInterestRect) { SetBodyInnerHTML(R"HTML( - <style> - .red_box { - position: fixed; - height: 100px; - width: 100vh; /* height of view, after -90 rot */ - right: calc(16px - 50vh); /* 16 pixels above top of view, after -90 */ - top: calc(50vh - 16px); /* 16 pixels in from right side, after -90 rot */ - transform-origin: top; - transform: rotate(-90deg); - background-color: red; - will-change: transform; - } - .blue_box { - height: 30px; - width: 600px; - background: blue; - } -</style> -<div class="red_box" id=target> - <div class="blue_box"></div> -</div> - + <style> + .red_box { + position: fixed; + height: 100px; + width: 100vh; /* height of view, after -90 rot */ + right: calc(16px - 50vh); /* 16 pixels above top of view, after -90 */ + top: calc(50vh - 16px); /* 16 pixels in from right side, after -90 rot */ + transform-origin: top; + transform: rotate(-90deg); + background-color: red; + will-change: transform; + } + .blue_box { + height: 30px; + width: 600px; + background: blue; + } + </style> + <div class="red_box" id=target> + <div class="blue_box"></div> + </div> )HTML"); GetFrame().View()->Resize(2000, 3000); UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 3000, 100), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 3000, 100), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, 3D90DegRotatedTallInterestRect) { +TEST_P(CompositedLayerMappingTest, 3D90DegRotatedTallInterestRect) { // It's rotated 90 degrees about the X axis, which means its visual content - // rect is empty, and so the interest rect is the default (0, 0, 4000, 4000) - // intersected with the layer bounds. - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 10000px; will-change: " - "transform; transform: rotateY(90deg)'></div>"); - - UpdateAllLifecyclePhasesForTest(); - PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 200, 4000), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); -} - -TEST_F(CompositedLayerMappingTest, 3D45DegRotatedTallInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 10000px; will-change: " - "transform; transform: rotateY(45deg)'></div>"); - - UpdateAllLifecyclePhasesForTest(); - PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 200, 6226), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); -} - -TEST_F(CompositedLayerMappingTest, RotatedTallInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 200px; height: 10000px; will-change: " - "transform; transform: rotateZ(45deg)'></div>"); - - UpdateAllLifecyclePhasesForTest(); - PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 200, 4000), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); -} - -TEST_F(CompositedLayerMappingTest, WideLayerInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 10000px; height: 200px; will-change: " - "transform'></div>"); - - UpdateAllLifecyclePhasesForTest(); - PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - // Screen-space visible content rect is [8, 8, 800, 200] (the screen is - // 800x600). Mapping back to local, adding 4000px in all directions, then - // clipping, yields this rect. - EXPECT_EQ(IntRect(0, 0, 4792, 200), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); -} - -TEST_F(CompositedLayerMappingTest, FixedPositionInterestRect) { - SetBodyInnerHTML( - "<div id='target' style='width: 300px; height: 400px; will-change: " - "transform; position: fixed; top: 100px; left: 200px;'></div>"); - - UpdateAllLifecyclePhasesForTest(); - PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - EXPECT_EQ(IntRect(0, 0, 300, 400), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); -} - -TEST_F(CompositedLayerMappingTest, LayerOffscreenInterestRect) { + // rect is empty. SetBodyInnerHTML(R"HTML( - <div id='target' style='width: 200px; height: 200px; will-change: - transform; position: absolute; top: 9000px; left: 0px;'> + <style>body { margin: 0}</style> + <div id='target' + style='width: 200px; height: 10000px; will-change: transform; + transform: rotateY(90deg); background: blue'> </div> )HTML"); UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); - ASSERT_TRUE(!!paint_layer->GraphicsLayerBacking()); - // Offscreen layers are painted as usual. - EXPECT_EQ(IntRect(0, 0, 200, 200), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // Use the default (-4000, -4000, 8800, 8600) intersected with the layer + // bounds. + EXPECT_EQ(gfx::Rect(0, 0, 200, 4600), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } else { + // Use the default (-4000, -4000, 8000, 8000) intersected with the layer + // bounds. + EXPECT_EQ(gfx::Rect(0, 0, 200, 4000), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } } -TEST_F(CompositedLayerMappingTest, ScrollingLayerInterestRect) { +TEST_P(CompositedLayerMappingTest, 3D45DegRotatedTallInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 200px; height: 10000px; will-change: transform; + transform: rotateY(45deg); background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // CullRectUpdate expands the cull rect twice. The first expansion is for + // composited scrolling of the LayoutView, and it's not big enough for + // |target| (as it has a sqrt(2) max scale from screen to local pixels) + // thus the second expansion. + EXPECT_EQ(gfx::Rect(0, 0, 200, 10000), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } else { + // Interest rect is expanded in both direction by 4000 * sqrt(2) pixels, + // then intersected with the layer bounds. + EXPECT_EQ(gfx::Rect(0, 0, 200, 6226), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } +} + +TEST_P(CompositedLayerMappingTest, RotatedTallInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 200px; height: 10000px; will-change: transform; + transform: rotateZ(45deg); background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + } else { + EXPECT_EQ(gfx::Rect(0, 0, 200, 4000), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } +} + +TEST_P(CompositedLayerMappingTest, WideLayerInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' style='width: 10000px; height: 200px; + will-change: transform; background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + // Screen-space visible content rect is [8, 8, 800, 200] (the screen is + // 800x600). Mapping back to local, adding 4000px in all directions, then + // clipping, yields this rect. + EXPECT_EQ(gfx::Rect(0, 0, 4792, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); +} + +TEST_P(CompositedLayerMappingTest, FixedPositionInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 300px; height: 400px; will-change: transform; + position: fixed; top: 100px; left: 200px; background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + EXPECT_EQ(gfx::Rect(0, 0, 300, 400), + PaintableRegion(paint_layer->GraphicsLayerBacking())); +} + +TEST_P(CompositedLayerMappingTest, LayerFarOffscreenInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 200px; height: 200px; position: absolute; top: 9000px; + left: 0px; will-change: transform; background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // CullRectUpdate knows the layer is far away from the viewport. + EXPECT_EQ(gfx::Rect(), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } else { + // Offscreen layers are painted as usual. + EXPECT_EQ(gfx::Rect(0, 0, 200, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); + } +} + +TEST_P(CompositedLayerMappingTest, LayerNearOffscreenInterestRect) { + SetBodyInnerHTML(R"HTML( + <div id='target' + style='width: 200px; height: 200px; position: absolute; top: 3000px; + left: 0px; will-change: transform; background: blue'> + </div> + )HTML"); + + UpdateAllLifecyclePhasesForTest(); + PaintLayer* paint_layer = GetPaintLayerByElementId("target"); + ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); + // Offscreen layers near to the viewport are painted as usual. + EXPECT_EQ(gfx::Rect(0, 0, 200, 200), + PaintableRegion(paint_layer->GraphicsLayerBacking())); +} + +TEST_P(CompositedLayerMappingTest, ScrollingLayerInterestRect) { SetBodyInnerHTML(R"HTML( <style> div::-webkit-scrollbar{ width: 5px; } </style> - <div id='target' style='width: 200px; height: 200px; will-change: - transform; overflow: scroll'> - <div style='width: 100px; height: 10000px'></div></div> + <div id='target' + style='width: 200px; height: 200px; will-change: transform; + overflow: scroll; background: blue'> + <div style='width: 100px; height: 10000px'></div> + </div> )HTML"); UpdateAllLifecyclePhasesForTest(); @@ -506,26 +556,31 @@ // Applying the viewport clip of the root has no effect because // the clip is already small. Mapping it down into the graphics layer // space yields (0, 0, 195, 193). This is then expanded by 4000px. - EXPECT_EQ(IntRect(0, 0, 195, 4193), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 0, 195, 4193), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, ClippedBigLayer) { +TEST_P(CompositedLayerMappingTest, ClippedBigLayer) { SetBodyInnerHTML(R"HTML( <div style='width: 1px; height: 1px; overflow: hidden'> - <div id='target' style='width: 10000px; height: 10000px; will-change: - transform'></div></div> + <div id='target' style='width: 10000px; height: 10000px; + will-change: transform; background: blue'> + </div> + </div> )HTML"); UpdateAllLifecyclePhasesForTest(); PaintLayer* paint_layer = GetPaintLayerByElementId("target"); ASSERT_TRUE(paint_layer->GraphicsLayerBacking()); // Offscreen layers are painted as usual. - EXPECT_EQ(IntRect(0, 0, 4001, 4001), - RecomputeInterestRect(paint_layer->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 0, 4001, 4001), + PaintableRegion(paint_layer->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintEmpty) { +TEST_P(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintEmpty) { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + IntSize layer_size(1000, 1000); // Both empty means there is nothing to do. EXPECT_FALSE( @@ -539,8 +594,11 @@ IntRect(), layer_size)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintNotBigEnough) { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + IntSize layer_size(1000, 1000); IntRect previous_interest_rect(100, 100, 100, 100); EXPECT_FALSE(InterestRectChangedEnoughToRepaint( @@ -551,8 +609,11 @@ previous_interest_rect, IntRect(1, 1, 200, 200), layer_size)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintNotBigEnoughButNewAreaTouchesEdge) { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + IntSize layer_size(500, 500); IntRect previous_interest_rect(100, 100, 100, 100); // Top edge. @@ -571,8 +632,11 @@ // Verifies that having a current viewport that touches a layer edge does not // force re-recording. -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintCurrentViewportTouchesEdge) { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + IntSize layer_size(500, 500); IntRect new_interest_rect(100, 100, 300, 300); // Top edge. @@ -589,8 +653,11 @@ IntRect(400, 300, 100, 100), new_interest_rect, layer_size)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintScrollScenarios) { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + IntSize layer_size(1000, 1000); IntRect previous_interest_rect(100, 100, 100, 100); IntRect new_interest_rect(previous_interest_rect); @@ -608,7 +675,7 @@ previous_interest_rect, new_interest_rect, layer_size)); } -TEST_F(CompositedLayerMappingTest, InterestRectChangeOnViewportScroll) { +TEST_P(CompositedLayerMappingTest, InterestRectChangeOnViewportScroll) { SetBodyInnerHTML(R"HTML( <style> ::-webkit-scrollbar { width: 0; height: 0; } @@ -617,7 +684,6 @@ <div id='div' style='width: 100px; height: 10000px'>Text</div> )HTML"); - UpdateAllLifecyclePhasesForTest(); GraphicsLayer* root_scrolling_layer = GetDocument().GetLayoutView()->Layer()->GraphicsLayerBacking(); EXPECT_EQ(gfx::Rect(0, 0, 800, 4600), PaintableRegion(root_scrolling_layer)); @@ -627,23 +693,17 @@ UpdateAllLifecyclePhasesForTest(); // Still use the previous interest rect because the recomputed rect hasn't // changed enough. - EXPECT_EQ(IntRect(0, 0, 800, 4900), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 800, 4600), PaintableRegion(root_scrolling_layer)); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 600), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); // Use recomputed interest rect because it changed enough. - EXPECT_EQ(IntRect(0, 0, 800, 5200), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 800, 5200), PaintableRegion(root_scrolling_layer)); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 5400), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 1400, 800, 8600), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 1400, 800, 8600), PaintableRegion(root_scrolling_layer)); @@ -652,8 +712,6 @@ UpdateAllLifecyclePhasesForTest(); // Still use the previous interest rect because it contains the recomputed // interest rect. - EXPECT_EQ(IntRect(0, 5000, 800, 5000), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 1400, 800, 8600), PaintableRegion(root_scrolling_layer)); @@ -661,12 +719,10 @@ ScrollOffset(0, 2000), mojom::blink::ScrollType::kProgrammatic); // Use recomputed interest rect because it changed enough. UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 0, 800, 6600), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 800, 6600), PaintableRegion(root_scrolling_layer)); } -TEST_F(CompositedLayerMappingTest, InterestRectChangeOnShrunkenViewport) { +TEST_P(CompositedLayerMappingTest, InterestRectChangeOnShrunkenViewport) { SetBodyInnerHTML(R"HTML( <style> ::-webkit-scrollbar { width: 0; height: 0; } @@ -675,7 +731,6 @@ <div id='div' style='width: 100px; height: 10000px'>Text</div> )HTML"); - UpdateAllLifecyclePhasesForTest(); GraphicsLayer* root_scrolling_layer = GetDocument().GetLayoutView()->Layer()->GraphicsLayerBacking(); EXPECT_EQ(gfx::Rect(0, 0, 800, 4600), PaintableRegion(root_scrolling_layer)); @@ -683,12 +738,10 @@ GetDocument().View()->SetFrameRect(IntRect(0, 0, 800, 60)); UpdateAllLifecyclePhasesForTest(); // Repaint required, so interest rect should be updated to shrunken size. - EXPECT_EQ(IntRect(0, 0, 800, 4060), - RecomputeInterestRect(root_scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 800, 4060), PaintableRegion(root_scrolling_layer)); } -TEST_F(CompositedLayerMappingTest, InterestRectChangeOnScroll) { +TEST_P(CompositedLayerMappingTest, InterestRectChangeOnScroll) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); @@ -697,53 +750,44 @@ ::-webkit-scrollbar { width: 0; height: 0; } body { margin: 0; } </style> - <div id='scroller' style='width: 400px; height: 400px; overflow: - scroll'> + <div id='scroller' style='width: 400px; height: 400px; overflow: scroll'> <div id='content' style='width: 100px; height: 10000px'>Text</div> </div )HTML"); - UpdateAllLifecyclePhasesForTest(); Element* scroller = GetDocument().getElementById("scroller"); GraphicsLayer* scrolling_layer = scroller->GetLayoutBox()->Layer()->GraphicsLayerBacking(); - EXPECT_EQ(IntRect(0, 0, 400, 4400), PaintableRegion(scrolling_layer)); + EXPECT_EQ(gfx::Rect(0, 0, 400, 4400), PaintableRegion(scrolling_layer)); scroller->setScrollTop(300); UpdateAllLifecyclePhasesForTest(); // Still use the previous interest rect because the recomputed rect hasn't // changed enough. - EXPECT_EQ(IntRect(0, 0, 400, 4700), RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 400, 4400), PaintableRegion(scrolling_layer)); scroller->setScrollTop(600); UpdateAllLifecyclePhasesForTest(); // Use recomputed interest rect because it changed enough. - EXPECT_EQ(IntRect(0, 0, 400, 5000), RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 400, 5000), PaintableRegion(scrolling_layer)); scroller->setScrollTop(5600); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 1600, 400, 8400), - RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 1600, 400, 8400), PaintableRegion(scrolling_layer)); scroller->setScrollTop(9000); UpdateAllLifecyclePhasesForTest(); // Still use the previous interest rect because it contains the recomputed // interest rect. - EXPECT_EQ(IntRect(0, 5000, 400, 5000), - RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 1600, 400, 8400), PaintableRegion(scrolling_layer)); scroller->setScrollTop(2000); // Use recomputed interest rect because it changed enough. UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 0, 400, 6400), RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 0, 400, 6400), PaintableRegion(scrolling_layer)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectShouldChangeOnPaintInvalidation) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); @@ -764,23 +808,22 @@ GraphicsLayer* scrolling_layer = scroller->GetLayoutBox()->Layer()->GraphicsLayerBacking(); - scroller->setScrollTop(5400); + scroller->setScrollTop(5800); UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ(gfx::Rect(0, 1800, 400, 8200), PaintableRegion(scrolling_layer)); + scroller->setScrollTop(9400); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 5400, 400, 4600), - RecomputeInterestRect(scrolling_layer)); - EXPECT_EQ(gfx::Rect(0, 5400, 400, 4600), PaintableRegion(scrolling_layer)); + // Still use the old cull rect because it contains the new recomputed one. + EXPECT_EQ(gfx::Rect(0, 1800, 400, 8200), PaintableRegion(scrolling_layer)); // Paint invalidation and repaint should change previous paint interest rect. GetDocument().getElementById("content")->setTextContent("Change"); UpdateAllLifecyclePhasesForTest(); - EXPECT_EQ(IntRect(0, 5400, 400, 4600), - RecomputeInterestRect(scrolling_layer)); EXPECT_EQ(gfx::Rect(0, 5400, 400, 4600), PaintableRegion(scrolling_layer)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectOfSquashingLayerWithNegativeOverflow) { SetBodyInnerHTML(R"HTML( <style>body { margin: 0; font-size: 16px; }</style> @@ -808,50 +851,59 @@ // The squashing layer is at (-10000, 190, 10100, 100) in viewport // coordinates. // The following rect is at (-4000, 190, 4100, 100) in viewport coordinates. - EXPECT_EQ(IntRect(6000, 0, 4100, 100), - grouped_mapping->ComputeInterestRect( - grouped_mapping->NonScrollingSquashingLayer(), IntRect())); + EXPECT_EQ(gfx::Rect(6000, 0, 4100, 100), + PaintableRegion(grouped_mapping->NonScrollingSquashingLayer())); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, InterestRectOfSquashingLayerWithAncestorClip) { - SetBodyInnerHTML( - "<style>body { margin: 0; }</style>" - "<div style='overflow: hidden; width: 400px; height: 400px'>" - " <div style='position: relative; backface-visibility: hidden'>" - " <div style='position: absolute; top: -500px; width: 200px; height: " - "700px; backface-visibility: hidden'></div>" - // Above overflow:hidden div and two composited layers make the squashing - // layer a child of an ancestor clipping layer. - " <div id='squashed' style='height: 1000px; width: 10000px; right: 0; " - "position: absolute'></div>" - " </div>" - "</div>"); + SetBodyInnerHTML(R"HTML( + <style>body { margin: 0; }</style> + <div style='overflow: hidden; width: 400px; height: 400px'> + <div style='position: relative; backface-visibility: hidden'> + <div style='position: absolute; top: -500px; width: 200px; + height: 700px; backface-visibility: hidden'></div> + <!-- Above overflow:hidden div and two composited layers make the + squashing layer a child of an ancestor clipping layer. --> + <div id='squashed' style='height: 1000px; width: 10000px; right: 0; + position: absolute'></div> + </div> + </div> + )HTML"); CompositedLayerMapping* grouped_mapping = GetDocument() .getElementById("squashed") ->GetLayoutBox() ->Layer() ->GroupedMapping(); - // The squashing layer is at (-9600, 0, 10000, 1000) in viewport coordinates. - // The following rect is at (-4000, 0, 4400, 1000) in viewport coordinates. - EXPECT_EQ(IntRect(5600, 0, 4400, 1000), - grouped_mapping->ComputeInterestRect( - grouped_mapping->NonScrollingSquashingLayer(), IntRect())); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // CullRectUpdate doesn't expand cull rect for layers without directly + // composited transform. + EXPECT_EQ(gfx::Rect(9600, 0, 400, 400), + PaintableRegion(grouped_mapping->NonScrollingSquashingLayer())); + } else { + // The squashing layer is at (-9600, 0, 10000, 1000) in viewport + // coordinates. The following rect is at (-4000, 0, 4400, 1000) in viewport + // coordinates. + EXPECT_EQ(gfx::Rect(5600, 0, 4400, 1000), + PaintableRegion(grouped_mapping->NonScrollingSquashingLayer())); + } } -TEST_F(CompositedLayerMappingTest, InterestRectOfIframeInScrolledDiv) { +TEST_P(CompositedLayerMappingTest, InterestRectOfIframeInScrolledDiv) { GetDocument().SetBaseURLOverride(KURL("http://test.com")); SetBodyInnerHTML(R"HTML( <style>body { margin: 0; }</style> <div style='width: 200; height: 8000px'></div> - <iframe src='http://test.com' width='500' height='500' - frameBorder='0'> + <iframe src='http://test.com' width='500' height='500' frameBorder='0'> </iframe> )HTML"); - SetChildFrameHTML( - "<style>body { margin: 0; } #target { width: 200px; height: 200px; " - "will-change: transform}</style><div id=target></div>"); + SetChildFrameHTML(R"HTML( + <style>body { margin: 0; }</style> + <div id=target style='width: 200px; height: 200px; will-change: transform; + background: blue'> + </div> + )HTML"); // Scroll 8000 pixels down to move the iframe into view. GetDocument().View()->LayoutViewport()->SetScrollOffset( @@ -862,25 +914,27 @@ ASSERT_TRUE(target); EXPECT_EQ( - IntRect(0, 0, 200, 200), - RecomputeInterestRect( + gfx::Rect(0, 0, 200, 200), + PaintableRegion( target->GetLayoutObject()->EnclosingLayer()->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, InterestRectOfScrolledIframe) { +TEST_P(CompositedLayerMappingTest, InterestRectOfScrolledIframe) { GetDocument().SetBaseURLOverride(KURL("http://test.com")); GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); SetBodyInnerHTML(R"HTML( - <style>body { margin: 0; } ::-webkit-scrollbar { display: none; - }</style> - <iframe src='http://test.com' width='500' height='500' - frameBorder='0'> + <style> + body { margin: 0; } + ::-webkit-scrollbar { display: none; } + </style> + <iframe src='http://test.com' width='500' height='500' frameBorder='0'> </iframe> )HTML"); - SetChildFrameHTML( - "<style>body { margin: 0; } #target { width: 200px; " - "height: 8000px;}</style><div id=target></div>"); + SetChildFrameHTML(R"HTML( + <style>body { margin: 0; }</style> + <div id=target style='width: 200px; height: 8000px'></div> + )HTML"); UpdateAllLifecyclePhasesForTest(); @@ -890,30 +944,33 @@ UpdateAllLifecyclePhasesForTest(); ASSERT_TRUE(ChildDocument().View()->GetLayoutView()->HasLayer()); - EXPECT_EQ(IntRect(0, 3500, 500, 4500), - RecomputeInterestRect(ChildDocument() - .View() - ->GetLayoutView() - ->EnclosingLayer() - ->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 3500, 500, 4500), + PaintableRegion(ChildDocument() + .View() + ->GetLayoutView() + ->EnclosingLayer() + ->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, InterestRectOfIframeWithContentBoxOffset) { +TEST_P(CompositedLayerMappingTest, InterestRectOfIframeWithContentBoxOffset) { GetDocument().SetBaseURLOverride(KURL("http://test.com")); GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); // Set a 10px border in order to have a contentBoxOffset for the iframe // element. SetBodyInnerHTML(R"HTML( - <style>body { margin: 0; } #frame { border: 10px solid black; } - ::-webkit-scrollbar { display: none; }</style> - <iframe src='http://test.com' width='500' height='500' - frameBorder='0'> + <style> + body { margin: 0; } + #frame { border: 10px solid black; } + ::-webkit-scrollbar { display: none; } + </style> + <iframe src='http://test.com' width='500' height='500' frameBorder='0'> </iframe> )HTML"); - SetChildFrameHTML( - "<style>body { margin: 0; } #target { width: 200px; " - "height: 8000px;}</style> <div id=target></div>"); + SetChildFrameHTML(R"HTML( + <style>body { margin: 0; }</style> + <div id=target style='width: 200px; height: 8000px'></div> + )HTML"); UpdateAllLifecyclePhasesForTest(); @@ -924,15 +981,15 @@ UpdateAllLifecyclePhasesForTest(); ASSERT_TRUE(ChildDocument().View()->GetLayoutView()->HasLayer()); - EXPECT_EQ(IntRect(0, 0, 500, 7500), - RecomputeInterestRect(ChildDocument() - .View() - ->GetLayoutView() - ->EnclosingLayer() - ->GraphicsLayerBacking())); + EXPECT_EQ(gfx::Rect(0, 0, 500, 7500), + PaintableRegion(ChildDocument() + .View() + ->GetLayoutView() + ->EnclosingLayer() + ->GraphicsLayerBacking())); } -TEST_F(CompositedLayerMappingTest, InterestRectOfIframeWithFixedContents) { +TEST_P(CompositedLayerMappingTest, InterestRectOfIframeWithFixedContents) { GetDocument().SetBaseURLOverride(KURL("http://test.com")); GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); @@ -944,8 +1001,8 @@ SetChildFrameHTML(R"HTML( <style>body { margin:0; } ::-webkit-scrollbar { display:none; }</style> <div id='forcescroll' style='height:6000px;'></div> - <div id='fixed' style=' - position:fixed; top:0; left:0; width:400px; height:300px;'> + <div id='fixed' style='position:fixed; top:0; left:0; width:400px; + height:300px; background:blue'> <div id='leftbox' style=' position:absolute; left:-5000px; width:10px; height:10px;'></div> <div id='child' style=' @@ -959,17 +1016,17 @@ // The graphics layer has dimensions 5400x300 but the interest rect clamps // this to the right-most 4000x4000 area. - EXPECT_EQ(IntRect(1000, 0, 4400, 300), RecomputeInterestRect(graphics_layer)); + EXPECT_EQ(gfx::Rect(1000, 0, 4400, 300), PaintableRegion(graphics_layer)); ChildDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0.0, 3000.0), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); // Because the fixed element does not scroll, the interest rect is unchanged. - EXPECT_EQ(IntRect(1000, 0, 4400, 300), RecomputeInterestRect(graphics_layer)); + EXPECT_EQ(gfx::Rect(1000, 0, 4400, 300), PaintableRegion(graphics_layer)); } -TEST_F(CompositedLayerMappingTest, ScrolledFixedPositionInterestRect) { +TEST_P(CompositedLayerMappingTest, ScrolledFixedPositionInterestRect) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); SetBodyInnerHTML(R"HTML( @@ -982,20 +1039,19 @@ <div id="forcescroll" style="height: 2000px;"></div> )HTML"); - UpdateAllLifecyclePhasesForTest(); auto* fixed = GetDocument().getElementById("fixed")->GetLayoutObject(); auto* graphics_layer = fixed->EnclosingLayer()->GraphicsLayerBacking(fixed); - EXPECT_EQ(IntRect(0, 500, 100, 4030), RecomputeInterestRect(graphics_layer)); + EXPECT_EQ(gfx::Rect(0, 500, 100, 4030), PaintableRegion(graphics_layer)); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0.0, 200.0), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); // Because the fixed element does not scroll, the interest rect is unchanged. - EXPECT_EQ(IntRect(0, 500, 100, 4030), RecomputeInterestRect(graphics_layer)); + EXPECT_EQ(gfx::Rect(0, 500, 100, 4030), PaintableRegion(graphics_layer)); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, ScrollingContentsAndForegroundLayerPaintingPhase) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); @@ -1045,20 +1101,21 @@ EXPECT_FALSE(mapping->ForegroundLayer()); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, DecorationOutlineLayerOnlyCreatedInCompositedScrolling) { SetBodyInnerHTML(R"HTML( <style> - #target { overflow: scroll; height: 200px; width: 200px; will-change: - transform; background: white local content-box; - outline: 1px solid blue; outline-offset: -2px;} + #target { + overflow: scroll; height: 200px; width: 200px; will-change: transform; + background: white local content-box; + outline: 1px solid blue; outline-offset: -2px; + } #scrolled { height: 300px; } </style> <div id="parent"> <div id="target"><div id="scrolled"></div></div> </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); Element* element = GetDocument().getElementById("target"); PaintLayer* paint_layer = @@ -1083,19 +1140,20 @@ EXPECT_FALSE(mapping->DecorationOutlineLayer()); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, DecorationOutlineLayerCreatedAndDestroyedInCompositedScrolling) { SetBodyInnerHTML(R"HTML( <style> - #scroller { overflow: scroll; height: 200px; width: 200px; background: - white local content-box; outline: 1px solid blue; contain: paint; } + #scroller { + overflow: scroll; height: 200px; width: 200px; contain: paint; + background: white local content-box; outline: 1px solid blue; + } #scrolled { height: 300px; } </style> <div id="parent"> <div id="scroller"><div id="scrolled"></div></div> </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); Element* scroller = GetDocument().getElementById("scroller"); PaintLayer* paint_layer = @@ -1127,7 +1185,7 @@ EXPECT_FALSE(mapping->DecorationOutlineLayer()); } -TEST_F(CompositedLayerMappingTest, StickyPositionMainThreadOffset) { +TEST_P(CompositedLayerMappingTest, StickyPositionMainThreadOffset) { SetBodyInnerHTML(R"HTML( <style>.composited { backface-visibility: hidden; } #scroller { overflow: auto; height: 200px; width: 200px; } @@ -1162,7 +1220,7 @@ EXPECT_FALSE(sticky_layer->NeedsCompositingInputsUpdate()); } -TEST_F(CompositedLayerMappingTest, StickyPositionNotSquashed) { +TEST_P(CompositedLayerMappingTest, StickyPositionNotSquashed) { SetBodyInnerHTML(R"HTML( <style> #scroller { overflow: auto; height: 200px; } @@ -1192,7 +1250,7 @@ EXPECT_EQ(kPaintsIntoOwnBacking, sticky3->GetCompositingState()); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, LayerPositionForStickyElementInCompositedScroller) { SetBodyInnerHTML(R"HTML( <style> @@ -1245,7 +1303,7 @@ EXPECT_FLOAT_EQ(8, sticky_position_relative_to_root.Y()); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, LayerPositionForStickyElementInNonCompositedScroller) { SetBodyInnerHTML(R"HTML( <style> @@ -1291,7 +1349,7 @@ EXPECT_FLOAT_EQ(8, sticky_position_relative_to_root.Y()); } -TEST_F(CompositedLayerMappingTest, ScrollingContainerBoundsChange) { +TEST_P(CompositedLayerMappingTest, ScrollingContainerBoundsChange) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); SetBodyInnerHTML(R"HTML( @@ -1311,7 +1369,6 @@ </div )HTML"); - UpdateAllLifecyclePhasesForTest(); Element* scrollerElement = GetDocument().getElementById("scroller"); auto* scroller = To<LayoutBoxModelObject>(GetLayoutObjectByElementId("scroller")); @@ -1342,8 +1399,7 @@ EXPECT_EQ(100, scroll_node->container_bounds.height()); } -TEST_F(CompositedLayerMappingTest, MainFrameLayerBackgroundColor) { - UpdateAllLifecyclePhasesForTest(); +TEST_P(CompositedLayerMappingTest, MainFrameLayerBackgroundColor) { EXPECT_EQ(Color::kWhite, GetDocument().View()->BaseBackgroundColor()); auto* view_cc_layer = ScrollingContentsCcLayerByScrollElementId( GetFrame().View()->RootCcLayer(), @@ -1360,7 +1416,7 @@ view_cc_layer->background_color()); } -TEST_F(CompositedLayerMappingTest, ScrollLayerSizingSubpixelAccumulation) { +TEST_P(CompositedLayerMappingTest, ScrollLayerSizingSubpixelAccumulation) { // This test verifies that when subpixel accumulation causes snapping it // applies to the scrolling contents layer. Verify that the mapping doesn't // have any vertical scrolling introduced as a result of the snapping @@ -1392,7 +1448,6 @@ <div id="space"></div> </div> )HTML"); - UpdateAllLifecyclePhasesForTest(); auto* mapping = GetPaintLayerByElementId("scroller")->GetCompositedLayerMapping(); ASSERT_TRUE(mapping); @@ -1401,15 +1456,15 @@ EXPECT_EQ(gfx::Size(1000, 200), mapping->ScrollingContentsLayer()->Size()); } -TEST_F(CompositedLayerMappingTest, SquashingScrollInterestRect) { +TEST_P(CompositedLayerMappingTest, SquashingScrollInterestRect) { SetHtmlInnerHTML(R"HTML( <style> * { margin: 0 } </style> - <div id=target - style='width: 200px; height: 200px; position: relative; will-change: transform'></div> - <div id=squashed - style='width: 200px; height: 6000px; top: -200px; position: relative;'></div> + <div id=target style='width: 200px; height: 200px; position: relative; + will-change: transform'></div> + <div id=squashed style='width: 200px; height: 6000px; top: -200px; + position: relative;'></div> )HTML"); auto* squashed = GetPaintLayerByElementId("squashed"); @@ -1424,7 +1479,7 @@ PaintableRegion(squashed->GroupedMapping()->SquashingLayer(*squashed))); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, SquashingBoundsUnderCompositedScrollingWithTransform) { SetHtmlInnerHTML(R"HTML( <div id=scroller style="will-change: transform; overflow: scroll; @@ -1457,7 +1512,7 @@ squashed->GraphicsLayerBacking()->GetOffsetFromTransformNode()); } -TEST_F(CompositedLayerMappingTest, ContentsNotOpaqueWithForegroundLayer) { +TEST_P(CompositedLayerMappingTest, ContentsNotOpaqueWithForegroundLayer) { SetHtmlInnerHTML(R"HTML( <style> div { @@ -1478,7 +1533,7 @@ EXPECT_FALSE(mapping->MainGraphicsLayer()->CcLayer().contents_opaque()); } -TEST_F(CompositedLayerMappingTest, EmptyBoundsDoesntDrawContent) { +TEST_P(CompositedLayerMappingTest, EmptyBoundsDoesntDrawContent) { SetHtmlInnerHTML(R"HTML( <style> div { @@ -1496,7 +1551,7 @@ EXPECT_FALSE(mapping->MainGraphicsLayer()->DrawsContent()); } -TEST_F(CompositedLayerMappingTest, TouchActionRectsWithoutContent) { +TEST_P(CompositedLayerMappingTest, TouchActionRectsWithoutContent) { SetBodyInnerHTML( "<div id='target' style='will-change: transform; width: 100px;" " height: 100px; touch-action: none;'></div>"); @@ -1515,7 +1570,7 @@ EXPECT_FALSE(mapping->MainGraphicsLayer()->DrawsContent()); } -TEST_F(CompositedLayerMappingTest, ContentsOpaque) { +TEST_P(CompositedLayerMappingTest, ContentsOpaque) { SetHtmlInnerHTML(R"HTML( <style> div { @@ -1535,7 +1590,7 @@ EXPECT_TRUE(mapping->MainGraphicsLayer()->CcLayer().contents_opaque()); } -TEST_F(CompositedLayerMappingTest, NullOverflowControlLayers) { +TEST_P(CompositedLayerMappingTest, NullOverflowControlLayers) { SetHtmlInnerHTML("<div id='target' style='will-change: transform'></div>"); CompositedLayerMapping* mapping = GetPaintLayerByElementId("target")->GetCompositedLayerMapping(); @@ -1544,7 +1599,7 @@ EXPECT_FALSE(mapping->LayerForScrollCorner()); } -TEST_F(CompositedLayerMappingTest, CompositedHiddenAnimatingLayer) { +TEST_P(CompositedLayerMappingTest, CompositedHiddenAnimatingLayer) { SetHtmlInnerHTML(R"HTML( <style> @keyframes slide { @@ -1582,7 +1637,7 @@ CompositingReason::kActiveTransformAnimation); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, RepaintScrollableAreaLayersInMainThreadScrolling) { SetHtmlInnerHTML(R"HTML( <style> @@ -1647,7 +1702,7 @@ EXPECT_TRUE(mapping->NeedsRepaint(*vertical_scrollbar_layer)); } -TEST_F(CompositedLayerMappingTest, IsolationClippingContainer) { +TEST_P(CompositedLayerMappingTest, IsolationClippingContainer) { SetBodyInnerHTML(R"HTML( <style> #hideable { @@ -1695,7 +1750,7 @@ EXPECT_EQ(squash_container_a_layer->ClippingContainer(), isolation_a_object); } -TEST_F(CompositedLayerMappingTest, SquashIntoScrollingContents) { +TEST_P(CompositedLayerMappingTest, SquashIntoScrollingContents) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); SetBodyInnerHTML(R"HTML( @@ -1749,7 +1804,7 @@ EXPECT_TRUE(target2->HasCompositedLayerMapping()); } -TEST_F(CompositedLayerMappingTest, +TEST_P(CompositedLayerMappingTest, SwitchSquashingBetweenScrollingAndNonScrolling) { GetDocument().GetFrame()->GetSettings()->SetPreferCompositingToLCDTextEnabled( true); @@ -1800,7 +1855,7 @@ // Unlike CompositingTest.WillChangeTransformHintInSVG, will-change hints on the // SVG element itself should not opt into creating layers after paint. -TEST_F(CompositedLayerMappingTest, WillChangeTransformHintOnSVG) { +TEST_P(CompositedLayerMappingTest, WillChangeTransformHintOnSVG) { ScopedCompositeSVGForTest enable_feature(true); SetBodyInnerHTML(R"HTML( <svg width="99" height="99" id="willChange" style="will-change: transform;"> @@ -1815,7 +1870,7 @@ // Test that will-change changes inside SVG correctly update whether the // graphics layer should create layers after paint. -TEST_F(CompositedLayerMappingTest, WillChangeTransformHintInSVGChanged) { +TEST_P(CompositedLayerMappingTest, WillChangeTransformHintInSVGChanged) { ScopedCompositeSVGForTest enable_feature(true); SetBodyInnerHTML(R"HTML( <svg width="99" height="99" id="svg" style="will-change: transform;">
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.cc b/third_party/blink/renderer/core/paint/cull_rect_updater.cc index 1b09629..eba7a4e 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater.cc +++ b/third_party/blink/renderer/core/paint/cull_rect_updater.cc
@@ -18,14 +18,10 @@ namespace { void SetLayerNeedsRepaintOnCullRectChange(PaintLayer& layer) { - // TODO(wangxianzhu): Enable the condition when we actually use the calculated - // cull rects during painting. For now this causes unnecessary NeedsRepaint - // on cull rect changes that don't affect painted result. Some unit tests are - // temporarily disabled for this reason. - // if (layer.PreviousPaintResult() == kMayBeClippedByCullRect || - // RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled()) { - layer.SetNeedsRepaint(); - // } + if (layer.PreviousPaintResult() == kMayBeClippedByCullRect || + RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled()) { + layer.SetNeedsRepaint(); + } } void SetFragmentCullRect(PaintLayer& layer, @@ -89,12 +85,15 @@ void CullRectUpdater::UpdateRecursively(PaintLayer& layer, const PaintLayer& parent_painting_layer, bool force_update_self) { - bool force_update_children = layer.ForcesChildrenCullRectUpdate(); - if (force_update_self || layer.NeedsCullRectUpdate() || - ShouldProactivelyUpdateCullRect(layer)) + bool should_proactively_update = ShouldProactivelyUpdateCullRect(layer); + bool force_update_children = should_proactively_update; + + if (force_update_self || should_proactively_update || + layer.NeedsCullRectUpdate()) force_update_children |= UpdateForSelf(layer, parent_painting_layer); - if (force_update_children || layer.DescendantNeedsCullRectUpdate()) + if (force_update_children || should_proactively_update || + layer.DescendantNeedsCullRectUpdate()) UpdateForDescendants(layer, force_update_children); layer.ClearNeedsCullRectUpdate(); @@ -257,4 +256,32 @@ return contents_cull_rect; } +OverriddenCullRectScope::OverriddenCullRectScope(LocalFrameView& frame_view, + const CullRect& cull_rect) + : frame_view_(frame_view) { + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) + return; + + PaintLayer* root_layer = frame_view_.GetLayoutView()->Layer(); + DCHECK(root_layer); + + // The cull rects calculated during PrePaint are good. + if (frame_view.GetFrame().IsLocalRoot() && + !root_layer->NeedsCullRectUpdate() && + cull_rect == + root_layer->GetLayoutObject().FirstFragment().GetCullRect()) { + DCHECK(!root_layer->DescendantNeedsCullRectUpdate()); + return; + } + + updated_ = true; + root_layer->SetNeedsCullRectUpdate(); + CullRectUpdater(*root_layer).UpdateInternal(cull_rect); +} + +OverriddenCullRectScope::~OverriddenCullRectScope() { + if (RuntimeEnabledFeatures::CullRectUpdateEnabled() && updated_) + frame_view_.GetLayoutView()->Layer()->SetNeedsCullRectUpdate(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/cull_rect_updater.h b/third_party/blink/renderer/core/paint/cull_rect_updater.h index 3c409b61..bef51d2 100644 --- a/third_party/blink/renderer/core/paint/cull_rect_updater.h +++ b/third_party/blink/renderer/core/paint/cull_rect_updater.h
@@ -14,6 +14,7 @@ class FragmentData; class PaintLayer; +class LocalFrameView; // This class is used for updating the cull rects of PaintLayer fragments (see: // |FragmentData::cull_rect_| and |FragmentData::contents_cull_rect_|. @@ -32,6 +33,8 @@ void Update() { UpdateInternal(CullRect::Infinite()); } private: + friend class OverriddenCullRectScope; + void UpdateInternal(const CullRect& input_cull_rect); void UpdateRecursively(PaintLayer&, const PaintLayer& parent_painting_layer, @@ -51,6 +54,22 @@ PropertyTreeState root_state_; }; +// Used when painting with a custom top-level cull rect, e.g. when printing a +// page. It temporarily overrides the cull rect on the PaintLayer of the +// LocalFrameView and marks the PaintLayer as needing to recalculate the cull +// rect when leaving this scope. +class OverriddenCullRectScope { + STACK_ALLOCATED(); + + public: + OverriddenCullRectScope(LocalFrameView&, const CullRect&); + ~OverriddenCullRectScope(); + + private: + LocalFrameView& frame_view_; + bool updated_ = false; +}; + } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_CULL_RECT_UPDATER_H_
diff --git a/third_party/blink/renderer/core/paint/custom_scrollbar_theme.cc b/third_party/blink/renderer/core/paint/custom_scrollbar_theme.cc index bf189b3d..d015d3d 100644 --- a/third_party/blink/renderer/core/paint/custom_scrollbar_theme.cc +++ b/third_party/blink/renderer/core/paint/custom_scrollbar_theme.cc
@@ -206,7 +206,7 @@ const LayoutCustomScrollbarPart& layout_custom_scrollbar_part, GraphicsContext& graphics_context, const PhysicalRect& rect) { - PaintInfo paint_info(graphics_context, PixelSnappedIntRect(rect), + PaintInfo paint_info(graphics_context, CullRect(PixelSnappedIntRect(rect)), PaintPhase::kForeground, kGlobalPaintNormalPhase, kPaintLayerNoFlag); ObjectPainter(layout_custom_scrollbar_part)
diff --git a/third_party/blink/renderer/core/paint/highlight_painting_utils_test.cc b/third_party/blink/renderer/core/paint/highlight_painting_utils_test.cc index ee5f6fd3..6b5c0aa0 100644 --- a/third_party/blink/renderer/core/paint/highlight_painting_utils_test.cc +++ b/third_party/blink/renderer/core/paint/highlight_painting_utils_test.cc
@@ -170,7 +170,7 @@ std::unique_ptr<PaintController> controller{ std::make_unique<PaintController>()}; GraphicsContext context(*controller); - PaintInfo paint_info(context, IntRect(), PaintPhase::kForeground, + PaintInfo paint_info(context, CullRect(), PaintPhase::kForeground, kGlobalPaintNormalPhase, 0 /* paint_flags */); TextPaintStyle paint_style;
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index c382568..4cbbccb0 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -1595,7 +1595,7 @@ const IntRect& mask_rect, const PhysicalOffset& paint_offset, bool object_has_multiple_boxes) { - PaintInfo paint_info(context, mask_rect, PaintPhase::kTextClip, + PaintInfo paint_info(context, CullRect(mask_rect), PaintPhase::kTextClip, kGlobalPaintNormalPhase, 0); if (!object_has_multiple_boxes) { PaintObject(paint_info, paint_offset);
diff --git a/third_party/blink/renderer/core/paint/paint_info.h b/third_party/blink/renderer/core/paint/paint_info.h index 54a47a2c..a0950407 100644 --- a/third_party/blink/renderer/core/paint/paint_info.h +++ b/third_party/blink/renderer/core/paint/paint_info.h
@@ -57,7 +57,7 @@ public: PaintInfo(GraphicsContext& context, - const IntRect& cull_rect, + const CullRect& cull_rect, PaintPhase phase, GlobalPaintFlags global_paint_flags, PaintLayerFlags paint_flags, @@ -137,6 +137,7 @@ PaintLayerFlags PaintFlags() const { return paint_flags_; } const CullRect& GetCullRect() const { return cull_rect_; } + void SetCullRect(const CullRect& cull_rect) { cull_rect_ = cull_rect; } bool IntersectsCullRect( const PhysicalRect& rect,
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index eb186c4..5dcec78 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -147,14 +147,17 @@ // Repaint if previously the layer may be clipped by cull rect, and cull rect // changes. - if ((paint_layer.PreviousPaintResult() == kMayBeClippedByCullRect || - // When PaintUnderInvalidationChecking is enabled, always repaint the - // subsequence when the paint rect changes because we will strictly match - // new and cached subsequences. Normally we can reuse the cached fully - // painted subsequence even if we would partially paint this time. - RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled()) && - paint_layer.PreviousCullRect() != painting_info.cull_rect) - return true; + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled() && + paint_layer.PreviousCullRect() != painting_info.cull_rect) { + if (paint_layer.PreviousPaintResult() == kMayBeClippedByCullRect) + return true; + // When PaintUnderInvalidationChecking is enabled, always repaint the + // subsequence when the paint rect changes because we will strictly match + // new and cached subsequences. Normally we can reuse the cached fully + // painted subsequence even if we would partially paint this time. + if (RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled()) + return true; + } return false; } @@ -256,7 +259,8 @@ // transform space. Convert cull_rect from the root layer's local space. cull_rect.MoveBy(RoundedIntPoint(first_root_fragment.PaintOffset())); base::Optional<CullRect> old_cull_rect; - if (!paint_layer_.SelfOrDescendantNeedsRepaint()) { + if (!paint_layer_.SelfOrDescendantNeedsRepaint() && + !RuntimeEnabledFeatures::CullRectUpdateEnabled()) { old_cull_rect = paint_layer_.PreviousCullRect(); // Convert old_cull_rect into the layer's transform space. old_cull_rect->MoveBy(RoundedIntPoint(first_fragment.PaintOffset())); @@ -314,36 +318,35 @@ DCHECK(paint_layer_.IsSelfPaintingLayer() || paint_layer_.HasSelfPaintingLayerDescendant()); + const auto& object = paint_layer_.GetLayoutObject(); PaintResult result = kFullyPainted; - if (paint_layer_.GetLayoutObject().GetFrameView()->ShouldThrottleRendering()) + if (object.GetFrameView()->ShouldThrottleRendering()) return result; // A paint layer should always have LocalBorderBoxProperties when it's ready // for paint. - if (!paint_layer_.GetLayoutObject() - .FirstFragment() - .HasLocalBorderBoxProperties()) { + if (!object.FirstFragment().HasLocalBorderBoxProperties()) { // TODO(crbug.com/848056): This can happen e.g. when we paint a filter // referencing a SVG foreign object through feImage, especially when there // is circular references. Should find a better solution. - paint_layer_.SetPreviousCullRect(CullRect()); + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) + paint_layer_.SetPreviousCullRect(CullRect()); return kMayBeClippedByCullRect; } bool selection_drag_image_only = painting_info_arg.GetGlobalPaintFlags() & kGlobalPaintSelectionDragImageOnly; - if (selection_drag_image_only && !paint_layer_.GetLayoutObject().IsSelected()) + if (selection_drag_image_only && !object.IsSelected()) return result; IgnorePaintTimingScope ignore_paint_timing; - if (paint_layer_.GetLayoutObject().StyleRef().Opacity() == 0.0f) { + if (object.StyleRef().Opacity() == 0.0f) { IgnorePaintTimingScope::IncrementIgnoreDepth(); } // Explicitly compute opacity of documentElement, as it is special-cased in // Largest Contentful Paint. bool is_document_element_invisible = false; - if (const auto* document_element = - paint_layer_.GetLayoutObject().GetDocument().documentElement()) { + if (const auto* document_element = object.GetDocument().documentElement()) { if (document_element->GetLayoutObject() && document_element->GetLayoutObject()->StyleRef().Opacity() == 0.0f) { is_document_element_invisible = true; @@ -376,8 +379,7 @@ // is not scrolled and should be above scrolled content. bool should_paint_self_outline = is_self_painting_layer && !is_painting_overlay_overflow_controls && - is_painting_composited_decoration && - paint_layer_.GetLayoutObject().StyleRef().HasOutline(); + is_painting_composited_decoration && object.StyleRef().HasOutline(); PhysicalOffset subpixel_accumulation = (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && @@ -388,7 +390,7 @@ : painting_info.sub_pixel_accumulation; ShouldRespectOverflowClipType respect_overflow_clip = - ShouldRespectOverflowClip(paint_flags, paint_layer_.GetLayoutObject()); + ShouldRespectOverflowClip(paint_flags, object); bool should_paint_content = paint_layer_.HasVisibleContent() && @@ -419,9 +421,27 @@ offset_from_root -= root->GetLayoutObject().FirstFragment().PaintOffset(); offset_from_root += subpixel_accumulation; - PhysicalRect bounds = paint_layer_.PhysicalBoundingBox(offset_from_root); - if (!PhysicalRect(painting_info.cull_rect.Rect()).Contains(bounds)) - result = kMayBeClippedByCullRect; + IntRect visual_rect = FirstFragmentVisualRect(object); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + if (object.FirstFragment().NextFragment()) { + result = kMayBeClippedByCullRect; + } else if (!object.FirstFragment().GetCullRect().Rect().Contains( + visual_rect)) { + result = kMayBeClippedByCullRect; + } else if (const auto* box = DynamicTo<LayoutBox>(object)) { + PhysicalRect contents_visual_rect = + box->PhysicalContentsVisualOverflowRect(); + contents_visual_rect.Move(object.FirstFragment().PaintOffset()); + if (!PhysicalRect(object.FirstFragment().GetContentsCullRect().Rect()) + .Contains(contents_visual_rect)) { + result = kMayBeClippedByCullRect; + } + } + } else { + PhysicalRect bounds = paint_layer_.PhysicalBoundingBox(offset_from_root); + if (!PhysicalRect(painting_info.cull_rect.Rect()).Contains(bounds)) + result = kMayBeClippedByCullRect; + } PaintLayerPaintingInfo local_painting_info(painting_info); local_painting_info.sub_pixel_accumulation = subpixel_accumulation; @@ -467,24 +487,20 @@ bool should_paint_normal_flow_and_pos_z_order_lists = is_painting_composited_foreground && !is_painting_overlay_overflow_controls; - bool is_video = IsA<LayoutVideo>(paint_layer_.GetLayoutObject()); + bool is_video = IsA<LayoutVideo>(object); base::Optional<ScopedPaintChunkHint> paint_chunk_hint; - base::Optional<IntRect> visual_rect; if (should_paint_content) { - visual_rect.emplace( - FirstFragmentVisualRect(paint_layer_.GetLayoutObject())); paint_chunk_hint.emplace(context.GetPaintController(), - paint_layer_.GetLayoutObject() - .FirstFragment() - .LocalBorderBoxProperties(), + object.FirstFragment().LocalBorderBoxProperties(), paint_layer_, DisplayItem::kLayerChunk, - *visual_rect); + visual_rect); } if (should_paint_background) { - PaintBackgroundForFragments(layer_fragments, context, local_painting_info, - paint_flags); + PaintBackgroundForFragmentsWithPhase(PaintPhase::kSelfBlockBackgroundOnly, + layer_fragments, context, + local_painting_info, paint_flags); } if (should_paint_neg_z_order_list) { @@ -500,7 +516,7 @@ // paint chunk after the previous forced paint chunks a stable id. paint_chunk_hint_foreground.emplace( context.GetPaintController(), paint_layer_, - DisplayItem::kLayerChunkForeground, *visual_rect); + DisplayItem::kLayerChunkForeground, visual_rect); } if (selection_drag_image_only) { PaintForegroundForFragmentsWithPhase(PaintPhase::kSelectionDragImage, @@ -513,8 +529,9 @@ } if (!is_video && should_paint_self_outline) { - PaintSelfOutlineForFragments(layer_fragments, context, local_painting_info, - paint_flags); + PaintBackgroundForFragmentsWithPhase(PaintPhase::kSelfOutlineOnly, + layer_fragments, context, + local_painting_info, paint_flags); } if (should_paint_normal_flow_and_pos_z_order_lists) { @@ -536,17 +553,17 @@ if (is_video && should_paint_self_outline) { // We paint outlines for video later so that they aren't obscured by the // video controls. - PaintSelfOutlineForFragments(layer_fragments, context, local_painting_info, - paint_flags); + PaintBackgroundForFragmentsWithPhase(PaintPhase::kSelfOutlineOnly, + layer_fragments, context, + local_painting_info, paint_flags); } if (is_painting_mask && should_paint_content && !selection_drag_image_only) { - const auto* properties = - paint_layer_.GetLayoutObject().FirstFragment().PaintProperties(); - if (properties) { + if (const auto* properties = object.FirstFragment().PaintProperties()) { if (properties->Mask()) { - PaintMaskForFragments(layer_fragments, context, local_painting_info, - paint_flags); + PaintBackgroundForFragmentsWithPhase(PaintPhase::kMask, layer_fragments, + context, local_painting_info, + paint_flags); } if (properties->ClipPathMask()) { PhysicalOffset visual_offset_from_root = @@ -554,15 +571,15 @@ ? paint_layer_.VisualOffsetFromAncestor( local_painting_info.root_layer, subpixel_accumulation) : offset_from_root; - ClipPathClipper::PaintClipPathAsMaskImage( - context, paint_layer_.GetLayoutObject(), - paint_layer_.GetLayoutObject(), visual_offset_from_root); + ClipPathClipper::PaintClipPathAsMaskImage(context, object, object, + visual_offset_from_root); } } } paint_layer_.SetPreviousPaintResult(result); - paint_layer_.SetPreviousCullRect(local_painting_info.cull_rect); + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) + paint_layer_.SetPreviousCullRect(local_painting_info.cull_rect); return result; } @@ -659,21 +676,16 @@ paint_layer_.GetScrollableArea()->HasLayerForScrollCorner()) return; - ForAllFragments( - context, layer_fragments, [&](const PaintLayerFragment& fragment) { - if (!fragment.background_rect.IsEmpty()) { - PaintFragmentWithPhase(PaintPhase::kOverlayOverflowControls, fragment, - context, fragment.background_rect, - painting_info, paint_flags); - } - }); + PaintBackgroundForFragmentsWithPhase(PaintPhase::kOverlayOverflowControls, + layer_fragments, context, painting_info, + paint_flags); } void PaintLayerPainter::PaintFragmentWithPhase( PaintPhase phase, const PaintLayerFragment& fragment, GraphicsContext& context, - const ClipRect& clip_rect, + const CullRect& cull_rect, const PaintLayerPaintingInfo& painting_info, PaintLayerFlags paint_flags) { DCHECK(paint_layer_.IsSelfPaintingLayer()); @@ -689,19 +701,11 @@ context.GetPaintController(), chunk_properties, paint_layer_, DisplayItem::PaintPhaseToDrawingType(phase)); - PhysicalRect new_cull_rect(clip_rect.Rect()); - // Now |new_cull_rect| is in the pixel-snapped border box space of - // |fragment.root_fragment_data|. Adjust it to the containing transform node's - // space in which we will paint. - new_cull_rect.Move(PhysicalOffset( - RoundedIntPoint(fragment.root_fragment_data->PaintOffset()))); - - PaintInfo paint_info(context, PixelSnappedIntRect(new_cull_rect), phase, - painting_info.GetGlobalPaintFlags(), paint_flags, - &painting_info.root_layer->GetLayoutObject(), - fragment.fragment_data - ? fragment.fragment_data->LogicalTopInFlowThread() - : LayoutUnit()); + PaintInfo paint_info( + context, cull_rect, phase, painting_info.GetGlobalPaintFlags(), + paint_flags, &painting_info.root_layer->GetLayoutObject(), + fragment.fragment_data ? fragment.fragment_data->LogicalTopInFlowThread() + : LayoutUnit()); if (paint_layer_.GetLayoutObject().ChildPaintBlockedByDisplayLock()) paint_info.SetDescendantPaintingBlocked(true); @@ -711,16 +715,34 @@ paint_layer_.GetLayoutObject().Paint(paint_info); } -void PaintLayerPainter::PaintBackgroundForFragments( +static CullRect LegacyCullRect(const PaintLayerFragment& fragment, + const ClipRect& clip_rect) { + DCHECK(!RuntimeEnabledFeatures::CullRectUpdateEnabled()); + PhysicalRect new_cull_rect(clip_rect.Rect()); + // Now |new_cull_rect| is in the pixel-snapped border box space of + // |fragment.root_fragment_data|. Adjust it to the containing transform node's + // space in which we will paint. + new_cull_rect.Move(PhysicalOffset( + RoundedIntPoint(fragment.root_fragment_data->PaintOffset()))); + return CullRect(PixelSnappedIntRect(new_cull_rect)); +} + +void PaintLayerPainter::PaintBackgroundForFragmentsWithPhase( + PaintPhase phase, const PaintLayerFragments& layer_fragments, GraphicsContext& context, const PaintLayerPaintingInfo& local_painting_info, PaintLayerFlags paint_flags) { ForAllFragments( context, layer_fragments, [&](const PaintLayerFragment& fragment) { - PaintFragmentWithPhase(PaintPhase::kSelfBlockBackgroundOnly, fragment, - context, fragment.background_rect, - local_painting_info, paint_flags); + CullRect cull_rect = + RuntimeEnabledFeatures::CullRectUpdateEnabled() + ? fragment.fragment_data->GetCullRect() + : LegacyCullRect(fragment, fragment.background_rect); + if (!cull_rect.Rect().IsEmpty()) { + PaintFragmentWithPhase(phase, fragment, context, cull_rect, + local_painting_info, paint_flags); + } }); } @@ -764,44 +786,24 @@ GraphicsContext& context, const PaintLayerPaintingInfo& local_painting_info, PaintLayerFlags paint_flags) { - ForAllFragments(context, layer_fragments, - [&](const PaintLayerFragment& fragment) { - if (!fragment.foreground_rect.IsEmpty()) { - PaintFragmentWithPhase(phase, fragment, context, - fragment.foreground_rect, - local_painting_info, paint_flags); - } - }); -} - -void PaintLayerPainter::PaintSelfOutlineForFragments( - const PaintLayerFragments& layer_fragments, - GraphicsContext& context, - const PaintLayerPaintingInfo& local_painting_info, - PaintLayerFlags paint_flags) { ForAllFragments( context, layer_fragments, [&](const PaintLayerFragment& fragment) { - if (!fragment.background_rect.IsEmpty()) { - PaintFragmentWithPhase(PaintPhase::kSelfOutlineOnly, fragment, - context, fragment.background_rect, + CullRect cull_rect; + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + // In CullRectUpdate, this function is the same as + // PaintBackgroundForFragmentsWithPhase(). The contents cull rect will + // be applied by ScopedBoxContentsPaintState. + cull_rect = fragment.fragment_data->GetCullRect(); + } else { + cull_rect = LegacyCullRect(fragment, fragment.foreground_rect); + } + if (!cull_rect.Rect().IsEmpty()) { + PaintFragmentWithPhase(phase, fragment, context, cull_rect, local_painting_info, paint_flags); } }); } -void PaintLayerPainter::PaintMaskForFragments( - const PaintLayerFragments& layer_fragments, - GraphicsContext& context, - const PaintLayerPaintingInfo& local_painting_info, - PaintLayerFlags paint_flags) { - ForAllFragments(context, layer_fragments, - [&](const PaintLayerFragment& fragment) { - PaintFragmentWithPhase(PaintPhase::kMask, fragment, context, - fragment.background_rect, - local_painting_info, paint_flags); - }); -} - void PaintLayerPainter::PaintOverlayOverflowControls( GraphicsContext& context, const CullRect& cull_rect,
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.h b/third_party/blink/renderer/core/paint/paint_layer_painter.h index 87ca42e..f92faa6 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.h +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.h
@@ -15,7 +15,6 @@ namespace blink { class CullRect; -class ClipRect; class ComputedStyle; class GraphicsContext; struct PhysicalOffset; @@ -73,13 +72,14 @@ void PaintFragmentWithPhase(PaintPhase, const PaintLayerFragment&, GraphicsContext&, - const ClipRect&, + const CullRect&, const PaintLayerPaintingInfo&, PaintLayerFlags); - void PaintBackgroundForFragments(const PaintLayerFragments&, - GraphicsContext&, - const PaintLayerPaintingInfo&, - PaintLayerFlags); + void PaintBackgroundForFragmentsWithPhase(PaintPhase, + const PaintLayerFragments&, + GraphicsContext&, + const PaintLayerPaintingInfo&, + PaintLayerFlags); void PaintForegroundForFragments(const PaintLayerFragments&, GraphicsContext&, const PaintLayerPaintingInfo&, @@ -89,18 +89,10 @@ GraphicsContext&, const PaintLayerPaintingInfo&, PaintLayerFlags); - void PaintSelfOutlineForFragments(const PaintLayerFragments&, - GraphicsContext&, - const PaintLayerPaintingInfo&, - PaintLayerFlags); void PaintOverlayOverflowControlsForFragments(const PaintLayerFragments&, GraphicsContext&, const PaintLayerPaintingInfo&, PaintLayerFlags); - void PaintMaskForFragments(const PaintLayerFragments&, - GraphicsContext&, - const PaintLayerPaintingInfo&, - PaintLayerFlags); void AdjustForPaintProperties(const GraphicsContext&, PaintLayerPaintingInfo&,
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc index bbd3192d..b61ef87 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter_test.cc
@@ -427,7 +427,7 @@ EXPECT_THAT(ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, IsSameId(content1, kBackgroundType))); - EXPECT_EQ(IntRect(0, 0, 800, 4600), target_layer->PreviousCullRect().Rect()); + EXPECT_EQ(IntRect(0, 0, 800, 4600), GetCullRect(*target_layer).Rect()); auto chunks = ContentPaintChunks(); if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { // |target| still created subsequence (cached). @@ -460,7 +460,7 @@ EXPECT_THAT(ContentDisplayItems(), ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, IsSameId(content1, kBackgroundType))); - EXPECT_EQ(IntRect(0, 0, 800, 4600), target_layer->PreviousCullRect().Rect()); + EXPECT_EQ(IntRect(0, 0, 800, 4600), GetCullRect(*target_layer).Rect()); chunks = ContentPaintChunks(); EXPECT_EQ(CullRect(IntRect(0, 0, 800, 4600)), GetCullRect(*target_layer)); if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { @@ -504,7 +504,7 @@ ElementsAre(VIEW_SCROLLING_BACKGROUND_DISPLAY_ITEM, IsSameId(content1, kBackgroundType), IsSameId(content2, kBackgroundType))); - EXPECT_EQ(IntRect(0, 0, 800, 7600), target_layer->PreviousCullRect().Rect()); + EXPECT_EQ(IntRect(0, 0, 800, 7600), GetCullRect(*target_layer).Rect()); chunks = ContentPaintChunks(); EXPECT_EQ(CullRect(IntRect(0, 0, 800, 7600)), GetCullRect(*target_layer)); if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { @@ -1059,7 +1059,7 @@ // Viewport rect (0, 0, 800, 600) expanded by 4000 for scrolling then clipped // by the contents rect. EXPECT_EQ(IntRect(0, 0, 800, 4600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, WideLayerCullRect) { @@ -1071,7 +1071,7 @@ // Same as TallLayerCullRect. EXPECT_EQ(IntRect(0, 0, 4800, 600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, TallScrolledLayerCullRect) { @@ -1083,27 +1083,27 @@ // Viewport rect (0, 0, 800, 600) expanded by 4000 for scrolling then clipped // by the contents rect. EXPECT_EQ(IntRect(0, 0, 800, 4600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 4000), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); EXPECT_EQ(IntRect(0, 0, 800, 8600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 4500), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); // Used the previous cull rect because the scroll amount is small. EXPECT_EQ(IntRect(0, 0, 800, 8600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); GetDocument().View()->LayoutViewport()->SetScrollOffset( ScrollOffset(0, 4600), mojom::blink::ScrollType::kProgrammatic); UpdateAllLifecyclePhasesForTest(); // Used new cull rect. EXPECT_EQ(IntRect(0, 600, 800, 8600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, WholeDocumentCullRect) { @@ -1133,9 +1133,8 @@ EXPECT_TRUE(GetCullRect(*GetPaintLayerByElementId("scroll")).IsInfinite()); // Cull rect is normal for contents below scroll other than the viewport. - EXPECT_EQ( - IntRect(0, 0, 200, 4200), - GetPaintLayerByElementId("below-scroll")->PreviousCullRect().Rect()); + EXPECT_EQ(IntRect(0, 0, 200, 4200), + GetCullRect(*GetPaintLayerByElementId("below-scroll")).Rect()); EXPECT_THAT(ContentDisplayItems(), UnorderedElementsAre( @@ -1174,7 +1173,7 @@ // 4200px in non-RTL mode. Expanding the resulting rect by 4000px in each // direction and clipping by the contents rect yields this result. EXPECT_EQ(IntRect(200, 0, 8800, 600), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } // TODO(wangxianzhu): These tests should correspond to the tests in @@ -1196,7 +1195,7 @@ // The scale doesn't affect the cull rect. // TODO(wangxianzhu): actually it should. EXPECT_EQ(IntRect(0, 0, 4200, 4300), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, ScaledAndRotatedCullRect) { @@ -1213,7 +1212,7 @@ // The scale and the rotation don't affect the cull rect. // TODO(wangxianzhu): actually they should. EXPECT_EQ(IntRect(0, 0, 4200, 4300), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, 3DRotated90DegreesCullRect) { @@ -1229,7 +1228,7 @@ // It's rotated 90 degrees about the X axis, which means its visual content // rect is empty, we fall back to the 4000px cull rect padding amount. EXPECT_EQ(IntRect(0, 0, 4200, 4300), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, 3DRotatedNear90DegreesCullRect) { @@ -1247,7 +1246,7 @@ // original layer size in certain dimensions. In such cases, we often fall // back to the 4000px cull rect padding amount. EXPECT_EQ(IntRect(0, 0, 4200, 4300), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, PerspectiveCullRect) { @@ -1294,7 +1293,7 @@ )HTML"); EXPECT_EQ(IntRect(0, 0, 4200, 4300), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, LayerOffscreenFarCullRect) { @@ -1331,7 +1330,7 @@ // space yields (0, 0, 195, 193). This is then expanded by 4000px and clipped // by the contents rect. EXPECT_EQ(IntRect(0, 0, 195, 4193), - GetPaintLayerByElementId("target")->PreviousCullRect().Rect()); + GetCullRect(*GetPaintLayerByElementId("target")).Rect()); } TEST_P(PaintLayerPainterTestCAP, NonCompositedScrollingLayerCullRect) {
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 017019a..f3031b63 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -677,7 +677,14 @@ } if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { - if (property_changed != PaintPropertyChangeType::kUnchanged) { + if (property_changed != PaintPropertyChangeType::kUnchanged || + // CullRectUpdater proactively update cull rect if the layer or + // descendant will repaint, but in pre-CAP the repaint flag stops + // propagation at compositing boundaries, while cull rect update + // ancestor flag should not stop at compositing boundaries. + (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && + context.paint_invalidator_context.painting_layer + ->SelfOrDescendantNeedsRepaint())) { if (object.HasLayer()) { To<LayoutBoxModelObject>(object).Layer()->SetNeedsCullRectUpdate(); } else if (object.SlowFirstChild()) {
diff --git a/third_party/blink/renderer/core/paint/scoped_paint_state.cc b/third_party/blink/renderer/core/paint/scoped_paint_state.cc index c7ef1d33..f2a9b3d 100644 --- a/third_party/blink/renderer/core/paint/scoped_paint_state.cc +++ b/third_party/blink/renderer/core/paint/scoped_paint_state.cc
@@ -64,11 +64,18 @@ return; // See comments for ScrollTranslation in object_paint_properties.h - // for the reason of adding ScrollOrigin(). contents_paint_offset will + // for the reason of adding ScrollOrigin(). The paint offset will // be used only for the scrolling contents that are not painted through // descendant objects' Paint() method, e.g. inline boxes. paint_offset_ += PhysicalOffset(box.ScrollOrigin()); + if (RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + adjusted_paint_info_.emplace(input_paint_info_); + adjusted_paint_info_->SetCullRect( + fragment_to_paint_->GetContentsCullRect()); + return; + } + // If a LayoutView is using infinite cull rect, we are painting with viewport // clip disabled, so don't cull the scrolling contents. This is just for // completeness because we always paint the whole scrolling background even
diff --git a/third_party/blink/renderer/core/paint/scoped_paint_state.h b/third_party/blink/renderer/core/paint/scoped_paint_state.h index 808f2b5d..b54e5d6 100644 --- a/third_party/blink/renderer/core/paint/scoped_paint_state.h +++ b/third_party/blink/renderer/core/paint/scoped_paint_state.h
@@ -41,12 +41,9 @@ paint_offset_ = fragment_to_paint_->PaintOffset(); if (&object == paint_info.PaintContainer()) { // PaintLayerPainter already adjusted for PaintOffsetTranslation for - // PaintContainer. TODO(wangxianzhu): Can we combine the code? + // PaintContainer. return; } - // TODO(wangxianzhu): Combine code for other paint properties into this - // class, then the following will be something like - // AdjustForLocalBorcerBoxProperties(). const auto* properties = fragment_to_paint_->PaintProperties(); if (properties && properties->PaintOffsetTranslation()) { AdjustForPaintOffsetTranslation(object,
diff --git a/third_party/blink/renderer/core/paint/svg_object_painter.cc b/third_party/blink/renderer/core/paint/svg_object_painter.cc index 8454ad3..4afa4ed 100644 --- a/third_party/blink/renderer/core/paint/svg_object_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_object_painter.cc
@@ -33,8 +33,7 @@ void SVGObjectPainter::PaintResourceSubtree(GraphicsContext& context) { DCHECK(!layout_object_.NeedsLayout()); - PaintInfo info(context, LayoutRect::InfiniteIntRect(), - PaintPhase::kForeground, + PaintInfo info(context, CullRect::Infinite(), PaintPhase::kForeground, kGlobalPaintNormalPhase | kGlobalPaintFlattenCompositingLayers, kPaintLayerPaintingRenderingResourceSubtree, &layout_object_.PaintingLayer()->GetLayoutObject());
diff --git a/third_party/blink/renderer/core/paint/table_painter_test.cc b/third_party/blink/renderer/core/paint/table_painter_test.cc index cb358d7..7beb507 100644 --- a/third_party/blink/renderer/core/paint/table_painter_test.cc +++ b/third_party/blink/renderer/core/paint/table_painter_test.cc
@@ -115,11 +115,9 @@ SetBodyInnerHTML(R"HTML( <style> body { margin: 0 } - td { width: 200px; height: 200px; border: 0; background-color: green; - } + td { width: 200px; height: 200px; border: 0; background-color: green; } tr { background-color: blue; opacity: 0.5; } - table { border: none; border-spacing: 100px; border-collapse: - separate; } + table { border: none; border-spacing: 100px; border-collapse: separate; } </style> <table> <tr id='row'><td id='cell1'><td id='cell2'></td></tr>
diff --git a/third_party/blink/renderer/core/paint/text_painter_test.cc b/third_party/blink/renderer/core/paint/text_painter_test.cc index 8fd5faf..08ddf3e3 100644 --- a/third_party/blink/renderer/core/paint/text_painter_test.cc +++ b/third_party/blink/renderer/core/paint/text_painter_test.cc
@@ -31,12 +31,12 @@ LineLayoutText GetLineLayoutText() { return LineLayoutText(layout_text_); } PaintInfo CreatePaintInfoForBackground() { - return PaintInfo(context_, IntRect(), PaintPhase::kSelfBlockBackgroundOnly, + return PaintInfo(context_, CullRect(), PaintPhase::kSelfBlockBackgroundOnly, kGlobalPaintNormalPhase, 0); } PaintInfo CreatePaintInfoForTextClip() { - return PaintInfo(context_, IntRect(), PaintPhase::kTextClip, + return PaintInfo(context_, CullRect(), PaintPhase::kTextClip, kGlobalPaintNormalPhase, 0); }
diff --git a/third_party/blink/renderer/core/svg/build.gni b/third_party/blink/renderer/core/svg/build.gni index 2909fe9..76efc7db 100644 --- a/third_party/blink/renderer/core/svg/build.gni +++ b/third_party/blink/renderer/core/svg/build.gni
@@ -113,8 +113,6 @@ "svg_enumeration.h", "svg_enumeration_map.cc", "svg_enumeration_map.h", - "svg_external_document_cache.cc", - "svg_external_document_cache.h", "svg_fe_blend_element.cc", "svg_fe_blend_element.h", "svg_fe_color_matrix_element.cc", @@ -282,6 +280,8 @@ "svg_resource.cc", "svg_resource.h", "svg_resource_client.h", + "svg_resource_document_content.cc", + "svg_resource_document_content.h", "svg_script_element.cc", "svg_script_element.h", "svg_set_element.cc",
diff --git a/third_party/blink/renderer/core/svg/svg_resource.cc b/third_party/blink/renderer/core/svg/svg_resource.cc index c0a8aa6..7bc6787e 100644 --- a/third_party/blink/renderer/core/svg/svg_resource.cc +++ b/third_party/blink/renderer/core/svg/svg_resource.cc
@@ -4,15 +4,17 @@ #include "third_party/blink/renderer/core/svg/svg_resource.h" +#include "services/network/public/mojom/content_security_policy.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/id_target_observer.h" #include "third_party/blink/renderer/core/dom/tree_scope.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.h" #include "third_party/blink/renderer/core/layout/svg/svg_resources_cycle_solver.h" -#include "third_party/blink/renderer/core/svg/svg_external_document_cache.h" +#include "third_party/blink/renderer/core/svg/svg_resource_document_content.h" #include "third_party/blink/renderer/core/svg/svg_uri_reference.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" +#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" #include "third_party/blink/renderer/platform/loader/fetch/resource.h" namespace blink { @@ -180,17 +182,24 @@ void ExternalSVGResource::Load(Document& document) { if (document_content_) return; - document_content_ = SVGExternalDocumentCache::From(document)->Get( - this, url_, fetch_initiator_type_names::kCSS); + ExecutionContext* execution_context = document.GetExecutionContext(); + ResourceLoaderOptions options(execution_context->GetCurrentWorld()); + options.initiator_info.name = fetch_initiator_type_names::kCSS; + FetchParameters params(ResourceRequest(url_), options); + document_content_ = SVGResourceDocumentContent::Fetch(params, document, this); target_ = ResolveTarget(); } void ExternalSVGResource::LoadWithoutCSP(Document& document) { if (document_content_) return; - document_content_ = SVGExternalDocumentCache::From(document)->Get( - this, url_, fetch_initiator_type_names::kCSS, + ExecutionContext* execution_context = document.GetExecutionContext(); + ResourceLoaderOptions options(execution_context->GetCurrentWorld()); + options.initiator_info.name = fetch_initiator_type_names::kCSS; + FetchParameters params(ResourceRequest(url_), options); + params.SetContentSecurityCheck( network::mojom::blink::CSPDisposition::DO_NOT_CHECK); + document_content_ = SVGResourceDocumentContent::Fetch(params, document, this); target_ = ResolveTarget(); }
diff --git a/third_party/blink/renderer/core/svg/svg_external_document_cache.cc b/third_party/blink/renderer/core/svg/svg_resource_document_content.cc similarity index 76% rename from third_party/blink/renderer/core/svg/svg_external_document_cache.cc rename to third_party/blink/renderer/core/svg/svg_resource_document_content.cc index b75f73d4..f0ea6783 100644 --- a/third_party/blink/renderer/core/svg/svg_external_document_cache.cc +++ b/third_party/blink/renderer/core/svg/svg_resource_document_content.cc
@@ -20,7 +20,7 @@ Boston, MA 02110-1301, USA. */ -#include "third_party/blink/renderer/core/svg/svg_external_document_cache.h" +#include "third_party/blink/renderer/core/svg/svg_resource_document_content.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -29,12 +29,62 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/loader/resource/text_resource.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" +#include "third_party/blink/renderer/platform/loader/fetch/resource.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_client.h" +#include "third_party/blink/renderer/platform/supplementable.h" namespace blink { namespace { +class SVGExternalDocumentCache final + : public GarbageCollected<SVGExternalDocumentCache>, + public Supplement<Document> { + public: + static const char kSupplementName[]; + static SVGExternalDocumentCache* From(Document&); + explicit SVGExternalDocumentCache(Document&); + + SVGResourceDocumentContent* Get(TextResource*); + + void Trace(Visitor*) const override; + + private: + HeapHashMap<WeakMember<Resource>, Member<SVGResourceDocumentContent>> + entries_; +}; + +const char SVGExternalDocumentCache::kSupplementName[] = + "SVGExternalDocumentCache"; + +SVGExternalDocumentCache* SVGExternalDocumentCache::From(Document& document) { + SVGExternalDocumentCache* cache = + Supplement<Document>::From<SVGExternalDocumentCache>(document); + if (!cache) { + cache = MakeGarbageCollected<SVGExternalDocumentCache>(document); + Supplement<Document>::ProvideTo(document, cache); + } + return cache; +} + +SVGExternalDocumentCache::SVGExternalDocumentCache(Document& document) + : Supplement<Document>(document) {} + +SVGResourceDocumentContent* SVGExternalDocumentCache::Get( + TextResource* resource) { + auto& entry = entries_.insert(resource, nullptr).stored_value->value; + if (!entry) { + entry = MakeGarbageCollected<SVGResourceDocumentContent>( + resource, GetSupplementable()->GetExecutionContext()); + } + return entry; +} + +void SVGExternalDocumentCache::Trace(Visitor* visitor) const { + Supplement<Document>::Trace(visitor); + visitor->Trace(entries_); +} + bool MimeTypeAllowed(const ResourceResponse& response) { AtomicString mime_type = response.MimeType(); if (response.IsHTTP()) @@ -83,55 +133,26 @@ visitor->Trace(context_); } -const char SVGExternalDocumentCache::kSupplementName[] = - "SVGExternalDocumentCache"; - -SVGExternalDocumentCache* SVGExternalDocumentCache::From(Document& document) { - SVGExternalDocumentCache* cache = - Supplement<Document>::From<SVGExternalDocumentCache>(document); - if (!cache) { - cache = MakeGarbageCollected<SVGExternalDocumentCache>(document); - Supplement<Document>::ProvideTo(document, cache); - } - return cache; -} - -SVGExternalDocumentCache::SVGExternalDocumentCache(Document& document) - : Supplement<Document>(document) {} - -SVGResourceDocumentContent* SVGExternalDocumentCache::Get( - ResourceClient* client, - const KURL& url, - const AtomicString& initiator_name, - network::mojom::blink::CSPDisposition csp_disposition) { - Document* context_document = GetSupplementable(); - ExecutionContext* execution_context = context_document->GetExecutionContext(); - ResourceLoaderOptions options(execution_context->GetCurrentWorld()); - options.initiator_info.name = initiator_name; - FetchParameters params(ResourceRequest(url), options); - params.SetContentSecurityCheck(csp_disposition); +SVGResourceDocumentContent* SVGResourceDocumentContent::Fetch( + FetchParameters& params, + Document& document, + ResourceClient* client) { params.MutableResourceRequest().SetMode( network::mojom::blink::RequestMode::kSameOrigin); + DCHECK_EQ(params.GetResourceRequest().GetRequestContext(), + mojom::blink::RequestContextType::UNSPECIFIED); params.SetRequestContext(mojom::blink::RequestContextType::IMAGE); params.SetRequestDestination(network::mojom::RequestDestination::kImage); - TextResource* resource = TextResource::FetchSVGDocument( - params, context_document->Fetcher(), client); + TextResource* resource = + TextResource::FetchSVGDocument(params, document.Fetcher(), client); if (!resource) return nullptr; - auto& entry = entries_.insert(resource, nullptr).stored_value->value; - if (!entry) { - entry = MakeGarbageCollected<SVGResourceDocumentContent>(resource, - execution_context); - } + auto* document_content = + SVGExternalDocumentCache::From(document)->Get(resource); if (resource->IsCacheValidator()) - entry->SetWasRevalidating(); - return entry; -} - -void SVGExternalDocumentCache::Trace(Visitor* visitor) const { - Supplement<Document>::Trace(visitor); - visitor->Trace(entries_); + document_content->SetWasRevalidating(); + return document_content; } } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_external_document_cache.h b/third_party/blink/renderer/core/svg/svg_resource_document_content.h similarity index 61% rename from third_party/blink/renderer/core/svg/svg_external_document_cache.h rename to third_party/blink/renderer/core/svg/svg_resource_document_content.h index aee3b4d..15da254 100644 --- a/third_party/blink/renderer/core/svg/svg_external_document_cache.h +++ b/third_party/blink/renderer/core/svg/svg_resource_document_content.h
@@ -20,53 +20,33 @@ Boston, MA 02110-1301, USA. */ -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_EXTERNAL_DOCUMENT_CACHE_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_EXTERNAL_DOCUMENT_CACHE_H_ +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_DOCUMENT_CONTENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_DOCUMENT_CONTENT_H_ -#include "services/network/public/mojom/content_security_policy.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/handle.h" -#include "third_party/blink/renderer/platform/loader/fetch/resource.h" -#include "third_party/blink/renderer/platform/supplementable.h" namespace blink { class Document; class ExecutionContext; +class FetchParameters; +class KURL; class ResourceClient; -class SVGResourceDocumentContent; class TextResource; -class CORE_EXPORT SVGExternalDocumentCache final - : public GarbageCollected<SVGExternalDocumentCache>, - public Supplement<Document> { - public: - static const char kSupplementName[]; - static SVGExternalDocumentCache* From(Document&); - explicit SVGExternalDocumentCache(Document&); - void Trace(Visitor*) const override; - - SVGResourceDocumentContent* Get( - ResourceClient*, - const KURL&, - const AtomicString& initiator_name, - network::mojom::blink::CSPDisposition = - network::mojom::blink::CSPDisposition::CHECK); - - private: - HeapHashMap<WeakMember<Resource>, Member<SVGResourceDocumentContent>> - entries_; -}; - class CORE_EXPORT SVGResourceDocumentContent final : public GarbageCollected<SVGResourceDocumentContent> { public: + static SVGResourceDocumentContent* Fetch(FetchParameters&, + Document&, + ResourceClient*); + SVGResourceDocumentContent(TextResource* resource, ExecutionContext* context) : resource_(resource), context_(context) { DCHECK(resource_); DCHECK(context_); } - void SetWasRevalidating() { was_revalidating_ = true; } Document* GetDocument(); const KURL& Url() const; @@ -74,6 +54,8 @@ void Trace(Visitor*) const; private: + void SetWasRevalidating() { was_revalidating_ = true; } + Member<TextResource> resource_; Member<Document> document_; Member<ExecutionContext> context_; @@ -82,4 +64,4 @@ } // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_EXTERNAL_DOCUMENT_CACHE_H_ +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_DOCUMENT_CONTENT_H_
diff --git a/third_party/blink/renderer/core/svg/svg_external_document_cache_test.cc b/third_party/blink/renderer/core/svg/svg_resource_document_content_test.cc similarity index 66% rename from third_party/blink/renderer/core/svg/svg_external_document_cache_test.cc rename to third_party/blink/renderer/core/svg/svg_resource_document_content_test.cc index 5dfad10..319f0960 100644 --- a/third_party/blink/renderer/core/svg/svg_external_document_cache_test.cc +++ b/third_party/blink/renderer/core/svg/svg_resource_document_content_test.cc
@@ -2,18 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/core/svg/svg_external_document_cache.h" +#include "third_party/blink/renderer/core/svg/svg_resource_document_content.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" #include "third_party/blink/renderer/platform/loader/fetch/fetch_initiator_type_names.h" +#include "third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h" namespace blink { -class SVGExternalDocumentCacheTest : public SimTest {}; +class SVGResourceDocumentContentTest : public SimTest {}; -TEST_F(SVGExternalDocumentCacheTest, GetDocumentBeforeLoadComplete) { +TEST_F(SVGResourceDocumentContentTest, GetDocumentBeforeLoadComplete) { SimRequest main_resource("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); main_resource.Complete("<html><body></body></html>"); @@ -22,9 +23,12 @@ SimSubresourceRequest svg_resource(kSVGUrl, "application/xml"); // Request a resource from the cache. + ExecutionContext* execution_context = GetDocument().GetExecutionContext(); + ResourceLoaderOptions options(execution_context->GetCurrentWorld()); + options.initiator_info.name = fetch_initiator_type_names::kCSS; + FetchParameters params(ResourceRequest(kSVGUrl), options); auto* entry = - SVGExternalDocumentCache::From(GetDocument()) - ->Get(nullptr, KURL(kSVGUrl), fetch_initiator_type_names::kCSS); + SVGResourceDocumentContent::Fetch(params, GetDocument(), nullptr); // Write part of the response. The document should not be initialized yet, // because the response is not complete. The document would be invalid at this
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc index 058b2e5..f2ca426 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.cc +++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -36,9 +36,9 @@ #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_transformable_container.h" #include "third_party/blink/renderer/core/svg/svg_animated_length.h" -#include "third_party/blink/renderer/core/svg/svg_external_document_cache.h" #include "third_party/blink/renderer/core/svg/svg_g_element.h" #include "third_party/blink/renderer/core/svg/svg_length_context.h" +#include "third_party/blink/renderer/core/svg/svg_resource_document_content.h" #include "third_party/blink/renderer/core/svg/svg_svg_element.h" #include "third_party/blink/renderer/core/svg/svg_symbol_element.h" #include "third_party/blink/renderer/core/svg/svg_title_element.h" @@ -215,8 +215,13 @@ context_document = To<LocalDOMWindow>(GetDocument().GetExecutionContext())->document(); } - document_content_ = SVGExternalDocumentCache::From(*context_document) - ->Get(this, element_url_, localName()); + + ExecutionContext* execution_context = context_document->GetExecutionContext(); + ResourceLoaderOptions options(execution_context->GetCurrentWorld()); + options.initiator_info.name = localName(); + FetchParameters params(ResourceRequest(element_url_), options); + document_content_ = + SVGResourceDocumentContent::Fetch(params, *context_document, this); } void SVGUseElement::SvgAttributeChanged(
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc index 5985761..ce2e22d 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -1021,7 +1021,7 @@ GraphicsContext graphics_context(paint_controller); PhysicalOffset physical_offset((LayoutUnit(x)), (LayoutUnit(y))); NGBoxFragmentPainter box_fragment_painter(fragment); - PaintInfo paint_info(graphics_context, LayoutRect::InfiniteIntRect(), + PaintInfo paint_info(graphics_context, CullRect::Infinite(), PaintPhase::kForeground, kGlobalPaintNormalPhase, kPaintLayerPaintingRenderingClipPathAsMask | kPaintLayerPaintingRenderingResourceSubtree);
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc index 5b6ed272..12c9f7e 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -303,13 +303,7 @@ } #if BUILDFLAG(USE_PROPRIETARY_CODECS) - if (video_type.codec == media::kCodecH264) { - if (extra_data.empty()) { - out_console_message = - "H.264 configuration must include an avcC description."; - return CodecConfigEval::kInvalid; - } - + if (video_type.codec == media::kCodecH264 && !extra_data.empty()) { out_h264_avcc = std::make_unique<media::mp4::AVCDecoderConfigurationRecord>(); out_h264_converter =
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc index 45d40a6..8c3d146 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -343,10 +343,12 @@ #endif DCHECK(layer_state_) << "No layer state for GraphicsLayer: " << DebugName(); - IntRect new_interest_rect = - interest_rect - ? *interest_rect - : client_.ComputeInterestRect(this, previous_interest_rect_); + IntRect new_interest_rect; + if (!RuntimeEnabledFeatures::CullRectUpdateEnabled()) { + new_interest_rect = interest_rect ? *interest_rect + : client_.ComputeInterestRect( + this, previous_interest_rect_); + } auto& paint_controller = GetPaintController(); PaintController::ScopedBenchmarkMode scoped_benchmark_mode(paint_controller, @@ -684,6 +686,12 @@ client_.GraphicsLayersDidChange(); } +gfx::Rect GraphicsLayer::PaintableRegion() const { + return RuntimeEnabledFeatures::CullRectUpdateEnabled() + ? client_.PaintableRegion(this) + : previous_interest_rect_; +} + scoped_refptr<cc::DisplayItemList> GraphicsLayer::PaintContentsToDisplayList() { DCHECK(!ShouldCreateLayersAfterPaint()); return cc_display_item_list_;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h index b46dadbf..b4a972d 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -230,7 +230,7 @@ friend class GraphicsLayerTest; // cc::ContentLayerClient implementation. - gfx::Rect PaintableRegion() const final { return previous_interest_rect_; } + gfx::Rect PaintableRegion() const final; scoped_refptr<cc::DisplayItemList> PaintContentsToDisplayList() final; bool FillsBoundsCompletely() const final { return false; } @@ -292,6 +292,7 @@ mutable std::unique_ptr<PaintController> paint_controller_; + // Used only when CullRectUpdate is not enabled. IntRect previous_interest_rect_; struct LayerState {
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h index d0b4ed9..3a790a9 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer_client.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer_client.h
@@ -54,9 +54,13 @@ public: virtual ~GraphicsLayerClient() = default; + // Used only when CullRectUpdate is not enabled. virtual IntRect ComputeInterestRect( const GraphicsLayer*, const IntRect& previous_interest_rect) const = 0; + // Used when CullRectUpdate is enabled. + virtual IntRect PaintableRegion(const GraphicsLayer*) const = 0; + virtual LayoutSize SubpixelAccumulation() const { return LayoutSize(); } // Returns whether the client needs to be repainted with respect to the given // graphics layer.
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc index 4840b23..7881d26 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.cc
@@ -611,23 +611,19 @@ } void RTCVideoDecoderStreamAdapter::OnFrameReady( - media::VideoDecoderStream::ReadStatus status, - scoped_refptr<media::VideoFrame> frame) { + media::VideoDecoderStream::ReadResult result) { DVLOG(3) << __func__; DCHECK(media_task_runner_->RunsTasksInCurrentSequence()); pending_read_ = false; - switch (status) { - case media::VideoDecoderStream::ReadStatus::OK: + switch (result.code()) { + case media::StatusCode::kOk: break; - case media::VideoDecoderStream::ReadStatus::ABORTED: - case media::VideoDecoderStream::ReadStatus::DEMUXER_READ_ABORTED: + case media::StatusCode::kAborted: // We're doing a Reset(), so just ignore it and keep going. return; - - case media::VideoDecoderStream::ReadStatus::DECODE_ERROR: - + default: DVLOG(2) << "Entering permanent error state"; UMA_HISTOGRAM_ENUMERATION("Media.RTCVideoDecoderError", media::VideoDecodeAccelerator::PLATFORM_FAILURE, @@ -638,10 +634,11 @@ pending_buffer_count_ = 0; } return; - default: - NOTREACHED(); } + scoped_refptr<media::VideoFrame> frame = std::move(result).value(); + DCHECK(frame); + const base::TimeDelta timestamp = frame->timestamp(); webrtc::VideoFrame rtc_frame = webrtc::VideoFrame::Builder()
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.h b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.h index a270cfef4..9a21eff 100644 --- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.h +++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_stream_adapter.h
@@ -39,7 +39,6 @@ class DecoderFactory; class GpuVideoAcceleratorFactories; class MediaLog; -class VideoFrame; } // namespace media namespace blink { @@ -112,8 +111,7 @@ InitCB init_cb); void OnInitializeDone(base::TimeTicks start_time, bool success); void DecodeOnMediaThread(std::unique_ptr<PendingBuffer>); - void OnFrameReady(media::VideoDecoderStream::ReadStatus status, - scoped_refptr<media::VideoFrame> frame); + void OnFrameReady(media::VideoDecoderStream::ReadResult result); bool ShouldReinitializeForSettingHDRColorSpace( const webrtc::EncodedImage& input_image) const;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 70777fe..f73321e 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -450,7 +450,7 @@ }, { name: "CSSAspectRatioInterpolation", - status: "experimental", + status: "stable", }, { name: "CSSAspectRatioProperty",
diff --git a/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h b/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h index 38ce668..f58ad1b 100644 --- a/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h +++ b/third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h
@@ -18,6 +18,9 @@ const IntRect&) const override { return IntRect(); } + IntRect PaintableRegion(const GraphicsLayer*) const override { + return IntRect(); + } String DebugName(const GraphicsLayer*) const override { return String(); } bool IsTrackingRasterInvalidations() const override { return is_tracking_raster_invalidations_;
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 658eb148..cc60f06d 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1180,6 +1180,13 @@ ] }, "crashtests": { + "chrome-bug-1172059.html": [ + "1c788ab3d8116381af6f6656d89c2811171bdef5", + [ + null, + {} + ] + ], "firefox-bug-1688293.html": [ "9ab1a88312683a66798cb52693c2ba4389222ff4", [ @@ -2956,6 +2963,1193 @@ ] ] }, + "css-counter-styles": { + "arabic-indic": { + "css3-counter-styles-101.html": [ + "623e3382368f41233bfecfe6b810eed5cf6780dc", + [ + null, + {} + ] + ], + "css3-counter-styles-102.html": [ + "47ec8c20a11248137926531c95e4cb446f555bb7", + [ + null, + {} + ] + ], + "css3-counter-styles-103.html": [ + "01b959cd85a0ba75651527ba12616a223964bde1", + [ + null, + {} + ] + ] + }, + "armenian": { + "css3-counter-styles-006.html": [ + "dd1185067bc69d3781e369eeb3f95226183e6769", + [ + null, + {} + ] + ], + "css3-counter-styles-007.html": [ + "eb35fb14622918f4e615a3c5859fd047ca202273", + [ + null, + {} + ] + ], + "css3-counter-styles-008.html": [ + "82440be6b353321ebfdef9ebcf668db3771326e5", + [ + null, + {} + ] + ], + "css3-counter-styles-009.html": [ + "b78a07cfeabaea80247c30e884e899193332b417", + [ + null, + {} + ] + ] + }, + "bengali": { + "css3-counter-styles-116.html": [ + "d82af0d69dadc630e4148404745f89f4c6eb82a2", + [ + null, + {} + ] + ], + "css3-counter-styles-117.html": [ + "9fe3ba66c33d9bdc7b327fbecb122245c027125c", + [ + null, + {} + ] + ], + "css3-counter-styles-118.html": [ + "32c8c34be26153efb842477129f74a9c9234808f", + [ + null, + {} + ] + ] + }, + "cambodian": { + "css3-counter-styles-158.html": [ + "ac7305c72cde2c39ef37c0074127b07c2c83f39f", + [ + null, + {} + ] + ], + "css3-counter-styles-159.html": [ + "cdb6bc4bfa7b44c34413fda1af40d71fc9aebb28", + [ + null, + {} + ] + ], + "css3-counter-styles-160.html": [ + "0100bab98be0bbc3e0187565f75abdf1b69b3005", + [ + null, + {} + ] + ] + }, + "cjk-decimal": { + "css3-counter-styles-001.html": [ + "44c4bdf25e38a6f09b7d98d685a11da13ba70d64", + [ + null, + {} + ] + ], + "css3-counter-styles-004.html": [ + "0cf970cd5ad9ce4f4589472ddf147e981a5efa95", + [ + null, + {} + ] + ], + "css3-counter-styles-005.html": [ + "599323ff474d3426d74bb90af26d47a6f4a4bfad", + [ + null, + {} + ] + ] + }, + "cjk-earthly-branch": { + "css3-counter-styles-201.html": [ + "5803371587ace4e7ffe2c3ca22814ed72d3880b8", + [ + null, + {} + ] + ], + "css3-counter-styles-202.html": [ + "d7c19b7f89a344b9652be2846f0305504432d069", + [ + null, + {} + ] + ], + "css3-counter-styles-203.html": [ + "d7f3336ffb510842ee5e93ab0d63e310b59f6488", + [ + null, + {} + ] + ] + }, + "cjk-heavenly-stem": { + "css3-counter-styles-204.html": [ + "d96bf00f2854b903edf621a0ef432740c1807114", + [ + null, + {} + ] + ], + "css3-counter-styles-205.html": [ + "73a4aee128da97a6027864b41fa500bb5724f6f1", + [ + null, + {} + ] + ], + "css3-counter-styles-206.html": [ + "0f47de46e9994fa6667b5e8344f0907687f1754c", + [ + null, + {} + ] + ] + }, + "devanagari": { + "css3-counter-styles-119.html": [ + "464925184b2c699f76eca34e49e49107fdcd812b", + [ + null, + {} + ] + ], + "css3-counter-styles-120.html": [ + "29d10c08030eaf7653916a0494c3dafe859459e2", + [ + null, + {} + ] + ], + "css3-counter-styles-121.html": [ + "c50676429bdd3729a0385be176b14e48c9d66295", + [ + null, + {} + ] + ] + }, + "ethiopic-numeric": { + "css3-counter-styles-068.html": [ + "47664f907086422169c358710ca95d886d16e041", + [ + null, + {} + ] + ], + "css3-counter-styles-069.html": [ + "9b3e3fad413b9b92dca073999e58f82fb64d30d0", + [ + null, + {} + ] + ], + "css3-counter-styles-070.html": [ + "75d6338e4f515f8fcf452de83fdea8ee6db486e4", + [ + null, + {} + ] + ] + }, + "georgian": { + "css3-counter-styles-010.html": [ + "106f4cdc4bfc348f34e39aa66d0c1814c8870d3b", + [ + null, + {} + ] + ], + "css3-counter-styles-011.html": [ + "932045ca09b4153b087478297d046f00854c5bfa", + [ + null, + {} + ] + ], + "css3-counter-styles-012.html": [ + "6ad5f7659705def00531e8ba979a02ee74f95e87", + [ + null, + {} + ] + ], + "css3-counter-styles-014.html": [ + "24ae1d08bb96660fcebd22399269c529060e45db", + [ + null, + {} + ] + ] + }, + "gujarati": { + "css3-counter-styles-122.html": [ + "b4aa7b30de5615fb3e923e2ff8dfa03d8cc30070", + [ + null, + {} + ] + ], + "css3-counter-styles-123.html": [ + "578601ad4ea057d6209b9ab72ef459cfab11fbf3", + [ + null, + {} + ] + ], + "css3-counter-styles-124.html": [ + "83beaabc14fa61d587b1b955d240a39dd2f982e2", + [ + null, + {} + ] + ] + }, + "gurmukhi": { + "css3-counter-styles-125.html": [ + "85d233c64728548e3549435c6b290485663cdbea", + [ + null, + {} + ] + ], + "css3-counter-styles-126.html": [ + "051cdc4d3bb21a8ba2baefc89ddbcad10ac691c9", + [ + null, + {} + ] + ], + "css3-counter-styles-127.html": [ + "52ab48084705e1d276a405975deb41ebcd3d0d02", + [ + null, + {} + ] + ] + }, + "hebrew": { + "css3-counter-styles-015.html": [ + "745cac5414bb17283248d553adedd3e2a4b3047b", + [ + null, + {} + ] + ], + "css3-counter-styles-016.html": [ + "6973f823dbebd837566a2a59bcafd42d8ac0f7e2", + [ + null, + {} + ] + ], + "css3-counter-styles-016a.html": [ + "8957e06bbe55c012dcd9e5eb92a57d75ec5a40f6", + [ + null, + {} + ] + ], + "css3-counter-styles-017.html": [ + "f80966a9c095075c421fefe5743e2b4601ee3aa2", + [ + null, + {} + ] + ] + }, + "hiragana": { + "css3-counter-styles-030.html": [ + "3acadc04b42f9484a4ad0e4f4781b50ff3e3e2db", + [ + null, + {} + ] + ], + "css3-counter-styles-031.html": [ + "791a9d8cb5f91375ca6706f8db5327a745d773da", + [ + null, + {} + ] + ], + "css3-counter-styles-032.html": [ + "066c221b1145414b9d930157b3ef215cc6b4eb1c", + [ + null, + {} + ] + ] + }, + "hiragana-iroha": { + "css3-counter-styles-033.html": [ + "be962ea16f9920cce4787d65fdcab8408c939b76", + [ + null, + {} + ] + ], + "css3-counter-styles-034.html": [ + "69d04634f9b7db63688af9276b7571d44cf9df34", + [ + null, + {} + ] + ], + "css3-counter-styles-035.html": [ + "634440def3a7c59eb74ab4e6e81a2a72fd192163", + [ + null, + {} + ] + ] + }, + "japanese-formal": { + "css3-counter-styles-047.html": [ + "a31d819f6d6564ecf57931ed2020ef6f40fb0fb2", + [ + null, + {} + ] + ], + "css3-counter-styles-048.html": [ + "120bfb03bfa5104ef4a504776d31bfddec8126d8", + [ + null, + {} + ] + ], + "css3-counter-styles-049.html": [ + "946b10c862d45144899c93419ced5842718d8382", + [ + null, + {} + ] + ], + "css3-counter-styles-050.html": [ + "d22ecdc1018a6bf75fa563a94f0cb7447f6f8d25", + [ + null, + {} + ] + ], + "css3-counter-styles-051.html": [ + "6838710c23a52e398d3d59544e26ba7f6bdca9ee", + [ + null, + {} + ] + ] + }, + "japanese-informal": { + "css3-counter-styles-042.html": [ + "2c5dcaec9fe73efbab5730ff4c122825b238cde3", + [ + null, + {} + ] + ], + "css3-counter-styles-043.html": [ + "b6df20c83015fb867b74989c6d32282d36d24bbc", + [ + null, + {} + ] + ], + "css3-counter-styles-044.html": [ + "01af21c3399f728237a1c532de766054aa868b9b", + [ + null, + {} + ] + ], + "css3-counter-styles-045.html": [ + "570f2a07ed6785d14286c89732c8f6279049093c", + [ + null, + {} + ] + ], + "css3-counter-styles-046.html": [ + "32f346bb0d77fde243eb999364d8677a55ad3157", + [ + null, + {} + ] + ] + }, + "kannada": { + "css3-counter-styles-128.html": [ + "b782cc8060b7b80c31273f9404eb3e6513b19dbb", + [ + null, + {} + ] + ], + "css3-counter-styles-129.html": [ + "19c453039b975caee5cb27e25fd29260566a21a9", + [ + null, + {} + ] + ], + "css3-counter-styles-130.html": [ + "957423d8d927db4bba1d7eab37136f8b7328c120", + [ + null, + {} + ] + ] + }, + "katakana": { + "css3-counter-styles-036.html": [ + "4662dd710cf9d660ef91380ead77cbad63b526b8", + [ + null, + {} + ] + ], + "css3-counter-styles-037.html": [ + "cf3e07b05d815806cd249f69d281f894f9b47fe1", + [ + null, + {} + ] + ], + "css3-counter-styles-038.html": [ + "cbbf779b165568168b5eb72cfbe5018665bf7329", + [ + null, + {} + ] + ] + }, + "katakana-iroha": { + "css3-counter-styles-039.html": [ + "6fd47073a3c48d6eca9ab1152bd15afddcb56926", + [ + null, + {} + ] + ], + "css3-counter-styles-040.html": [ + "5b12a0c4b9aab2af566a38c1c323425bac4ea4ed", + [ + null, + {} + ] + ], + "css3-counter-styles-041.html": [ + "f87354f2e8acdd0e174e651cc6b2c4b9d0c03c21", + [ + null, + {} + ] + ] + }, + "khmer": { + "css3-counter-styles-161.html": [ + "c9fd66540ca292077d77caa9795c095f7ca1246e", + [ + null, + {} + ] + ], + "css3-counter-styles-162.html": [ + "369fabb61839d42a9dd5a36a5f48bd4f77c218a0", + [ + null, + {} + ] + ], + "css3-counter-styles-163.html": [ + "9d689d5c873ff78c93efb49e99f1c96b7c90aef7", + [ + null, + {} + ] + ] + }, + "korean-hangul-formal": { + "css3-counter-styles-052.html": [ + "cb6a8cae2ee568339e636a28ed9c9d803e1171be", + [ + null, + {} + ] + ], + "css3-counter-styles-053.html": [ + "70e007c3177cbb84e09d5897638bbb1b0102fd16", + [ + null, + {} + ] + ], + "css3-counter-styles-054.html": [ + "b541d19bf30a5583ab27feb564b8e37ee61e8756", + [ + null, + {} + ] + ], + "css3-counter-styles-055.html": [ + "4a35e732c06ee4e4257f5ced2cfd5a80008a6e8b", + [ + null, + {} + ] + ], + "css3-counter-styles-056.html": [ + "a8ab993e4ad61ad67132f1dba9e55e67904443a4", + [ + null, + {} + ] + ] + }, + "korean-hanja-formal": { + "css3-counter-styles-062.html": [ + "40890e5e6a938635eb17376b50292507bfa58a50", + [ + null, + {} + ] + ], + "css3-counter-styles-063.html": [ + "28482aee039a6cec4a266b6e08e5c7f5ca819929", + [ + null, + {} + ] + ], + "css3-counter-styles-064.html": [ + "8240e025df07b4f1e1f81a611c4fea9b9c49e713", + [ + null, + {} + ] + ], + "css3-counter-styles-065.html": [ + "e07b99acc42250946142d0b6fcc5fa86f563a758", + [ + null, + {} + ] + ], + "css3-counter-styles-066.html": [ + "7d12eca98245e93627b3b4a2a74381c2af0ba13a", + [ + null, + {} + ] + ] + }, + "korean-hanja-informal": { + "css3-counter-styles-057.html": [ + "5634075c13cdd1afab4ad4e7b4e36e9b806b1d86", + [ + null, + {} + ] + ], + "css3-counter-styles-058.html": [ + "47538198a517e6bd5b314b92e7632184d6102810", + [ + null, + {} + ] + ], + "css3-counter-styles-059.html": [ + "476ea29cdb014f4b5abd319cd3c041291735a377", + [ + null, + {} + ] + ], + "css3-counter-styles-060.html": [ + "2127ed7fbb262122f9e280fb2da8aec5ebc5b87d", + [ + null, + {} + ] + ], + "css3-counter-styles-061.html": [ + "8ff24a7d70b824f6e1971c4683139305d479ee21", + [ + null, + {} + ] + ] + }, + "lao": { + "css3-counter-styles-131.html": [ + "4a77df5b485731cf6fa96d2f957f27134c35445f", + [ + null, + {} + ] + ], + "css3-counter-styles-132.html": [ + "bbe5107ba31997ca134d94beec56fbbca909822c", + [ + null, + {} + ] + ], + "css3-counter-styles-133.html": [ + "3cabd354e481a7e0b896334897afab7c8ad187a0", + [ + null, + {} + ] + ] + }, + "lower-armenian": { + "css3-counter-styles-111.html": [ + "88d0395736da6d22a2cf97c3a9369ec76297dfbf", + [ + null, + {} + ] + ], + "css3-counter-styles-112.html": [ + "d4239e0a0e46fd4645dc15c750f215225a9564eb", + [ + null, + {} + ] + ], + "css3-counter-styles-114.html": [ + "8f1cb8c1e964aa7570a1e4212064e917323d77a5", + [ + null, + {} + ] + ], + "css3-counter-styles-115.html": [ + "08afc18c3b8967aae2683800ab76f5db43cadc0a", + [ + null, + {} + ] + ] + }, + "lower-greek": { + "css3-counter-styles-027.html": [ + "875db78e44e0ed3155c447fc60ff40dfb8346e94", + [ + null, + {} + ] + ], + "css3-counter-styles-028.html": [ + "d66c3c31761273fc1662fa598b744feefe5efdcc", + [ + null, + {} + ] + ], + "css3-counter-styles-029.html": [ + "a4b4f405f8a203aad77ba66a726adbf14c61ae62", + [ + null, + {} + ] + ] + }, + "lower-roman": { + "css3-counter-styles-019.html": [ + "d377e176c10046b41db6ee92b2709a00137b3cbf", + [ + null, + {} + ] + ], + "css3-counter-styles-020.html": [ + "48e39184406752338a6f19bb0938d7a5ebc89a25", + [ + null, + {} + ] + ], + "css3-counter-styles-020a.html": [ + "17dda54f0026e640ac0758d61cb6bf016e3b5990", + [ + null, + {} + ] + ], + "css3-counter-styles-020b.html": [ + "db24763de384f7e865110291afc934addf380139", + [ + null, + {} + ] + ], + "css3-counter-styles-021.html": [ + "794c3c9fbd64ddfe7315e9d7b85f7404dd1743a6", + [ + null, + {} + ] + ], + "css3-counter-styles-022.html": [ + "29c4a8c8956f45b395b31f911b853ce76d15b9ba", + [ + null, + {} + ] + ] + }, + "malayalam": { + "css3-counter-styles-134.html": [ + "0254b57b4ee24bb43c3fd9c1d04e422128e4e9d1", + [ + null, + {} + ] + ], + "css3-counter-styles-135.html": [ + "167cfc1d52e2c57a28255d3ecb0b512037e4f7a9", + [ + null, + {} + ] + ], + "css3-counter-styles-136.html": [ + "643b404ea617763b19b5f506bafda0498d74311c", + [ + null, + {} + ] + ] + }, + "mongolian": { + "css3-counter-styles-137.html": [ + "1ffb05ec27a65cbbc2afd146c0083c2920231711", + [ + null, + {} + ] + ], + "css3-counter-styles-138.html": [ + "4e45748f0463d5dbc73b8c2398d7025d0e91b377", + [ + null, + {} + ] + ], + "css3-counter-styles-139.html": [ + "435760c571d792c898c7d36168ccde95fdd4d713", + [ + null, + {} + ] + ] + }, + "myanmar": { + "css3-counter-styles-140.html": [ + "2b11c681b5237fbabd76c3b3f40b9bd9fef59288", + [ + null, + {} + ] + ], + "css3-counter-styles-141.html": [ + "112cc1abc54a3a129ef095d20328afb3667e832a", + [ + null, + {} + ] + ], + "css3-counter-styles-142.html": [ + "22f6a303702adf334aa1a3d91b11a25c4dd178b9", + [ + null, + {} + ] + ] + }, + "oriya": { + "css3-counter-styles-143.html": [ + "279742b5f18defdfc60765a865572e1f89f5f950", + [ + null, + {} + ] + ], + "css3-counter-styles-144.html": [ + "ec42bab0a86f7c74f9fd0b554b197cf1fd4d44f5", + [ + null, + {} + ] + ], + "css3-counter-styles-145.html": [ + "3280343b939ee4008a1c4c56f7cb2056dbdf1075", + [ + null, + {} + ] + ] + }, + "persian": { + "css3-counter-styles-104.html": [ + "9886e5cf76f1a3374b749ff342775447359036ca", + [ + null, + {} + ] + ], + "css3-counter-styles-105.html": [ + "6a0dcf7c9ac1f7e80d27ce93f09426ddd935876b", + [ + null, + {} + ] + ], + "css3-counter-styles-106.html": [ + "2b9edde718e83af7f871618700690f79dfd57f20", + [ + null, + {} + ] + ] + }, + "simp-chinese-formal": { + "css3-counter-styles-076.html": [ + "f7db75ded21fe25147ab1146868727e6de719bad", + [ + null, + {} + ] + ], + "css3-counter-styles-077.html": [ + "d84025423c806e3f3f065a3aef636f3d8e98c55f", + [ + null, + {} + ] + ], + "css3-counter-styles-078.html": [ + "b7b650455ac78e64348e565934682f81603964b3", + [ + null, + {} + ] + ], + "css3-counter-styles-079.html": [ + "3c74989e5f2ba86f9b23f5b63da262ca8dc9a4ba", + [ + null, + {} + ] + ], + "css3-counter-styles-080.html": [ + "958f44290b087198c3e3e94dc06c9255882541bb", + [ + null, + {} + ] + ] + }, + "simp-chinese-informal": { + "css3-counter-styles-071.html": [ + "6e11ecd0dc151317af4ac01877a8f24274e8f6cd", + [ + null, + {} + ] + ], + "css3-counter-styles-072.html": [ + "3af6151f6c2f8cf73dd00608f6f2bee933a9efec", + [ + null, + {} + ] + ], + "css3-counter-styles-073.html": [ + "3e520e455bba31c5bc0eff6b5a0b855abf633929", + [ + null, + {} + ] + ], + "css3-counter-styles-074.html": [ + "f32a521319f7faf46b19f5e3cbc04f15c11359eb", + [ + null, + {} + ] + ], + "css3-counter-styles-075.html": [ + "bb7807e41face99c77116f6a2efc70b3bf82bb83", + [ + null, + {} + ] + ] + }, + "tamil": { + "css3-counter-styles-146.html": [ + "d0476babc7f41d46b80acec44392504605e5a101", + [ + null, + {} + ] + ], + "css3-counter-styles-147.html": [ + "4f5bfac30147e4344d21bd9af0473678d54c6148", + [ + null, + {} + ] + ], + "css3-counter-styles-148.html": [ + "948aa839b34e8cc831efe74860e61e900309034a", + [ + null, + {} + ] + ] + }, + "telugu": { + "css3-counter-styles-149.html": [ + "7bc24912043639dad18d93134d94ab2d8b19e2a5", + [ + null, + {} + ] + ], + "css3-counter-styles-150.html": [ + "50dd1f3ef5c5b036be7451d2d254b22524af47ea", + [ + null, + {} + ] + ], + "css3-counter-styles-151.html": [ + "141451c34c9e25b48dabc5ff4c2ee9ae6356480d", + [ + null, + {} + ] + ] + }, + "thai": { + "css3-counter-styles-152.html": [ + "74b8ece9323dd13d56101c4a5a23312222470706", + [ + null, + {} + ] + ], + "css3-counter-styles-153.html": [ + "a5918a6135b029bf9114b8ac134fcdcf165881a1", + [ + null, + {} + ] + ], + "css3-counter-styles-154.html": [ + "876c0ef925928b37869c4ef41f1dc7243331af13", + [ + null, + {} + ] + ] + }, + "tibetan": { + "css3-counter-styles-155.html": [ + "0467f6f6097c068f860188b0abd58ac6f6008c06", + [ + null, + {} + ] + ], + "css3-counter-styles-156.html": [ + "4dba20d69240ca8d352260dc3320c70d805186ea", + [ + null, + {} + ] + ], + "css3-counter-styles-157.html": [ + "5aeb79c11356dcc91712b310c6617eb442ee1f25", + [ + null, + {} + ] + ] + }, + "trad-chinese-formal": { + "css3-counter-styles-086.html": [ + "b47b091a2fb648254ea06a91f7165b352b0f5354", + [ + null, + {} + ] + ], + "css3-counter-styles-087.html": [ + "887d024f01127f87a59cf17c73c2cc2b828aeb27", + [ + null, + {} + ] + ], + "css3-counter-styles-088.html": [ + "d97f156885b58b998482cf553b3c354c428825f0", + [ + null, + {} + ] + ], + "css3-counter-styles-089.html": [ + "69c24c88137373c7421ac406ef9f5cf486c95874", + [ + null, + {} + ] + ], + "css3-counter-styles-090.html": [ + "e5fbb361dbe57189f0d9952229dfd41acf4b2c05", + [ + null, + {} + ] + ] + }, + "trad-chinese-informal": { + "css3-counter-styles-081.html": [ + "89ec3f12c6346d49939b3a842b6c6d037e830903", + [ + null, + {} + ] + ], + "css3-counter-styles-082.html": [ + "bac46b3c85d944546a7db0ba5b55eacb9bf6081e", + [ + null, + {} + ] + ], + "css3-counter-styles-083.html": [ + "d8935b0a898af82e734592e4490eba3dcfa4af28", + [ + null, + {} + ] + ], + "css3-counter-styles-084.html": [ + "2387abd64a4d4e7f7a7828da4553be10913710ba", + [ + null, + {} + ] + ], + "css3-counter-styles-085.html": [ + "1dba111c3b9fff48b4e8ddb82d0f14e7d3887eca", + [ + null, + {} + ] + ] + }, + "upper-armenian": { + "css3-counter-styles-107.html": [ + "52a86fc22e5fa014eeb02b1cc2428f149005576e", + [ + null, + {} + ] + ], + "css3-counter-styles-108.html": [ + "5781ddc02876a77841c29c497650f81a1aaa4f56", + [ + null, + {} + ] + ], + "css3-counter-styles-109.html": [ + "f355f98613bab6673a3676ecea4b219bed429ca5", + [ + null, + {} + ] + ], + "css3-counter-styles-110.html": [ + "6a9baeb3be902832d2db69e95eedb7e5f590ce38", + [ + null, + {} + ] + ] + }, + "upper-roman": { + "css3-counter-styles-023.html": [ + "6c9828aa0fc1dcc2551ffda35166f53a17c34fa8", + [ + null, + {} + ] + ], + "css3-counter-styles-024.html": [ + "65b16180c4d2ba59402b3f2c203333dbd63085f6", + [ + null, + {} + ] + ], + "css3-counter-styles-024a.html": [ + "f51f74b541ac17259ea64a316a3ab2eee7f8c70c", + [ + null, + {} + ] + ], + "css3-counter-styles-025.html": [ + "9417d9e44f779109e3120cbab983c124e4eb0c66", + [ + null, + {} + ] + ], + "css3-counter-styles-026.html": [ + "e106e05377218f02cad15498d4cf22cd40f2be46", + [ + null, + {} + ] + ] + } + }, "css-flexbox": { "css-flexbox-height-animation-stretch.html": [ "7aa16aaeecea007ae40c9ddbd9d0e53e5cd9eaeb", @@ -6711,6 +7905,162 @@ ] } }, + "file-system-access": { + "local_FileSystemBaseHandle-IndexedDB-manual.https.html": [ + "211b190aad36db7cf98acf6a5bb25856f67c9d5e", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-isSameEntry-manual.https.html": [ + "d2ddc2dbdccca95dcb0f1cf2820714c14961f4c3", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html": [ + "f395b0b4c17e18ac36e835c0c39576f3fe30525c", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-Error-manual.https.html": [ + "67206e350966c9b75432bb095bf091b8d260bfbd", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html": [ + "35f23d8387d8b771e7e1e93729b59107e773f2f0", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html": [ + "922cbf556a13465898589fddfab05bda345d1dd0", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html": [ + "22ef3ba37d36a435f2aae874054e156e8bb67520", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-frames-manual.https.html": [ + "8eb9082708242947e29404df422da2a2b6753c98", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-windows-manual.https.html": [ + "2137ea368c94411278c78d6d993f0e305e3b6131", + [ + null, + {} + ] + ], + "local_FileSystemBaseHandle-postMessage-workers-manual.https.html": [ + "619a37cc972166cc691feccb24109073fa979f1c", + [ + null, + {} + ] + ], + "local_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html": [ + "63a88538e8b915e80d334949ca2b2b619d3e9654", + [ + null, + {} + ] + ], + "local_FileSystemDirectoryHandle-getFileHandle-manual.https.html": [ + "d16771bf450df6237bbd55b440b4789da2acf6e7", + [ + null, + {} + ] + ], + "local_FileSystemDirectoryHandle-iteration-manual.https.html": [ + "495ea5e0a095a4e3dab424e250d45797c6b5e955", + [ + null, + {} + ] + ], + "local_FileSystemDirectoryHandle-removeEntry-manual.https.html": [ + "765492e1e861779567df9f255628eb0f5ffb83df", + [ + null, + {} + ] + ], + "local_FileSystemDirectoryHandle-resolve-manual.https.html": [ + "0d539abb54e08f8bfbb06bcc5010cda3a53b83da", + [ + null, + {} + ] + ], + "local_FileSystemFileHandle-getFile-manual.https.html": [ + "9d8dede88949053c43bc3b15f28b335d9bb93198", + [ + null, + {} + ] + ], + "local_FileSystemWritableFileStream-manual.https.html": [ + "2db242c708d029893cea4294af15f5b751716fe1", + [ + null, + {} + ] + ], + "local_FileSystemWritableFileStream-piped-manual.https.html": [ + "296f75412e1c8e631e49e3b7a8320c60c718bc05", + [ + null, + {} + ] + ], + "local_FileSystemWritableFileStream-write-manual.https.html": [ + "eb9708740b584b83065f07b5a68b6c676915bd1d", + [ + null, + {} + ] + ], + "showDirectoryPicker-manual.https.html": [ + "d1abf93eafa47158cce34429eee0d288cc62e9ce", + [ + null, + {} + ] + ], + "showOpenFilePicker-manual.https.html": [ + "fd72b040c0c92d560b5bdcfda169b0c36b2ea098", + [ + null, + {} + ] + ], + "showSaveFilePicker-manual.https.html": [ + "332a1a42730dfa53403f8b7227338261e5162b42", + [ + null, + {} + ] + ] + }, "fullscreen": { "api": { "document-exit-fullscreen-manual.html": [ @@ -8747,162 +10097,6 @@ ] ] }, - "native-file-system": { - "native_FileSystemBaseHandle-IndexedDB-manual.https.html": [ - "c68df06de9ac53034f13fc39cbdfb876db29d60e", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-isSameEntry-manual.https.html": [ - "1d13d8bab6685dee9a6579707bf3e51a2ffe8939", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-BroadcastChannel-manual.https.html": [ - "07f8d9620d8e9466e63e1faa1f3dce27b2ba7d37", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-Error-manual.https.html": [ - "19fcb3ea71604d16011b33d49b8fac6db91e4625", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-MessagePort-frames-manual.https.html": [ - "81e545c5190b5f09e02ddd5034587d2bf5c796a0", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-MessagePort-windows-manual.https.html": [ - "1b583d0c395d6475565be6516e3d12199362a5dd", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-MessagePort-workers-manual.https.html": [ - "22d0bf5a72319f24b4b4541054a937e918aa3d8e", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-frames-manual.https.html": [ - "6d5c5ab78ab8ef8f4fd68d3c6a540b17a4a4ca29", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-windows-manual.https.html": [ - "ad1e8e7bcf31b200b84f7c2415cea1b308f75052", - [ - null, - {} - ] - ], - "native_FileSystemBaseHandle-postMessage-workers-manual.https.html": [ - "bc1fc5087a61f2df630e23c0e7efaa69ee4c4fab", - [ - null, - {} - ] - ], - "native_FileSystemDirectoryHandle-getDirectoryHandle-manual.https.html": [ - "03672321e2d8d7464dbe9a688a69bf78e4dc8f2b", - [ - null, - {} - ] - ], - "native_FileSystemDirectoryHandle-getFileHandle-manual.https.html": [ - "94b31226f8d600ef60c2412203b9b941d60d0930", - [ - null, - {} - ] - ], - "native_FileSystemDirectoryHandle-iteration-manual.https.html": [ - "10d891098dee36fffe58cbc472200add4fb58490", - [ - null, - {} - ] - ], - "native_FileSystemDirectoryHandle-removeEntry-manual.https.html": [ - "cedb87587cee3b68f4edf76060679407f61b3c59", - [ - null, - {} - ] - ], - "native_FileSystemDirectoryHandle-resolve-manual.https.html": [ - "9c001b366b9d24e5d55e88409650b4454f2ddac7", - [ - null, - {} - ] - ], - "native_FileSystemFileHandle-getFile-manual.https.html": [ - "5a0b1d97b05a48c178cf86e6c766565fa87a7ef0", - [ - null, - {} - ] - ], - "native_FileSystemWritableFileStream-manual.https.html": [ - "56ff51cd05a7e7088520ab0fbf77ff378a530b4f", - [ - null, - {} - ] - ], - "native_FileSystemWritableFileStream-piped-manual.https.html": [ - "f6c6e6009aadf2b4c37b7926dfcd06962701fefa", - [ - null, - {} - ] - ], - "native_FileSystemWritableFileStream-write-manual.https.html": [ - "280edc27e5ad6f7a18e5f4c476a189efd6418e43", - [ - null, - {} - ] - ], - "showDirectoryPicker-manual.https.html": [ - "5dadbe1a9d5c605378415f4b5be3f430c634aa5b", - [ - null, - {} - ] - ], - "showOpenFilePicker-manual.https.html": [ - "e6405a9c8c6c0fdea68edf74bd41dfc6572dbd42", - [ - null, - {} - ] - ], - "showSaveFilePicker-manual.https.html": [ - "3a20f1428d903ac518bfbaa668cbc754166eb0ce", - [ - null, - {} - ] - ] - }, "notifications": { "body-basic-manual.html": [ "a479917aeef9f3b777d152148a3b75cb8df7f494", @@ -60346,6 +61540,21 @@ ] ] }, + "css-counter-styles": { + "broken-symbols.htm": [ + "d449161b1d490c5edaa6940f3a7ba9b81b1d749f", + [ + null, + [ + [ + "/css/css-counter-styles/broken-symbols-ref.htm", + "==" + ] + ], + {} + ] + ] + }, "css-display": { "display-change-iframe.html": [ "5fc53274e2ac5e16278fd20799ba60a74f2ec41b", @@ -96867,13 +98076,39 @@ {} ] ], - "highlight-painting-order.html": [ - "5a1004e0a074bb62c614c0b9230f9771853d70f2", + "highlight-painting-001.html": [ + "2994527d8d821653b4e106408a0984b7c5031790", [ null, [ [ - "/css/css-pseudo/highlight-painting-order-ref.html", + "/css/css-pseudo/highlight-painting-001-ref.html", + "==" + ] + ], + {} + ] + ], + "highlight-painting-002.html": [ + "213e943c000444be934191d7d63b9a356ecf2521", + [ + null, + [ + [ + "/css/css-pseudo/highlight-painting-002-ref.html", + "==" + ] + ], + {} + ] + ], + "highlight-painting-003.html": [ + "2ac688925439e376cf012e3b50c2d0b38982dce9", + [ + null, + [ + [ + "/css/css-pseudo/highlight-painting-003-ref.html", "==" ] ], @@ -175870,7 +177105,7 @@ ], "resources": { "helpers.js": [ - "c67d684652884c99dce7c29c6121952941743641", + "8bac86b9b913c3d7b7b2e44d9f577a91985046de", [] ], "non-main-frame-select.html": [ @@ -177250,6 +178485,10 @@ ], "attributes": { "resources": { + "domain-child.sub.html": [ + "72ec083b7867b1ef8daa6266deeb59ccd12dde4c", + [] + ], "path": { "one.html": [ "3c5af1cb205daaef2561acf00fc4f01f87a5e193", @@ -177265,13 +178504,17 @@ ] }, "path-redirect-shared.js": [ - "83a614117cd54c23540a7405e15dcbedf96cfa00", + "1c2fec0fd5215547cccfffa4955a3b364021dc5d", [] ], "path.html": [ "3c5af1cb205daaef2561acf00fc4f01f87a5e193", [] ], + "path.html.headers": [ + "23de552c1a40a8276d43e1f99e26acb0dbfc3986", + [] + ], "pathfakeout": { "one.html": [ "3c5af1cb205daaef2561acf00fc4f01f87a5e193", @@ -177307,18 +178550,10 @@ ] }, "http-state": { - "domain-tests-expected.txt": [ - "cc37bc7be2641eed57db710358d089c8d75594fd", - [] - ], "ordering-tests-expected.txt": [ "d9ef0913b9fad0c3cacb105351849e8e9abc5ede", [] ], - "path-tests-expected.txt": [ - "d901fbecc35943d3d409f84e712a677aed962687", - [] - ], "resources": { "all-tests.html.py-str": [ "474e0cb2cd5681c2bd5beb6afc501dfca13ae734", @@ -177345,366 +178580,6 @@ [] ], "test-files": { - "domain0001-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0001-test": [ - "fd8926d7b4fc22c84aa0bb247e3e50632ef71ff3", - [] - ], - "domain0002-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0002-test": [ - "a6ad2a80856c6eca623560ce640ee47ecc3777da", - [] - ], - "domain0003-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0003-test": [ - "ff051f4806c94b1e45dd58dab8f819965b4bd74c", - [] - ], - "domain0004-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0004-test": [ - "f05029bb5a74f2d2b982ff5abf88c3a38e1200b6", - [] - ], - "domain0005-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0005-test": [ - "697ab186fcde49bf34cf169db27ae8d0ae4927f2", - [] - ], - "domain0006-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0006-test": [ - "fe5f90df9dc00b989a4456700677573bbb6aebe4", - [] - ], - "domain0007-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0007-test": [ - "1d2c6fcec6270b002960a719cdff5db8a549d675", - [] - ], - "domain0008-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0008-test": [ - "491c52de9da50c6f668007c0e6a367d049b3c019", - [] - ], - "domain0009-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0009-test": [ - "736e69fe8e5a8498c1f69fd504358c18913ab8e5", - [] - ], - "domain0010-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0010-test": [ - "5bf212f27d8e6312cad86941177a4d5e53a5eff1", - [] - ], - "domain0011-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0011-test": [ - "e1c54db25eda8ba96a7adfd40ea316e1bff4aa85", - [] - ], - "domain0012-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0012-test": [ - "a189f38087a66eefba14ad25b86d6e9135f53ef6", - [] - ], - "domain0013-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0013-test": [ - "8493146e767a9f57eb6ad29a8be2cbd19ca956d7", - [] - ], - "domain0014-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0014-test": [ - "adccd0d3205c71ec3c6b4e8810f80595cff26033", - [] - ], - "domain0015-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0015-test": [ - "c123ba940d31f5e01322579ddd7473b72d9844a6", - [] - ], - "domain0016-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0016-test": [ - "9136ac4d86a80bef4ad4b461d36b9b5a8704911d", - [] - ], - "domain0017-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0017-test": [ - "8e876b8d687072ffb127d6e89b725076b41c38c6", - [] - ], - "domain0018-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0018-test": [ - "3763f9625ef867ad4218de70b5ea06ecae87d0e4", - [] - ], - "domain0019-expected": [ - "1f359c4850bae230784cda7633e3db91ff0f0ee0", - [] - ], - "domain0019-test": [ - "f5aebfd0e10e1b4d39740d1cec7d98a6a757fd7c", - [] - ], - "domain0020-expected": [ - "5eb3ac42d41ac5d9e78a50c6f9f6065651cddac6", - [] - ], - "domain0020-test": [ - "1c7a61c85f6ed7d652b42c3ed23980648bf081ea", - [] - ], - "domain0021-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0021-test": [ - "895744eac5da0a574381b8be74ad96298cc47567", - [] - ], - "domain0022-expected": [ - "1f359c4850bae230784cda7633e3db91ff0f0ee0", - [] - ], - "domain0022-test": [ - "6eeae00159fa2c7350427da96ffbb7b7a46ae7a4", - [] - ], - "domain0023-expected": [ - "5eb3ac42d41ac5d9e78a50c6f9f6065651cddac6", - [] - ], - "domain0023-test": [ - "91a81ed003c55f597dbd15ad7cacc44e22215a67", - [] - ], - "domain0024-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0024-test": [ - "63157b9b4575bc24f424c07ce3b721a8c16ab328", - [] - ], - "domain0025-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0025-test": [ - "353c3bb63461a3599b1c630fada4b3b9173136f2", - [] - ], - "domain0026-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0026-test": [ - "3b14e3075468947ccd7ac5af4aba7c49b8725f78", - [] - ], - "domain0027-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0027-test": [ - "8b7adbd17a17717b7987be1bbc5756dd75050e0d", - [] - ], - "domain0028-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0028-test": [ - "ab8f2c401ebefc02538ec906ec53ee9e29d4ce65", - [] - ], - "domain0029-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0029-test": [ - "cfab57a6e497b65866525e7adbc58c27418288ba", - [] - ], - "domain0031-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0031-test": [ - "6eccb78b8b83ff1d10c1c54ff3f64d87095d63e1", - [] - ], - "domain0033-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0033-test": [ - "7fdcc8356a11456b095e7dcf230373c665b399e1", - [] - ], - "domain0034-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0034-test": [ - "d3f4723fd08ee9502047190ece283fd5f173b78e", - [] - ], - "domain0035-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0035-test": [ - "967d248c25663a97f3f824c5f6b792abee88b28c", - [] - ], - "domain0036-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0036-test": [ - "a618ec4dd203bb73d32ccf357aadcd96d93271e9", - [] - ], - "domain0037-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0037-test": [ - "c61fe8f27629bd8dbefa8c69252ebca22d6bca76", - [] - ], - "domain0038-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0038-test": [ - "2d8fcca573141f8a08cc94f40d03fe1bef615467", - [] - ], - "domain0039-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0039-test": [ - "3225b28baacb8ebce7bbdb1a437da7b3ea4c7fa5", - [] - ], - "domain0040-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "domain0040-test": [ - "3e32fa895c357326a566bbb2643069a09ec29f38", - [] - ], - "domain0041-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0041-test": [ - "6fbc4ad1141721adacaaaafac1083f7d68552aff", - [] - ], - "domain0042-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "domain0042-test": [ - "9258624cc56f45f386609c7244e27847e15673ce", - [] - ], - "mozilla0011-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "mozilla0011-test": [ - "bba20536edd738acdc0d7fa8e5f0cf30050c961f", - [] - ], - "optional-domain0030-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "optional-domain0030-test": [ - "3ab75aa3a07894934f9df01f448dee383a629acb", - [] - ], - "optional-domain0041-expected": [ - "b14d4f69b58c3d9cc7ed1f363d42d625e7bdcf8c", - [] - ], - "optional-domain0041-test": [ - "b85a6c9e43cbed1899cff10c6ca53916176d98db", - [] - ], - "optional-domain0042-expected": [ - "8b137891791fe96927ad78e64b0aad7bded08bdc", - [] - ], - "optional-domain0042-test": [ - "524d192b6e7e3a4ef89669267f0451ab0066d18c", - [] - ], - "optional-domain0043-expected": [ - "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - [] - ], - "optional-domain0043-test": [ - "506cdc46e521578b6c6ba491b499779bf05f55fc", - [] - ], "ordering0001-expected": [ "3d819593f5365165bfa02550e48084f37c81c33f", [] @@ -177726,7 +178601,7 @@ [] ], "cookie-test.js": [ - "56e958263d9771efcdc19048a496753f3c87384d", + "67c54bc10594ac4e8814a96aa031e6ff786c2861", [] ], "cookie.py": [ @@ -186024,6 +186899,26 @@ ] } }, + "css-counter-styles": { + "META.yml": [ + "9b220d37977710ab6f04cbd9685826f28ebdd59a", + [] + ], + "README": [ + "df60c5800acbc449917b82504fe6a8c44649ec66", + [] + ], + "broken-symbols-ref.htm": [ + "0247f65d3e0bd0db6de4403e1da90dae2cd42de1", + [] + ], + "support": { + "counter-style-testcommon.js": [ + "a3615e92ff0678d5e7b2aad0a20076cd1ac07d6e", + [] + ] + } + }, "css-device-adapt": { "META.yml": [ "f04eba57ce450541e9283f62718dd3ed71f3631c", @@ -200645,8 +201540,16 @@ "ecdb308f2f426af4f2763fabb30f7244f42fcf62", [] ], - "highlight-painting-order-ref.html": [ - "827ee9433bec0246425abf9c249135355b3b2490", + "highlight-painting-001-ref.html": [ + "7ca31dbcf99e3538b83954af1b3b8cebd507d68b", + [] + ], + "highlight-painting-002-ref.html": [ + "81bf812d95e76715349b621ad797c1f9abbe707e", + [] + ], + "highlight-painting-003-ref.html": [ + "2be2d97a3da2f62f083c3d38bff8a2b9bb79a64e", [] ], "highlight-z-index-001-ref.html": [ @@ -215943,7 +216846,7 @@ [] ], "requirements.txt": [ - "03ce983831da5d30ad423f9030cb612b30a9fb91", + "281c9229ef878e458076ac4ecaa344e8f67337e4", [] ], "reviewing-tests": { @@ -221015,6 +221918,158 @@ ] } }, + "file-system-access": { + "DIR_METADATA": [ + "3fe14ca40e52343cd7f7a3478f3f8b770e2e2ce0", + [] + ], + "META.yml": [ + "b4eaf1a49c5d1d841b116a4ec272b7b2b60dc87a", + [] + ], + "OWNERS": [ + "a6d4f2cbf2081458db85b226b5ab69ff9e6fc474", + [] + ], + "README.md": [ + "b007264cea5db3c1ad6f2825ae44b149445dcaec", + [] + ], + "resources": { + "data": { + "testfile.txt": [ + "980a0d5f19a64b4b30a87d4206aade58726b60e3", + [] + ] + }, + "local-fs-test-helpers.js": [ + "1f944b0ad6a856c2d0881df5a322f5ab7ee4e387", + [] + ], + "message-target-dedicated-worker.js": [ + "26ff23ef8ac65009c3c5efd4bdeda3970ae93910", + [] + ], + "message-target-service-worker.js": [ + "4a6174ae3b5539300954f6f36782a96a066b4889", + [] + ], + "message-target-shared-worker.js": [ + "6829c61d4cf9f32f4834ae09ffba1d614b0430a0", + [] + ], + "message-target.html": [ + "32c7f0c56c61d4d2f6e432dd3c38f8afe91f9762", + [] + ], + "message-target.js": [ + "1e9ef636a33a2203dab7560f077c528578a0eeaf", + [] + ], + "messaging-blob-helpers.js": [ + "852f2e2d3213075ce738fbc2bb5ac4a1f4008ad6", + [] + ], + "messaging-helpers.js": [ + "55fc04ab817aeac2ccf13e716030264666b79d97", + [] + ], + "messaging-serialize-helpers.js": [ + "ada68f43db50683ec3350e243ebe8da6966e8196", + [] + ], + "opaque-origin-sandbox.html": [ + "63ada267d8cee589989bc7758b0b5378e6af91b9", + [] + ], + "sandboxed-fs-test-helpers.js": [ + "f6cfd4b0aab82d20d4ee422107837240f2e3ae3d", + [] + ], + "test-helpers.js": [ + "27469349cdeaa8eb02fd3b8e19ed9a4cff2a6081", + [] + ] + }, + "script-tests": { + "FileSystemBaseHandle-IndexedDB.js": [ + "855e52f04ddf2f4f8641524010216c6e8c7cdda7", + [] + ], + "FileSystemBaseHandle-isSameEntry.js": [ + "8c0b3521c3faed445e95f4fded160d5ac497e578", + [] + ], + "FileSystemBaseHandle-postMessage-BroadcastChannel.js": [ + "6c3ae7d49bc7c9a2cb49c6b214b3ec022a8790d4", + [] + ], + "FileSystemBaseHandle-postMessage-Error.js": [ + "0b9dc6b033f379b227aac84d8e9ed63520d50514", + [] + ], + "FileSystemBaseHandle-postMessage-MessagePort-frames.js": [ + "89343f3948de3bdfa52ecd9463489dffc6cada32", + [] + ], + "FileSystemBaseHandle-postMessage-MessagePort-windows.js": [ + "78b3176bf813d037ed71fad75281ca8cf3e3e191", + [] + ], + "FileSystemBaseHandle-postMessage-MessagePort-workers.js": [ + "8e46edc88a9e030b1e963598659eb3148a552b18", + [] + ], + "FileSystemBaseHandle-postMessage-frames.js": [ + "009a030a4f01fc4d1c2ba3d9b616cc32c0d27398", + [] + ], + "FileSystemBaseHandle-postMessage-windows.js": [ + "83bf8c64297c2962e4cf2f597d16bb26f31f167f", + [] + ], + "FileSystemBaseHandle-postMessage-workers.js": [ + "f7abf65554b783e6a1ab6ee0d3f3b2142d22c991", + [] + ], + "FileSystemDirectoryHandle-getDirectoryHandle.js": [ + "48a4ce4ce69e8f6823db6fdd0c83a2a0c3378f32", + [] + ], + "FileSystemDirectoryHandle-getFileHandle.js": [ + "dddd67a705808c65f759741956c3b2e16114f43d", + [] + ], + "FileSystemDirectoryHandle-iteration.js": [ + "3e721a0f017f0b393dba05a4f3b8dc098f6c0698", + [] + ], + "FileSystemDirectoryHandle-removeEntry.js": [ + "5b25ed6874fe95d4b076af974d5d2d27e471378d", + [] + ], + "FileSystemDirectoryHandle-resolve.js": [ + "a8900f97e54523f29bdc9afcd021d32c9dbb0e08", + [] + ], + "FileSystemFileHandle-getFile.js": [ + "80593418bb1622b76e440a1c55cd745c59b8a582", + [] + ], + "FileSystemWritableFileStream-piped.js": [ + "64637c9febf4027d3368d0f589b542c321ed424b", + [] + ], + "FileSystemWritableFileStream-write.js": [ + "141a9771d2a93201b0484a2f4104795c5364b315", + [] + ], + "FileSystemWritableFileStream.js": [ + "1cebb993556f0da7785e9f9df8b3d47f4d4229cd", + [] + ] + } + }, "focus": { "activeelement-after-focusing-different-site-iframe-contentwindow-expected.txt": [ "74adb0b7433b8aa68213fb8e1c17541348e099d0", @@ -222294,7 +223349,7 @@ ], "resources": { "generic-sensor-helpers.js": [ - "59855742ce4db245f8f2e10c55e323126dcde564", + "7070daa0516ea37ca69be5e48c5908f0b1e0dec4", [] ], "iframe_sensor_handler.html": [ @@ -225815,7 +226870,7 @@ [] ], "transformations.yaml": [ - "ffb1e85ec041d5516d133a04edfa597710ff57ef", + "add421e4eb5aa83614c66a8d73fb358293daf760", [] ], "video.yaml": [ @@ -226105,6 +227160,10 @@ "universal-worker.js": [ "5d46edcde24c1854c19069d967038c493d7e24f0", [] + ], + "worker-owner-frame.html": [ + "092fed9604eac35e1ffd31b7c98bcbde5735d088", + [] ] }, "sandbox.https.html.headers": [ @@ -236066,7 +237125,7 @@ [] ], "idle-detection-helper.js": [ - "5d085461835c44090c7fbe45aab874fc9e9e7899", + "f053e635e0bd568ca67fa406278eddd2d9cf3898", [] ], "idlharness-worker.js": [ @@ -237324,6 +238383,10 @@ "a9304e90ef886bd9db5356258e84f700418d4393", [] ], + "file-system-access.idl": [ + "3eda19c9d84af81a8eecc5ef3f0ea06753290301", + [] + ], "filter-effects.idl": [ "b17ebf67890981804f7a0fc657fb77a9f0fee748", [] @@ -237472,10 +238535,6 @@ "a41abb55eaeef0abc0695384477f1cd63ddf78ad", [] ], - "native-file-system.idl": [ - "3eda19c9d84af81a8eecc5ef3f0ea06753290301", - [] - ], "navigation-timing.idl": [ "9b0f784231731ce583e2f18290a93303bfa56be2", [] @@ -238070,7 +239129,7 @@ ] }, "lint.ignore": [ - "e296376fb69cdef8d293d3b13fb620eb20016553", + "72e26ff785294cc6036b5417349642a39108bdc9", [] ], "loading": { @@ -239656,7 +240715,7 @@ ], "resources": { "imagecapture-helpers.js": [ - "8301b1c2b64ad5567d13b33be7a37d04ed89fdaf", + "8f142cff4194a4d6d899e403c3219eaa90b1a5ef", [] ] } @@ -240251,158 +241310,6 @@ [] ] }, - "native-file-system": { - "DIR_METADATA": [ - "3fe14ca40e52343cd7f7a3478f3f8b770e2e2ce0", - [] - ], - "META.yml": [ - "b4eaf1a49c5d1d841b116a4ec272b7b2b60dc87a", - [] - ], - "OWNERS": [ - "a6d4f2cbf2081458db85b226b5ab69ff9e6fc474", - [] - ], - "README.md": [ - "6905a68e7901ce26bc1a363062304e1536604400", - [] - ], - "resources": { - "data": { - "testfile.txt": [ - "980a0d5f19a64b4b30a87d4206aade58726b60e3", - [] - ] - }, - "message-target-dedicated-worker.js": [ - "26ff23ef8ac65009c3c5efd4bdeda3970ae93910", - [] - ], - "message-target-service-worker.js": [ - "4a6174ae3b5539300954f6f36782a96a066b4889", - [] - ], - "message-target-shared-worker.js": [ - "6829c61d4cf9f32f4834ae09ffba1d614b0430a0", - [] - ], - "message-target.html": [ - "32c7f0c56c61d4d2f6e432dd3c38f8afe91f9762", - [] - ], - "message-target.js": [ - "98c726eea06610f84ea84f02b8706dc873094575", - [] - ], - "messaging-blob-helpers.js": [ - "852f2e2d3213075ce738fbc2bb5ac4a1f4008ad6", - [] - ], - "messaging-helpers.js": [ - "279c5d1d12f73db773b3806575eac79362a178e4", - [] - ], - "messaging-serialize-helpers.js": [ - "3df2d48e086fcea8deb52183dcea59cc09eafdd1", - [] - ], - "native-fs-test-helpers.js": [ - "1f944b0ad6a856c2d0881df5a322f5ab7ee4e387", - [] - ], - "opaque-origin-sandbox.html": [ - "63ada267d8cee589989bc7758b0b5378e6af91b9", - [] - ], - "sandboxed-fs-test-helpers.js": [ - "a7506b6b2f3d10c2709d161d9e886c748b63f3f0", - [] - ], - "test-helpers.js": [ - "27469349cdeaa8eb02fd3b8e19ed9a4cff2a6081", - [] - ] - }, - "script-tests": { - "FileSystemBaseHandle-IndexedDB.js": [ - "855e52f04ddf2f4f8641524010216c6e8c7cdda7", - [] - ], - "FileSystemBaseHandle-isSameEntry.js": [ - "8c0b3521c3faed445e95f4fded160d5ac497e578", - [] - ], - "FileSystemBaseHandle-postMessage-BroadcastChannel.js": [ - "7daf65e39b6f7776c46eb90d671c192b0ba4aca0", - [] - ], - "FileSystemBaseHandle-postMessage-Error.js": [ - "c4ae8363cc5041ad940a4365f4c81c33c755eaf2", - [] - ], - "FileSystemBaseHandle-postMessage-MessagePort-frames.js": [ - "29258cf65d27ed77700b2fbaadcc52de0282b939", - [] - ], - "FileSystemBaseHandle-postMessage-MessagePort-windows.js": [ - "cf70efaf2e7494a184769b39b4fab797aee9e3e8", - [] - ], - "FileSystemBaseHandle-postMessage-MessagePort-workers.js": [ - "756660a82a7e561052055453a826bfc74305048f", - [] - ], - "FileSystemBaseHandle-postMessage-frames.js": [ - "e34b17fb4140fb5ad5a070989160f5c65041f7e7", - [] - ], - "FileSystemBaseHandle-postMessage-windows.js": [ - "877795bbd2333d987bf43153e4a30e251c02ffbd", - [] - ], - "FileSystemBaseHandle-postMessage-workers.js": [ - "db8e55491f230c1d3767bf2c57625ffc08bb7d09", - [] - ], - "FileSystemDirectoryHandle-getDirectoryHandle.js": [ - "48a4ce4ce69e8f6823db6fdd0c83a2a0c3378f32", - [] - ], - "FileSystemDirectoryHandle-getFileHandle.js": [ - "dddd67a705808c65f759741956c3b2e16114f43d", - [] - ], - "FileSystemDirectoryHandle-iteration.js": [ - "3e721a0f017f0b393dba05a4f3b8dc098f6c0698", - [] - ], - "FileSystemDirectoryHandle-removeEntry.js": [ - "5b25ed6874fe95d4b076af974d5d2d27e471378d", - [] - ], - "FileSystemDirectoryHandle-resolve.js": [ - "a8900f97e54523f29bdc9afcd021d32c9dbb0e08", - [] - ], - "FileSystemFileHandle-getFile.js": [ - "80593418bb1622b76e440a1c55cd745c59b8a582", - [] - ], - "FileSystemWritableFileStream-piped.js": [ - "64637c9febf4027d3368d0f589b542c321ed424b", - [] - ], - "FileSystemWritableFileStream-write.js": [ - "141a9771d2a93201b0484a2f4104795c5364b315", - [] - ], - "FileSystemWritableFileStream.js": [ - "1cebb993556f0da7785e9f9df8b3d47f4d4229cd", - [] - ] - } - }, "native-io": { "DIR_METADATA": [ "61612cf5bf09116a06c8fd490c40d365a3572c2f", @@ -240660,7 +241567,7 @@ }, "resources": { "orientation-event-helpers.js": [ - "51154ad73765e498650f05e365837fe7fe30fdba", + "1f0deba278ee7ca21d48a8c378e3fedb16184ce0", [] ] } @@ -243936,10 +244843,6 @@ "make-html-script.js": [ "a013fa64b305b3ceca8a1014afd7e59ff7be7d10", [] - ], - "referrer-policy-unsafe-url-navigate-to-srcdoc.html": [ - "dfdfae1f0d83db7850149c516747a04cb393f795", - [] ] } }, @@ -244436,11 +245339,11 @@ ], "chromium": { "README.md": [ - "ec953033f9bf5b06bbd2a8b6eccf4fae4760185f", + "3813f6de5d7db8a5cbabf89b7642d8ac5fa2eb23", [] ], "contacts_manager_mock.js": [ - "443d50bbc62bef71e408ffba57eb6678772da224", + "2ace6d49ffa321a4b249a6971f1bb362cfb0de15", [] ], "enable-hyperlink-auditing.js": [ @@ -244448,11 +245351,11 @@ [] ], "fake-serial.js": [ - "46a79f0147afa46ff35ee1483bd3d33200b96b58", + "1a0f4b521787332a65179af2db675b913f6278e7", [] ], "generic_sensor_mocks.js": [ - "56438824518225a9b1e5c89f1f6b73aa7f4e57c0", + "b7b303b6f14d47b98558f26dfc7e4b5c377f18f3", [] ], "generic_sensor_mocks.js.headers": [ @@ -244460,7 +245363,7 @@ [] ], "mock-barcodedetection.js": [ - "c11f879b5b6e0ce43bffef7f8f5cabe6fba51632", + "b0d2e0af0ae40c620c952fe71e4d3818e3a908e2", [] ], "mock-barcodedetection.js.headers": [ @@ -244468,7 +245371,7 @@ [] ], "mock-facedetection.js": [ - "1275e4dd2f5e24988e723a728dbf5bb4acc4c6cb", + "7ae658621ee9c34b9dc1091777ef4ccaff950a02", [] ], "mock-facedetection.js.headers": [ @@ -244476,15 +245379,15 @@ [] ], "mock-idle-detection.js": [ - "d88d1ad1c55afaee243e1e9146827b073c380613", + "afc5b93f500b057d1238a98335b65f9de3d7a885", [] ], "mock-imagecapture.js": [ - "a8f5c896b1f2cc2c90240bd053d218c28dc549dd", + "97d45d453bdda968b2356acf0b129d2eb0347f64", [] ], "mock-screenenumeration.js": [ - "2e41f59ea809b6434d9363228b162dbcf3538f61", + "fc89b11ea106c8bda9f9deec300915e51fd26dd0", [] ], "mock-screenenumeration.js.header": [ @@ -244492,7 +245395,7 @@ [] ], "mock-textdetection.js": [ - "427ce38da21a9cd00e11aab313708f2719d8b094", + "52ca987e28639a93363b5496a0f0c14a46e2bb50", [] ], "mock-textdetection.js.headers": [ @@ -244500,7 +245403,7 @@ [] ], "nfc-mock.js": [ - "2665f3db6b3f2a887ec97d10db6c0123e6a2bb4e", + "6a0437a7975420bc802b2715a8707bf518092349", [] ], "web-bluetooth-test.js": [ @@ -244536,7 +245439,7 @@ [] ], "webxr-test.js": [ - "01d2ec23396a9fbe21d25fba90dc8dcd0f9bd0d3", + "2846adda6ab414a8593a4c83dc4dbe082adcb62b", [] ], "webxr-test.js.headers": [ @@ -244561,7 +245464,7 @@ [] ], "test-only-api.js": [ - "ef66e0e733f9c68004129d24b3c9ad12b9aa0708", + "a66eb44ede7c15a37fb1a3c5dd5d2abc17177c8d", [] ], "test-only-api.js.headers": [ @@ -244792,7 +245695,7 @@ ], "resources": { "screenenumeration-helpers.js": [ - "7d5d52219433d061fed6600c437e32f843be3d5b", + "d0e0d9c56bc1ec56ee3e5511312ae652c94997e4", [] ] } @@ -245054,7 +245957,7 @@ ], "resources": { "automation.js": [ - "98f67fb6282ceb866b63a3eb9bfa19d0dc0f1b2d", + "e88fdb1a9d23dfd601d5e9e6e11b560be07d577e", [] ], "common.js": [ @@ -247858,7 +248761,7 @@ ], "resources": { "shapedetection-helpers.js": [ - "05424de893dc9ac59d7f40c436bb73c9523da52f", + "1b4949b8f6bf00956786e3a33788669eb6f655be", [] ] } @@ -248602,6 +249505,14 @@ ] } }, + "crashtests": { + "support": { + "used.svg": [ + "37ce3f57629133e9436f75d122c24cf64bd15ade", + [] + ] + } + }, "embedded": { "reference": { "green-rect-100x100.svg": [ @@ -251454,7 +252365,7 @@ ], "resources": { "nfc-helpers.js": [ - "659f74ed8b128f8fb785eced13f90e21c53439b7", + "35154e287d8134e5a016b89f8ebfbe7db81748b8", [] ], "support-iframe.html": [ @@ -256324,7 +257235,7 @@ [] ], "webxr_util.js": [ - "fc4ca7d0d379cd81287723fcae0b6e70eeeaed22", + "8ca7918298bad1329cf9e0f39c7349070c3169ed", [] ] }, @@ -281432,6 +282343,17 @@ }, "cookies": { "attributes": { + "domain": { + "domain.sub.html": [ + "96e2ce071d00e4ef26b1e4c7890cceef9443270e", + [ + null, + { + "timeout": "long" + } + ] + ] + }, "expires.html": [ "d5683239486316958479ca32fa7fa08db8fc29a6", [ @@ -281442,7 +282364,7 @@ ] ], "invalid.html": [ - "04030c140acf84adc53597142ab09d0d59f9f8cc", + "4bc4247775d420eed97cb0ec82e77712abb4f214", [ null, { @@ -281545,15 +282467,6 @@ ] }, "http-state": { - "domain-tests.html": [ - "e4f763a935d52b0f9c9655d4073757d2f77451e8", - [ - null, - { - "timeout": "long" - } - ] - ], "ordering-tests.html": [ "4dce985ac71a0d48538dc7376dff7102a0fcd78f", [ @@ -285937,6 +286850,85 @@ ] ] }, + "css-counter-styles": { + "counter-style-additive-symbols-syntax.html": [ + "41747daede6d1bcef2d5ea7b5cd31a0ae7375e7e", + [ + null, + {} + ] + ], + "counter-style-fallback.html": [ + "5c844fbccf36dd8e1a15740e286573a10dc68552", + [ + null, + {} + ] + ], + "counter-style-name-syntax.html": [ + "a09bac7bec9f873048f45c13707c153006c257eb", + [ + null, + {} + ] + ], + "counter-style-negative-syntax.html": [ + "5314201e5dca1b490ba2eac0d26a00bb4e09bcd5", + [ + null, + {} + ] + ], + "counter-style-pad-syntax.html": [ + "18c151f045801b173e327ff067ac6468db933d4f", + [ + null, + {} + ] + ], + "counter-style-prefix-suffix-syntax.html": [ + "4f53b9afe648ec0084955147af6533dc7f4c75a6", + [ + null, + {} + ] + ], + "counter-style-range-syntax.html": [ + "26cea66a0e858a7d34c12966a72dfe618f0f2dfa", + [ + null, + {} + ] + ], + "counter-style-speak-as-syntax.html": [ + "f67896633ff1aecb7069fc3465850890142c2f3a", + [ + null, + {} + ] + ], + "counter-style-symbols-syntax.html": [ + "240ce8a16a31722d09452fd578fe3da05ee4a9f9", + [ + null, + {} + ] + ], + "counter-style-system-syntax.html": [ + "be593c436bba717042caa26472199fc0424b75da", + [ + null, + {} + ] + ], + "idlharness.html": [ + "e914b41b0e43a1e471af458c94c13690c4559c33", + [ + null, + {} + ] + ] + }, "css-device-adapt": { "documentElement-clientWidth-on-minimum-scale-size.tentative.html": [ "74e2172510f8496bda64bb2ae3600b0e165347fd", @@ -296926,21 +297918,21 @@ }, "aspect-ratio": { "parsing": { - "contain-intrinsic-size-computed.html": [ + "aspect-ratio-computed.html": [ "d98f6d1dcee3d7f06e11ba024c3f881d011b4495", [ null, {} ] ], - "contain-intrinsic-size-invalid.html": [ + "aspect-ratio-invalid.html": [ "d85df5a844850d354621e835134a5c81d8b77ea7", [ null, {} ] ], - "contain-intrinsic-size-valid.html": [ + "aspect-ratio-valid.html": [ "e825b7cdb451f0d71efc0c78ae78ed3bad2d142d", [ null, @@ -297609,6 +298601,13 @@ {} ] ], + "dynamic-rowspan-change.html": [ + "c02f84b4a5ad13c0984b5277af0230ae942dda4e", + [ + null, + {} + ] + ], "fixed-layout-1.html": [ "3e0d013af1c6970a1180cf19db37e8e7b82cc0c0", [ @@ -337667,6 +338666,883 @@ ] } }, + "file-system-access": { + "idlharness.https.any.js": [ + "ab182537356a8234e2d826ad64c5e1bd9954eabd", + [ + "file-system-access/idlharness.https.any.html", + { + "script_metadata": [ + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ], + [ + "file-system-access/idlharness.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "/resources/WebIDLParser.js" + ], + [ + "script", + "/resources/idlharness.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "opaque-origin.https.window.js": [ + "8f431a24062c11d9d4d90984e9b1580369dff001", + [ + "file-system-access/opaque-origin.https.window.html", + {} + ] + ], + "sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js": [ + "7f0fc4a7212db3c4bc19f59d0ce265ccf5536bae", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "/IndexedDB/support-promises.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-IndexedDB.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "/IndexedDB/support-promises.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-IndexedDB.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js": [ + "67d36dfae8ae05a4013af598ec72cda89f964628", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-isSameEntry.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-isSameEntry.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js": [ + "ca25b548cbbb4920bda1175c7af160b95b4de0f7", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.html", + { + "script_metadata": [ + [ + "script", + "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-BroadcastChannel.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js": [ + "16a7002a2add7950393756074cc8a94e4b21c5a8", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.html", + { + "script_metadata": [ + [ + "script", + "/common/get-host-info.sub.js" + ], + [ + "script", + "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-Error.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js": [ + "612c823295b6a338d48160e662dae424904b9b2c", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-MessagePort-frames.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js": [ + "28cec810ee34906bf7566900b3993c8ea57f2ab9", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-MessagePort-windows.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js": [ + "1599ba969d87b54ee870ad2732466fa272658813", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.html", + { + "script_metadata": [ + [ + "script", + "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-MessagePort-workers.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js": [ + "a0e41c51b181e0d787876811ae4e5949afcc7117", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-frames.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js": [ + "1e3de1ea399cf4b75531f3cf3a6c10242ca6c4f9", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-windows.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js": [ + "e690682b6ff7c388cfd8875665997f6b2e6f6283", + [ + "file-system-access/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.html", + { + "script_metadata": [ + [ + "script", + "/service-workers/service-worker/resources/test-helpers.sub.js" + ], + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "resources/messaging-helpers.js" + ], + [ + "script", + "resources/messaging-blob-helpers.js" + ], + [ + "script", + "resources/messaging-serialize-helpers.js" + ], + [ + "script", + "script-tests/FileSystemBaseHandle-postMessage-workers.js" + ], + [ + "timeout", + "long" + ] + ], + "timeout": "long" + } + ] + ], + "sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js": [ + "69ca2bf3677f25e2fac3dcc130894d783bc62231", + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js": [ + "afe362e757cf9ac98e840c31003a8a85d20100e5", + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-getFileHandle.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-getFileHandle.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemDirectoryHandle-iteration.https.any.js": [ + "3961ea3ea86cd209d69485e8301850db193f5c8d", + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-iteration.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-iteration.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-iteration.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-iteration.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js": [ + "a4be8bd267e743ee617c29c1cce1188e6b9d377a", + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-removeEntry.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-removeEntry.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemDirectoryHandle-resolve.https.any.js": [ + "6ee32709307cb930c8d56374841792fd70235915", + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-resolve.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-resolve.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemDirectoryHandle-resolve.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemDirectoryHandle-resolve.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemFileHandle-getFile.https.any.js": [ + "fb93858fe7934b27244fa0ff828eac75c34b6629", + [ + "file-system-access/sandboxed_FileSystemFileHandle-getFile.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemFileHandle-getFile.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemFileHandle-getFile.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemFileHandle-getFile.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemWritableFileStream-piped.https.any.js": [ + "eed6a561dc40e658b6b6c8d51766cdacc42a024c", + [ + "file-system-access/sandboxed_FileSystemWritableFileStream-piped.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "../streams/resources/recording-streams.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-piped.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemWritableFileStream-piped.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "../streams/resources/recording-streams.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-piped.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemWritableFileStream-write.https.any.js": [ + "7ef0ea0ef82626eae74f152b94f898859aca6832", + [ + "file-system-access/sandboxed_FileSystemWritableFileStream-write.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-write.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemWritableFileStream-write.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream-write.js" + ] + ] + } + ] + ], + "sandboxed_FileSystemWritableFileStream.https.any.js": [ + "16dbbe6a808a603c9b81482f733dcf09e84670ff", + [ + "file-system-access/sandboxed_FileSystemWritableFileStream.https.any.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream.js" + ] + ] + } + ], + [ + "file-system-access/sandboxed_FileSystemWritableFileStream.https.any.worker.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ], + [ + "script", + "resources/sandboxed-fs-test-helpers.js" + ], + [ + "script", + "script-tests/FileSystemWritableFileStream.js" + ] + ] + } + ] + ], + "showPicker-errors.https.window.js": [ + "2310c323d9f37d317a65e2bb6cdcc001ebfa3568", + [ + "file-system-access/showPicker-errors.https.window.html", + { + "script_metadata": [ + [ + "script", + "resources/test-helpers.js" + ] + ] + } + ] + ] + }, "focus": { "activeelement-after-focusing-different-site-iframe-contentwindow.html": [ "b16280acbd7a85abb183d6c23c7508f6ce2fe17f", @@ -347901,6 +349777,13 @@ {} ] ], + "2d.transformation.transform.3d.html": [ + "657fc5d20bd76b206973375cc393b8168e46cb93", + [ + null, + {} + ] + ], "2d.transformation.transform.identity.html": [ "a33209ee83c15846487e991341c9a2261e6279c1", [ @@ -347942,6 +349825,13 @@ null, {} ] + ], + "2d.transformation.translate3d.html": [ + "2fee078bb3c2c0d761fa9d7d70bb25991d6e39c5", + [ + null, + {} + ] ] }, "video": { @@ -359566,6 +361456,15 @@ } ] ], + "reporting-to-owner.https.html": [ + "03f7b3197dab5c4b97c0bfd91836ec3018c92443", + [ + null, + { + "timeout": "long" + } + ] + ], "require-corp-about-blank.https.html": [ "945333b83d54cf2148070f1a842e11155a14434c", [ @@ -370191,21 +372090,21 @@ }, "the-popup-element": { "popup-element-basic.tentative.html": [ - "3be3fae9ac9a5bbccc6784a1efb87240574207b8", + "0fcc7f40e94cd0d3794c27039caff840d063f407", [ null, {} ] ], "popup-shadow-dom.tentative.html": [ - "f17bdabac4b2bdd1f2e615e3bf90cf6ee1018059", + "eef0309a4db21cade0e0a24eff733b273b11457d", [ null, {} ] ], "popup-stacking.tentative.html": [ - "bcba6f064c033aa25291fa7ff4df4ddb4f63d29d", + "167b350c42925ecb23402657a1dda7ccee7422e5", [ null, {} @@ -380279,6 +382178,20 @@ {} ] ], + "add-remove-position-fixed.html": [ + "19a109e8d76422d6f39fdca5c04f942948ef3b97", + [ + null, + {} + ] + ], + "add-remove-position-sticky.html": [ + "a269dd156996b930aaef4ba78d5755ba830a5951", + [ + null, + {} + ] + ], "body-display-change.html": [ "0576bd6865084fac5d8c5ccc24285709d50f587e", [ @@ -385353,883 +387266,6 @@ ] ] }, - "native-file-system": { - "idlharness.https.any.js": [ - "9e7b52261ced9aef9a517b8db02788ce2e11ef6b", - [ - "native-file-system/idlharness.https.any.html", - { - "script_metadata": [ - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ], - [ - "native-file-system/idlharness.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "/resources/WebIDLParser.js" - ], - [ - "script", - "/resources/idlharness.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "opaque-origin.https.window.js": [ - "8f431a24062c11d9d4d90984e9b1580369dff001", - [ - "native-file-system/opaque-origin.https.window.html", - {} - ] - ], - "sandboxed_FileSystemBaseHandle-IndexedDB.https.any.js": [ - "7f0fc4a7212db3c4bc19f59d0ce265ccf5536bae", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "/IndexedDB/support-promises.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-IndexedDB.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemBaseHandle-IndexedDB.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "/IndexedDB/support-promises.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-IndexedDB.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemBaseHandle-isSameEntry.https.any.js": [ - "67d36dfae8ae05a4013af598ec72cda89f964628", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-isSameEntry.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemBaseHandle-isSameEntry.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-isSameEntry.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.js": [ - "ca25b548cbbb4920bda1175c7af160b95b4de0f7", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-BroadcastChannel.https.window.html", - { - "script_metadata": [ - [ - "script", - "/service-workers/service-worker/resources/test-helpers.sub.js" - ], - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-BroadcastChannel.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.js": [ - "16a7002a2add7950393756074cc8a94e4b21c5a8", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-Error.https.window.html", - { - "script_metadata": [ - [ - "script", - "/common/get-host-info.sub.js" - ], - [ - "script", - "/service-workers/service-worker/resources/test-helpers.sub.js" - ], - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-Error.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.js": [ - "612c823295b6a338d48160e662dae424904b9b2c", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-frames.https.window.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-MessagePort-frames.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.js": [ - "28cec810ee34906bf7566900b3993c8ea57f2ab9", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-windows.https.window.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-MessagePort-windows.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.js": [ - "1599ba969d87b54ee870ad2732466fa272658813", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-MessagePort-workers.https.window.html", - { - "script_metadata": [ - [ - "script", - "/service-workers/service-worker/resources/test-helpers.sub.js" - ], - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-MessagePort-workers.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.js": [ - "a0e41c51b181e0d787876811ae4e5949afcc7117", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-frames.https.window.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-frames.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.js": [ - "1e3de1ea399cf4b75531f3cf3a6c10242ca6c4f9", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-windows.https.window.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-windows.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.js": [ - "e690682b6ff7c388cfd8875665997f6b2e6f6283", - [ - "native-file-system/sandboxed_FileSystemBaseHandle-postMessage-workers.https.window.html", - { - "script_metadata": [ - [ - "script", - "/service-workers/service-worker/resources/test-helpers.sub.js" - ], - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "resources/messaging-helpers.js" - ], - [ - "script", - "resources/messaging-blob-helpers.js" - ], - [ - "script", - "resources/messaging-serialize-helpers.js" - ], - [ - "script", - "script-tests/FileSystemBaseHandle-postMessage-workers.js" - ], - [ - "timeout", - "long" - ] - ], - "timeout": "long" - } - ] - ], - "sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.js": [ - "69ca2bf3677f25e2fac3dcc130894d783bc62231", - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-getDirectoryHandle.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-getDirectoryHandle.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.js": [ - "afe362e757cf9ac98e840c31003a8a85d20100e5", - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-getFileHandle.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-getFileHandle.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-getFileHandle.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemDirectoryHandle-iteration.https.any.js": [ - "3961ea3ea86cd209d69485e8301850db193f5c8d", - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-iteration.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-iteration.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-iteration.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-iteration.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.js": [ - "a4be8bd267e743ee617c29c1cce1188e6b9d377a", - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-removeEntry.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-removeEntry.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-removeEntry.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemDirectoryHandle-resolve.https.any.js": [ - "6ee32709307cb930c8d56374841792fd70235915", - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-resolve.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemDirectoryHandle-resolve.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemDirectoryHandle-resolve.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemFileHandle-getFile.https.any.js": [ - "fb93858fe7934b27244fa0ff828eac75c34b6629", - [ - "native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemFileHandle-getFile.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemFileHandle-getFile.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemFileHandle-getFile.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemWritableFileStream-piped.https.any.js": [ - "eed6a561dc40e658b6b6c8d51766cdacc42a024c", - [ - "native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "../streams/resources/recording-streams.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream-piped.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemWritableFileStream-piped.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "../streams/resources/recording-streams.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream-piped.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemWritableFileStream-write.https.any.js": [ - "7ef0ea0ef82626eae74f152b94f898859aca6832", - [ - "native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream-write.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemWritableFileStream-write.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream-write.js" - ] - ] - } - ] - ], - "sandboxed_FileSystemWritableFileStream.https.any.js": [ - "16dbbe6a808a603c9b81482f733dcf09e84670ff", - [ - "native-file-system/sandboxed_FileSystemWritableFileStream.https.any.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream.js" - ] - ] - } - ], - [ - "native-file-system/sandboxed_FileSystemWritableFileStream.https.any.worker.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ], - [ - "script", - "resources/sandboxed-fs-test-helpers.js" - ], - [ - "script", - "script-tests/FileSystemWritableFileStream.js" - ] - ] - } - ] - ], - "showPicker-errors.https.window.js": [ - "2310c323d9f37d317a65e2bb6cdcc001ebfa3568", - [ - "native-file-system/showPicker-errors.https.window.html", - { - "script_metadata": [ - [ - "script", - "resources/test-helpers.js" - ] - ] - } - ] - ] - }, "native-io": { "close_async.tentative.https.any.js": [ "1a7c680084cebea00be6910306dc276378ac2050", @@ -404772,7 +405808,7 @@ ] ], "iframe-inheritance-javascript-child.html": [ - "e6df2098d472dfa4b26b85bc5b1da0ef0faeefb8", + "491f104de4b49b661d8595815000cae2f60423d9", [ null, {} @@ -404793,7 +405829,7 @@ ] ], "iframe-inheritance-srcdoc.html": [ - "356eedd4f48e6263d3f89b1557dfe285738924ac", + "5b76f8efccb25ef488fbff2ef2a45f4081fae199", [ null, {} @@ -411527,7 +412563,7 @@ ] ], "detection-options.https.html": [ - "db870e8e4708e535d844326907a6d85a0154a875", + "4b79da2a6e8dc129c367a7f2c3cf3da6832bcc27", [ null, {} @@ -412179,71 +413215,6 @@ ] }, "storage": { - "buckets": { - "buckets_basic.tentative.https.any.js": [ - "fffb9af10cc191e88c0309e279c99ce34a6b701d", - [ - "storage/buckets/buckets_basic.tentative.https.any.html", - { - "script_metadata": [ - [ - "title", - "Buckets API: Basic tests for openOrCreate(), keys(), delete()." - ], - [ - "global", - "window,worker" - ] - ] - } - ], - [ - "storage/buckets/buckets_basic.tentative.https.any.serviceworker.html", - { - "script_metadata": [ - [ - "title", - "Buckets API: Basic tests for openOrCreate(), keys(), delete()." - ], - [ - "global", - "window,worker" - ] - ] - } - ], - [ - "storage/buckets/buckets_basic.tentative.https.any.sharedworker.html", - { - "script_metadata": [ - [ - "title", - "Buckets API: Basic tests for openOrCreate(), keys(), delete()." - ], - [ - "global", - "window,worker" - ] - ] - } - ], - [ - "storage/buckets/buckets_basic.tentative.https.any.worker.html", - { - "script_metadata": [ - [ - "title", - "Buckets API: Basic tests for openOrCreate(), keys(), delete()." - ], - [ - "global", - "window,worker" - ] - ] - } - ] - ] - }, "estimate-indexeddb.https.any.js": [ "b0c6b944dd6ff83a00b38cac6d6c4e3ea8424979", [ @@ -432894,6 +433865,15 @@ {} ] ], + "RTCPeerConnection-capture-video.https.html": [ + "8d2579602a8deb8cec4335d1a804f2ce0d8bb403", + [ + null, + { + "timeout": "long" + } + ] + ], "RTCPeerConnection-connectionState.https.html": [ "d7716a1d4da19acaf3bd8c016543dd1c75b471d6", [ @@ -433076,6 +434056,15 @@ } ] ], + "RTCPeerConnection-relay-canvas.https.html": [ + "6e9cd068220d6f0ec2a8a77e215a40702f91ee75", + [ + null, + { + "timeout": "long" + } + ] + ], "RTCPeerConnection-remote-track-mute.https.html": [ "c280a7d44d8d2a477f2600c741ed68903e516651", [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/META.yml b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/META.yml new file mode 100644 index 0000000..9b220d37 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/META.yml
@@ -0,0 +1,5 @@ +spec: https://drafts.csswg.org/css-counter-styles/ +suggested_reviewers: + - r12a + - svgeesus + - tabatkins
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/README b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/README new file mode 100644 index 0000000..df60c580 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/README
@@ -0,0 +1,2 @@ +See http://www.w3.org/International/tests/ +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-101.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-101.html new file mode 100644 index 0000000..623e338 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-101.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>arabic-indic, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: arabic-indic produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: arabic-indic; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'><ol> +<li title='1'>١</li> +<li title='2'>٢</li> +<li title='3'>٣</li> +<li title='4'>٤</li> +<li title='5'>٥</li> +<li title='6'>٦</li> +<li title='7'>٧</li> +<li title='8'>٨</li> +<li title='9'>٩</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-102.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-102.html new file mode 100644 index 0000000..47ec8c20 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-102.html
@@ -0,0 +1,89 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>arabic-indic, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: arabic-indic produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: arabic-indic; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'> +<ol start='10'> +<li title='10'>١٠</li> +<li title='11'>١١</li> +<li title='12'>١٢</li> +</ol> +<ol start='43'> +<li title='43'>٤٣</li> +</ol> +<ol start='77'> +<li title='77'>٧٧</li> +</ol> +<ol start='80'> +<li title='80'>٨٠</li> +</ol> +<ol start='99'> +<li title='99'>٩٩</li> +<li title='100'>١٠٠</li> +<li title='101'>١٠١</li> +</ol> +<ol start='222'> +<li title='222'>٢٢٢</li> +</ol> +<ol start='540'> +<li title='540'>٥٤٠</li> +</ol> +<ol start='999'> +<li title='999'>٩٩٩</li> +<li title='1000'>١٠٠٠</li> +</ol> +<ol start='1005'> +<li title='1005'>١٠٠٥</li> +</ol> +<ol start='1060'> +<li title='1060'>١٠٦٠</li> +</ol> +<ol start='1065'> +<li title='1065'>١٠٦٥</li> +</ol> +<ol start='1800'> +<li title='1800'>١٨٠٠</li> +</ol> +<ol start='1860'> +<li title='1860'>١٨٦٠</li> +</ol> +<ol start='1865'> +<li title='1865'>١٨٦٥</li> +</ol> +<ol start='5865'> +<li title='5865'>٥٨٦٥</li> +</ol> +<ol start='7005'> +<li title='7005'>٧٠٠٥</li> +</ol> +<ol start='7800'> +<li title='7800'>٧٨٠٠</li> +</ol> +<ol start='7864'> +<li title='7864'>٧٨٦٤</li> +</ol> +<ol start='9999'> +<li title='9999'>٩٩٩٩</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-103.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-103.html new file mode 100644 index 0000000..01b959c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/arabic-indic/css3-counter-styles-103.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>arabic-indic, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: arabic-indic produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: arabic-indic; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title='1'>١.</li> +<li title='2'>٢.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-006.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-006.html new file mode 100644 index 0000000..dd11850 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-006.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>armenian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: armenian produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol> +<li title='1'>Ա</li> +<li title='2'>Բ</li> +<li title='3'>Գ</li> +<li title='4'>Դ</li> +<li title='5'>Ե</li> +<li title='6'>Զ</li> +<li title='7'>Է</li> +<li title='8'>Ը</li> +<li title='9'>Թ</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-007.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-007.html new file mode 100644 index 0000000..eb35fb1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-007.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>armenian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: armenian produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>Ժ</li></ol> +<ol start='11'><li title='11'>ԺԱ</li></ol> +<ol start='12'><li title='12'>ԺԲ</li></ol> +<ol start='43'><li title='43'>ԽԳ</li></ol> +<ol start='77'><li title='77'>ՀԷ</li></ol> +<ol start='80'><li title='80'>Ձ</li></ol> +<ol start='99'><li title='99'>ՂԹ</li></ol> +<ol start='100'><li title='100'>Ճ</li></ol> +<ol start='101'><li title='101'>ՃԱ</li></ol> +<ol start='222'><li title='222'>ՄԻԲ</li></ol> +<ol start='540'><li title='540'>ՇԽ</li></ol> +<ol start='999'><li title='999'>ՋՂԹ</li></ol> +<ol start='1000'><li title='1000'>Ռ</li></ol> +<ol start='1005'><li title='1005'>ՌԵ</li></ol> +<ol start='1060'><li title='1060'>ՌԿ</li></ol> +<ol start='1065'><li title='1065'>ՌԿԵ</li></ol> +<ol start='1800'><li title='1800'>ՌՊ</li></ol> +<ol start='1860'><li title='1860'>ՌՊԿ</li></ol> +<ol start='1865'><li title='1865'>ՌՊԿԵ</li></ol> +<ol start='5865'><li title='5865'>ՐՊԿԵ</li></ol> +<ol start='7005'><li title='7005'>ՒԵ</li></ol> +<ol start='7800'><li title='7800'>ՒՊ</li></ol> +<ol start='7865'><li title='7865'>ՒՊԿԵ</li></ol> +<ol start='9999'><li title='9999'>ՔՋՂԹ</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-008.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-008.html new file mode 100644 index 0000000..82440be --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-008.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>armenian, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: armenian produces counter values outside its ranges using its fallback style."> +<style type='text/css'> +ol li { list-style-type: armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='9999'><li title='9999'>ՔՋՂԹ</li></ol> +<ol start='10000'><li title='10000'>10000</li></ol> +<ol start='10001'><li title='10001'>10001</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-009.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-009.html new file mode 100644 index 0000000..b78a07cf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/armenian/css3-counter-styles-009.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>armenian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: armenian will produce a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class="test"><ol> +<li title='1'>Ա.</li> +<li title='2'>Բ.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-116.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-116.html new file mode 100644 index 0000000..d82af0d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-116.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>bengali, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:bengali produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: bengali; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">১</li> +<li title="2">২</li> +<li title="3">৩</li> +<li title="4">৪</li> +<li title="5">৫</li> +<li title="6">৬</li> +<li title="7">৭</li> +<li title="8">৮</li> +<li title="9">৯</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-117.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-117.html new file mode 100644 index 0000000..9fe3ba6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-117.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>bengali, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: bengali produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: bengali; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title="10">১০</li></ol> +<ol start="11"><li title="11">১১</li></ol> +<ol start="12"><li title="12">১২</li></ol> +<ol start="43"><li title="43">৪৩</li></ol> +<ol start="77"><li title="77">৭৭</li></ol> +<ol start="80"><li title="80">৮০</li></ol> +<ol start="99"><li title="99">৯৯</li></ol> +<ol start="100"><li title="100">১০০</li></ol> +<ol start="101"><li title="101">১০১</li></ol> +<ol start="222"><li title="222">২২২</li></ol> +<ol start="540"><li title="540">৫৪০</li></ol> +<ol start="999"><li title="999">৯৯৯</li></ol> +<ol start="1000"><li title="1000">১০০০</li></ol> +<ol start="1005"><li title="1005">১০০৫</li></ol> +<ol start="1060"><li title="1060">১০৬০</li></ol> +<ol start="1065"><li title="1065">১০৬৫</li></ol> +<ol start="1800"><li title="1800">১৮০০</li></ol> +<ol start="1860"><li title="1860">১৮৬০</li></ol> +<ol start="1865"><li title="1865">১৮৬৫</li></ol> +<ol start="5865"><li title="5865">৫৮৬৫</li></ol> +<ol start="7005"><li title="7005">৭০০৫</li></ol> +<ol start="7800"><li title="7800">৭৮০০</li></ol> +<ol start="7864"><li title="7864">৭৮৬৪</li></ol> +<ol start="9999"><li title="9999">৯৯৯৯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-118.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-118.html new file mode 100644 index 0000000..32c8c34 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/bengali/css3-counter-styles-118.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>bengali, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: bengali produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: bengali; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">১.</li> +<li title="2">২.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols-ref.htm b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols-ref.htm new file mode 100644 index 0000000..0247f65d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols-ref.htm
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<ol><li>Should have "1." as bullet point.</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols.htm b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols.htm new file mode 100644 index 0000000..d449161b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/broken-symbols.htm
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<meta charset="UTF-8"> +<title>CSS Test: invalid counter-style symbols</title> +<link rel="author" title="Anthony Ramine" href="mailto:n.oxyde@gmail.com"> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#typedef-symbol"> +<link rel="match" href="broken-symbols-ref.htm"> +<style type="text/css"> + @counter-style a { + system: alphabetic; + symbols: ⓐ inherit; + } +</style> +<ol style="list-style-type: a"><li>Should have "1." as bullet point.</ol>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-158.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-158.html new file mode 100644 index 0000000..ac7305c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-158.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cambodian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cambodian produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: cambodian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">១</li> +<li title="2">២</li> +<li title="3">៣</li> +<li title="4">៤</li> +<li title="5">៥</li> +<li title="6">៦</li> +<li title="7">៧</li> +<li title="8">៨</li> +<li title="9">៩</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-159.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-159.html new file mode 100644 index 0000000..cdb6bc4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-159.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cambodian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cambodian produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: cambodian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="11"><li title="11">១១</li></ol> +<ol start="12"><li title="12">១២</li></ol> +<ol start="43"><li title="43">៤៣</li></ol> +<ol start="77"><li title="77">៧៧</li></ol> +<ol start="80"><li title="80">៨០</li></ol> +<ol start="99"><li title="99">៩៩</li></ol> +<ol start="100"><li title="100">១០០</li></ol> +<ol start="101"><li title="101">១០១</li></ol> +<ol start="222"><li title="222">២២២</li></ol> +<ol start="540"><li title="540">៥៤០</li></ol> +<ol start="999"><li title="999">៩៩៩</li></ol> +<ol start="1000"><li title="1000">១០០០</li></ol> +<ol start="1005"><li title="1005">១០០៥</li></ol> +<ol start="1060"><li title="1060">១០៦០</li></ol> +<ol start="1065"><li title="1065">១០៦៥</li></ol> +<ol start="1800"><li title="1800">១៨០០</li></ol> +<ol start="1860"><li title="1860">១៨៦០</li></ol> +<ol start="5865"><li title="5865">៥៨៦៥</li></ol> +<ol start="7005"><li title="7005">៧០០៥</li></ol> +<ol start="7800"><li title="7800">៧៨០០</li></ol> +<ol start="7864"><li title="7864">៧៨៦៤</li></ol> +<ol start="9999"><li title="9999">៩៩៩៩</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-160.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-160.html new file mode 100644 index 0000000..0100bab9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cambodian/css3-counter-styles-160.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cambodian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cambodian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: cambodian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">១.</li> +<li title="2">២.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-001.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-001.html new file mode 100644 index 0000000..44c4bdf --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-001.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-decimal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-decimal produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-decimal; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'><ol> +<li title="1">一</li> +<li title="2">二</li> +<li title="3">三</li> +<li title="4">四</li> +<li title="5">五</li> +<li title="6">六</li> +<li title="7">七</li> +<li title="8">八</li> +<li title="9">九</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-004.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-004.html new file mode 100644 index 0000000..0cf970c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-004.html
@@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-decimal, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-decimal produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-decimal; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'> +<ol start="10"><li title="10">一〇</li></ol> +<ol start="11"><li title="11">一一</li></ol> +<ol start="12"><li title="12">一二</li></ol> +<ol start="43"><li title="43">四三</li></ol> +<ol start="77"><li title="77">七七</li></ol> +<ol start="80"><li title="80">八〇</li></ol> +<ol start="99"><li title="99">九九</li></ol> +<ol start="100"><li title="100">一〇〇</li></ol> +<ol start="101"><li title="101">一〇一</li></ol> +<ol start="222"><li title="222">二二二</li></ol> +<ol start="540"><li title="540">五四〇</li></ol> +<ol start="999"><li title="999">九九九</li></ol> +<ol start="1000"><li title="1000">一〇〇〇</li></ol> +<ol start="1005"><li title="1005">一〇〇五</li></ol> +<ol start="1060"><li title="1060">一〇六〇</li></ol> +<ol start="1065"><li title="1065">一〇六五</li></ol> +<ol start="1800"><li title="1800">一八〇〇</li></ol> +<ol start="1860"><li title="1860">一八六〇</li></ol> +<ol start="5865"><li title="5865">五八六五</li></ol> +<ol start="7005"><li title="7005">七〇〇五</li></ol> +<ol start="7800"><li title="7800">七八〇〇</li></ol> +<ol start="7864"><li title="7864">七八六四</li></ol> +<ol start="9999"><li title="9999">九九九九</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-005.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-005.html new file mode 100644 index 0000000..599323f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-decimal/css3-counter-styles-005.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-decimal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-decimal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +ol li { list-style-type: cjk-decimal; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">一、</li> +<li title="2">二、</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-201.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-201.html new file mode 100644 index 0000000..5803371 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-201.html
@@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-earthly-branch, 0-12</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:cjk-earthly-branch produces numbers up to 12 per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-earthly-branch; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">子</li> +<li title="2">丑</li> +<li title="3">寅</li> +<li title="4">卯</li> +<li title="5">辰</li> +<li title="6">巳</li> +<li title="7">午</li> +<li title="8">未</li> +<li title="9">申</li> +<li title="10">酉</li> +<li title="11">戌</li> +<li title="12">亥</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-202.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-202.html new file mode 100644 index 0000000..d7c19b7f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-202.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-earthly-branch, 13+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-earthly-branch produces numbers after 12 per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-earthly-branch; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="13"><li title="13">子子</li></ol> +<ol start="14"><li title="14">子丑</li></ol> +<ol start="77"><li title="77">巳辰</li></ol> +<ol start="80"><li title="80">巳未</li></ol> +<ol start="99"><li title="99">未寅</li></ol> +<ol start="100"><li title="100">未卯</li></ol> +<ol start="101"><li title="101">未辰</li></ol> +<ol start="222"><li title="222">子巳巳</li></ol> +<ol start="540"><li title="540">寅未亥</li></ol> +<ol start="999"><li title="999">巳戌寅</li></ol> +<ol start="1000"><li title="1000">巳戌卯</li></ol> +<ol start="1005"><li title="1005">巳戌申</li></ol> +<ol start="1060"><li title="1060">午卯卯</li></ol> +<ol start="1065"><li title="1065">午卯申</li></ol> +<ol start="1800"><li title="1800">亥辰亥</li></ol> +<ol start="1860"><li title="1860">亥酉亥</li></ol> +<ol start="5865"><li title="5865">寅卯未申</li></ol> +<ol start="7005"><li title="7005">寅亥午申</li></ol> +<ol start="7800"><li title="7800">卯巳子亥</li></ol> +<ol start="7864"><li title="7864">卯巳午卯</li></ol> +<ol start="9999"><li title="9999">辰申辰寅</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-203.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-203.html new file mode 100644 index 0000000..d7f3336 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-earthly-branch/css3-counter-styles-203.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-earthly-branch, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-earthly-branch produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-earthly-branch; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">子、</li> +<li title="2">丑、</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-204.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-204.html new file mode 100644 index 0000000..d96bf00f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-204.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-heavenly-stem, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:cjk-heavenly-stem produces numbers up to 12 per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-heavenly-stem; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">甲</li> +<li title="2">乙</li> +<li title="3">丙</li> +<li title="4">丁</li> +<li title="5">戊</li> +<li title="6">己</li> +<li title="7">庚</li> +<li title="8">辛</li> +<li title="9">壬</li> +<li title="10">癸</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-205.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-205.html new file mode 100644 index 0000000..73a4aee1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-205.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-heavenly-stem, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-heavenly-stem produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-heavenly-stem; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="11"><li title="11">甲甲</li></ol> +<ol start="12"><li title="12">甲乙</li></ol> +<ol start="43"><li title="43">丁丙</li></ol> +<ol start="77"><li title="77">庚庚</li></ol> +<ol start="80"><li title="80">庚癸</li></ol> +<ol start="99"><li title="99">壬壬</li></ol> +<ol start="100"><li title="100">壬癸</li></ol> +<ol start="101"><li title="101">癸甲</li></ol> +<ol start="222"><li title="222">乙乙乙</li></ol> +<ol start="540"><li title="540">戊丙癸</li></ol> +<ol start="999"><li title="999">壬壬壬</li></ol> +<ol start="1000"><li title="1000">壬壬癸</li></ol> +<ol start="1005"><li title="1005">壬癸戊</li></ol> +<ol start="1060"><li title="1060">癸戊癸</li></ol> +<ol start="1065"><li title="1065">癸己戊</li></ol> +<ol start="1800"><li title="1800">甲庚壬癸</li></ol> +<ol start="1860"><li title="1860">甲辛戊癸</li></ol> +<ol start="5865"><li title="5865">戊辛己戊</li></ol> +<ol start="7005"><li title="7005">己壬癸戊</li></ol> +<ol start="7800"><li title="7800">庚庚壬癸</li></ol> +<ol start="7864"><li title="7864">庚辛己丁</li></ol> +<ol start="9999"><li title="9999">壬壬壬壬</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-206.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-206.html new file mode 100644 index 0000000..0f47de4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/cjk-heavenly-stem/css3-counter-styles-206.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>cjk-heavenly-stem, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: cjk-heavenly-stem produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: cjk-heavenly-stem; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">甲、</li> +<li title="2">乙、</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-additive-symbols-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-additive-symbols-syntax.html new file mode 100644 index 0000000..41747da --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-additive-symbols-syntax.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-symbols"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_additive_symbols(value, expected) { + test_valid_counter_style_descriptor('additive-symbols', value, expected); +} + +function test_invalid_additive_symbols(value) { + test_invalid_counter_style_descriptor('additive-symbols', value); +} + +// [ <integer [0,∞]> && <symbol> ]# + +test_valid_additive_symbols('1 "X"'); +test_valid_additive_symbols('"X" 1', '1 "X"'); +test_valid_additive_symbols('5 "V", 1 "I"'); + +test_invalid_additive_symbols(''); + +// Weights must be non-negative +test_invalid_additive_symbols('-1 "X"'); + +// Weights must be in strictly decreasing order +test_invalid_additive_symbols('1 "I", 5 "V"'); +test_invalid_additive_symbols('1 "X", 1 "Y"'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-fallback.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-fallback.html new file mode 100644 index 0000000..5c844fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-fallback.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-fallback"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_fallback(value) { + test_valid_counter_style_descriptor('fallback', value); +} + +function test_invalid_fallback(value) { + test_invalid_counter_style_descriptor('fallback', value); +} + +// <counter-style-name> + +test_valid_fallback('bar'); + +// Counter style names are custom identifiers, not strings +test_invalid_fallback('"bar"'); + +// The following are not valid counter style names +test_invalid_fallback('none'); +test_invalid_fallback('initial'); +test_invalid_fallback('inherit'); +test_invalid_fallback('unset'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-name-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-name-syntax.html new file mode 100644 index 0000000..a09bac7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-name-syntax.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#the-counter-style-rule"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +test_valid_name('foo'); + +test_invalid_name(''); +test_invalid_name('none'); +test_invalid_name('initial'); +test_invalid_name('inherit'); +test_invalid_name('unset'); + +test_invalid_name('decimal'); +test_invalid_name('disc'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-negative-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-negative-syntax.html new file mode 100644 index 0000000..5314201 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-negative-syntax.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-negative"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_negative(value) { + test_valid_counter_style_descriptor('negative', value); +} + +function test_invalid_negative(value) { + test_invalid_counter_style_descriptor('negative', value); +} + +// <symbol> <symbol>? + +test_valid_negative('"X"'); +test_valid_negative('"X" "X"'); +test_invalid_negative('"X" "X" "X"'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-pad-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-pad-syntax.html new file mode 100644 index 0000000..18c151f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-pad-syntax.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-pad"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_pad(value, expected) { + test_valid_counter_style_descriptor('pad', value, expected); +} + +function test_invalid_pad(value) { + test_invalid_counter_style_descriptor('pad', value); +} + +// <integer [0,∞]> && <symbol> + +test_invalid_pad('10'); +test_invalid_pad('"X"'); +test_valid_pad('10 "X"'); +test_valid_pad('"X" 10', '10 "X"'); +test_invalid_pad('-1 "X"'); +test_invalid_pad('"X" -1'); +test_invalid_pad('10 "X" "Y"'); +test_invalid_pad('10 10 "X"'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-prefix-suffix-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-prefix-suffix-syntax.html new file mode 100644 index 0000000..4f53b9af --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-prefix-suffix-syntax.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-prefix"> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-suffix"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_prefix_suffix(value, expected) { + test_valid_counter_style_descriptor('prefix', value, expected); + test_valid_counter_style_descriptor('suffix', value, expected); +} + +function test_invalid_prefix_suffix(value) { + test_invalid_counter_style_descriptor('prefix', value); + test_invalid_counter_style_descriptor('suffix', value); +} + +// <symbol> +// <symbol> = <string> | <image> | <custom-ident> + +// string values +test_valid_prefix_suffix('"string"'); +test_valid_prefix_suffix('"initial"'); +test_valid_prefix_suffix('"inherit"'); +test_valid_prefix_suffix('"unset"'); + +// custom-ident values +test_valid_prefix_suffix('custom-ident') +test_invalid_prefix_suffix('initial'); +test_invalid_prefix_suffix('inherit'); +test_invalid_prefix_suffix('unset'); + +// image values +test_valid_prefix_suffix('url("https://example.com/foo.png")'); +test_valid_prefix_suffix('url(https://example.com/foo.png)', 'url("https://example.com/foo.png")'); +test_valid_prefix_suffix('linear-gradient(yellow, blue)'); + +// Must be exactly one symbol +test_invalid_prefix_suffix(''); +test_invalid_prefix_suffix('foo bar'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-range-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-range-syntax.html new file mode 100644 index 0000000..26cea66 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-range-syntax.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-range"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_range(value) { + test_valid_counter_style_descriptor('range', value); +} + +function test_invalid_range(value) { + test_invalid_counter_style_descriptor('range', value); +} + +// [ <integer> | infinite ]{2} ]# | auto + +test_valid_range('auto'); + +test_valid_range('infinite infinite'); +test_valid_range('infinite 0'); +test_valid_range('0 infinite'); + +test_valid_range('infinite 0, 5 10, 100 infinite'); +test_valid_range('infinite 10, 5 20, 15 infinite'); + +test_invalid_range(''); +test_invalid_range('0 -1'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-speak-as-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-speak-as-syntax.html new file mode 100644 index 0000000..f67896633 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-speak-as-syntax.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-speak_as"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_speak_as(value) { + test_valid_counter_style_descriptor('speak-as', value); +} + +function test_invalid_speak_as(value) { + test_invalid_counter_style_descriptor('speak-as', value); +} + +// auto | bullets | numbers | words | spell-out | <counter-style-name> + +test_valid_speak_as('auto'); +test_valid_speak_as('bullets'); +test_valid_speak_as('numbers'); +test_valid_speak_as('words'); +test_valid_speak_as('spell-out'); + +test_valid_speak_as('bar'); +test_valid_speak_as('spellout'); // 'spellout' is a valid counter style name + +test_invalid_speak_as('bullets numbers'); + +// The following are not valid counter style names +test_invalid_speak_as('none'); +test_invalid_speak_as('initial'); +test_invalid_speak_as('inherit'); +test_invalid_speak_as('unset'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-symbols-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-symbols-syntax.html new file mode 100644 index 0000000..240ce8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-symbols-syntax.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-symbols"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_symbols(value, expected) { + test_valid_counter_style_descriptor('symbols', value, expected); +} + +function test_invalid_symbols(value) { + test_invalid_counter_style_descriptor('symbols', value); +} + +// <symbol>+ + +test_valid_symbols('"X"'); +test_valid_symbols('"X" "X"'); +test_valid_symbols('ident "X"'); +test_valid_symbols('ident "X" url("foo.jpg")'); + +test_invalid_symbols(''); +test_invalid_symbols('initial "X" "X"'); +test_invalid_symbols('inherit "X" "X"'); +test_invalid_symbols('unset "X" "X"'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-system-syntax.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-system-syntax.html new file mode 100644 index 0000000..be593c4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/counter-style-system-syntax.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles-3/#counter-style-system"> +<link rel="author" href="mailto:xiaochengh@chromium.org"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="support/counter-style-testcommon.js"></script> +<script> +function test_valid_system(value) { + test_valid_counter_style_descriptor('system', value); +} + +function test_invalid_system(value) { + test_invalid_counter_style_descriptor('system', value); +} + +// cyclic | numeric | alphabetic | symbolic | additive | +// [fixed <integer>?] | [ extends <counter-style-name> ] + +test_valid_system('cyclic'); +test_valid_system('fixed'); +test_valid_system('fixed 100'); +test_valid_system('fixed -1'); +test_valid_system('symbolic'); +test_valid_system('alphabetic'); +test_valid_system('numeric'); +test_valid_system('additive'); +test_valid_system('extends bar'); + +test_invalid_system('float'); +test_invalid_system('cyclic cyclic'); + +// The following are not valid counter style names +test_invalid_system('extends none'); +test_invalid_system('extends initial'); +test_invalid_system('extends inherit'); +test_invalid_system('extends unset'); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-119.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-119.html new file mode 100644 index 0000000..4649251 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-119.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>devanagari, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:devanagari produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: devanagari; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">१</li> +<li title="2">२</li> +<li title="3">३</li> +<li title="4">४</li> +<li title="5">५</li> +<li title="6">६</li> +<li title="7">७</li> +<li title="8">८</li> +<li title="9">९</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-120.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-120.html new file mode 100644 index 0000000..29d10c0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-120.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>devanagari, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: devanagari produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: devanagari; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title="10">१०</li></ol> +<ol start="11"><li title="11">११</li></ol> +<ol start="12"><li title="12">१२</li></ol> +<ol start="43"><li title="43">४३</li></ol> +<ol start="77"><li title="77">७७</li></ol> +<ol start="80"><li title="80">८०</li></ol> +<ol start="99"><li title="99">९९</li></ol> +<ol start="100"><li title="100">१००</li></ol> +<ol start="101"><li title="101">१०१</li></ol> +<ol start="222"><li title="222">२२२</li></ol> +<ol start="540"><li title="540">५४०</li></ol> +<ol start="999"><li title="999">९९९</li></ol> +<ol start="1000"><li title="1000">१०००</li></ol> +<ol start="1005"><li title="1005">१००५</li></ol> +<ol start="1060"><li title="1060">१०६०</li></ol> +<ol start="1065"><li title="1065">१०६५</li></ol> +<ol start="1800"><li title="1800">१८००</li></ol> +<ol start="1860"><li title="1860">१८६०</li></ol> +<ol start="1865"><li title="1865">१८६५</li></ol> +<ol start="5865"><li title="5865">५८६५</li></ol> +<ol start="7005"><li title="7005">७००५</li></ol> +<ol start="7800"><li title="7800">७८००</li></ol> +<ol start="7864"><li title="7864">७८६४</li></ol> +<ol start="9999"><li title="9999">९९९९</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-121.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-121.html new file mode 100644 index 0000000..c506764 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/devanagari/css3-counter-styles-121.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>devanagari, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: devanagari produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: devanagari; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">१.</li> +<li title="2">२.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-068.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-068.html new file mode 100644 index 0000000..47664f90 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-068.html
@@ -0,0 +1,44 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>ethiopic-numeric, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#ethiopic-numeric-counter-style'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to ethiopic-numeric will produce numbering for a list of up to 9 items as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: ethiopic-numeric; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class='test'> + <ol> + <li title='1'>፩.</li> + <li title='2'>፪.</li> + <li title='3'>፫.</li> + <li title='4'>፬.</li> + <li title='5'>፭.</li> + <li title='6'>፮.</li> + <li title='7'>፯.</li> + <li title='8'>፰.</li> + <li title='9'>፱.</li> + </ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-069.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-069.html new file mode 100644 index 0000000..9b3e3fa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-069.html
@@ -0,0 +1,102 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>ethiopic-numeric, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#ethiopic-numeric-counter-style'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to ethiopic-numeric will produce numbering for a list of items over 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: ethiopic-numeric; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class='test'> + <ol start='10'> + <li title='10'>፲.</li> + <li title='11'>፲፩.</li> + <li title='12'>፲፪.</li> + </ol> + <ol start='43'> + <li title='43'>፵፫.</li> + </ol> + <ol start='77'> + <li title='77'>፸፯.</li> + </ol> + <ol start='80'> + <li title='80'>፹.</li> + </ol> + <ol start='99'> + <li title='99'>፺፱.</li> + <li title='100'>፻.</li> + <li title='101'>፻፩.</li> + </ol> + <ol start='222'> + <li title='222'>፪፻፳፪.</li> + </ol> + <ol start='540'> + <li title='540'>፭፻፵.</li> + </ol> + <ol start='999'> + <li title='999'>፱፻፺፱.</li> + <li title='1000'>፲፻.</li> + </ol> + <ol start='1005'> + <li title='1005'>፲፻፭.</li> + </ol> + <ol start='1060'> + <li title='1060'>፲፻፷.</li> + </ol> + <ol start='1065'> + <li title='1065'>፲፻፷፭.</li> + </ol> + <ol start='1800'> + <li title='1800'>፲፰፻.</li> + </ol> + <ol start='1860'> + <li title='1860'>፲፰፻፷.</li> + </ol> + <ol start='1865'> + <li title='1865'>፲፰፻፷፭.</li> + </ol> + <ol start='5865'> + <li title='5865'>፶፰፻፷፭.</li> + </ol> + <ol start='7005'> + <li title='7005'>፸፻፭.</li> + </ol> + <ol start='7800'> + <li title='7800'>፸፰፻.</li> + </ol> + <ol start='7864'> + <li title='7864'>፸፰፻፷፬.</li> + </ol> + <ol start='9999'> + <li title='9999'>፺፱፻፺፱.</li> + <li title='10000'>፼.</li> + </ol> + <ol start='78010092'> + <li title='78010092'>፸፰፻፩፼፺፪.</li> + </ol> + <ol start='1000001'> + <li title='1000001'>፻፼፩.</li> + </ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-070.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-070.html new file mode 100644 index 0000000..75d6338 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/ethiopic-numeric/css3-counter-styles-070.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>ethiopic-numeric, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#ethiopic-numeric-counter-style'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to ethiopic-numeric will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: ethiopic-numeric; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class='test'> + <ol start='1'> + <li title='1'>፩/ </li> + </ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-010.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-010.html new file mode 100644 index 0000000..106f4cd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-010.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>georgian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: georgian produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: georgian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol> +<li title="1">ა</li> +<li title="2">ბ</li> +<li title="3">გ</li> +<li title="4">დ</li> +<li title="5">ე</li> +<li title="6">ვ</li> +<li title="7">ზ</li> +<li title="8">ჱ</li> +<li title="9">თ</li></ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-011.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-011.html new file mode 100644 index 0000000..932045ca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-011.html
@@ -0,0 +1,53 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>georgian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: georgian produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: georgian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>ი</li></ol> +<ol start='11'><li title='11'>ია</li></ol> +<ol start='12'><li title='12'>იბ</li></ol> +<ol start='43'><li title='43'>მგ</li></ol> +<ol start='77'><li title='77'>ოზ</li></ol> +<ol start='80'><li title='80'>პ</li></ol> +<ol start='99'><li title='99'>ჟთ</li></ol> +<ol start='100'><li title='100'>რ</li></ol> +<ol start='101'><li title='101'>რა</li></ol> +<ol start='222'><li title='222'>სკბ</li></ol> +<ol start='540'><li title='540'>ფმ</li></ol> +<ol start='999'><li title='999'>შჟთ</li></ol> +<ol start='1000'><li title='1000'>ჩ</li></ol> +<ol start='1005'><li title='1005'>ჩე</li></ol> +<ol start='1060'><li title='1060'>ჩჲ</li></ol> +<ol start='1065'><li title='1065'>ჩჲე</li></ol> +<ol start='1800'><li title='1800'>ჩყ</li></ol> +<ol start='1860'><li title='1860'>ჩყჲ</li></ol> +<ol start='1865'><li title='1865'>ჩყჲე</li></ol> +<ol start='5865'><li title='5865'>ჭყჲე</li></ol> +<ol start='7005'><li title='7005'>ჴე</li></ol> +<ol start='7800'><li title='7800'>ჴყ</li></ol> +<ol start='7865'><li title='7865'>ჴყჲე</li></ol> +<ol start='9999'><li title='9999'>ჰშჟთ</li></ol> +<ol start='10000'><li title='10000'>ჵ</li></ol> +<ol start='10001'><li title='10001'>ჵა</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-012.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-012.html new file mode 100644 index 0000000..6ad5f76 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-012.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>georgian, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: georgian produces numbers in the fallback counter style above the limit per the spec."> +<style type='text/css'> +ol li { list-style-type: georgian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="19999"> +<li title="19999">ჵჰშჟთ</li> +<li title='20000'>20000</li> +<li title='20001'>20001</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-014.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-014.html new file mode 100644 index 0000000..24ae1d0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/georgian/css3-counter-styles-014.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>georgian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: georgian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: georgian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class="test"> +<ol start='1'><li title='1'>ა.</li></ol> +<ol start='2'><li title='2'>ბ.</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-122.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-122.html new file mode 100644 index 0000000..b4aa7b3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-122.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gujarati, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:gujarati produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: gujarati; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">૧</li> +<li title="2">૨</li> +<li title="3">૩</li> +<li title="4">૪</li> +<li title="5">૫</li> +<li title="6">૬</li> +<li title="7">૭</li> +<li title="8">૮</li> +<li title="9">૯</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-123.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-123.html new file mode 100644 index 0000000..578601ad --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-123.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gujarati, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: gujarati produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: gujarati; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title="10">૧૦</li></ol> +<ol start="11"><li title="11">૧૧</li></ol> +<ol start="12"><li title="12">૧૨</li></ol> +<ol start="43"><li title="43">૪૩</li></ol> +<ol start="77"><li title="77">૭૭</li></ol> +<ol start="80"><li title="80">૮૦</li></ol> +<ol start="99"><li title="99">૯૯</li></ol> +<ol start="100"><li title="100">૧૦૦</li></ol> +<ol start="101"><li title="101">૧૦૧</li></ol> +<ol start="222"><li title="222">૨૨૨</li></ol> +<ol start="540"><li title="540">૫૪૦</li></ol> +<ol start="999"><li title="999">૯૯૯</li></ol> +<ol start="1000"><li title="1000">૧૦૦૦</li></ol> +<ol start="1005"><li title="1005">૧૦૦૫</li></ol> +<ol start="1060"><li title="1060">૧૦૬૦</li></ol> +<ol start="1065"><li title="1065">૧૦૬૫</li></ol> +<ol start="1800"><li title="1800">૧૮૦૦</li></ol> +<ol start="1860"><li title="1860">૧૮૬૦</li></ol> +<ol start="1865"><li title="1865">૧૮૬૫</li></ol> +<ol start="5865"><li title="5865">૫૮૬૫</li></ol> +<ol start="7005"><li title="7005">૭૦૦૫</li></ol> +<ol start="7800"><li title="7800">૭૮૦૦</li></ol> +<ol start="7864"><li title="7864">૭૮૬૪</li></ol> +<ol start="9999"><li title="9999">૯૯૯૯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-124.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-124.html new file mode 100644 index 0000000..83beaab --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gujarati/css3-counter-styles-124.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gujarati, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: gujarati produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: gujarati; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">૧.</li> +<li title="2">૨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-125.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-125.html new file mode 100644 index 0000000..85d233c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-125.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gurmukhi, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:gurmukhi produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: gurmukhi; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">੧</li> +<li title="2">੨</li> +<li title="3">੩</li> +<li title="4">੪</li> +<li title="5">੫</li> +<li title="6">੬</li> +<li title="7">੭</li> +<li title="8">੮</li> +<li title="9">੯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-126.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-126.html new file mode 100644 index 0000000..051cdc4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-126.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gurmukhi, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: gurmukhi produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: gurmukhi; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">੧੦</li></ol> +<ol start="11"><li title="11">੧੧</li></ol> +<ol start="12"><li title="12">੧੨</li></ol> +<ol start="43"><li title="43">੪੩</li></ol> +<ol start="77"><li title="77">੭੭</li></ol> +<ol start="80"><li title="80">੮੦</li></ol> +<ol start="99"><li title="99">੯੯</li></ol> +<ol start="100"><li title="100">੧੦੦</li></ol> +<ol start="101"><li title="101">੧੦੧</li></ol> +<ol start="222"><li title="222">੨੨੨</li></ol> +<ol start="540"><li title="540">੫੪੦</li></ol> +<ol start="999"><li title="999">੯੯੯</li></ol> +<ol start="1000"><li title="1000">੧੦੦੦</li></ol> +<ol start="1005"><li title="1005">੧੦੦੫</li></ol> +<ol start="1060"><li title="1060">੧੦੬੦</li></ol> +<ol start="1065"><li title="1065">੧੦੬੫</li></ol> +<ol start="1800"><li title="1800">੧੮੦੦</li></ol> +<ol start="1860"><li title="1860">੧੮੬੦</li></ol> +<ol start="1865"><li title="1865">੧੮੬੫</li></ol> +<ol start="5865"><li title="5865">੫੮੬੫</li></ol> +<ol start="7005"><li title="7005">੭੦੦੫</li></ol> +<ol start="7800"><li title="7800">੭੮੦੦</li></ol> +<ol start="7864"><li title="7864">੭੮੬੪</li></ol> +<ol start="9999"><li title="9999">੯੯੯੯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-127.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-127.html new file mode 100644 index 0000000..52ab48084 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/gurmukhi/css3-counter-styles-127.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>gurmukhi, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: gurmukhi produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: gurmukhi; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">੧.</li> +<li title="2">੨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-015.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-015.html new file mode 100644 index 0000000..745cac54 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-015.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hebrew, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: hebrew produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: hebrew; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol> +<li title="1">א</li> +<li title="2">ב</li> +<li title="3">ג</li> +<li title="4">ד</li> +<li title="5">ה</li> +<li title="6">ו</li> +<li title="7">ז</li> +<li title="8">ח</li> +<li title="9">ט</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016.html new file mode 100644 index 0000000..6973f82 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hebrew, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: hebrew produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: hebrew; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>י</li></ol> +<ol start='11'><li title='11'>יא</li></ol> +<ol start='12'><li title='12'>יב</li></ol> +<ol start='13'><li title='13'>יג</li></ol> +<ol start='14'><li title='14'>יד</li></ol> +<ol start='15'><li title='15'>טו</li></ol> +<ol start='16'><li title='16'>טז</li></ol> +<ol start='17'><li title='17'>יז</li></ol> +<ol start='18'><li title='18'>יח</li></ol> +<ol start='43'><li title='43'>מג</li></ol> +<ol start='77'><li title='77'>עז</li></ol> +<ol start='80'><li title='80'>פ</li></ol> +<ol start='99'><li title='99'>צט</li></ol> +<ol start='100'><li title='100'>ק</li></ol> +<ol start='101'><li title='101'>קא</li></ol> +<ol start='222'><li title='222'>רכב</li></ol> +<ol start='400'><li title='400'>ת</li></ol> +<ol start='401'><li title='401'>תא</li></ol> +<ol start='499'><li title='499'>תצט</li></ol> +<ol start='500'><li title='500'>תק</li></ol> +<ol start='555'><li title='555'>תקנה</li></ol> +<ol start='997'><li title='997'>תתקצז</li></ol> +<ol start='1000'><li title='1000'>א׳</li></ol> +<ol start='1001'><li title='1001'>א׳א</li></ol> +<ol start='3256'><li title='3256'>ג׳רנו</li></ol> +<ol start='7998'><li title='7998'>ז׳תתקצח</li></ol> +<ol start='9999'><li title='9999'>ט׳תתקצט</li></ol> +<ol start='10000'><li title='10000'>י׳</li></ol> +<ol start='10997'><li title='10997'>י׳תתקצז</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016a.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016a.html new file mode 100644 index 0000000..8957e06 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-016a.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hebrew, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: hebrew produces numbers in the fallback counter style above the limit per the spec."> +<style type='text/css'> +ol li { list-style-type: hebrew; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10999"> +<li title="10999">י׳תתקצט</li> +<li title='11000'>11000</li> +<li title='11001'>11001</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-017.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-017.html new file mode 100644 index 0000000..f80966a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hebrew/css3-counter-styles-017.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hebrew, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: hebrew produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: hebrew; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class="test"><ol> +<li title="1">א.</li> +<li title="2">ב.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-033.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-033.html new file mode 100644 index 0000000..be962ea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-033.html
@@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana-iroha, simple</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana-iroha will produce list numbering for the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol><li title='1'>い、</li> +<li title='2'>ろ、</li> +<li title='3'>は、</li> +<li title='4'>に、</li> +<li title='5'>ほ、</li> +<li title='6'>へ、</li> +<li title='7'>と、</li> +<li title='8'>ち、</li> +<li title='9'>り、</li> +<li title='10'>ぬ、</li> +<li title='11'>る、</li> +<li title='12'>を、</li> +<li title='13'>わ、</li> +<li title='14'>か、</li> +<li title='15'>よ、</li> +<li title='16'>た、</li> +<li title='17'>れ、</li> +<li title='18'>そ、</li> +<li title='19'>つ、</li> +<li title='20'>ね、</li> +<li title='21'>な、</li> +<li title='22'>ら、</li> +<li title='23'>む、</li> +<li title='24'>う、</li> +<li title='25'>ゐ、</li> +<li title='26'>の、</li> +<li title='27'>お、</li> +<li title='28'>く、</li> +<li title='29'>や、</li> +<li title='30'>ま、</li> +<li title='31'>け、</li> +<li title='32'>ふ、</li> +<li title='33'>こ、</li> +<li title='34'>え、</li> +<li title='35'>て、</li> +<li title='36'>あ、</li> +<li title='37'>さ、</li> +<li title='38'>き、</li> +<li title='39'>ゆ、</li> +<li title='40'>め、</li> +<li title='41'>み、</li> +<li title='42'>し、</li> +<li title='43'>ゑ、</li> +<li title='44'>ひ、</li> +<li title='45'>も、</li> +<li title='46'>せ、</li> +<li title='47'>す、</li> +</ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-034.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-034.html new file mode 100644 index 0000000..69d0463 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-034.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana-iroha, extended</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana-iroha will produce list numbering after the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='48'><li title='48'>いい、</li></ol> +<ol start='77'><li title='77'>いま、</li></ol> +<ol start='80'><li title='80'>いこ、</li></ol> +<ol start='99'><li title='99'>ろほ、</li></ol> +<ol start='100'><li title='100'>ろへ、</li></ol> +<ol start='101'><li title='101'>ろと、</li></ol> +<ol start='222'><li title='222'>にえ、</li></ol> +<ol start='540'><li title='540'>るむ、</li></ol> +<ol start='999'><li title='999'>なを、</li></ol> +<ol start='1000'><li title='1000'>なわ、</li></ol> +<ol start='1005'><li title='1005'>なそ、</li></ol> +<ol start='1060'><li title='1060'>らの、</li></ol> +<ol start='1065'><li title='1065'>らけ、</li></ol> +<ol start='1800'><li title='1800'>きか、</li></ol> +<ol start='1860'><li title='1860'>ゆお、</li></ol> +<ol start='5865'><li title='5865'>ろまさ、</li></ol> +<ol start='7005'><li title='7005'>はちろ、</li></ol> +<ol start='7800'><li title='7800'>はうも、</li></ol> +<ol start='7864'><li title='7864'>はのよ、</li></ol> +<ol start='9999'><li title='9999'>にうて、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-035.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-035.html new file mode 100644 index 0000000..634440d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana-iroha/css3-counter-styles-035.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana-iroha, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana-iroha will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>い、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-030.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-030.html new file mode 100644 index 0000000..3acadc0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-030.html
@@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana, simple</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana will produce list numbering for the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol><li title='1'>あ、</li> +<li title='2'>い、</li> +<li title='3'>う、</li> +<li title='4'>え、</li> +<li title='5'>お、</li> +<li title='6'>か、</li> +<li title='7'>き、</li> +<li title='8'>く、</li> +<li title='9'>け、</li> +<li title='10'>こ、</li> +<li title='11'>さ、</li> +<li title='12'>し、</li> +<li title='13'>す、</li> +<li title='14'>せ、</li> +<li title='15'>そ、</li> +<li title='16'>た、</li> +<li title='17'>ち、</li> +<li title='18'>つ、</li> +<li title='19'>て、</li> +<li title='20'>と、</li> +<li title='21'>な、</li> +<li title='22'>に、</li> +<li title='23'>ぬ、</li> +<li title='24'>ね、</li> +<li title='25'>の、</li> +<li title='26'>は、</li> +<li title='27'>ひ、</li> +<li title='28'>ふ、</li> +<li title='29'>へ、</li> +<li title='30'>ほ、</li> +<li title='31'>ま、</li> +<li title='32'>み、</li> +<li title='33'>む、</li> +<li title='34'>め、</li> +<li title='35'>も、</li> +<li title='36'>や、</li> +<li title='37'>ゆ、</li> +<li title='38'>よ、</li> +<li title='39'>ら、</li> +<li title='40'>り、</li> +<li title='41'>る、</li> +<li title='42'>れ、</li> +<li title='43'>ろ、</li> +<li title='44'>わ、</li> +<li title='45'>ゐ、</li> +<li title='46'>ゑ、</li> +<li title='47'>を、</li> +<li title='48'>ん、</li> +</ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-031.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-031.html new file mode 100644 index 0000000..791a9d8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-031.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana, extended</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana will produce list numbering after the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='49'><li title='49'>ああ、</li></ol> +<ol start='50'><li title='50'>あい、</li></ol> +<ol start='51'><li title='51'>あう、</li></ol> +<ol start='77'><li title='77'>あへ、</li></ol> +<ol start='80'><li title='80'>あみ、</li></ol> +<ol start='99'><li title='99'>いう、</li></ol> +<ol start='100'><li title='100'>いえ、</li></ol> +<ol start='101'><li title='101'>いお、</li></ol> +<ol start='222'><li title='222'>えほ、</li></ol> +<ol start='540'><li title='540'>さし、</li></ol> +<ol start='999'><li title='999'>とら、</li></ol> +<ol start='1000'><li title='1000'>とり、</li></ol> +<ol start='1005'><li title='1005'>とゐ、</li></ol> +<ol start='1060'><li title='1060'>にえ、</li></ol> +<ol start='1065'><li title='1065'>にけ、</li></ol> +<ol start='1800'><li title='1800'>ゆね、</li></ol> +<ol start='1860'><li title='1860'>よや、</li></ol> +<ol start='5865'><li title='5865'>いはけ、</li></ol> +<ol start='7005'><li title='7005'>うあゐ、</li></ol> +<ol start='7800'><li title='7800'>うつね、</li></ol> +<ol start='7864'><li title='7864'>うてり、</li></ol> +<ol start='9999'><li title='9999'>えたそ、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-032.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-032.html new file mode 100644 index 0000000..066c221 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/hiragana/css3-counter-styles-032.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>hiragana, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to hiragana will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: hiragana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>あ、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/idlharness.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/idlharness.html new file mode 100644 index 0000000..e914b41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/idlharness.html
@@ -0,0 +1,33 @@ +<!doctype html> +<title>css-counter-styles IDL tests</title> +<link rel="help" href="https://drafts.csswg.org/css-counter-styles/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/WebIDLParser.js"></script> +<script src="/resources/idlharness.js"></script> + +<style> + @counter-style triangle { + system: cyclic; + symbols: ‣; + suffix: " "; + } +</style> +<script> + 'use strict'; + idl_test( + ['css-counter-styles'], + ['cssom'], + idl_array => { + try { + self.counter = document.styleSheets[0].rules[0]; + } catch (e) { + // Will be surfaced when counter is undefined below. + } + + idl_array.add_objects({ + CSSCounterStyleRule: ['counter'], + }); + } + ); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-047.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-047.html new file mode 100644 index 0000000..a31d819 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-047.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-formal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-formal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零、</li></ol> +<ol start='1'><li title='1'>壱、</li></ol> +<ol start='2'><li title='2'>弐、</li></ol> +<ol start='3'><li title='3'>参、</li></ol> +<ol start='4'><li title='4'>四、</li></ol> +<ol start='5'><li title='5'>伍、</li></ol> +<ol start='6'><li title='6'>六、</li></ol> +<ol start='7'><li title='7'>七、</li></ol> +<ol start='8'><li title='8'>八、</li></ol> +<ol start='9'><li title='9'>九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-048.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-048.html new file mode 100644 index 0000000..120bfb0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-048.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-formal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-formal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>壱拾、</li></ol> +<ol start='11'><li title='11'>壱拾壱、</li></ol> +<ol start='12'><li title='12'>壱拾弐、</li></ol> +<ol start='43'><li title='43'>四拾参、</li></ol> +<ol start='77'><li title='77'>七拾七、</li></ol> +<ol start='80'><li title='80'>八拾、</li></ol> +<ol start='99'><li title='99'>九拾九、</li></ol> +<ol start='100'><li title='100'>壱百、</li></ol> +<ol start='101'><li title='101'>壱百壱、</li></ol> +<ol start='222'><li title='222'>弐百弐拾弐、</li></ol> +<ol start='540'><li title='540'>伍百四拾、</li></ol> +<ol start='999'><li title='999'>九百九拾九、</li></ol> +<ol start='1000'><li title='1000'>壱阡、</li></ol> +<ol start='1005'><li title='1005'>壱阡伍、</li></ol> +<ol start='1060'><li title='1060'>壱阡六拾、</li></ol> +<ol start='1065'><li title='1065'>壱阡六拾伍、</li></ol> +<ol start='1800'><li title='1800'>壱阡八百、</li></ol> +<ol start='1860'><li title='1860'>壱阡八百六拾、</li></ol> +<ol start='1865'><li title='1865'>壱阡八百六拾伍、</li></ol> +<ol start='5865'><li title='5865'>伍阡八百六拾伍、</li></ol> +<ol start='7005'><li title='7005'>七阡伍、</li></ol> +<ol start='7800'><li title='7800'>七阡八百、</li></ol> +<ol start='7865'><li title='7865'>七阡八百六拾伍、</li></ol> +<ol start='9999'><li title='9999'>九阡九百九拾九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-049.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-049.html new file mode 100644 index 0000000..946b10c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-049.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-formal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: japanese-formal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-formal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九阡九百九拾九</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-050.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-050.html new file mode 100644 index 0000000..d22ecdc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-050.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-formal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to japanese-formal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">マイナス壱拾壱、</li><li title="-10">マイナス壱拾、</li><li title="-9">マイナス九、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-051.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-051.html new file mode 100644 index 0000000..6838710 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-formal/css3-counter-styles-051.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-formal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-formal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>壱、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-042.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-042.html new file mode 100644 index 0000000..2c5dcae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-042.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-informal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-informal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>〇、</li></ol> +<ol start='1'><li title='1'>一、</li></ol> +<ol start='2'><li title='2'>二、</li></ol> +<ol start='3'><li title='3'>三、</li></ol> +<ol start='4'><li title='4'>四、</li></ol> +<ol start='5'><li title='5'>五、</li></ol> +<ol start='6'><li title='6'>六、</li></ol> +<ol start='7'><li title='7'>七、</li></ol> +<ol start='8'><li title='8'>八、</li></ol> +<ol start='9'><li title='9'>九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-043.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-043.html new file mode 100644 index 0000000..b6df20c8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-043.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-informal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-informal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>十、</li></ol> +<ol start='11'><li title='11'>十一、</li></ol> +<ol start='12'><li title='12'>十二、</li></ol> +<ol start='43'><li title='43'>四十三、</li></ol> +<ol start='77'><li title='77'>七十七、</li></ol> +<ol start='80'><li title='80'>八十、</li></ol> +<ol start='99'><li title='99'>九十九、</li></ol> +<ol start='100'><li title='100'>百、</li></ol> +<ol start='101'><li title='101'>百一、</li></ol> +<ol start='222'><li title='222'>二百二十二、</li></ol> +<ol start='540'><li title='540'>五百四十、</li></ol> +<ol start='999'><li title='999'>九百九十九、</li></ol> +<ol start='1000'><li title='1000'>千、</li></ol> +<ol start='1005'><li title='1005'>千五、</li></ol> +<ol start='1060'><li title='1060'>千六十、</li></ol> +<ol start='1065'><li title='1065'>千六十五、</li></ol> +<ol start='1800'><li title='1800'>千八百、</li></ol> +<ol start='1860'><li title='1860'>千八百六十、</li></ol> +<ol start='1865'><li title='1865'>千八百六十五、</li></ol> +<ol start='5865'><li title='5865'>五千八百六十五、</li></ol> +<ol start='7005'><li title='7005'>七千五、</li></ol> +<ol start='7800'><li title='7800'>七千八百、</li></ol> +<ol start='7865'><li title='7865'>七千八百六十五、</li></ol> +<ol start='9999'><li title='9999'>九千九百九十九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-044.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-044.html new file mode 100644 index 0000000..01af21c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-044.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-informal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: japanese-informal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +ol li { list-style-type: japanese-informal; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九千九百九十九</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-045.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-045.html new file mode 100644 index 0000000..570f2a0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-045.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-informal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to japanese-informal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">マイナス十一、</li><li title="-10">マイナス十、</li><li title="-9">マイナス九、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-046.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-046.html new file mode 100644 index 0000000..32f346bb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/japanese-informal/css3-counter-styles-046.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>japanese-informal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to japanese-informal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: japanese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>一、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-128.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-128.html new file mode 100644 index 0000000..b782cc80 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-128.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>kannada, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:kannada produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: kannada; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">೧</li> +<li title="2">೨</li> +<li title="3">೩</li> +<li title="4">೪</li> +<li title="5">೫</li> +<li title="6">೬</li> +<li title="7">೭</li> +<li title="8">೮</li> +<li title="9">೯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-129.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-129.html new file mode 100644 index 0000000..19c4530 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-129.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>kannada, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: kannada produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: kannada; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">೧೦</li></ol> +<ol start="11"><li title="11">೧೧</li></ol> +<ol start="12"><li title="12">೧೨</li></ol> +<ol start="43"><li title="43">೪೩</li></ol> +<ol start="77"><li title="77">೭೭</li></ol> +<ol start="80"><li title="80">೮೦</li></ol> +<ol start="99"><li title="99">೯೯</li></ol> +<ol start="100"><li title="100">೧೦೦</li></ol> +<ol start="101"><li title="101">೧೦೧</li></ol> +<ol start="222"><li title="222">೨೨೨</li></ol> +<ol start="540"><li title="540">೫೪೦</li></ol> +<ol start="999"><li title="999">೯೯೯</li></ol> +<ol start="1000"><li title="1000">೧೦೦೦</li></ol> +<ol start="1005"><li title="1005">೧೦೦೫</li></ol> +<ol start="1060"><li title="1060">೧೦೬೦</li></ol> +<ol start="1065"><li title="1065">೧೦೬೫</li></ol> +<ol start="1800"><li title="1800">೧೮೦೦</li></ol> +<ol start="1860"><li title="1860">೧೮೬೦</li></ol> +<ol start="1865"><li title="1865">೧೮೬೫</li></ol> +<ol start="5865"><li title="5865">೫೮೬೫</li></ol> +<ol start="7005"><li title="7005">೭೦೦೫</li></ol> +<ol start="7800"><li title="7800">೭೮೦೦</li></ol> +<ol start="7864"><li title="7864">೭೮೬೪</li></ol> +<ol start="9999"><li title="9999">೯೯೯೯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-130.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-130.html new file mode 100644 index 0000000..957423d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/kannada/css3-counter-styles-130.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>kannada, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: kannada produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: kannada; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">೧.</li> +<li title="2">೨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-039.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-039.html new file mode 100644 index 0000000..6fd4707 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-039.html
@@ -0,0 +1,79 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana-iroha, simple</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana-iroha will produce list numbering for the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol><li title='1'>イ、</li> +<li title='2'>ロ、</li> +<li title='3'>ハ、</li> +<li title='4'>ニ、</li> +<li title='5'>ホ、</li> +<li title='6'>ヘ、</li> +<li title='7'>ト、</li> +<li title='8'>チ、</li> +<li title='9'>リ、</li> +<li title='10'>ヌ、</li> +<li title='11'>ル、</li> +<li title='12'>ヲ、</li> +<li title='13'>ワ、</li> +<li title='14'>カ、</li> +<li title='15'>ヨ、</li> +<li title='16'>タ、</li> +<li title='17'>レ、</li> +<li title='18'>ソ、</li> +<li title='19'>ツ、</li> +<li title='20'>ネ、</li> +<li title='21'>ナ、</li> +<li title='22'>ラ、</li> +<li title='23'>ム、</li> +<li title='24'>ウ、</li> +<li title='25'>ヰ、</li> +<li title='26'>ノ、</li> +<li title='27'>オ、</li> +<li title='28'>ク、</li> +<li title='29'>ヤ、</li> +<li title='30'>マ、</li> +<li title='31'>ケ、</li> +<li title='32'>フ、</li> +<li title='33'>コ、</li> +<li title='34'>エ、</li> +<li title='35'>テ、</li> +<li title='36'>ア、</li> +<li title='37'>サ、</li> +<li title='38'>キ、</li> +<li title='39'>ユ、</li> +<li title='40'>メ、</li> +<li title='41'>ミ、</li> +<li title='42'>シ、</li> +<li title='43'>ヱ、</li> +<li title='44'>ヒ、</li> +<li title='45'>モ、</li> +<li title='46'>セ、</li> +<li title='47'>ス、</li> +</ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-040.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-040.html new file mode 100644 index 0000000..5b12a0c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-040.html
@@ -0,0 +1,52 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana-iroha, extended</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana-iroha will produce list numbering after the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='48'><li title='48'>イイ、</li></ol> +<ol start='77'><li title='77'>イマ、</li></ol> +<ol start='80'><li title='80'>イコ、</li></ol> +<ol start='99'><li title='99'>ロホ、</li></ol> +<ol start='100'><li title='100'>ロヘ、</li></ol> +<ol start='101'><li title='101'>ロト、</li></ol> +<ol start='222'><li title='222'>ニエ、</li></ol> +<ol start='540'><li title='540'>ルム、</li></ol> +<ol start='999'><li title='999'>ナヲ、</li></ol> +<ol start='1000'><li title='1000'>ナワ、</li></ol> +<ol start='1005'><li title='1005'>ナソ、</li></ol> +<ol start='1060'><li title='1060'>ラノ、</li></ol> +<ol start='1065'><li title='1065'>ラケ、</li></ol> +<ol start='1800'><li title='1800'>キカ、</li></ol> +<ol start='1860'><li title='1860'>ユオ、</li></ol> +<ol start='5865'><li title='5865'>ロマサ、</li></ol> +<ol start='7005'><li title='7005'>ハチロ、</li></ol> +<ol start='7800'><li title='7800'>ハウモ、</li></ol> +<ol start='7864'><li title='7864'>ハノヨ、</li></ol> +<ol start='9999'><li title='9999'>ニウテ、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-041.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-041.html new file mode 100644 index 0000000..f87354f2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana-iroha/css3-counter-styles-041.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana-iroha, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana-iroha will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana-iroha; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>イ、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-036.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-036.html new file mode 100644 index 0000000..4662dd7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-036.html
@@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana, simple</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana will produce list numbering for the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol><li title='1'>ア、</li> +<li title='2'>イ、</li> +<li title='3'>ウ、</li> +<li title='4'>エ、</li> +<li title='5'>オ、</li> +<li title='6'>カ、</li> +<li title='7'>キ、</li> +<li title='8'>ク、</li> +<li title='9'>ケ、</li> +<li title='10'>コ、</li> +<li title='11'>サ、</li> +<li title='12'>シ、</li> +<li title='13'>ス、</li> +<li title='14'>セ、</li> +<li title='15'>ソ、</li> +<li title='16'>タ、</li> +<li title='17'>チ、</li> +<li title='18'>ツ、</li> +<li title='19'>テ、</li> +<li title='20'>ト、</li> +<li title='21'>ナ、</li> +<li title='22'>ニ、</li> +<li title='23'>ヌ、</li> +<li title='24'>ネ、</li> +<li title='25'>ノ、</li> +<li title='26'>ハ、</li> +<li title='27'>ヒ、</li> +<li title='28'>フ、</li> +<li title='29'>ヘ、</li> +<li title='30'>ホ、</li> +<li title='31'>マ、</li> +<li title='32'>ミ、</li> +<li title='33'>ム、</li> +<li title='34'>メ、</li> +<li title='35'>モ、</li> +<li title='36'>ヤ、</li> +<li title='37'>ユ、</li> +<li title='38'>ヨ、</li> +<li title='39'>ラ、</li> +<li title='40'>リ、</li> +<li title='41'>ル、</li> +<li title='42'>レ、</li> +<li title='43'>ロ、</li> +<li title='44'>ワ、</li> +<li title='45'>ヰ、</li> +<li title='46'>ヱ、</li> +<li title='47'>ヲ、</li> +<li title='48'>ン、</li> +</ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-037.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-037.html new file mode 100644 index 0000000..cf3e07b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-037.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana, extended</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana will produce list numbering after the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='49'><li title='49'>アア、</li></ol> +<ol start='50'><li title='50'>アイ、</li></ol> +<ol start='51'><li title='51'>アウ、</li></ol> +<ol start='77'><li title='77'>アヘ、</li></ol> +<ol start='80'><li title='80'>アミ、</li></ol> +<ol start='99'><li title='99'>イウ、</li></ol> +<ol start='100'><li title='100'>イエ、</li></ol> +<ol start='101'><li title='101'>イオ、</li></ol> +<ol start='222'><li title='222'>エホ、</li></ol> +<ol start='540'><li title='540'>サシ、</li></ol> +<ol start='999'><li title='999'>トラ、</li></ol> +<ol start='1000'><li title='1000'>トリ、</li></ol> +<ol start='1005'><li title='1005'>トヰ、</li></ol> +<ol start='1060'><li title='1060'>ニエ、</li></ol> +<ol start='1065'><li title='1065'>ニケ、</li></ol> +<ol start='1800'><li title='1800'>ユネ、</li></ol> +<ol start='1860'><li title='1860'>ヨヤ、</li></ol> +<ol start='5865'><li title='5865'>イハケ、</li></ol> +<ol start='7005'><li title='7005'>ウアヰ、</li></ol> +<ol start='7800'><li title='7800'>ウツネ、</li></ol> +<ol start='7864'><li title='7864'>ウテリ、</li></ol> +<ol start='9999'><li title='9999'>エタソ、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-038.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-038.html new file mode 100644 index 0000000..cbbf779 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/katakana/css3-counter-styles-038.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>katakana, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to katakana will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: katakana; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>ア、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-161.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-161.html new file mode 100644 index 0000000..c9fd665 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-161.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>khmer, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: khmer produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: khmer; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">១</li> +<li title="2">២</li> +<li title="3">៣</li> +<li title="4">៤</li> +<li title="5">៥</li> +<li title="6">៦</li> +<li title="7">៧</li> +<li title="8">៨</li> +<li title="9">៩</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-162.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-162.html new file mode 100644 index 0000000..369fabb6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-162.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>khmer, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: khmer produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: khmer; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="11"><li title="11">១១</li></ol> +<ol start="12"><li title="12">១២</li></ol> +<ol start="43"><li title="43">៤៣</li></ol> +<ol start="77"><li title="77">៧៧</li></ol> +<ol start="80"><li title="80">៨០</li></ol> +<ol start="99"><li title="99">៩៩</li></ol> +<ol start="100"><li title="100">១០០</li></ol> +<ol start="101"><li title="101">១០១</li></ol> +<ol start="222"><li title="222">២២២</li></ol> +<ol start="540"><li title="540">៥៤០</li></ol> +<ol start="999"><li title="999">៩៩៩</li></ol> +<ol start="1000"><li title="1000">១០០០</li></ol> +<ol start="1005"><li title="1005">១០០៥</li></ol> +<ol start="1060"><li title="1060">១០៦០</li></ol> +<ol start="1065"><li title="1065">១០៦៥</li></ol> +<ol start="1800"><li title="1800">១៨០០</li></ol> +<ol start="1860"><li title="1860">១៨៦០</li></ol> +<ol start="5865"><li title="5865">៥៨៦៥</li></ol> +<ol start="7005"><li title="7005">៧០០៥</li></ol> +<ol start="7800"><li title="7800">៧៨០០</li></ol> +<ol start="7864"><li title="7864">៧៨៦៤</li></ol> +<ol start="9999"><li title="9999">៩៩៩៩</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-163.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-163.html new file mode 100644 index 0000000..9d689d5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/khmer/css3-counter-styles-163.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>khmer, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: khmer produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: khmer; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">១.</li> +<li title="2">២.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-052.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-052.html new file mode 100644 index 0000000..cb6a8cae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-052.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hangul-formal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hangul-formal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hangul-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>영,</li></ol> +<ol start='1'><li title='1'>일,</li></ol> +<ol start='2'><li title='2'>이,</li></ol> +<ol start='3'><li title='3'>삼,</li></ol> +<ol start='4'><li title='4'>사,</li></ol> +<ol start='5'><li title='5'>오,</li></ol> +<ol start='6'><li title='6'>육,</li></ol> +<ol start='7'><li title='7'>칠,</li></ol> +<ol start='8'><li title='8'>팔,</li></ol> +<ol start='9'><li title='9'>구,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-053.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-053.html new file mode 100644 index 0000000..70e007c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-053.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hangul-formal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hangul-formal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hangul-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>일십,</li></ol> +<ol start='11'><li title='11'>일십일,</li></ol> +<ol start='12'><li title='12'>일십이,</li></ol> +<ol start='43'><li title='43'>사십삼,</li></ol> +<ol start='77'><li title='77'>칠십칠,</li></ol> +<ol start='80'><li title='80'>팔십,</li></ol> +<ol start='99'><li title='99'>구십구,</li></ol> +<ol start='100'><li title='100'>일백,</li></ol> +<ol start='101'><li title='101'>일백일,</li></ol> +<ol start='222'><li title='222'>이백이십이,</li></ol> +<ol start='540'><li title='540'>오백사십,</li></ol> +<ol start='999'><li title='999'>구백구십구,</li></ol> +<ol start='1000'><li title='1000'>일천,</li></ol> +<ol start='1005'><li title='1005'>일천오,</li></ol> +<ol start='1060'><li title='1060'>일천육십,</li></ol> +<ol start='1065'><li title='1065'>일천육십오,</li></ol> +<ol start='1800'><li title='1800'>일천팔백,</li></ol> +<ol start='1860'><li title='1860'>일천팔백육십,</li></ol> +<ol start='1865'><li title='1865'>일천팔백육십오,</li></ol> +<ol start='5865'><li title='5865'>오천팔백육십오,</li></ol> +<ol start='7005'><li title='7005'>칠천오,</li></ol> +<ol start='7800'><li title='7800'>칠천팔백,</li></ol> +<ol start='7865'><li title='7865'>칠천팔백육십오,</li></ol> +<ol start='9999'><li title='9999'>구천구백구십구,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-054.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-054.html new file mode 100644 index 0000000..b541d19 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-054.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hangul-formal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: korean-hangul-formal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hangul-formal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits. If it is decimal digits (ie. the fallback) score as Partial. In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">구천구백구십구</li> +<li title="10000">10000.</li> +<li title="10001">10001.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-055.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-055.html new file mode 100644 index 0000000..4a35e73 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-055.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hangul-formal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to korean-hangul-formal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hangul-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">마이너스 일십일,</li><li title="-10">마이너스 일십,</li><li title="-9">마이너스 구,</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-056.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-056.html new file mode 100644 index 0000000..a8ab993 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hangul-formal/css3-counter-styles-056.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hangul-formal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hangul-formal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hangul-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>일,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-062.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-062.html new file mode 100644 index 0000000..40890e5e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-062.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-formal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-formal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零,</li></ol> +<ol start='1'><li title='1'>壹,</li></ol> +<ol start='2'><li title='2'>貳,</li></ol> +<ol start='3'><li title='3'>參,</li></ol> +<ol start='4'><li title='4'>四,</li></ol> +<ol start='5'><li title='5'>五,</li></ol> +<ol start='6'><li title='6'>六,</li></ol> +<ol start='7'><li title='7'>七,</li></ol> +<ol start='8'><li title='8'>八,</li></ol> +<ol start='9'><li title='9'>九,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-063.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-063.html new file mode 100644 index 0000000..28482ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-063.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-formal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-formal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>壹拾,</li></ol> +<ol start='11'><li title='11'>壹拾壹,</li></ol> +<ol start='12'><li title='12'>壹拾貳,</li></ol> +<ol start='43'><li title='43'>四拾參,</li></ol> +<ol start='77'><li title='77'>七拾七,</li></ol> +<ol start='80'><li title='80'>八拾,</li></ol> +<ol start='99'><li title='99'>九拾九,</li></ol> +<ol start='100'><li title='100'>壹百,</li></ol> +<ol start='101'><li title='101'>壹百壹,</li></ol> +<ol start='222'><li title='222'>貳百貳拾貳,</li></ol> +<ol start='540'><li title='540'>五百四拾,</li></ol> +<ol start='999'><li title='999'>九百九拾九,</li></ol> +<ol start='1000'><li title='1000'>壹仟,</li></ol> +<ol start='1005'><li title='1005'>壹仟五,</li></ol> +<ol start='1060'><li title='1060'>壹仟六拾,</li></ol> +<ol start='1065'><li title='1065'>壹仟六拾五,</li></ol> +<ol start='1800'><li title='1800'>壹仟八百,</li></ol> +<ol start='1860'><li title='1860'>壹仟八百六拾,</li></ol> +<ol start='1865'><li title='1865'>壹仟八百六拾五,</li></ol> +<ol start='5865'><li title='5865'>五仟八百六拾五,</li></ol> +<ol start='7005'><li title='7005'>七仟五,</li></ol> +<ol start='7800'><li title='7800'>七仟八百,</li></ol> +<ol start='7865'><li title='7865'>七仟八百六拾五,</li></ol> +<ol start='9999'><li title='9999'>九仟九百九拾九,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-064.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-064.html new file mode 100644 index 0000000..8240e025 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-064.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-formal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: korean-hanja-formal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-formal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits. If it is decimal digits (ie. the fallback) score as Partial. In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九仟九百九拾九</li> +<li title="10000">10000.</li> +<li title="10001">10001.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-065.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-065.html new file mode 100644 index 0000000..e07b99a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-065.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-formal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to korean-hanja-formal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">마이너스 壹拾壹,</li><li title="-10">마이너스 壹拾,</li><li title="-9">마이너스 九,</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-066.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-066.html new file mode 100644 index 0000000..7d12eca9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-formal/css3-counter-styles-066.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-formal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-formal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>壹,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-057.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-057.html new file mode 100644 index 0000000..5634075c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-057.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-informal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-informal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零,</li></ol> +<ol start='1'><li title='1'>一,</li></ol> +<ol start='2'><li title='2'>二,</li></ol> +<ol start='3'><li title='3'>三,</li></ol> +<ol start='4'><li title='4'>四,</li></ol> +<ol start='5'><li title='5'>五,</li></ol> +<ol start='6'><li title='6'>六,</li></ol> +<ol start='7'><li title='7'>七,</li></ol> +<ol start='8'><li title='8'>八,</li></ol> +<ol start='9'><li title='9'>九,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-058.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-058.html new file mode 100644 index 0000000..47538198 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-058.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-informal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-informal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>十,</li></ol> +<ol start='11'><li title='11'>十一,</li></ol> +<ol start='12'><li title='12'>十二,</li></ol> +<ol start='43'><li title='43'>四十三,</li></ol> +<ol start='77'><li title='77'>七十七,</li></ol> +<ol start='80'><li title='80'>八十,</li></ol> +<ol start='99'><li title='99'>九十九,</li></ol> +<ol start='100'><li title='100'>百,</li></ol> +<ol start='101'><li title='101'>百一,</li></ol> +<ol start='222'><li title='222'>二百二十二,</li></ol> +<ol start='540'><li title='540'>五百四十,</li></ol> +<ol start='999'><li title='999'>九百九十九,</li></ol> +<ol start='1000'><li title='1000'>千,</li></ol> +<ol start='1005'><li title='1005'>千五,</li></ol> +<ol start='1060'><li title='1060'>千六十,</li></ol> +<ol start='1065'><li title='1065'>千六十五,</li></ol> +<ol start='1800'><li title='1800'>千八百,</li></ol> +<ol start='1860'><li title='1860'>千八百六十,</li></ol> +<ol start='1865'><li title='1865'>千八百六十五,</li></ol> +<ol start='5865'><li title='5865'>五千八百六十五,</li></ol> +<ol start='7005'><li title='7005'>七千五,</li></ol> +<ol start='7800'><li title='7800'>七千八百,</li></ol> +<ol start='7865'><li title='7865'>七千八百六十五,</li></ol> +<ol start='9999'><li title='9999'>九千九百九十九,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-059.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-059.html new file mode 100644 index 0000000..476ea29c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-059.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-informal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: korean-hanja-informal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-informal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits. If it is decimal digits (ie. the fallback) score as Partial. In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九千九百九十九</li> +<li title="10000">10000.</li> +<li title="10001">10001.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-060.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-060.html new file mode 100644 index 0000000..2127ed7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-060.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-informal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to korean-hanja-informal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">마이너스 十一,</li><li title="-10">마이너스 十,</li><li title="-9">마이너스 九,</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-061.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-061.html new file mode 100644 index 0000000..8ff24a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/korean-hanja-informal/css3-counter-styles-061.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>korean-hanja-informal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to korean-hanja-informal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: korean-hanja-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>一,</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-131.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-131.html new file mode 100644 index 0000000..4a77df5b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-131.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lao, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:lao produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: lao; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">໑</li> +<li title="2">໒</li> +<li title="3">໓</li> +<li title="4">໔</li> +<li title="5">໕</li> +<li title="6">໖</li> +<li title="7">໗</li> +<li title="8">໘</li> +<li title="9">໙</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-132.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-132.html new file mode 100644 index 0000000..bbe5107b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-132.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lao, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lao produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: lao; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">໑໐</li></ol> +<ol start="11"><li title="11">໑໑</li></ol> +<ol start="12"><li title="12">໑໒</li></ol> +<ol start="43"><li title="43">໔໓</li></ol> +<ol start="77"><li title="77">໗໗</li></ol> +<ol start="80"><li title="80">໘໐</li></ol> +<ol start="99"><li title="99">໙໙</li></ol> +<ol start="100"><li title="100">໑໐໐</li></ol> +<ol start="101"><li title="101">໑໐໑</li></ol> +<ol start="222"><li title="222">໒໒໒</li></ol> +<ol start="540"><li title="540">໕໔໐</li></ol> +<ol start="999"><li title="999">໙໙໙</li></ol> +<ol start="1000"><li title="1000">໑໐໐໐</li></ol> +<ol start="1005"><li title="1005">໑໐໐໕</li></ol> +<ol start="1060"><li title="1060">໑໐໖໐</li></ol> +<ol start="1065"><li title="1065">໑໐໖໕</li></ol> +<ol start="1800"><li title="1800">໑໘໐໐</li></ol> +<ol start="1860"><li title="1860">໑໘໖໐</li></ol> +<ol start="1865"><li title="1865">໑໘໖໕</li></ol> +<ol start="5865"><li title="5865">໕໘໖໕</li></ol> +<ol start="7005"><li title="7005">໗໐໐໕</li></ol> +<ol start="7800"><li title="7800">໗໘໐໐</li></ol> +<ol start="7864"><li title="7864">໗໘໖໔</li></ol> +<ol start="9999"><li title="9999">໙໙໙໙</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-133.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-133.html new file mode 100644 index 0000000..3cabd35 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lao/css3-counter-styles-133.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lao, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lao produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: lao; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">໑.</li> +<li title="2">໒.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-111.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-111.html new file mode 100644 index 0000000..88d03957 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-111.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-armenian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-armenian produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">ա</li> +<li title="2">բ</li> +<li title="3">գ</li> +<li title="4">դ</li> +<li title="5">ե</li> +<li title="6">զ</li> +<li title="7">է</li> +<li title="8">ը</li> +<li title="9">թ</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-112.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-112.html new file mode 100644 index 0000000..d4239e0a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-112.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-armenian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-armenian produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title="10">ժ</li></ol> +<ol start="11"><li title="11">ժա</li></ol> +<ol start="12"><li title="12">ժբ</li></ol> +<ol start="43"><li title="43">խգ</li></ol> +<ol start="77"><li title="77">հէ</li></ol> +<ol start="80"><li title="80">ձ</li></ol> +<ol start="99"><li title="99">ղթ</li></ol> +<ol start="100"><li title="100">ճ</li></ol> +<ol start="101"><li title="101">ճա</li></ol> +<ol start="222"><li title="222">միբ</li></ol> +<ol start="540"><li title="540">շխ</li></ol> +<ol start="999"><li title="999">ջղթ</li></ol> +<ol start="1000"><li title="1000">ռ</li></ol> +<ol start="1005"><li title="1005">ռե</li></ol> +<ol start="1060"><li title="1060">ռկ</li></ol> +<ol start="1065"><li title="1065">ռկե</li></ol> +<ol start="1800"><li title="1800">ռպ</li></ol> +<ol start="1860"><li title="1860">ռպկ</li></ol> +<ol start="1865"><li title="1865">ռպկե</li></ol> +<ol start="5865"><li title="5865">րպկե</li></ol> +<ol start="7005"><li title="7005">ւե</li></ol> +<ol start="7800"><li title="7800">ւպ</li></ol> +<ol start="7865"><li title="7865">ւպկե</li></ol> +<ol start="9999"><li title="9999">քջղթ</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-114.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-114.html new file mode 100644 index 0000000..8f1cb8c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-114.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-armenian, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-armenian produces numbers in the fallback counter style above the limit per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='9999'> +<li title="9999">քջղթ</li> +<li title="10000">10000</li> +<li title="10001">10001</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-115.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-115.html new file mode 100644 index 0000000..08afc18 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-armenian/css3-counter-styles-115.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-armenian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-armenian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">ա.</li> +<li title="2">բ.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-027.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-027.html new file mode 100644 index 0000000..875db78 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-027.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-greek, simple</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to lower-greek will produce list numbering for the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: lower-greek; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol><li title='1'>α.</li> +<li title='2'>β.</li> +<li title='3'>γ.</li> +<li title='4'>δ.</li> +<li title='5'>ε.</li> +<li title='6'>ζ.</li> +<li title='7'>η.</li> +<li title='8'>θ.</li> +<li title='9'>ι.</li> +<li title='10'>κ.</li> +<li title='11'>λ.</li> +<li title='12'>μ.</li> +<li title='13'>ν.</li> +<li title='14'>ξ.</li> +<li title='15'>ο.</li> +<li title='16'>π.</li> +<li title='17'>ρ.</li> +<li title='18'>σ.</li> +<li title='19'>τ.</li> +<li title='20'>υ.</li> +<li title='21'>φ.</li> +<li title='22'>χ.</li> +<li title='23'>ψ.</li> +<li title='24'>ω.</li> +</ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-028.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-028.html new file mode 100644 index 0000000..d66c3c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-028.html
@@ -0,0 +1,54 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-greek, extended</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to lower-greek will produce list numbering after the basic alphabet as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: lower-greek; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='25'><li title='25'>αα.</li></ol> +<ol start='26'><li title='26'>αβ.</li></ol> +<ol start='43'><li title='43'>ατ.</li></ol> +<ol start='77'><li title='77'>γε.</li></ol> +<ol start='80'><li title='80'>γθ.</li></ol> +<ol start='99'><li title='99'>δγ.</li></ol> +<ol start='100'><li title='100'>δδ.</li></ol> +<ol start='101'><li title='101'>δε.</li></ol> +<ol start='222'><li title='222'>ιζ.</li></ol> +<ol start='540'><li title='540'>χμ.</li></ol> +<ol start='999'><li title='999'>αρο.</li></ol> +<ol start='1000'><li title='1000'>αρπ.</li></ol> +<ol start='1005'><li title='1005'>αρφ.</li></ol> +<ol start='1060'><li title='1060'>αυδ.</li></ol> +<ol start='1065'><li title='1065'>αυι.</li></ol> +<ol start='1800'><li title='1800'>γβω.</li></ol> +<ol start='1860'><li title='1860'>γεμ.</li></ol> +<ol start='5865'><li title='5865'>κδι.</li></ol> +<ol start='7005'><li title='7005'>μγφ.</li></ol> +<ol start='7800'><li title='7800'>νμω.</li></ol> +<ol start='7864'><li title='7864'>νοπ.</li></ol> +<ol start='9999'><li title='9999'>ρθο.</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-029.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-029.html new file mode 100644 index 0000000..a4b4f40 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-greek/css3-counter-styles-029.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-greek, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-alphabetic'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to lower-greek will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: lower-greek; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>α.</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-019.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-019.html new file mode 100644 index 0000000..d377e17 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-019.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: lower-roman produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol> +<li title="1">i</li> +<li title="2">ii</li> +<li title="3">iii</li> +<li title="4">iv</li> +<li title="5">v</li> +<li title="6">vi</li> +<li title="7">vii</li> +<li title="8">viii</li> +<li title="9">ix</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020.html new file mode 100644 index 0000000..48e39184 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, 10-3999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: lower-roman produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>x</li></ol> +<ol start='11'><li title='11'>xi</li></ol> +<ol start='12'><li title='12'>xii</li></ol> +<ol start='43'><li title='43'>xliii</li></ol> +<ol start='77'><li title='77'>lxxvii</li></ol> +<ol start='80'><li title='80'>lxxx</li></ol> +<ol start='99'><li title='99'>xcix</li></ol> +<ol start='100'><li title='100'>c</li></ol> +<ol start='101'><li title='101'>ci</li></ol> +<ol start='222'><li title='222'>ccxxii</li></ol> +<ol start='540'><li title='540'>dxl</li></ol> +<ol start='999'><li title='999'>cmxcix</li></ol> +<ol start='1000'><li title='1000'>m</li></ol> +<ol start='1005'><li title='1005'>mv</li></ol> +<ol start='1060'><li title='1060'>mlx</li></ol> +<ol start='1065'><li title='1065'>mlxv</li></ol> +<ol start='1800'><li title='1800'>mdccc</li></ol> +<ol start='1860'><li title='1860'>mdccclx</li></ol> +<ol start='1865'><li title='1865'>mdccclxv</li></ol> +<ol start='2555'><li title='2555'>mmdlv</li></ol> +<ol start='3000'><li title='3000'>mmm</li></ol> +<ol start='3999'><li title='3999'>mmmcmxcix</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020a.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020a.html new file mode 100644 index 0000000..17dda54f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020a.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, 3000-3999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='author' title='Chris Lilley' href='mailto:chris@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to lower-roman will produce list of up to 9 items in the range range: 1 to 3999."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: lower-roman; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='3000'><li title='3000'>mmm.</li></ol> +<ol start='3555'><li title='3555'>mmmdlv.</li></ol> +<ol start='3998'><li title='3998'>mmmcmxcviii.</li></ol> +<ol start='3999'><li title='3999'>mmmcmxcix.</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020b.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020b.html new file mode 100644 index 0000000..db24763d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-020b.html
@@ -0,0 +1,38 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, straddling range, 3000-4001</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='author' title='Chris Lilley' href='mailto:chris@w3.org'> +<link rel="reviewer" title="Tab Atkins" href="mailto:jackalmage@gmail.com" /> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#descdef-counter-style-range'> +<meta name='flags' content='font'> +<meta name="assert" content=" If a counter style is used to represent a counter value outside of its ranges, the counter style instead drops down to its fallback counter style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: lower-roman; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='3000'><li title='3000'>mmm.</li></ol> +<ol start='3555'><li title='3555'>mmmdlv.</li></ol> +<ol start='3998'><li title='3998'>mmmcmxcviii.</li></ol> +<ol start='3999'><li title='3999'>mmmcmxcix.</li></ol> +<ol start='4001'><li title='4001'>4001.</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-021.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-021.html new file mode 100644 index 0000000..794c3c9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-021.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-roman produces numbers in the fallback counter style above the limit per the spec"> +<style type='text/css'> +ol li { list-style-type: lower-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol start='3999'> +<li title='3999'>mmmcmxcix</li> +<li title='4000'>4000</li></ol> +<ol start='4001'><li title='4001'>4001</li> +<li title='4002'>4002</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-022.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-022.html new file mode 100644 index 0000000..29c4a8c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/lower-roman/css3-counter-styles-022.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>lower-roman, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: lower-roman produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: lower-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class="test"><ol> +<li title='1'>i.</li> +<li title='2'>ii.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-134.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-134.html new file mode 100644 index 0000000..0254b57b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-134.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>malayalam, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:malayalam produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: malayalam; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">൧</li> +<li title="2">൨</li> +<li title="3">൩</li> +<li title="4">൪</li> +<li title="5">൫</li> +<li title="6">൬</li> +<li title="7">൭</li> +<li title="8">൮</li> +<li title="9">൯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-135.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-135.html new file mode 100644 index 0000000..167cfc1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-135.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>malayalam, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: malayalam produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: malayalam; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">൧൦</li></ol> +<ol start="11"><li title="11">൧൧</li></ol> +<ol start="12"><li title="12">൧൨</li></ol> +<ol start="43"><li title="43">൪൩</li></ol> +<ol start="77"><li title="77">൭൭</li></ol> +<ol start="80"><li title="80">൮൦</li></ol> +<ol start="99"><li title="99">൯൯</li></ol> +<ol start="100"><li title="100">൧൦൦</li></ol> +<ol start="101"><li title="101">൧൦൧</li></ol> +<ol start="222"><li title="222">൨൨൨</li></ol> +<ol start="540"><li title="540">൫൪൦</li></ol> +<ol start="999"><li title="999">൯൯൯</li></ol> +<ol start="1000"><li title="1000">൧൦൦൦</li></ol> +<ol start="1005"><li title="1005">൧൦൦൫</li></ol> +<ol start="1060"><li title="1060">൧൦൬൦</li></ol> +<ol start="1065"><li title="1065">൧൦൬൫</li></ol> +<ol start="1800"><li title="1800">൧൮൦൦</li></ol> +<ol start="1860"><li title="1860">൧൮൬൦</li></ol> +<ol start="1865"><li title="1865">൧൮൬൫</li></ol> +<ol start="5865"><li title="5865">൫൮൬൫</li></ol> +<ol start="7005"><li title="7005">൭൦൦൫</li></ol> +<ol start="7800"><li title="7800">൭൮൦൦</li></ol> +<ol start="7864"><li title="7864">൭൮൬൪</li></ol> +<ol start="9999"><li title="9999">൯൯൯൯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-136.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-136.html new file mode 100644 index 0000000..643b404 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/malayalam/css3-counter-styles-136.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>malayalam, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: malayalam produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: malayalam; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">൧.</li> +<li title="2">൨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-137.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-137.html new file mode 100644 index 0000000..1ffb05e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-137.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>mongolian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:mongolian produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: mongolian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">᠑</li> +<li title="2">᠒</li> +<li title="3">᠓</li> +<li title="4">᠔</li> +<li title="5">᠕</li> +<li title="6">᠖</li> +<li title="7">᠗</li> +<li title="8">᠘</li> +<li title="9">᠙</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-138.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-138.html new file mode 100644 index 0000000..4e45748 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-138.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>mongolian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: mongolian produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: mongolian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">᠑᠐</li></ol> +<ol start="11"><li title="11">᠑᠑</li></ol> +<ol start="12"><li title="12">᠑᠒</li></ol> +<ol start="43"><li title="43">᠔᠓</li></ol> +<ol start="77"><li title="77">᠗᠗</li></ol> +<ol start="80"><li title="80">᠘᠐</li></ol> +<ol start="99"><li title="99">᠙᠙</li></ol> +<ol start="100"><li title="100">᠑᠐᠐</li></ol> +<ol start="101"><li title="101">᠑᠐᠑</li></ol> +<ol start="222"><li title="222">᠒᠒᠒</li></ol> +<ol start="540"><li title="540">᠕᠔᠐</li></ol> +<ol start="999"><li title="999">᠙᠙᠙</li></ol> +<ol start="1000"><li title="1000">᠑᠐᠐᠐</li></ol> +<ol start="1005"><li title="1005">᠑᠐᠐᠕</li></ol> +<ol start="1060"><li title="1060">᠑᠐᠖᠐</li></ol> +<ol start="1065"><li title="1065">᠑᠐᠖᠕</li></ol> +<ol start="1800"><li title="1800">᠑᠘᠐᠐</li></ol> +<ol start="1860"><li title="1860">᠑᠘᠖᠐</li></ol> +<ol start="1865"><li title="1865">᠑᠘᠖᠕</li></ol> +<ol start="5865"><li title="5865">᠕᠘᠖᠕</li></ol> +<ol start="7005"><li title="7005">᠗᠐᠐᠕</li></ol> +<ol start="7800"><li title="7800">᠗᠘᠐᠐</li></ol> +<ol start="7864"><li title="7864">᠗᠘᠖᠔</li></ol> +<ol start="9999"><li title="9999">᠙᠙᠙᠙</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-139.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-139.html new file mode 100644 index 0000000..435760c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/mongolian/css3-counter-styles-139.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>mongolian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: mongolian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: mongolian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">᠑.</li> +<li title="2">᠒.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-140.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-140.html new file mode 100644 index 0000000..2b11c68 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-140.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>myanmar, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:myanmar produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: myanmar; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">၁</li> +<li title="2">၂</li> +<li title="3">၃</li> +<li title="4">၄</li> +<li title="5">၅</li> +<li title="6">၆</li> +<li title="7">၇</li> +<li title="8">၈</li> +<li title="9">၉</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-141.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-141.html new file mode 100644 index 0000000..112cc1a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-141.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>myanmar, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: myanmar produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: myanmar; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">၁၀</li></ol> +<ol start="11"><li title="11">၁၁</li></ol> +<ol start="12"><li title="12">၁၂</li></ol> +<ol start="43"><li title="43">၄၃</li></ol> +<ol start="77"><li title="77">၇၇</li></ol> +<ol start="80"><li title="80">၈၀</li></ol> +<ol start="99"><li title="99">၉၉</li></ol> +<ol start="100"><li title="100">၁၀၀</li></ol> +<ol start="101"><li title="101">၁၀၁</li></ol> +<ol start="222"><li title="222">၂၂၂</li></ol> +<ol start="540"><li title="540">၅၄၀</li></ol> +<ol start="999"><li title="999">၉၉၉</li></ol> +<ol start="1000"><li title="1000">၁၀၀၀</li></ol> +<ol start="1005"><li title="1005">၁၀၀၅</li></ol> +<ol start="1060"><li title="1060">၁၀၆၀</li></ol> +<ol start="1065"><li title="1065">၁၀၆၅</li></ol> +<ol start="1800"><li title="1800">၁၈၀၀</li></ol> +<ol start="1860"><li title="1860">၁၈၆၀</li></ol> +<ol start="1865"><li title="1865">၁၈၆၅</li></ol> +<ol start="5865"><li title="5865">၅၈၆၅</li></ol> +<ol start="7005"><li title="7005">၇၀၀၅</li></ol> +<ol start="7800"><li title="7800">၇၈၀၀</li></ol> +<ol start="7864"><li title="7864">၇၈၆၄</li></ol> +<ol start="9999"><li title="9999">၉၉၉၉</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-142.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-142.html new file mode 100644 index 0000000..22f6a303 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/myanmar/css3-counter-styles-142.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>myanmar, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: myanmar produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: myanmar; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">၁.</li> +<li title="2">၂.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-143.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-143.html new file mode 100644 index 0000000..279742b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-143.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>oriya, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:oriya produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: oriya; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">୧</li> +<li title="2">୨</li> +<li title="3">୩</li> +<li title="4">୪</li> +<li title="5">୫</li> +<li title="6">୬</li> +<li title="7">୭</li> +<li title="8">୮</li> +<li title="9">୯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-144.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-144.html new file mode 100644 index 0000000..ec42bab0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-144.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>oriya, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: oriya produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: oriya; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">୧୦</li></ol> +<ol start="11"><li title="11">୧୧</li></ol> +<ol start="12"><li title="12">୧୨</li></ol> +<ol start="43"><li title="43">୪୩</li></ol> +<ol start="77"><li title="77">୭୭</li></ol> +<ol start="80"><li title="80">୮୦</li></ol> +<ol start="99"><li title="99">୯୯</li></ol> +<ol start="100"><li title="100">୧୦୦</li></ol> +<ol start="101"><li title="101">୧୦୧</li></ol> +<ol start="222"><li title="222">୨୨୨</li></ol> +<ol start="540"><li title="540">୫୪୦</li></ol> +<ol start="999"><li title="999">୯୯୯</li></ol> +<ol start="1000"><li title="1000">୧୦୦୦</li></ol> +<ol start="1005"><li title="1005">୧୦୦୫</li></ol> +<ol start="1060"><li title="1060">୧୦୬୦</li></ol> +<ol start="1065"><li title="1065">୧୦୬୫</li></ol> +<ol start="1800"><li title="1800">୧୮୦୦</li></ol> +<ol start="1860"><li title="1860">୧୮୬୦</li></ol> +<ol start="1865"><li title="1865">୧୮୬୫</li></ol> +<ol start="5865"><li title="5865">୫୮୬୫</li></ol> +<ol start="7005"><li title="7005">୭୦୦୫</li></ol> +<ol start="7800"><li title="7800">୭୮୦୦</li></ol> +<ol start="7864"><li title="7864">୭୮୬୪</li></ol> +<ol start="9999"><li title="9999">୯୯୯୯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-145.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-145.html new file mode 100644 index 0000000..3280343 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/oriya/css3-counter-styles-145.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>oriya, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: oriya produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: oriya; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">୧.</li> +<li title="2">୨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-104.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-104.html new file mode 100644 index 0000000..9886e5c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-104.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>persian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: persian produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: persian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'> +<ol> +<li title='1'>۱</li> +<li title='2'>۲</li> +<li title='3'>۳</li> +<li title='4'>۴</li> +<li title='5'>۵</li> +<li title='6'>۶</li> +<li title='7'>۷</li> +<li title='8'>۸</li> +<li title='9'>۹</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-105.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-105.html new file mode 100644 index 0000000..6a0dcf7c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-105.html
@@ -0,0 +1,89 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>persian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: persian produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: persian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class='test'> +<ol start='10'> +<li title='10'>۱۰</li> +<li title='11'>۱۱</li> +<li title='12'>۱۲</li> +</ol> +<ol start='43'> +<li title='43'>۴۳</li> +</ol> +<ol start='77'> +<li title='77'>۷۷</li> +</ol> +<ol start='80'> +<li title='80'>۸۰</li> +</ol> +<ol start='99'> +<li title='99'>۹۹</li> +<li title='100'>۱۰۰</li> +<li title='101'>۱۰۱</li> +</ol> +<ol start='222'> +<li title='222'>۲۲۲</li> +</ol> +<ol start='540'> +<li title='540'>۵۴۰</li> +</ol> +<ol start='999'> +<li title='999'>۹۹۹</li> +<li title='1000'>۱۰۰۰</li> +</ol> +<ol start='1005'> +<li title='1005'>۱۰۰۵</li> +</ol> +<ol start='1060'> +<li title='1060'>۱۰۶۰</li> +</ol> +<ol start='1065'> +<li title='1065'>۱۰۶۵</li> +</ol> +<ol start='1800'> +<li title='1800'>۱۸۰۰</li> +</ol> +<ol start='1860'> +<li title='1860'>۱۸۶۰</li> +</ol> +<ol start='1865'> +<li title='1865'>۱۸۶۵</li> +</ol> +<ol start='5865'> +<li title='5865'>۵۸۶۵</li> +</ol> +<ol start='7005'> +<li title='7005'>۷۰۰۵</li> +</ol> +<ol start='7800'> +<li title='7800'>۷۸۰۰ </li> +</ol> +<ol start='7864'> +<li title='7864'>۷۸۶۴</li> +</ol> +<ol start='9999'> +<li title='9999'>۹۹۹۹</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-106.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-106.html new file mode 100644 index 0000000..2b9edde --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/persian/css3-counter-styles-106.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>persian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: persian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: persian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title='1'>۱.</li> +<li title='2'>۲.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-076.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-076.html new file mode 100644 index 0000000..f7db75d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-076.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-formal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-formal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零、</li></ol> +<ol start='1'><li title='1'>壹、</li></ol> +<ol start='2'><li title='2'>贰、</li></ol> +<ol start='3'><li title='3'>叁、</li></ol> +<ol start='4'><li title='4'>肆、</li></ol> +<ol start='5'><li title='5'>伍、</li></ol> +<ol start='6'><li title='6'>陆、</li></ol> +<ol start='7'><li title='7'>柒、</li></ol> +<ol start='8'><li title='8'>捌、</li></ol> +<ol start='9'><li title='9'>玖、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-077.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-077.html new file mode 100644 index 0000000..d840254 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-077.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-formal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-formal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>壹拾、</li></ol> +<ol start='11'><li title='11'>壹拾壹、</li></ol> +<ol start='12'><li title='12'>壹拾贰、</li></ol> +<ol start='43'><li title='43'>肆拾叁、</li></ol> +<ol start='77'><li title='77'>柒拾柒、</li></ol> +<ol start='80'><li title='80'>捌拾、</li></ol> +<ol start='99'><li title='99'>玖拾玖、</li></ol> +<ol start='100'><li title='100'>壹佰、</li></ol> +<ol start='101'><li title='101'>壹佰零壹、</li></ol> +<ol start='222'><li title='222'>贰佰贰拾贰、</li></ol> +<ol start='540'><li title='540'>伍佰肆拾、</li></ol> +<ol start='999'><li title='999'>玖佰玖拾玖、</li></ol> +<ol start='1000'><li title='1000'>壹仟、</li></ol> +<ol start='1005'><li title='1005'>壹仟零伍、</li></ol> +<ol start='1060'><li title='1060'>壹仟零陆拾、</li></ol> +<ol start='1065'><li title='1065'>壹仟零陆拾伍、</li></ol> +<ol start='1800'><li title='1800'>壹仟捌佰、</li></ol> +<ol start='1860'><li title='1860'>壹仟捌佰陆拾、</li></ol> +<ol start='1865'><li title='1865'>壹仟捌佰陆拾伍、</li></ol> +<ol start='5865'><li title='5865'>伍仟捌佰陆拾伍、</li></ol> +<ol start='7005'><li title='7005'>柒仟零伍、</li></ol> +<ol start='7800'><li title='7800'>柒仟捌佰、</li></ol> +<ol start='7865'><li title='7865'>柒仟捌佰陆拾伍、</li></ol> +<ol start='9999'><li title='9999'>玖仟玖佰玖拾玖、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-078.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-078.html new file mode 100644 index 0000000..b7b6504 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-078.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-formal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: simp-chinese-formal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">玖仟玖佰玖拾玖</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-079.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-079.html new file mode 100644 index 0000000..3c74989 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-079.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-formal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to simp-chinese-formal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">负壹拾壹、</li><li title="-10">负壹拾、</li><li title="-9">负玖、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-080.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-080.html new file mode 100644 index 0000000..958f442 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-formal/css3-counter-styles-080.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-formal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-formal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>壹、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-071.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-071.html new file mode 100644 index 0000000..6e11ecd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-071.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-informal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-informal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零、</li></ol> +<ol start='1'><li title='1'>一、</li></ol> +<ol start='2'><li title='2'>二、</li></ol> +<ol start='3'><li title='3'>三、</li></ol> +<ol start='4'><li title='4'>四、</li></ol> +<ol start='5'><li title='5'>五、</li></ol> +<ol start='6'><li title='6'>六、</li></ol> +<ol start='7'><li title='7'>七、</li></ol> +<ol start='8'><li title='8'>八、</li></ol> +<ol start='9'><li title='9'>九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-072.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-072.html new file mode 100644 index 0000000..3af6151 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-072.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-informal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-informal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>十、</li></ol> +<ol start='11'><li title='11'>十一、</li></ol> +<ol start='12'><li title='12'>十二、</li></ol> +<ol start='43'><li title='43'>四十三、</li></ol> +<ol start='77'><li title='77'>七十七、</li></ol> +<ol start='80'><li title='80'>八十、</li></ol> +<ol start='99'><li title='99'>九十九、</li></ol> +<ol start='100'><li title='100'>一百、</li></ol> +<ol start='101'><li title='101'>一百零一、</li></ol> +<ol start='222'><li title='222'>二百二十二、</li></ol> +<ol start='540'><li title='540'>五百四十、</li></ol> +<ol start='999'><li title='999'>九百九十九、</li></ol> +<ol start='1000'><li title='1000'>一千、</li></ol> +<ol start='1005'><li title='1005'>一千零五、</li></ol> +<ol start='1060'><li title='1060'>一千零六十、</li></ol> +<ol start='1065'><li title='1065'>一千零六十五、</li></ol> +<ol start='1800'><li title='1800'>一千八百、</li></ol> +<ol start='1860'><li title='1860'>一千八百六十、</li></ol> +<ol start='1865'><li title='1865'>一千八百六十五、</li></ol> +<ol start='5865'><li title='5865'>五千八百六十五、</li></ol> +<ol start='7005'><li title='7005'>七千零五、</li></ol> +<ol start='7800'><li title='7800'>七千八百、</li></ol> +<ol start='7865'><li title='7865'>七千八百六十五、</li></ol> +<ol start='9999'><li title='9999'>九千九百九十九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-073.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-073.html new file mode 100644 index 0000000..3e520e45 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-073.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-informal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: simp-chinese-informal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九千九百九十九</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-074.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-074.html new file mode 100644 index 0000000..f32a52131 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-074.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-informal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to simp-chinese-informal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">负十一、</li><li title="-10">负十、</li><li title="-9">负九、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-075.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-075.html new file mode 100644 index 0000000..bb7807e4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/simp-chinese-informal/css3-counter-styles-075.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>simp-chinese-informal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to simp-chinese-informal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: simp-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>一、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/support/counter-style-testcommon.js b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/support/counter-style-testcommon.js new file mode 100644 index 0000000..a3615e9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/support/counter-style-testcommon.js
@@ -0,0 +1,83 @@ +function test_counter_style_descriptor(descriptor, value, expected) { + let descriptors = []; + descriptors.push(`${descriptor}: ${value}`); + + // Fill out the remaining necessary descriptors + if (descriptor === 'system') { + if (value === 'additive') + descriptors.push('additive-symbols: 1 "I"'); + else if (!value.startsWith('extends')) + descriptors.push('symbols: "X" "Y"'); + } else if (descriptor === 'symbols') { + descriptors.push('system: symbolic'); + } else if (descriptor === 'additive-symbols') { + descriptors.push('system: additive'); + } else { + descriptors.push('system: symbolic'); + descriptors.push('symbols: "X" "Y"'); + } + + let style = document.createElement('style'); + style.textContent = `@counter-style foo { ${descriptors.join(';')} }`; + document.head.appendChild(style); + + test(() => { + let rule = style.sheet.cssRules[0]; + // TODO: The spec is inconsistent on when the entire rule is invalid + // (and hence absent from OM), and when only the descriptor is invalid. + // Revise when spec issue is resolved. + // See https://github.com/w3c/csswg-drafts/issues/5717 + if (!rule) { + assert_equals(expected, undefined); + return; + } + + assert_equals(rule.constructor.name, 'CSSCounterStyleRule'); + + let text = rule.cssText; + if (expected) + assert_not_equals(text.indexOf(`${descriptor}: ${expected}`), -1); + else + assert_equals(text.indexOf(`${descriptor}:`), -1); + }, `@counter-style '${descriptor}: ${value}' is ${expected ? 'valid' : 'invalid'}`); + + style.remove(); +} + +function test_valid_counter_style_descriptor(descriptor, value, expected) { + expected = expected || value; + test_counter_style_descriptor(descriptor, value, expected); +} + +function test_invalid_counter_style_descriptor(descriptor, value) { + test_counter_style_descriptor(descriptor, value, undefined); +} + +function test_counter_style_name(name, isValid) { + let style = document.createElement('style'); + style.textContent = `@counter-style ${name} { system: symbolic; symbols: 'X' 'Y'; }`; + document.head.appendChild(style); + + test(() => { + let rule = style.sheet.cssRules[0]; + if (!isValid) { + assert_equals(rule, undefined); + return; + } + + assert_not_equals(rule, undefined); + assert_equals(rule.constructor.name, 'CSSCounterStyleRule'); + assert_equals(rule.name, name); + }, `@counter-style name ${name} is ${isValid ? 'valid' : 'invalid'}`); + + style.remove(); +} + +function test_valid_name(name) { + test_counter_style_name(name, true); +} + +function test_invalid_name(name) { + test_counter_style_name(name, false); +} +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-146.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-146.html new file mode 100644 index 0000000..d0476bab --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-146.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tamil, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:tamil produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: tamil; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">௧</li> +<li title="2">௨</li> +<li title="3">௩</li> +<li title="4">௪</li> +<li title="5">௫</li> +<li title="6">௬</li> +<li title="7">௭</li> +<li title="8">௮</li> +<li title="9">௯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-147.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-147.html new file mode 100644 index 0000000..4f5bfac --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-147.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tamil, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: tamil produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: tamil; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">௧௦</li></ol> +<ol start="11"><li title="11">௧௧</li></ol> +<ol start="12"><li title="12">௧௨</li></ol> +<ol start="43"><li title="43">௪௩</li></ol> +<ol start="77"><li title="77">௭௭</li></ol> +<ol start="80"><li title="80">௮௦</li></ol> +<ol start="99"><li title="99">௯௯</li></ol> +<ol start="100"><li title="100">௧௦௦</li></ol> +<ol start="101"><li title="101">௧௦௧</li></ol> +<ol start="222"><li title="222">௨௨௨</li></ol> +<ol start="540"><li title="540">௫௪௦</li></ol> +<ol start="999"><li title="999">௯௯௯</li></ol> +<ol start="1000"><li title="1000">௧௦௦௦</li></ol> +<ol start="1005"><li title="1005">௧௦௦௫</li></ol> +<ol start="1060"><li title="1060">௧௦௬௦</li></ol> +<ol start="1065"><li title="1065">௧௦௬௫</li></ol> +<ol start="1800"><li title="1800">௧௮௦௦</li></ol> +<ol start="1860"><li title="1860">௧௮௬௦</li></ol> +<ol start="1865"><li title="1865">௧௮௬௫</li></ol> +<ol start="5865"><li title="5865">௫௮௬௫</li></ol> +<ol start="7005"><li title="7005">௭௦௦௫</li></ol> +<ol start="7800"><li title="7800">௭௮௦௦</li></ol> +<ol start="7864"><li title="7864">௭௮௬௪</li></ol> +<ol start="9999"><li title="9999">௯௯௯௯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-148.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-148.html new file mode 100644 index 0000000..948aa839b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tamil/css3-counter-styles-148.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tamil, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: tamil produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: tamil; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">௧.</li> +<li title="2">௨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-149.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-149.html new file mode 100644 index 0000000..7bc2491 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-149.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>telugu, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:telugu produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: telugu; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">౧</li> +<li title="2">౨</li> +<li title="3">౩</li> +<li title="4">౪</li> +<li title="5">౫</li> +<li title="6">౬</li> +<li title="7">౭</li> +<li title="8">౮</li> +<li title="9">౯</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-150.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-150.html new file mode 100644 index 0000000..50dd1f3e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-150.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>telugu, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: telugu produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: telugu; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">౧౦</li></ol> +<ol start="11"><li title="11">౧౧</li></ol> +<ol start="12"><li title="12">౧౨</li></ol> +<ol start="43"><li title="43">౪౩</li></ol> +<ol start="77"><li title="77">౭౭</li></ol> +<ol start="80"><li title="80">౮౦</li></ol> +<ol start="99"><li title="99">౯౯</li></ol> +<ol start="100"><li title="100">౧౦౦</li></ol> +<ol start="101"><li title="101">౧౦౧</li></ol> +<ol start="222"><li title="222">౨౨౨</li></ol> +<ol start="540"><li title="540">౫౪౦</li></ol> +<ol start="999"><li title="999">౯౯౯</li></ol> +<ol start="1000"><li title="1000">౧౦౦౦</li></ol> +<ol start="1005"><li title="1005">౧౦౦౫</li></ol> +<ol start="1060"><li title="1060">౧౦౬౦</li></ol> +<ol start="1065"><li title="1065">౧౦౬౫</li></ol> +<ol start="1800"><li title="1800">౧౮౦౦</li></ol> +<ol start="1860"><li title="1860">౧౮౬౦</li></ol> +<ol start="1865"><li title="1865">౧౮౬౫</li></ol> +<ol start="5865"><li title="5865">౫౮౬౫</li></ol> +<ol start="7005"><li title="7005">౭౦౦౫</li></ol> +<ol start="7800"><li title="7800">౭౮౦౦</li></ol> +<ol start="7864"><li title="7864">౭౮౬౪</li></ol> +<ol start="9999"><li title="9999">౯౯౯౯</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-151.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-151.html new file mode 100644 index 0000000..141451c3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/telugu/css3-counter-styles-151.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>telugu, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: telugu produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: telugu; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">౧.</li> +<li title="2">౨.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-152.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-152.html new file mode 100644 index 0000000..74b8ece --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-152.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>thai, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:thai produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: thai; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">๑</li> +<li title="2">๒</li> +<li title="3">๓</li> +<li title="4">๔</li> +<li title="5">๕</li> +<li title="6">๖</li> +<li title="7">๗</li> +<li title="8">๘</li> +<li title="9">๙</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-153.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-153.html new file mode 100644 index 0000000..a5918a6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-153.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>thai, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: thai produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: thai; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">๑๐</li></ol> +<ol start="11"><li title="11">๑๑</li></ol> +<ol start="12"><li title="12">๑๒</li></ol> +<ol start="43"><li title="43">๔๓</li></ol> +<ol start="77"><li title="77">๗๗</li></ol> +<ol start="80"><li title="80">๘๐</li></ol> +<ol start="99"><li title="99">๙๙</li></ol> +<ol start="100"><li title="100">๑๐๐</li></ol> +<ol start="101"><li title="101">๑๐๑</li></ol> +<ol start="222"><li title="222">๒๒๒</li></ol> +<ol start="540"><li title="540">๕๔๐</li></ol> +<ol start="999"><li title="999">๙๙๙</li></ol> +<ol start="1000"><li title="1000">๑๐๐๐</li></ol> +<ol start="1005"><li title="1005">๑๐๐๕</li></ol> +<ol start="1060"><li title="1060">๑๐๖๐</li></ol> +<ol start="1065"><li title="1065">๑๐๖๕</li></ol> +<ol start="1800"><li title="1800">๑๘๐๐</li></ol> +<ol start="1860"><li title="1860">๑๘๖๐</li></ol> +<ol start="1865"><li title="1865">๑๘๖๕</li></ol> +<ol start="5865"><li title="5865">๕๘๖๕</li></ol> +<ol start="7005"><li title="7005">๗๐๐๕</li></ol> +<ol start="7800"><li title="7800">๗๘๐๐</li></ol> +<ol start="7864"><li title="7864">๗๘๖๔</li></ol> +<ol start="9999"><li title="9999">๙๙๙๙</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-154.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-154.html new file mode 100644 index 0000000..876c0ef9 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/thai/css3-counter-styles-154.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>thai, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: thai produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: thai; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">๑.</li> +<li title="2">๒.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-155.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-155.html new file mode 100644 index 0000000..0467f6f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-155.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tibetan, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type:tibetan produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: tibetan; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title="1">༡</li> +<li title="2">༢</li> +<li title="3">༣</li> +<li title="4">༤</li> +<li title="5">༥</li> +<li title="6">༦</li> +<li title="7">༧</li> +<li title="8">༨</li> +<li title="9">༩</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-156.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-156.html new file mode 100644 index 0000000..4dba20d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-156.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tibetan, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: tibetan produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: tibetan; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start="10"><li title="10">༡༠</li></ol> +<ol start="11"><li title="11">༡༡</li></ol> +<ol start="12"><li title="12">༡༢</li></ol> +<ol start="43"><li title="43">༤༣</li></ol> +<ol start="77"><li title="77">༧༧</li></ol> +<ol start="80"><li title="80">༨༠</li></ol> +<ol start="99"><li title="99">༩༩</li></ol> +<ol start="100"><li title="100">༡༠༠</li></ol> +<ol start="101"><li title="101">༡༠༡</li></ol> +<ol start="222"><li title="222">༢༢༢</li></ol> +<ol start="540"><li title="540">༥༤༠</li></ol> +<ol start="999"><li title="999">༩༩༩</li></ol> +<ol start="1000"><li title="1000">༡༠༠༠</li></ol> +<ol start="1005"><li title="1005">༡༠༠༥</li></ol> +<ol start="1060"><li title="1060">༡༠༦༠</li></ol> +<ol start="1065"><li title="1065">༡༠༦༥</li></ol> +<ol start="1800"><li title="1800">༡༨༠༠</li></ol> +<ol start="1860"><li title="1860">༡༨༦༠</li></ol> +<ol start="1865"><li title="1865">༡༨༦༥</li></ol> +<ol start="5865"><li title="5865">༥༨༦༥</li></ol> +<ol start="7005"><li title="7005">༧༠༠༥</li></ol> +<ol start="7800"><li title="7800">༧༨༠༠</li></ol> +<ol start="7864"><li title="7864">༧༨༦༤</li></ol> +<ol start="9999"><li title="9999">༩༩༩༩</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-157.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-157.html new file mode 100644 index 0000000..5aeb79c1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/tibetan/css3-counter-styles-157.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>tibetan, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: tibetan produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: tibetan; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title="1">༡.</li> +<li title="2">༢.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-086.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-086.html new file mode 100644 index 0000000..b47b091 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-086.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-formal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-formal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零、</li></ol> +<ol start='1'><li title='1'>壹、</li></ol> +<ol start='2'><li title='2'>貳、</li></ol> +<ol start='3'><li title='3'>參、</li></ol> +<ol start='4'><li title='4'>肆、</li></ol> +<ol start='5'><li title='5'>伍、</li></ol> +<ol start='6'><li title='6'>陸、</li></ol> +<ol start='7'><li title='7'>柒、</li></ol> +<ol start='8'><li title='8'>捌、</li></ol> +<ol start='9'><li title='9'>玖、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-087.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-087.html new file mode 100644 index 0000000..887d024f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-087.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-formal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-formal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>壹拾、</li></ol> +<ol start='11'><li title='11'>壹拾壹、</li></ol> +<ol start='12'><li title='12'>壹拾貳、</li></ol> +<ol start='43'><li title='43'>肆拾參、</li></ol> +<ol start='77'><li title='77'>柒拾柒、</li></ol> +<ol start='80'><li title='80'>捌拾、</li></ol> +<ol start='99'><li title='99'>玖拾玖、</li></ol> +<ol start='100'><li title='100'>壹佰、</li></ol> +<ol start='101'><li title='101'>壹佰零壹、</li></ol> +<ol start='222'><li title='222'>貳佰貳拾貳、</li></ol> +<ol start='540'><li title='540'>伍佰肆拾、</li></ol> +<ol start='999'><li title='999'>玖佰玖拾玖、</li></ol> +<ol start='1000'><li title='1000'>壹仟、</li></ol> +<ol start='1005'><li title='1005'>壹仟零伍、</li></ol> +<ol start='1060'><li title='1060'>壹仟零陸拾、</li></ol> +<ol start='1065'><li title='1065'>壹仟零陸拾伍、</li></ol> +<ol start='1800'><li title='1800'>壹仟捌佰、</li></ol> +<ol start='1860'><li title='1860'>壹仟捌佰陸拾、</li></ol> +<ol start='1865'><li title='1865'>壹仟捌佰陸拾伍、</li></ol> +<ol start='5865'><li title='5865'>伍仟捌佰陸拾伍、</li></ol> +<ol start='7005'><li title='7005'>柒仟零伍、</li></ol> +<ol start='7800'><li title='7800'>柒仟捌佰、</li></ol> +<ol start='7865'><li title='7865'>柒仟捌佰陸拾伍、</li></ol> +<ol start='9999'><li title='9999'>玖仟玖佰玖拾玖、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-088.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-088.html new file mode 100644 index 0000000..d97f156 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-088.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-formal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: trad-chinese-formal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">玖仟玖佰玖拾玖</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-089.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-089.html new file mode 100644 index 0000000..69c24c8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-089.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-formal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to trad-chinese-formal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">負壹拾壹、</li><li title="-10">負壹拾、</li><li title="-9">負玖、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-090.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-090.html new file mode 100644 index 0000000..e5fbb36 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-formal/css3-counter-styles-090.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-formal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-formal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-formal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>壹、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-081.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-081.html new file mode 100644 index 0000000..89ec3f12 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-081.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-informal, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-informal will produce list of up to 9 items numbering as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='0'><li title='0'>零、</li></ol> +<ol start='1'><li title='1'>一、</li></ol> +<ol start='2'><li title='2'>二、</li></ol> +<ol start='3'><li title='3'>三、</li></ol> +<ol start='4'><li title='4'>四、</li></ol> +<ol start='5'><li title='5'>五、</li></ol> +<ol start='6'><li title='6'>六、</li></ol> +<ol start='7'><li title='7'>七、</li></ol> +<ol start='8'><li title='8'>八、</li></ol> +<ol start='9'><li title='9'>九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-082.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-082.html new file mode 100644 index 0000000..bac46b3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-082.html
@@ -0,0 +1,56 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-informal, 10-9999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-informal will produce list numbering after 9 as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='10'><li title='10'>十、</li></ol> +<ol start='11'><li title='11'>十一、</li></ol> +<ol start='12'><li title='12'>十二、</li></ol> +<ol start='43'><li title='43'>四十三、</li></ol> +<ol start='77'><li title='77'>七十七、</li></ol> +<ol start='80'><li title='80'>八十、</li></ol> +<ol start='99'><li title='99'>九十九、</li></ol> +<ol start='100'><li title='100'>一百、</li></ol> +<ol start='101'><li title='101'>一百零一、</li></ol> +<ol start='222'><li title='222'>二百二十二、</li></ol> +<ol start='540'><li title='540'>五百四十、</li></ol> +<ol start='999'><li title='999'>九百九十九、</li></ol> +<ol start='1000'><li title='1000'>一千、</li></ol> +<ol start='1005'><li title='1005'>一千零五、</li></ol> +<ol start='1060'><li title='1060'>一千零六十、</li></ol> +<ol start='1065'><li title='1065'>一千零六十五、</li></ol> +<ol start='1800'><li title='1800'>一千八百、</li></ol> +<ol start='1860'><li title='1860'>一千八百六十、</li></ol> +<ol start='1865'><li title='1865'>一千八百六十五、</li></ol> +<ol start='5865'><li title='5865'>五千八百六十五、</li></ol> +<ol start='7005'><li title='7005'>七千零五、</li></ol> +<ol start='7800'><li title='7800'>七千八百、</li></ol> +<ol start='7865'><li title='7865'>七千八百六十五、</li></ol> +<ol start='9999'><li title='9999'>九千九百九十九、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-083.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-083.html new file mode 100644 index 0000000..d8935b0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-083.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-informal, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="[Exploratory] list-style-type: trad-chinese-informal produces counter values outside its range without using the prescribed fallback style."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test fails if the two columns of the first line are NOT the same. Otherwise, test passes only if the left column of the 2nd and 3rd lines is NOT decimal digits and is NOT the same as the right side. Score as Partial if the columns of the 2nd and 3rd lines are the same (ie. fallback was used). In all this IGNORE the suffix.</p> +<div class="test"><ol start="9999"> +<li title="9999">九千九百九十九</li> +<li title="10000">一〇〇〇〇</li> +<li title="10001">一〇〇〇一</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-084.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-084.html new file mode 100644 index 0000000..2387abd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-084.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-informal, negative</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="With list-style-type set to trad-chinese-informal, negative list markers will be rendered according to the rules described."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start="-11"><li title="-11">負十一、</li><li title="-10">負十、</li><li title="-9">負九、</li></ol></div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-085.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-085.html new file mode 100644 index 0000000..1dba111c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/trad-chinese-informal/css3-counter-styles-085.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>trad-chinese-informal, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#complex-cjk'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to trad-chinese-informal will produce a suffix as described in the CSS3 Counter Styles module."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: trad-chinese-informal; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> + + +<div class="test"><ol start='1'><li title='1'>一、</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-107.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-107.html new file mode 100644 index 0000000..52a86fc2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-107.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-armenian, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-armenian produces numbers up to 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol> +<li title='1'>Ա</li> +<li title='2'>Բ</li> +<li title='3'>Գ</li> +<li title='4'>Դ</li> +<li title='5'>Ե</li> +<li title='6'>Զ</li> +<li title='7'>Է</li> +<li title='8'>Ը</li> +<li title='9'>Թ</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-108.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-108.html new file mode 100644 index 0000000..5781ddc --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-108.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-armenian, 10+</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-armenian produces numbers after 9 per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>Ժ</li></ol> +<ol start='11'><li title='11'>ԺԱ</li></ol> +<ol start='12'><li title='12'>ԺԲ</li></ol> +<ol start='43'><li title='43'>ԽԳ</li></ol> +<ol start='77'><li title='77'>ՀԷ</li></ol> +<ol start='80'><li title='80'>Ձ</li></ol> +<ol start='99'><li title='99'>ՂԹ</li></ol> +<ol start='100'><li title='100'>Ճ</li></ol> +<ol start='101'><li title='101'>ՃԱ</li></ol> +<ol start='222'><li title='222'>ՄԻԲ</li></ol> +<ol start='540'><li title='540'>ՇԽ</li></ol> +<ol start='999'><li title='999'>ՋՂԹ</li></ol> +<ol start='1000'><li title='1000'>Ռ</li></ol> +<ol start='1005'><li title='1005'>ՌԵ</li></ol> +<ol start='1060'><li title='1060'>ՌԿ</li></ol> +<ol start='1065'><li title='1065'>ՌԿԵ</li></ol> +<ol start='1800'><li title='1800'>ՌՊ</li></ol> +<ol start='1860'><li title='1860'>ՌՊԿ</li></ol> +<ol start='1865'><li title='1865'>ՌՊԿԵ</li></ol> +<ol start='5865'><li title='5865'>ՐՊԿԵ</li></ol> +<ol start='7005'><li title='7005'>ՒԵ</li></ol> +<ol start='7800'><li title='7800'>ՒՊ</li></ol> +<ol start='7865'><li title='7865'>ՒՊԿԵ</li></ol> +<ol start='9999'><li title='9999'>ՔՋՂԹ</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-109.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-109.html new file mode 100644 index 0000000..f355f98 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-109.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-armenian, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-armenian produces numbers in the fallback counter style above the limit per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='9999'> +<li title='9999'>ՔՋՂԹ</li> +<li title='10000'>10000</li> +<li title='10001'>10001</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +The test relies on the start attribute working. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-110.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-110.html new file mode 100644 index 0000000..6a9baeb3 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-armenian/css3-counter-styles-110.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-armenian, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-armenian produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-armenian; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class='test'><ol> +<li title='1'>Ա.</li> +<li title='2'>Բ.</li> +</ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-023.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-023.html new file mode 100644 index 0000000..6c9828a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-023.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-roman, 0-9</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: upper-roman produces numbers up to 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol> +<li title="1">I</li> +<li title="2">II</li> +<li title="3">III</li> +<li title="4">IV</li> +<li title="5">V</li> +<li title="6">VI</li> +<li title="7">VII</li> +<li title="8">VIII</li> +<li title="9">IX</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024.html new file mode 100644 index 0000000..65b1618 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-roman, 10-3999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style: upper-roman produces numbers after 9 items per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"> +<ol start='10'><li title='10'>X</li></ol> +<ol start='11'><li title='11'>XI</li></ol> +<ol start='12'><li title='12'>XII</li></ol> +<ol start='43'><li title='43'>XLIII</li></ol> +<ol start='77'><li title='77'>LXXVII</li></ol> +<ol start='80'><li title='80'>LXXX</li></ol> +<ol start='99'><li title='99'>XCIX</li></ol> +<ol start='100'><li title='100'>C</li></ol> +<ol start='101'><li title='101'>CI</li></ol> +<ol start='222'><li title='222'>CCXXII</li></ol> +<ol start='540'><li title='540'>DXL</li></ol> +<ol start='999'><li title='999'>CMXCIX</li></ol> +<ol start='1000'><li title='1000'>M</li></ol> +<ol start='1005'><li title='1005'>MV</li></ol> +<ol start='1060'><li title='1060'>MLX</li></ol> +<ol start='1065'><li title='1065'>MLXV</li></ol> +<ol start='1800'><li title='1800'>MDCCC</li></ol> +<ol start='1860'><li title='1860'>MDCCCLX</li></ol> +<ol start='1865'><li title='1865'>MDCCCLXV</li></ol> +<ol start='2555'><li title='2555'>MMDLV</li></ol> +<ol start='3000'><li title='3000'>MMM</li></ol> +<ol start='3999'><li title='3999'>MMMCMXCIX</li></ol> +</div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024a.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024a.html new file mode 100644 index 0000000..f51f74b5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-024a.html
@@ -0,0 +1,37 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-roman, 3000-3999</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='author' title='Chris Lilley' href='mailto:chris@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="Setting list-style-type to upper-roman will produce list of up to 9 items in the range range: 1 to 3999."> +<style type='text/css'> +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +ol li { list-style-type: upper-roman; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, ignoring the suffix.</p> + + +<div class="test"><ol start='3000'><li title='3000'>MMM.</li></ol> +<ol start='3555'><li title='3555'>MMMDLV.</li></ol> +<ol start='3998'><li title='3998'>MMMCMXCVIII.</li></ol> +<ol start='3999'><li title='3999'>MMMCMXCIX.</li></ol> +</div> + + +<!--Notes: +You will need an appropriate font to run this test. + +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> + + +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-025.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-025.html new file mode 100644 index 0000000..9417d9e4 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-025.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-roman, outside range</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-roman produces numbers in the fallback counter style above the limit per the spec"> +<style type='text/css'> +ol li { list-style-type: upper-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the two columns are the same, IGNORING the suffix.</p> +<div class="test"><ol start='3999'> +<li title='3999'>MMMCMXCIX</li> +<li title='4000'>4000</li></ol> +<ol start='4001'><li title='4001'>4001</li> +<li title='4002'>4002</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-026.html b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-026.html new file mode 100644 index 0000000..e106e053 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-counter-styles/upper-roman/css3-counter-styles-026.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en" > +<head> +<meta charset="utf-8"/> +<title>upper-roman, suffix</title> +<link rel='author' title='Richard Ishida' href='mailto:ishida@w3.org'> +<link rel='help' href='http://www.w3.org/TR/css-counter-styles-3/#simple-numeric'> +<link rel="reviewer" title="Chris Lilley" href="mailto:chris@w3.org" /> +<meta name='flags' content='font'> +<meta name="assert" content="list-style-type: upper-roman produces a suffix per the spec."> +<style type='text/css'> +ol li { list-style-type: upper-roman; } +/* the following CSS is not part of the test */ +.test { font-size: 25px; } +ol { margin: 0; padding-left: 8em; } +</style> +</head> +<body> +<p class="instructions">Test passes if the numbers AND the suffix in each of the two columns is the same.</p> +<div class="test"><ol> +<li title='1'>I.</li> +<li title='2'>II.</li> +</ol></div> +<!--Notes: +You will need an appropriate font to run this test. +To see the ASCII decimal number associated with a row, mouse over it and the number will pop up in a tooltip. +--> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-computed.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-computed.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-computed.html rename to third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-computed.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-invalid.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-invalid.html rename to third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-invalid.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-valid.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-valid.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/contain-intrinsic-size-valid.html rename to third_party/blink/web_tests/external/wpt/css/css-sizing/aspect-ratio/parsing/aspect-ratio-valid.html
diff --git a/third_party/blink/web_tests/external/wpt/docs/requirements.txt b/third_party/blink/web_tests/external/wpt/docs/requirements.txt index 03ce983..281c9229 100644 --- a/third_party/blink/web_tests/external/wpt/docs/requirements.txt +++ b/third_party/blink/web_tests/external/wpt/docs/requirements.txt
@@ -1,4 +1,4 @@ -recommonmark==0.6.0 +recommonmark==0.7.1 # Pin this to the same major version as https://docs.python.org/3/ Sphinx==2.4.4 # pyup: <3.0 sphinx-argparse==0.2.5
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/editing/deleting/460938-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/editing/deleting/460938-expected.txt new file mode 100644 index 0000000..1cf68849 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/editing/deleting/460938-expected.txt
@@ -0,0 +1,5 @@ +PASS Renderer did not crash. +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel-expected.txt new file mode 100644 index 0000000..d5191d73 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel-expected.txt
@@ -0,0 +1,13 @@ +This tests cancelling a requestAnimationFrame callback + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS callbackFired is false +PASS successfullyParsed is true + +TEST COMPLETE + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel2-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel2-expected.txt new file mode 100644 index 0000000..141e37c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-cancel2-expected.txt
@@ -0,0 +1,14 @@ +Tests one requestAnimationFrame callback cancelling a second + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS callbackFired is false +PASS cancelFired is true +PASS successfullyParsed is true + +TEST COMPLETE + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-expected.txt new file mode 100644 index 0000000..2be9c1f --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-expected.txt
@@ -0,0 +1,13 @@ +Tests basic use of requestAnimationFrame + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS callbackInvoked is true +PASS successfullyParsed is true + +TEST COMPLETE + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-timestamps-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-timestamps-expected.txt new file mode 100644 index 0000000..a8cb49a9 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/animation/request-animation-frame-timestamps-expected.txt
@@ -0,0 +1,16 @@ +Tests the timestamps provided to requestAnimationFrame callbacks + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS firstTimestamp is defined. +PASS secondTimestamp is defined. +PASS firstTimestamp is secondTimestamp +PASS firstTimestamp is defined. +PASS successfullyParsed is true + +TEST COMPLETE + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/focus-display-block-inline-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/focus-display-block-inline-expected.txt new file mode 100644 index 0000000..8569ea2a --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/focus-display-block-inline-expected.txt
@@ -0,0 +1,6 @@ +PASS successfullyParsed is true + +TEST COMPLETE + +PASS Setting display to none on focus processed OK. +When you hit TAB, this button should disappear.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/fontfaceset-multiple-families-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/fontfaceset-multiple-families-expected.txt new file mode 100644 index 0000000..9332a61 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/css/fontfaceset-multiple-families-expected.txt
@@ -0,0 +1,26 @@ +CONSOLE WARNING: line 91: Failed to decode downloaded font: data:application/x-truetype-font, +Test load events for fonts.loadFont() with multiple font families. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS event.fontfaces.length is 2 +PASS event.fontfaces[0].status is "loaded" +PASS event.fontfaces[1].status is "loaded" +PASS loadedFonts is ['TestFont1', 'TestFont2'] +PASS document.fonts.check('10px TestFont1') is true +PASS document.fonts.check('10px TestFont2') is true +PASS document.fonts.check('10px TestFont1, TestFont2') is true +PASS document.fonts.check('10px Times') is true +PASS document.fonts.check('10px TestFont1, Times') is true +PASS event.fontfaces.length is 2 +PASS event.fontfaces[0].status is "error" +PASS event.fontfaces[1].status is "error" +PASS failedFonts is ['TestFont3', 'TestFont4'] +PASS document.fonts.check('10px TestFont3') is false +PASS document.fonts.check('10px TestFont4') is false +PASS document.fonts.check('10px TestFont4, Times') is false +PASS firedEvents is ['loading', 'loadingdone', 'loadingerror'] +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/hit-test-counts-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/hit-test-counts-expected.txt new file mode 100644 index 0000000..ff62ee1 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/hit-test-counts-expected.txt
@@ -0,0 +1,81 @@ +Count how many hit tests are required for various event scenarios. Hit tests can be expensive and it's often tempting to add more. These values should only ever be changed to go down, not up. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +Event on a simple div +--------------------- +Initial: 0+0 +MouseMove: 1+0 +MouseDown: 1+2 +MouseUp: 0+1 +Wheel: 0+1 +TouchStart: 1+1 +TouchMove: 0+0 +TouchEnd: 0+0 +GestureTapDown: 0+1 +GestureShowPress: 0+1 +GestureTap: 0+3 +GestureTapCancel: 0+1 +DoubleFingerTouch: 3+0 +TouchScroll: 4+2 +MouseWheelScroll: 0+2 + +Event entirely over one iframe nested in another +--------------------- +Initial: 0+0 0+0 0+0 +MouseMove: 1+0 1+0 1+0 +MouseDown: 1+1 1+1 1+2 +MouseUp: 0+0 0+0 0+1 +Wheel: 0+1 0+1 0+1 +TouchStart: 2+0 2+0 1+1 +TouchMove: 0+0 0+0 0+0 +TouchEnd: 0+0 0+0 0+0 +GestureTapDown: 1+0 1+0 0+1 +GestureShowPress: 1+0 1+0 0+1 +GestureTap: 1+0 1+0 0+3 +GestureTapCancel: 1+0 1+0 0+1 +DoubleFingerTouch: 3+0 3+0 3+0 +TouchScroll: 4+2 4+2 4+2 +MouseWheelScroll: 0+2 0+2 0+2 + +Event near boundary of two iframes +--------------------- +Initial: 0+0 0+0 0+0 +MouseMove: 1+0 1+0 0+0 +MouseDown: 1+1 1+2 0+0 +MouseUp: 0+0 0+1 0+0 +Wheel: 0+1 0+1 0+0 +TouchStart: 2+0 1+1 1+0 +TouchMove: 0+0 0+0 0+0 +TouchEnd: 0+0 0+0 0+0 +GestureTapDown: 1+0 0+1 0+0 +GestureShowPress: 1+0 0+1 0+0 +GestureTap: 1+0 0+3 0+0 +GestureTapCancel: 1+0 0+1 0+0 +DoubleFingerTouch: 3+0 3+0 2+0 +TouchScroll: 3+3 3+1 1+0 +MouseWheelScroll: 0+2 0+2 0+0 + +Event on a simple div (desktop viewport) +--------------------- +Initial: 0+0 +MouseMove: 1+0 +MouseDown: 1+2 +MouseUp: 0+1 +Wheel: 0+1 +TouchStart: 1+1 +TouchMove: 0+0 +TouchEnd: 0+0 +GestureTapDown: 0+1 +GestureShowPress: 0+1 +GestureTap: 0+3 +GestureTapCancel: 0+1 +DoubleFingerTouch: 3+0 +TouchScroll: 4+2 +MouseWheelScroll: 0+2 + +PASS successfullyParsed is true + +TEST COMPLETE + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/message-port-multi-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/message-port-multi-expected.txt index 82c56a0..ca2efe7 100644 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/message-port-multi-expected.txt +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/events/message-port-multi-expected.txt
@@ -11,16 +11,16 @@ PASS channel.port1.postMessage("duplicate buffer", [arrayBuffer, arrayBuffer]) threw exception DataCloneError: Failed to execute 'postMessage' on 'MessagePort': ArrayBuffer at index 1 is a duplicate of an earlier ArrayBuffer.. PASS channel.port1.postMessage("largeSequence", largePortArray) threw exception RangeError: Failed to execute 'postMessage' on 'MessagePort': Array length exceeds supported limit.. PASS event.ports is non-null and zero length when no port sent -PASS successfullyParsed is true - -TEST COMPLETE - PASS event.ports is non-null and zero length when empty array sent PASS event.ports contains two ports when two ports sent PASS event.ports contains two ports when two ports re-sent after error PASS Sending host object has thrown DataCloneError: Failed to execute 'postMessage' on 'MessagePort': MessageChannel object could not be cloned. PASS Sending host object has thrown DataCloneError: Failed to execute 'postMessage' on 'MessagePort': Navigator object could not be cloned. PASS Sending Function object has thrown DataCloneError: Failed to execute 'postMessage' on 'MessagePort': function() {} could not be cloned. +PASS successfullyParsed is true + +TEST COMPLETE + PASS send-port: transferred one port PASS send-port-twice: transferred one port twice PASS send-two-ports: transferred two ports
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/forms/interactive-validation-attach-assertion-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/forms/interactive-validation-attach-assertion-expected.txt new file mode 100644 index 0000000..b7102ce --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fast/forms/interactive-validation-attach-assertion-expected.txt
@@ -0,0 +1,6 @@ + +PASS Not crashed. +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fullscreen/enter-exit-full-screen-hover-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fullscreen/enter-exit-full-screen-hover-expected.txt new file mode 100644 index 0000000..28a9234 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/fullscreen/enter-exit-full-screen-hover-expected.txt
@@ -0,0 +1,15 @@ +PASS getHoverActiveState(enterButton) is "hovered" +PASS document.webkitIsFullScreen is true +PASS successfullyParsed is true + +TEST COMPLETE + +PASS getHoverActiveState(enterButton) is "default" +PASS getHoverActiveState(exitButton) is "hovered" +PASS document.webkitIsFullScreen is false +PASS getHoverActiveState(exitButton) is "default" +Enter fullscreen Exit fullscreen +EVENT(webkitfullscreenchange) +EVENT(webkitfullscreenchange) +END OF TEST +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/devtools/network/network-initiator-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/devtools/network/network-initiator-expected.txt deleted file mode 100644 index 8ed0d83..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/devtools/network/network-initiator-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -Tests resources initiator for images initiated by IMG tag, static CSS, CSS class added from JavaScript and XHR. - -http://127.0.0.1:8000/devtools/network/resources/initiator.css: parser - http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html 2 -http://127.0.0.1:8000/devtools/network/resources/resource.php?type=image&random=1&size=100: parser - http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html 8 -http://127.0.0.1:8000/devtools/network/resources/resource.php?type=image&random=1&size=200: parser - http://127.0.0.1:8000/devtools/network/resources/initiator.css undefined -size=300 NOT FOUND -http://127.0.0.1:8000/devtools/network/resources/resource.php?type=image&random=1&size=400: script - loadData http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html 13 -http://127.0.0.1:8000/devtools/network/resources/style.css: parser - http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html undefined -http://127.0.0.1:8000/devtools/network/resources/empty.html: parser - http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html 17 -http://127.0.0.1:8000/devtools/network/resources/module1.js: script - http://127.0.0.1:8000/devtools/network/resources/network-initiator-frame.html 19 -http://127.0.0.1:8000/devtools/network/resources/module2.js: script - http://127.0.0.1:8000/devtools/network/resources/module1.js 2 -http://127.0.0.1:8000/devtools/network/resources/example.ttf: parser - http://127.0.0.1:8000/devtools/network/resources/initiator.css undefined -
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/inspector-protocol/issues/content-security-policy-issue-creation-img-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/inspector-protocol/issues/content-security-policy-issue-creation-img-expected.txt new file mode 100644 index 0000000..9b87aa3c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/inspector-protocol/issues/content-security-policy-issue-creation-img-expected.txt
@@ -0,0 +1,21 @@ +Verifies that CSP issue is created from a page with image source violation. + +Inspector issue: { + issue : { + code : ContentSecurityPolicyIssue + details : { + contentSecurityPolicyIssueDetails : { + blockedURL : https://thirdparty.test/network/resources/to-be-blocked.jpg + contentSecurityPolicyViolationType : kURLViolation + isReportOnly : false + sourceCodeLocation : { + columnNumber : 0 + lineNumber : 8 + url : https://devtools.test:8443/inspector-protocol/resources/content-security-policy-issue-image.php + } + violatedDirective : img-src + } + } + } +} +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/mixed-autoupgrade/optionally/image-upgrade-console-message.https-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/mixed-autoupgrade/optionally/image-upgrade-console-message.https-expected.txt new file mode 100644 index 0000000..ed698bf --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/mixed-autoupgrade/optionally/image-upgrade-console-message.https-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE WARNING: line 1: Mixed Content: The page at 'https://127.0.0.1:8443/mixed-autoupgrade/optionally/image-upgrade-console-message.https.html' was loaded over HTTPS, but requested an insecure element 'http://web-platform.test:8443/mixed-autoupgrade/resources/pass.png'. This request was automatically upgraded to HTTPS, For more information see https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html +CONSOLE WARNING: line 10: Mixed Content: The page at 'https://127.0.0.1:8443/mixed-autoupgrade/optionally/image-upgrade-console-message.https.html' was loaded over HTTPS, but requested an insecure element 'http://web-platform.test:8443/mixed-autoupgrade/resources/pass.png'. This request was automatically upgraded to HTTPS, For more information see https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/deprecated-subresource-requests-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/deprecated-subresource-requests-expected.txt new file mode 100644 index 0000000..307fc620 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/deprecated-subresource-requests-expected.txt
@@ -0,0 +1,6 @@ +CONSOLE WARNING: line 1: Subresource requests using legacy protocols (like `ftp:`) are blocked. Please deliver web-accessible resources over modern protocols like HTTPS. See https://www.chromestatus.com/feature/5709390967472128 for details. +CONSOLE WARNING: line 1: Subresource requests whose URLs contain embedded credentials (e.g. `https://user:pass@host/`) are blocked. See https://www.chromestatus.com/feature/5669008342777856 for more details. +This is a testharness.js-based test. +PASS deprecated-subresource-requests +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/empty-url-plugin-in-frame-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/empty-url-plugin-in-frame-expected.txt deleted file mode 100644 index 211ce74..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/empty-url-plugin-in-frame-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE MESSAGE: line 12: Blink Test Plugin: initializing -This test loads a secure iframe that loads a plugin without a URL. We should *not* get a mixed content callback because the plugin cannot be controlled by an active network attacker.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-font-in-main-frame-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-font-in-main-frame-expected.txt deleted file mode 100644 index 847d16ff2..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-font-in-main-frame-expected.txt +++ /dev/null
@@ -1,2 +0,0 @@ -CONSOLE WARNING: line 15: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-font.html' was loaded over HTTPS, but requested an insecure font 'http://example.test:8080/css/resources/cors-ahem.php'. This content should also be served over HTTPS. -This test opens a window that loads an insecure font. We should trigger a mixed content callback because the main frame in the window is HTTPS but is displaying insecure content.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt deleted file mode 100644 index 5d3ee23..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/mixedContent/insecure-plugin-in-iframe-expected.txt +++ /dev/null
@@ -1,3 +0,0 @@ -CONSOLE WARNING: line 14: Mixed Content: The page at 'https://127.0.0.1:8443/security/mixedContent/resources/frame-with-insecure-plugin.html' was loaded over HTTPS, but requested an insecure plugin resource 'http://example.test:8000/security/mixedContent/resources/dummy.swf'. This content should also be served over HTTPS. -CONSOLE MESSAGE: line 14: Blink Test Plugin: initializing -This test loads a secure iframe that loads an insecure plugin. We should get a mixed content callback because the insecure plugin can script the secure origin.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/referrer-policy-conflicting-policies-image-set-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/referrer-policy-conflicting-policies-image-set-expected.txt new file mode 100644 index 0000000..cb92f2c8 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/referrer-policy-conflicting-policies-image-set-expected.txt
@@ -0,0 +1 @@ +CONSOLE WARNING: line 26: Mixed Content: The page at 'https://127.0.0.1:8443/security/resources/referrer-policy-conflicting-policies-image-set.html' was loaded over HTTPS, but requested an insecure element 'http://127.0.0.1:8080/security/resources/green-if-no-referrer.php'. This request was automatically upgraded to HTTPS, For more information see https://blog.chromium.org/2019/10/no-more-mixed-messages-about-https.html
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/video-poster-cross-origin-crash2-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/video-poster-cross-origin-crash2-expected.txt new file mode 100644 index 0000000..68b313dc --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/security/video-poster-cross-origin-crash2-expected.txt
@@ -0,0 +1,2 @@ +CONSOLE ERROR: line 28: Access to image at 'http://localhost:8080/nonesuch.png' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. +Test passes if it doesn't crash.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/xmlhttprequest/origin-allowlisting-ip-addresses-with-subdomains-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/xmlhttprequest/origin-allowlisting-ip-addresses-with-subdomains-expected.txt deleted file mode 100644 index 88c65861..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/http/tests/xmlhttprequest/origin-allowlisting-ip-addresses-with-subdomains-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -CONSOLE WARNING: line 24: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/. -CONSOLE ERROR: line 26: Access to XMLHttpRequest at 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. -CONSOLE ERROR: line 45: Access to XMLHttpRequest at 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. -Specifying that an IP address should match subdomains doesn't make sense. This test verifies that it doesn't do anything. - -Testing: http://127.0.0.1:8000/xmlhttprequest/resources/get.txt (sync) -FAIL: NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'http://127.0.0.1:8000/xmlhttprequest/resources/get.txt'. -Testing: http://127.0.0.1:8000/xmlhttprequest/resources/get.txt (async) -FAIL: 0 -
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.png b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.png deleted file mode 100644 index b47c942..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.txt deleted file mode 100644 index dfddf31..0000000 --- a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/images/missing-image-border-zoom-expected.txt +++ /dev/null
@@ -1 +0,0 @@ -Blocked access to external URL https://www.example.com/doesntexist.png
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/paint/invalidation/compositing/inline-repaint-container-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/paint/invalidation/compositing/inline-repaint-container-expected.txt new file mode 100644 index 0000000..3d9cb7c --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/paint/invalidation/compositing/inline-repaint-container-expected.txt
@@ -0,0 +1 @@ +This should not assert in debug builds.
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-1-no-change-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-1-no-change-expected.txt new file mode 100644 index 0000000..c208080 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-1-no-change-expected.txt
@@ -0,0 +1,16 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 28: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus +pblur +i2focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test no change of focus inside plugin onfocus and onblur events + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-2-change-focus-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-2-change-focus-expected.txt new file mode 100644 index 0000000..ce4f1c6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-2-change-focus-expected.txt
@@ -0,0 +1,18 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 34: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus-change-2 +pblur +i2focus +i2blur +i3focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test changing focus inside plugin onfocus event + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-3-change-blur-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-3-change-blur-expected.txt new file mode 100644 index 0000000..8781fa6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-3-change-blur-expected.txt
@@ -0,0 +1,16 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 34: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus +pblur-change-2 +i2focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test changing focus inside plugin onblur event + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-4-change-focus-and-blur-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-4-change-focus-and-blur-expected.txt new file mode 100644 index 0000000..6a560f3 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/plugins/focus-change-4-change-focus-and-blur-expected.txt
@@ -0,0 +1,18 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 40: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus-change-2 +pblur-change-4 +i4focus +i4blur +i3focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test changing focus inside plugin onfocus and onblur events + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-3-change-blur-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-3-change-blur-expected.txt new file mode 100644 index 0000000..8781fa6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-3-change-blur-expected.txt
@@ -0,0 +1,16 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 34: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus +pblur-change-2 +i2focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test changing focus inside plugin onblur event + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-4-change-focus-and-blur-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-4-change-focus-and-blur-expected.txt new file mode 100644 index 0000000..6a560f3 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/disable-navigator-plugins-empty/plugins/focus-change-4-change-focus-and-blur-expected.txt
@@ -0,0 +1,18 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +CONSOLE MESSAGE: Blink Test Plugin: DidChangeFocus(true) +CONSOLE MESSAGE: line 40: Blink Test Plugin: DidChangeFocus(false) +i1focus +i1blur +pfocus-change-2 +pblur-change-4 +i4focus +i4blur +i3focus +PASS successfullyParsed is true + +TEST COMPLETE + + +Test changing focus inside plugin onfocus and onblur events + +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture-expected.txt new file mode 100644 index 0000000..018428fe --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/overlay-scrollbar/plugin-overlay-scrollbar-mouse-capture-expected.txt
@@ -0,0 +1,11 @@ +CONSOLE MESSAGE: Blink Test Plugin: initializing +This tests whether scrolling still works correctly when an overlay scrollbar is over a plugin. Clicking on the overlay scrollbar should cause it to activate and capture input. + +On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". + +PASS eventHistory.length is 0 +PASS window.scrollY > 0 is true +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/text-antialias/custom-font-data-crash2-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/text-antialias/custom-font-data-crash2-expected.txt new file mode 100644 index 0000000..514393e7 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/text-antialias/custom-font-data-crash2-expected.txt
@@ -0,0 +1,3 @@ +CONSOLE WARNING: line 29: Failed to decode downloaded font: custom-font-data-crash2.html +CONSOLE WARNING: line 29: OTS parsing error: invalid sfntVersion: 1008813135 +PASS
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/v8-off-thread-finalization/fast/dom/gc-image-element-2-expected.txt b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/v8-off-thread-finalization/fast/dom/gc-image-element-2-expected.txt new file mode 100644 index 0000000..a1b0119 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/enable-blink-features=ForceSynchronousHTMLParsing/virtual/v8-off-thread-finalization/fast/dom/gc-image-element-2-expected.txt
@@ -0,0 +1,18 @@ +Tests for image elements firing their load events even when they're not in the document. Should say "onload fired" ten times, and then "PASS". + +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +onload fired... +PASS + +PASS successfullyParsed is true + +TEST COMPLETE +
diff --git a/third_party/blink/web_tests/wpt_internal/webcodecs/annexb.h264 b/third_party/blink/web_tests/wpt_internal/webcodecs/annexb.h264 new file mode 100644 index 0000000..afd7682 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/webcodecs/annexb.h264 Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/webcodecs/annexb_decoding.any.js b/third_party/blink/web_tests/wpt_internal/webcodecs/annexb_decoding.any.js new file mode 100644 index 0000000..6078732 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/webcodecs/annexb_decoding.any.js
@@ -0,0 +1,77 @@ +// META: global=window,dedicatedworker +// META: script=/wpt_internal/webcodecs/encoder_utils.js + +promise_test(async t => { + let outputs = 0; + const chunks = [ + { + offset: 0, + size: 4045 + }, + { + offset: 4045, + size: 926 + }, + { + offset: 4971, + size: 241 + }, + { + offset: 5212, + size: 97 + }, + { + offset: 5309, + size: 98 + }, + { + offset: 5407, + size: 624 + }, + { + offset: 6031, + size: 185 + }, + { + offset: 6216, + size: 94 + }, + { + offset: 6310, + size: 109 + }, + { + offset: 6419, + size: 281 + } + ]; + + let all_chunks_buffer = await (await fetch('annexb.h264')).arrayBuffer(); + let decoder = new VideoDecoder({ + error: () => t.unreached_func("Unexpected error"), + output: (frame) => { outputs++; }, + }); + + const config = { + codec: "avc1.42001E", + codedWidth: 320, + codedHeight: 240 + /* no description means Annex B */ + }; + decoder.configure(config); + let counter = 0; + for (let chunk of chunks) { + let buffer = new Uint8Array(all_chunks_buffer, chunk.offset, chunk.size); + let encoded_chunk = new EncodedVideoChunk({ + type: (counter == 0) ? 'key' : 'delta', + timestamp: counter * 1_00_000, + data: buffer + }); + counter++; + decoder.decode(encoded_chunk); + } + + await decoder.flush(); + decoder.close(); + assert_equals(outputs, chunks.length); +}, "Decode AnnexB");
diff --git a/third_party/blink/web_tests/wpt_internal/webcodecs/basic_video_encoding.any.js b/third_party/blink/web_tests/wpt_internal/webcodecs/basic_video_encoding.any.js index 0f49523..63d7f8d 100644 --- a/third_party/blink/web_tests/wpt_internal/webcodecs/basic_video_encoding.any.js +++ b/third_party/blink/web_tests/wpt_internal/webcodecs/basic_video_encoding.any.js
@@ -1,7 +1,7 @@ // META: global=window,dedicatedworker // META: script=/wpt_internal/webcodecs/encoder_utils.js -async function encode_decode_test(codec, acc, avc_options) { +async function encode_decode_test(codec, acc, avc_format) { const w = 640; const h = 360; let next_ts = 0 @@ -47,8 +47,8 @@ bitrate: 5000000, }; - if (avc_options !== null) { - encoder_config.avcOptions = avc_options; + if (avc_format != null) { + encoder_config.avc = {format: avc_format}; } let encoder = new VideoEncoder(encoder_init); @@ -142,11 +142,11 @@ "encoding and decoding vp8"); promise_test( - encode_decode_test.bind(null, "avc1.42001E", "allow", { outputFormat: "annexb"}), + encode_decode_test.bind(null, "avc1.42001E", "allow", "annexb"), "encoding and decoding avc1.42001E (annexb)"); promise_test( - encode_decode_test.bind(null, "avc1.42001E", "allow", { outputFormat: "avc"}), + encode_decode_test.bind(null, "avc1.42001E", "allow", "avc"), "encoding and decoding avc1.42001E (avc)"); /* Uncomment this for manual testing, before we have GPU tests for that */
diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn index 4af3d7b..51b4f12 100644 --- a/third_party/breakpad/BUILD.gn +++ b/third_party/breakpad/BUILD.gn
@@ -85,6 +85,7 @@ sources = [ "breakpad/src/common/path_helper.cc", "breakpad/src/common/path_helper.h", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/processor/basic_code_module.h", "breakpad/src/processor/basic_code_modules.cc", "breakpad/src/processor/basic_code_modules.h", @@ -236,6 +237,7 @@ executable("minidump_dump") { sources = [ + "breakpad/src/common/scoped_ptr.h", "breakpad/src/processor/basic_code_module.h", "breakpad/src/processor/basic_code_modules.cc", "breakpad/src/processor/basic_code_modules.h", @@ -298,9 +300,11 @@ "breakpad/src/common/mac/macho_utilities.cc", "breakpad/src/common/mac/macho_walker.cc", "breakpad/src/common/md5.cc", + "breakpad/src/common/memory_range.h", "breakpad/src/common/module.cc", "breakpad/src/common/path_helper.cc", "breakpad/src/common/path_helper.h", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/common/stabs_reader.cc", "breakpad/src/common/stabs_to_module.cc", "breakpad/src/tools/mac/dump_syms/dump_syms_tool.cc", @@ -383,6 +387,7 @@ "breakpad/src/common/convert_UTF.cc", "breakpad/src/common/mac/MachIPC.mm", "breakpad/src/common/mac/arch_utilities.cc", + "breakpad/src/common/mac/arch_utilities.h", "breakpad/src/common/mac/bootstrap_compat.cc", "breakpad/src/common/mac/file_id.cc", "breakpad/src/common/mac/launch_reporter.cc", @@ -391,6 +396,7 @@ "breakpad/src/common/mac/macho_walker.cc", "breakpad/src/common/mac/string_utilities.cc", "breakpad/src/common/md5.cc", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/common/simple_string_dictionary.cc", "breakpad/src/common/string_conversion.cc", ] @@ -477,6 +483,7 @@ "breakpad/src/common/linux/symbol_collector_client.h", "breakpad/src/common/linux/symbol_upload.cc", "breakpad/src/common/linux/symbol_upload.h", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/tools/linux/symupload/sym_upload.cc", ] @@ -523,10 +530,13 @@ "breakpad/src/common/linux/linux_libc_support.h", "breakpad/src/common/linux/memory_mapped_file.cc", "breakpad/src/common/linux/memory_mapped_file.h", + "breakpad/src/common/memory_allocator.h", + "breakpad/src/common/memory_range.h", "breakpad/src/common/module.cc", "breakpad/src/common/module.h", "breakpad/src/common/path_helper.cc", "breakpad/src/common/path_helper.h", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/common/stabs_reader.cc", "breakpad/src/common/stabs_reader.h", "breakpad/src/common/stabs_to_module.cc", @@ -616,6 +626,8 @@ "breakpad/src/common/linux/safe_readlink.cc", "breakpad/src/common/linux/safe_readlink.h", "breakpad/src/common/memory_allocator.h", + "breakpad/src/common/memory_range.h", + "breakpad/src/common/scoped_ptr.h", "breakpad/src/common/simple_string_dictionary.cc", "breakpad/src/common/simple_string_dictionary.h", "breakpad/src/common/string_conversion.cc", @@ -645,6 +657,7 @@ static_library("processor_support") { sources = [ "breakpad/src/common/scoped_ptr.h", + "breakpad/src/processor/basic_code_module.h", "breakpad/src/processor/basic_code_modules.cc", "breakpad/src/processor/basic_code_modules.h", "breakpad/src/processor/convert_old_arm64_context.cc", @@ -776,6 +789,7 @@ "breakpad/src/common/path_helper.cc", "breakpad/src/common/path_helper.h", "breakpad/src/tools/linux/md2core/minidump-2-core.cc", + "breakpad/src/tools/linux/md2core/minidump_memory_range.h", ] include_dirs = [ "breakpad/src" ] @@ -1104,6 +1118,7 @@ "breakpad/src/client/windows/sender/crash_report_sender.h", "breakpad/src/common/windows/http_upload.cc", "breakpad/src/common/windows/http_upload.h", + "breakpad/src/common/windows/string_utils-inl.h", ] configs += [ ":sender_config" ] public_configs = [ ":sender_config" ]
diff --git a/third_party/ced/BUILD.gn b/third_party/ced/BUILD.gn index cd0c02a8..e5bd16d 100644 --- a/third_party/ced/BUILD.gn +++ b/third_party/ced/BUILD.gn
@@ -43,7 +43,6 @@ "src/util/string_util.h", "src/util/varsetter.h", ] - public = [ "src/compact_enc_det/compact_enc_det.h" ] configs -= [ "//build/config/compiler:chromium_code" ] configs += [ "//build/config/compiler:no_chromium_code",
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index c7685bf..2e3fedc6 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-10-4-141-gd3befe1c7 -Revision: d3befe1c72999805bc3960d29780cd8f505a180d +Version: VER-2-10-4-142-g0636dc8af +Revision: 0636dc8af1e502c343b126b50f3a0dbec8f3fc26 CPEPrefix: cpe:/a:freetype:freetype:2.10.4 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl index 216a8d8..04b0dfcb 100644 --- a/tools/gritsettings/translation_expectations.pyl +++ b/tools/gritsettings/translation_expectations.pyl
@@ -51,6 +51,7 @@ "components/javascript_dialogs/android/javascript_dialogs_android_strings.grd", "components/media_router/browser/android/java/strings/android_chrome_media_router_strings.grd", "components/permissions/android/permissions_android_strings.grd", + "components/webapps/browser/android/android_webapps_strings.grd", "content/public/android/java/strings/android_content_strings.grd", "device/bluetooth/bluetooth_strings.grd", "device/fido/fido_strings.grd",
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 4996237..811d2ae2 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -452,6 +452,7 @@ 'Android FYI SkiaRenderer Vulkan (Pixel 2)': 'gpu_tests_android_release_trybot', 'ChromeOS FYI Release (amd64-generic)': 'gpu_tests_chromeos_amd64_release_trybot_dcheck_off_no_symbols', 'ChromeOS FYI Release (kevin)': 'gpu_tests_chromeos_kevin_release_trybot_dcheck_off_no_symbols', + 'GPU FYI Lacros x64 Builder': 'gpu_tests_ozone_linux_non_x11_release_trybot', 'GPU FYI Linux Builder': 'gpu_fyi_tests_release_trybot', 'GPU FYI Linux Ozone Builder': 'angle_ozone_linux_system_gbm_libdrm_release_trybot', 'GPU FYI Linux Builder (dbg)': 'gpu_fyi_tests_debug_trybot', @@ -936,6 +937,8 @@ 'fuchsia-fyi-x64-rel': 'release_trybot_fuchsia', 'fuchsia_x64': 'release_trybot_fuchsia', 'fuchsia-x64-cast': 'release_trybot_fuchsia_cast', + 'gpu-fyi-try-lacros-amd-rel': 'gpu_tests_ozone_linux_non_x11_release_trybot', + 'gpu-fyi-try-lacros-intel-rel': 'gpu_tests_ozone_linux_non_x11_release_trybot', 'gpu-fyi-try-linux-amd-rel': 'gpu_fyi_tests_release_trybot', 'gpu-fyi-try-linux-intel-dqp': 'angle_deqp_release_trybot', 'gpu-fyi-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot', @@ -2436,6 +2439,10 @@ 'updater_on_win_mac', 'release_trybot', ], + 'gpu_tests_ozone_linux_non_x11_release_trybot': [ + 'gpu_tests', 'ozone_linux', 'ozone_linux_non_x11', 'release_trybot', + ], + 'ozone_linux_release_bot': [ 'ozone_linux', 'release_bot', ],
diff --git a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json index b640179..0c31de3 100644 --- a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json
@@ -240,6 +240,21 @@ "use_goma": true } }, + "GPU FYI Lacros x64 Builder": { + "gn_args": { + "dcheck_always_on": true, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "ozone_platform": "headless", + "proprietary_codecs": true, + "symbol_level": 1, + "use_bundled_weston": true, + "use_goma": true, + "use_ozone": true, + "use_x11": false + } + }, "GPU FYI Linux Builder": { "gn_args": { "build_angle_gles1_conform_tests": true,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json index 279e667..b9c5597 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -122,6 +122,36 @@ "use_goma": true } }, + "gpu-fyi-try-lacros-amd-rel": { + "gn_args": { + "dcheck_always_on": true, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "ozone_platform": "headless", + "proprietary_codecs": true, + "symbol_level": 1, + "use_bundled_weston": true, + "use_goma": true, + "use_ozone": true, + "use_x11": false + } + }, + "gpu-fyi-try-lacros-intel-rel": { + "gn_args": { + "dcheck_always_on": true, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "ozone_platform": "headless", + "proprietary_codecs": true, + "symbol_level": 1, + "use_bundled_weston": true, + "use_goma": true, + "use_ozone": true, + "use_x11": false + } + }, "gpu-fyi-try-linux-amd-rel": { "gn_args": { "build_angle_gles1_conform_tests": true,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 53446d7..49ca52c 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -23694,22 +23694,6 @@ </description> </action> -<action name="Signin_WorkProfilePrompt_Add"> - <owner>ydago@chromium.org</owner> - <description> - Recorded when the user chooses to add a work profile in the work profile - confirmation dialog. - </description> -</action> - -<action name="Signin_WorkProfilePrompt_Cancel"> - <owner>ydago@chromium.org</owner> - <description> - Recorded when the user chooses not to add a work profile in the work profile - confirmation dialog. - </description> -</action> - <action name="SiteChipPress"> <owner>Please list the metric's owners. Add more owner tags as needed.</owner> <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 8eca845..16a6a5b 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -10456,8 +10456,8 @@ <int value="4" label="FitToWidth"/> <int value="5" label="FitToPageFirst"/> <int value="6" label="FitToPage"/> - <int value="7" label="OpenBookmarksPanelFirst"/> - <int value="8" label="OpenBookmarksPanel"/> + <int value="7" label="OpenBookmarksPanelFirst (deprecated)"/> + <int value="8" label="OpenBookmarksPanel (deprecated)"/> <int value="9" label="FollowBookmarkFirst"/> <int value="10" label="FollowBookmark"/> <int value="11" label="PageSelectorNavigateFirst"/> @@ -31276,6 +31276,7 @@ <int value="3793" label="SessionStorageFirstUsedBeforeFcp"/> <int value="3794" label="SessionStorageFirstUsedAfterFcp"/> <int value="3795" label="GravitySensorConstructor"/> + <int value="3796" label="ElementInternalsStates"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -43798,6 +43799,7 @@ <int value="-1195034892" label="ContinuousSearch:disabled"/> <int value="-1194129602" label="ClientSideDetectionModelOnAndroid:disabled"/> <int value="-1192790333" label="ArcUseHighMemoryDalvikProfile:disabled"/> + <int value="-1191671217" label="TabGroupsNewBadgePromo:disabled"/> <int value="-1191258368" label="PageInfoPerformanceHints:disabled"/> <int value="-1190174011" label="enable-hdr"/> <int value="-1186760297" label="ForceSpectreVariant2Mitigation:disabled"/> @@ -44393,6 +44395,7 @@ <int value="-639026783" label="disable-gpu-appcontainer"/> <int value="-638952203" label="RendererSideResourceScheduler:disabled"/> <int value="-637215276" label="QuickAnswersOnEditableText:enabled"/> + <int value="-634865673" label="ThemeRefactorAndroid:enabled"/> <int value="-634122679" label="GoogleBrandedContextMenu:enabled"/> <int value="-634116286" label="OmniboxUIExperimentUnboldSuggestionText:enabled"/> @@ -45326,6 +45329,7 @@ <int value="283182071" label="SecurityInterstitialsDarkMode:enabled"/> <int value="283232244" label="OmniboxUIExperimentNarrowDropdown:enabled"/> <int value="285387302" label="AvatarToolbarButton:enabled"/> + <int value="286001833" label="TabGroupsNewBadgePromo:enabled"/> <int value="286717452" label="ContextualSearchDebug:disabled"/> <int value="287932297" label="AutofillSettingsCardTypeSplit:enabled"/> <int value="288012253" label="CrostiniFiles:enabled"/> @@ -46804,6 +46808,7 @@ <int value="1638927687" label="AutofillRichMetadataQueries:disabled"/> <int value="1639190590" label="UseMessagesGoogleComDomain:enabled"/> <int value="1639314588" label="LookalikeUrlNavigationSuggestions:disabled"/> + <int value="1639728471" label="ThemeRefactorAndroid:disabled"/> <int value="1640386037" label="ContextualSuggestionsSlimPeekUI:disabled"/> <int value="1643626730" label="PrinterStatus:disabled"/> <int value="1643712769" label="PrintWithReducedRasterization:enabled"/> @@ -67918,6 +67923,11 @@ <int value="2" label="Closed"/> </enum> +<enum name="SecurePaymentConfirmationSystemPromptResult"> + <int value="0" label="Canceled"/> + <int value="1" label="Accepted"/> +</enum> + <enum name="SecurityFilteredTouchResult"> <int value="0" label="Touch event was handled by security sensitive dialog"/> <int value="1"
diff --git a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml index 306aa614..32fc5801 100644 --- a/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/chromeos/histograms.xml
@@ -336,6 +336,16 @@ </summary> </histogram> +<histogram name="ChromeOS.DiagnosticsUi.OpenDuration" units="ms" + expires_after="2021-07-15"> + <owner>baileyberro@chromium.org</owner> + <owner>cros-peripherals@google.com</owner> + <summary> + Records the duration that the Diagnostics App is open. emitted when the app + is closed. + </summary> +</histogram> + <histogram name="ChromeOS.DiagnosticsUi.RoutineCount" units="routines" expires_after="2021-07-15"> <owner>baileyberro@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml b/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml index a0749392..732eb02 100644 --- a/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/enterprise/histograms.xml
@@ -348,7 +348,7 @@ </histogram> <histogram name="Enterprise.DeviceLocalAccountPolicyRefresh3" - enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + enum="EnterprisePolicyRefresh" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -374,7 +374,7 @@ </histogram> <histogram name="Enterprise.DevicePolicyInvalidations2" - enum="EnterprisePolicyInvalidations" expires_after="2021-05-02"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -390,7 +390,7 @@ </histogram> <histogram name="Enterprise.DevicePolicyRefresh3" - enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + enum="EnterprisePolicyRefresh" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -405,7 +405,7 @@ </histogram> <histogram name="Enterprise.DeviceRemoteCommand.Executed" - enum="RemoteCommandExecutionStatus" expires_after="2021-07-27"> + enum="RemoteCommandExecutionStatus" expires_after="2022-03-01"> <!-- Name completed by histogram_suffixes name="Enterprise.RemoteCommandType". --> <owner>asumaneev@google.com</owner> @@ -418,7 +418,7 @@ </histogram> <histogram name="Enterprise.DeviceRemoteCommand.Executed.Unsigned" - enum="RemoteCommandExecutionStatus" expires_after="2021-03-01"> + enum="RemoteCommandExecutionStatus" expires_after="2022-03-01"> <!-- Name completed by histogram_suffixes name="Enterprise.RemoteCommandType". --> <owner>asumaneev@google.com</owner> @@ -431,7 +431,7 @@ </histogram> <histogram name="Enterprise.DeviceRemoteCommand.Received" - enum="RemoteCommandReceivedStatus" expires_after="2021-03-01"> + enum="RemoteCommandReceivedStatus" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -443,7 +443,7 @@ </histogram> <histogram name="Enterprise.DeviceRemoteCommand.Received.Unsigned" - enum="RemoteCommandReceivedStatus" expires_after="2021-03-01"> + enum="RemoteCommandReceivedStatus" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -455,7 +455,7 @@ </histogram> <histogram name="Enterprise.DeviceRemoteCommandInvalidations" - enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -693,7 +693,7 @@ <histogram name="Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyInvalidations2" - enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -712,7 +712,7 @@ <histogram name="Enterprise.FCMInvalidationService.DeviceLocalAccountPolicyRefresh3" - enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + enum="EnterprisePolicyRefresh" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -730,7 +730,7 @@ </histogram> <histogram name="Enterprise.FCMInvalidationService.DevicePolicyInvalidations2" - enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -748,7 +748,7 @@ </histogram> <histogram name="Enterprise.FCMInvalidationService.DevicePolicyRefresh3" - enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + enum="EnterprisePolicyRefresh" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -766,7 +766,7 @@ </histogram> <histogram name="Enterprise.FCMInvalidationService.PolicyInvalidations" - enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -781,7 +781,7 @@ <histogram name="Enterprise.FCMInvalidationService.PolicyInvalidationsRegistrationResult" - enum="BooleanSuccess" expires_after="2021-05-02"> + enum="BooleanSuccess" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -794,7 +794,7 @@ </histogram> <histogram name="Enterprise.FCMInvalidationService.PolicyRefresh2" - enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + enum="EnterprisePolicyRefresh" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1006,7 +1006,7 @@ </histogram> <histogram name="Enterprise.PolicyInvalidations" - enum="EnterprisePolicyInvalidations" expires_after="2021-07-04"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1018,7 +1018,7 @@ </histogram> <histogram name="Enterprise.PolicyInvalidationsRegistrationResult" - enum="BooleanSuccess" expires_after="2021-05-02"> + enum="BooleanSuccess" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1053,7 +1053,7 @@ </histogram> <histogram name="Enterprise.PolicyRefresh2" enum="EnterprisePolicyRefresh" - expires_after="2021-03-01"> + expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1170,7 +1170,7 @@ </histogram> <histogram name="Enterprise.RemoteCommandInvalidationsRegistrationResult" - enum="BooleanSuccess" expires_after="2021-03-01"> + enum="BooleanSuccess" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1222,6 +1222,9 @@ <histogram name="Enterprise.TiclInvalidationService.DevicePolicyInvalidations" enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + <obsolete> + Removed 2021/01. + </obsolete> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1236,6 +1239,9 @@ <histogram name="Enterprise.TiclInvalidationService.DevicePolicyRefresh2" enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + <obsolete> + Removed 2021/01. + </obsolete> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1250,6 +1256,9 @@ <histogram name="Enterprise.TiclInvalidationService.PolicyInvalidations" enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + <obsolete> + Removed 2021/01. + </obsolete> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1265,6 +1274,9 @@ <histogram name="Enterprise.TiclInvalidationService.PolicyInvalidationsRegistrationResult" enum="BooleanSuccess" expires_after="2021-03-01"> + <obsolete> + Removed 2021/01. + </obsolete> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1278,6 +1290,9 @@ <histogram name="Enterprise.TiclInvalidationService.PolicyRefresh2" enum="EnterprisePolicyRefresh" expires_after="2021-03-01"> + <obsolete> + Removed 2021/01. + </obsolete> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1426,7 +1441,7 @@ </histogram> <histogram name="Enterprise.UserRemoteCommand.Executed" - enum="RemoteCommandExecutionStatus" expires_after="2021-03-01"> + enum="RemoteCommandExecutionStatus" expires_after="2022-03-01"> <!-- Name completed by histogram_suffixes name="Enterprise.RemoteCommandType". --> <owner>asumaneev@google.com</owner> @@ -1439,7 +1454,7 @@ </histogram> <histogram name="Enterprise.UserRemoteCommand.Executed.Unsigned" - enum="RemoteCommandExecutionStatus" expires_after="2021-03-01"> + enum="RemoteCommandExecutionStatus" expires_after="2022-03-01"> <!-- Name completed by histogram_suffixes name="Enterprise.RemoteCommandType". --> <owner>asumaneev@google.com</owner> @@ -1452,7 +1467,7 @@ </histogram> <histogram name="Enterprise.UserRemoteCommand.Received" - enum="RemoteCommandReceivedStatus" expires_after="2021-03-01"> + enum="RemoteCommandReceivedStatus" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1464,7 +1479,7 @@ </histogram> <histogram name="Enterprise.UserRemoteCommand.Received.Unsigned" - enum="RemoteCommandReceivedStatus" expires_after="2021-08-01"> + enum="RemoteCommandReceivedStatus" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary> @@ -1476,7 +1491,7 @@ </histogram> <histogram name="Enterprise.UserRemoteCommandInvalidations" - enum="EnterprisePolicyInvalidations" expires_after="2021-03-01"> + enum="EnterprisePolicyInvalidations" expires_after="2022-03-01"> <owner>asumaneev@google.com</owner> <owner>managed-platforms@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/media/histograms.xml b/tools/metrics/histograms/histograms_xml/media/histograms.xml index 8ebcfebe5..9130d71 100644 --- a/tools/metrics/histograms/histograms_xml/media/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/media/histograms.xml
@@ -4102,9 +4102,9 @@ <histogram name="Media.VideoCapture.Windows.NumberOfRetriesNeededForMFGetDeviceStreamCategory" - units="retries" expires_after="2021-02-01"> + units="retries" expires_after="2022-02-01"> <owner>guidou@chromium.org</owner> - <owner>armax@chromium.org</owner> + <owner>webrtc-dev@chromium.org</owner> <summary> Counts how many retries are needed for calls to MediaFoundation function GetDeviceStreamCategory before getting a result different from @@ -4114,9 +4114,9 @@ <histogram name="Media.VideoCapture.Windows.NumberOfRetriesNeededForMFGetDeviceStreamCount" - units="retries" expires_after="2021-02-01"> + units="retries" expires_after="2022-02-01"> <owner>guidou@chromium.org</owner> - <owner>armax@chromium.org</owner> + <owner>webrtc-dev@chromium.org</owner> <summary> Counts how many retries are needed for calls to MediaFoundation function GetDeviceStreamCount before getting a result different from
diff --git a/tools/metrics/histograms/histograms_xml/payment/histograms.xml b/tools/metrics/histograms/histograms_xml/payment/histograms.xml index 38b151c..20c6521 100644 --- a/tools/metrics/histograms/histograms_xml/payment/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/payment/histograms.xml
@@ -152,6 +152,20 @@ </histogram> <histogram + name="PaymentRequest.SecurePaymentConfirmation.Funnel.SystemPromptResult" + enum="SecurePaymentConfirmationSystemPromptResult" + expires_after="2021-08-01"> + <owner>danyao@chromium.org</owner> + <owner>web-payments-team@google.com</owner> + <summary> + Records the result of the FIDO system prompt, which is shown after the + Secure Payment Confirmation dialog is accepted. The result is Accepted if + the prompt is successful, or Canceled if the prompt is canceled. Logged when + the FIDO system prompt closes. + </summary> +</histogram> + +<histogram name="PaymentRequest.SecurePaymentConfirmationCredentialIdSizeInBytes" units="bytes" expires_after="2021-08-01"> <owner>danyao@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml b/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml index 46d13c2d..7581665 100644 --- a/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/web_rtc/histograms.xml
@@ -1121,10 +1121,9 @@ </histogram> <histogram name="WebRTC.DesktopCaptureCounters" enum="DesktopCaptureCounters" - expires_after="2020-12-31"> + expires_after="2021-12-31"> <owner>guidou@chromium.org</owner> - <owner>marinaciocea@chromium.org</owner> - <owner>armax@chromium.org</owner> + <owner>webrtc-dev@chromium.org</owner> <summary> Counters on creation of DesktopCaptureDevice and the first capture call. </summary> @@ -1774,8 +1773,9 @@ </histogram> <histogram name="WebRTC.UserMediaRequest.Result2" - enum="MediaStreamRequestResult2" expires_after="2021-02-07"> - <owner>grunell@chromium.org</owner> + enum="MediaStreamRequestResult2" expires_after="2022-02-07"> + <owner>guidou@chromium.org</owner> + <owner>agpalak@chromium.org</owner> <summary> Counters for UserMediaRequests results such as failure reasons. The standard specification error names are in parenthesis.
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index fb0f2b4..d4b0e4a 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@ { "trace_processor_shell": { "win": { - "hash": "9b1abd9e9c3ed0b8221c11b2da9ddc4c84651d5b", - "remote_path": "perfetto_binaries/trace_processor_shell/win/acc731df2fbbc812874dc3650b48c516f1732aff/trace_processor_shell.exe" + "hash": "aac95837855df9eceed9a744c92b1a23ea1dd901", + "remote_path": "perfetto_binaries/trace_processor_shell/win/b998b78079b8d83e83cce03d5033ac7611d5d204/trace_processor_shell.exe" }, "mac": { - "hash": "005e823125a364cc1a733cd1467f1b1b6ba028e4", - "remote_path": "perfetto_binaries/trace_processor_shell/mac/acc731df2fbbc812874dc3650b48c516f1732aff/trace_processor_shell" + "hash": "37b00e2fc21cfba0ba2cc81d4f314598400c0715", + "remote_path": "perfetto_binaries/trace_processor_shell/mac/b998b78079b8d83e83cce03d5033ac7611d5d204/trace_processor_shell" }, "linux": { - "hash": "b821229580a5b49a7f7149ef5d1d37d3ba8c39a4", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/b969d2e265f0dbdca7d25f4db27014f6fa28a7d0/trace_processor_shell" + "hash": "c3abde49b5a533310318cb7348f16cf8ab065ec2", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/f5271e869bde5d7b034fea10cbcc95266a2c3b43/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/base/OWNERS b/ui/base/OWNERS index 964fafc2..01f524d6 100644 --- a/ui/base/OWNERS +++ b/ui/base/OWNERS
@@ -2,6 +2,8 @@ per-file template_expressions*=michaelpg@chromium.org per-file template_expressions*=rbpotter@chromium.org +per-file class_property*=kylixrd@chromium.org + per-file window_open_disposition*=pkasting@chromium.org # If you're doing structural changes get a review from one of the ui/OWNERS.
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc index 00353bfc..9ccd5d41 100644 --- a/ui/base/ui_base_features.cc +++ b/ui/base/ui_base_features.cc
@@ -308,11 +308,8 @@ const base::Feature kSwipeToMoveCursor{"SwipeToMoveCursor", base::FEATURE_DISABLED_BY_DEFAULT}; -#if defined(OS_WIN) || (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \ - defined(OS_MAC) const base::Feature kUIDebugTools{"ui-debug-tools", base::FEATURE_DISABLED_BY_DEFAULT}; -#endif bool IsSwipeToMoveCursorEnabled() { static const bool enabled =
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h index 1f854ac..be3003d 100644 --- a/ui/base/ui_base_features.h +++ b/ui/base/ui_base_features.h
@@ -166,11 +166,8 @@ COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kSwipeToMoveCursor; -#if defined(OS_WIN) || (defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \ - defined(OS_MAC) // Enables UI debugging tools such as shortcuts. COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kUIDebugTools; -#endif COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSwipeToMoveCursorEnabled();
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn index 674be9fc..0b3a3db 100644 --- a/ui/gfx/BUILD.gn +++ b/ui/gfx/BUILD.gn
@@ -115,6 +115,10 @@ "overlay_transform_utils.cc", "overlay_transform_utils.h", "platform_font.h", + "rendering_pipeline.cc", + "rendering_pipeline.h", + "rendering_stage_scheduler.cc", + "rendering_stage_scheduler.h", "scrollbar_size.cc", "scrollbar_size.h", "selection_model.cc",
diff --git a/ui/gfx/rendering_pipeline.cc b/ui/gfx/rendering_pipeline.cc new file mode 100644 index 0000000..6790edbf --- /dev/null +++ b/ui/gfx/rendering_pipeline.cc
@@ -0,0 +1,298 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/gfx/rendering_pipeline.h" + +#include "base/task/current_thread.h" +#include "base/task/sequence_manager/task_time_observer.h" +#include "base/thread_annotations.h" +#include "base/threading/thread_checker.h" +#include "ui/gfx/rendering_stage_scheduler.h" + +namespace gfx { +namespace { + +class ThreadSafeTimeObserver : public base::sequence_manager::TaskTimeObserver { + public: + explicit ThreadSafeTimeObserver( + scoped_refptr<base::SingleThreadTaskRunner> task_runner) + : task_runner_(std::move(task_runner)) {} + ~ThreadSafeTimeObserver() override { + // If the observer is being used on the target thread, unregister now. If it + // was being used on a different thread, then the target thread should have + // been torn down already. + SetEnabled(false); + } + + ThreadSafeTimeObserver(const ThreadSafeTimeObserver&) = delete; + ThreadSafeTimeObserver& operator=(const ThreadSafeTimeObserver&) = delete; + + void SetEnabled(bool enabled) { + { + base::AutoLock hold(time_lock_); + if (enabled_ == enabled) + return; + enabled_ = enabled; + } + + if (!task_runner_) + return; + + if (task_runner_->BelongsToCurrentThread()) { + UpdateOnTargetThread(enabled); + return; + } + + task_runner_->PostTask( + FROM_HERE, base::BindOnce(&ThreadSafeTimeObserver::UpdateOnTargetThread, + base::Unretained(this), enabled)); + } + + base::TimeDelta GetAndResetTimeSinceLastFrame() { + base::AutoLock hold(time_lock_); + + if (!start_time_active_task_.is_null()) { + auto now = base::TimeTicks::Now(); + time_since_last_frame_ += now - start_time_active_task_; + start_time_active_task_ = now; + } + + auto result = time_since_last_frame_; + time_since_last_frame_ = base::TimeDelta(); + return result; + } + + // TaskTimeObserver impl. + void WillProcessTask(base::TimeTicks start_time) override { + base::AutoLock hold(time_lock_); + if (!enabled_) + return; + + DCHECK(start_time_active_task_.is_null()); + start_time_active_task_ = start_time; + } + + void DidProcessTask(base::TimeTicks start_time, + base::TimeTicks end_time) override { + base::AutoLock hold(time_lock_); + if (!enabled_) { + start_time_active_task_ = base::TimeTicks(); + return; + } + + // This should be null for the task which adds this object to the observer + // list. + if (start_time_active_task_.is_null()) + return; + + if (start_time_active_task_ <= end_time) { + time_since_last_frame_ += (end_time - start_time_active_task_); + } else { + // This could happen if |GetAndResetTimeSinceLastFrame| is called on a + // different thread and the observed thread had to wait to acquire the + // lock to call DidProcessTask. Assume the time for this task is already + // recorded in |GetAndResetTimeSinceLastFrame|. + DCHECK_NE(start_time_active_task_, start_time); + } + + start_time_active_task_ = base::TimeTicks(); + } + + private: + void UpdateOnTargetThread(bool enabled) { + if (enabled) { + base::CurrentThread::Get().AddTaskTimeObserver(this); + + base::AutoLock hold(time_lock_); + start_time_active_task_ = base::TimeTicks(); + time_since_last_frame_ = base::TimeDelta(); + } else { + base::CurrentThread::Get().RemoveTaskTimeObserver(this); + } + } + + // Accessed only on the calling thread. The caller ensures no concurrent + // access. + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + + // Accessed on calling and target thread. + base::Lock time_lock_; + bool enabled_ GUARDED_BY(time_lock_) = false; + base::TimeTicks start_time_active_task_ GUARDED_BY(time_lock_); + base::TimeDelta time_since_last_frame_ GUARDED_BY(time_lock_); +}; + +} // namespace + +class RenderingPipelineImpl final : public RenderingPipeline { + public: + explicit RenderingPipelineImpl(const char* pipeline_type) + : pipeline_type_(pipeline_type) { + RenderingStageScheduler::EnsureInitialized(); + DETACH_FROM_THREAD(bound_thread_); + } + ~RenderingPipelineImpl() override { TearDown(); } + + RenderingPipelineImpl(const RenderingPipelineImpl&) = delete; + RenderingPipelineImpl& operator=(const RenderingPipelineImpl&) = delete; + + void SetTargetDuration(base::TimeDelta target_duration) override { + DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); + DCHECK(!target_duration.is_zero()); + + if (target_duration_ == target_duration) + return; + + target_duration_ = target_duration; + if (should_use_scheduler()) + SetUp(); + } + + void AddSequenceManagerThread( + base::PlatformThreadId thread_id, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) override { + base::AutoLock lock(lock_); + DCHECK(time_observers_.find(thread_id) == time_observers_.end()); + time_observers_[thread_id] = + std::make_unique<ThreadSafeTimeObserver>(task_runner); + if (scheduler_) + CreateSchedulerAndEnableWithLockAcquired(); + } + + base::sequence_manager::TaskTimeObserver* AddSimpleThread( + base::PlatformThreadId thread_id) override { + base::AutoLock lock(lock_); + DCHECK(time_observers_.find(thread_id) == time_observers_.end()); + time_observers_[thread_id] = + std::make_unique<ThreadSafeTimeObserver>(nullptr); + + if (scheduler_) + CreateSchedulerAndEnableWithLockAcquired(); + return time_observers_[thread_id].get(); + } + + void NotifyFrameFinished() override { + DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); + + base::AutoLock lock(lock_); + if (!scheduler_) + return; + + // TODO(crbug.com/1157620): This can be optimized to exclude tasks which can + // be paused during rendering. The best use-case is idle tasks on the + // renderer main thread. If all non-optional work is close to the frame + // budget then the scheduler dynamically adjusts to pause work like idle + // tasks. + base::TimeDelta total_time; + for (auto& it : time_observers_) { + total_time += it.second->GetAndResetTimeSinceLastFrame(); + } + scheduler_->ReportCpuCompletionTime(total_time + gpu_latency_); + } + + void SetGpuLatency(base::TimeDelta gpu_latency) override { + DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); + gpu_latency_ = gpu_latency; + } + + void UpdateActiveCount(bool active) override { + DCHECK_CALLED_ON_VALID_THREAD(bound_thread_); + + if (active) { + active_count_++; + } else { + DCHECK_GT(active_count_, 0); + active_count_--; + } + + if (should_use_scheduler()) { + SetUp(); + } else { + TearDown(); + } + } + + private: + bool should_use_scheduler() const { + // TODO(crbug.com/1157620) : Figure out what we should be doing if multiple + // independent pipelines of a type are running simultaneously. The common + // use-case for this in practice would be multi-window. The tabs could be + // hosted in the same renderer process and each window is composited + // independently by the GPU process. + return active_count_ == 1 && !target_duration_.is_zero(); + } + + void SetUp() { + base::AutoLock lock(lock_); + CreateSchedulerAndEnableWithLockAcquired(); + } + + void CreateSchedulerAndEnableWithLockAcquired() { + lock_.AssertAcquired(); + scheduler_.reset(); + + std::vector<base::PlatformThreadId> platform_threads; + for (auto& it : time_observers_) { + platform_threads.push_back(it.first); + it.second->SetEnabled(true); + } + + scheduler_ = RenderingStageScheduler::CreateAdpf( + pipeline_type_, std::move(platform_threads), target_duration_); + } + + void TearDown() { + base::AutoLock lock(lock_); + for (auto& it : time_observers_) + it.second->SetEnabled(false); + scheduler_.reset(); + } + + THREAD_CHECKER(bound_thread_); + + base::Lock lock_; + base::flat_map<base::PlatformThreadId, + std::unique_ptr<ThreadSafeTimeObserver>> + time_observers_ GUARDED_BY(lock_); + std::unique_ptr<RenderingStageScheduler> scheduler_ GUARDED_BY(lock_); + + // Pipeline name, for tracing and metrics. + const char* pipeline_type_; + + // The number of currently active pipelines of this type. + int active_count_ = 0; + + // The target time for this rendering stage for a frame. + base::TimeDelta target_duration_; + + base::TimeDelta gpu_latency_; +}; + +RenderingPipeline::ScopedPipelineActive::ScopedPipelineActive( + RenderingPipeline* pipeline) + : pipeline_(pipeline) { + pipeline_->UpdateActiveCount(true); +} + +RenderingPipeline::ScopedPipelineActive::~ScopedPipelineActive() { + pipeline_->UpdateActiveCount(false); +} + +std::unique_ptr<RenderingPipeline> RenderingPipeline::CreateRendererMain() { + static constexpr char kRendererMain[] = "RendererMain"; + return std::make_unique<RenderingPipelineImpl>(kRendererMain); +} + +std::unique_ptr<RenderingPipeline> +RenderingPipeline::CreateRendererCompositor() { + static constexpr char kRendererCompositor[] = "RendererCompositor"; + return std::make_unique<RenderingPipelineImpl>(kRendererCompositor); +} + +std::unique_ptr<RenderingPipeline> RenderingPipeline::CreateGpu() { + static constexpr char kGpu[] = "Gpu"; + return std::make_unique<RenderingPipelineImpl>(kGpu); +} + +} // namespace gfx
diff --git a/ui/gfx/rendering_pipeline.h b/ui/gfx/rendering_pipeline.h new file mode 100644 index 0000000..f832244c --- /dev/null +++ b/ui/gfx/rendering_pipeline.h
@@ -0,0 +1,83 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_GFX_RENDERING_PIPELINE_H_ +#define UI_GFX_RENDERING_PIPELINE_H_ + +#include "base/containers/flat_map.h" +#include "base/memory/singleton.h" +#include "base/single_thread_task_runner.h" +#include "base/threading/platform_thread.h" +#include "ui/gfx/gfx_export.h" + +namespace base { +namespace sequence_manager { +class TaskTimeObserver; +} +} // namespace base + +namespace gfx { + +// Tracks the desired and actual execution time of rendering threads to +// optimally schedule them on the CPU. Instances of this class should be shared +// between all compositors of the same rendering stage. +// +// This class can be created on any thread but becomes bound to the thread it's +// subsequently used on. The class may be destroyed on any thread but the caller +// is responsible for ensuring all other threads in the rendering stage, other +// than the thread the object is destroyed on, are torn down before destroying +// an instance of this class. +class GFX_EXPORT RenderingPipeline { + public: + // Notifies when this pipeline is active. Multiple pipelines of the same type + // can be concurrently active at a time. The pipeline is assumed active for + // the lifetime of this object. + class GFX_EXPORT ScopedPipelineActive { + public: + explicit ScopedPipelineActive(RenderingPipeline* pipeline); + ~ScopedPipelineActive(); + + private: + RenderingPipeline* const pipeline_; + }; + + static std::unique_ptr<RenderingPipeline> CreateRendererMain(); + static std::unique_ptr<RenderingPipeline> CreateRendererCompositor(); + static std::unique_ptr<RenderingPipeline> CreateGpu(); + + virtual ~RenderingPipeline() = default; + + // Add to this pipeline a thread backed by base sequence manager, where + // |base::CurrentThread| works. Most threads in chromium should fall into + // this category. + // This method is thread safe and can be called on any thread. + virtual void AddSequenceManagerThread( + base::PlatformThreadId thread_id, + scoped_refptr<base::SingleThreadTaskRunner> task_runner) = 0; + + // Add a simple thread to this pipeline. The caller is responsible for + // updating the returned observer for tasks executed on the thread. + // The returned observer is owned by this pipeline object. + // This method is thread safe and can be called on any thread. + virtual base::sequence_manager::TaskTimeObserver* AddSimpleThread( + base::PlatformThreadId thread_id) = 0; + + // Notifies when this pipeline stage has finished rendering to compute the + // execution time per frame for the associated threads. + virtual void NotifyFrameFinished() = 0; + + // Sets the desired duration for this pipeline. + virtual void SetTargetDuration(base::TimeDelta target_duration) = 0; + + // Sets the latency from composition for a display buffer finishing on the + // Gpu thread to when execution finished on the Gpu. + virtual void SetGpuLatency(base::TimeDelta delta) = 0; + + protected: + virtual void UpdateActiveCount(bool active) = 0; +}; + +} // namespace gfx + +#endif // UI_GFX_RENDERING_PIPELINE_H_
diff --git a/ui/gfx/rendering_stage_scheduler.cc b/ui/gfx/rendering_stage_scheduler.cc new file mode 100644 index 0000000..58c365c --- /dev/null +++ b/ui/gfx/rendering_stage_scheduler.cc
@@ -0,0 +1,163 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/gfx/rendering_stage_scheduler.h" + +#include "base/logging.h" +#include "base/native_library.h" +#include "base/no_destructor.h" +#include "base/trace_event/trace_event.h" +#include "build/build_config.h" + +#if defined(OS_ANDROID) + +#include <dlfcn.h> +#include <sys/types.h> + +extern "C" { + +typedef struct APowerManager APowerManager; + +using pAPower_acquireManager = APowerManager* (*)(); +using pAPower_createThreadGroup = int64_t (*)(APowerManager* manager, + pid_t* threadIds, + size_t numThreadIds, + uint64_t desiredDurationMicros); +using pAPower_destroyThreadGroup = + void (*)(APowerManager* manager, int64_t /* ThreadGroupId */ threadGroup); +using pAPower_updateThreadGroupDesiredDuration = + void (*)(APowerManager* manager, + int64_t /* ThreadGroupId */ threadGroup, + uint64_t desiredDurationMicros); +using pAPower_reportThreadGroupDuration = + void (*)(APowerManager* manager, + int64_t /* ThreadGroupId */ threadGroup, + uint64_t actualDurationMicros); +} + +#endif // OS_ANDROID + +namespace gfx { +namespace { + +#if defined(OS_ANDROID) + +#define LOAD_FUNCTION(lib, func) \ + do { \ + func##Fn = reinterpret_cast<p##func>( \ + base::GetFunctionPointerFromNativeLibrary(lib, #func)); \ + if (!func##Fn) { \ + supported = false; \ + LOG(ERROR) << "Unable to load function " << #func; \ + } \ + } while (0) + +struct AdpfMethods { + static const AdpfMethods& Get() { + static const base::NoDestructor<AdpfMethods> instance; + return *instance; + } + + AdpfMethods() { + base::NativeLibraryLoadError error; + base::NativeLibrary main_dl_handle = + base::LoadNativeLibrary(base::FilePath("libandroid.so"), &error); + if (!main_dl_handle) { + LOG(ERROR) << "Couldnt load libandroid.so: " << error.ToString(); + supported = false; + return; + } + + LOAD_FUNCTION(main_dl_handle, APower_acquireManager); + LOAD_FUNCTION(main_dl_handle, APower_createThreadGroup); + LOAD_FUNCTION(main_dl_handle, APower_destroyThreadGroup); + LOAD_FUNCTION(main_dl_handle, APower_updateThreadGroupDesiredDuration); + LOAD_FUNCTION(main_dl_handle, APower_reportThreadGroupDuration); + } + + ~AdpfMethods() = default; + + bool supported = true; + pAPower_acquireManager APower_acquireManagerFn; + pAPower_createThreadGroup APower_createThreadGroupFn; + pAPower_destroyThreadGroup APower_destroyThreadGroupFn; + pAPower_updateThreadGroupDesiredDuration + APower_updateThreadGroupDesiredDurationFn; + pAPower_reportThreadGroupDuration APower_reportThreadGroupDurationFn; +}; + +APowerManager* GetPowerManager() { + static APowerManager* power_manager = + AdpfMethods::Get().supported + ? AdpfMethods::Get().APower_acquireManagerFn() + : nullptr; + return power_manager; +} + +class RenderingStageSchedulerAdpf : public RenderingStageScheduler { + public: + RenderingStageSchedulerAdpf(const char* pipeline_type, + std::vector<base::PlatformThreadId> threads, + base::TimeDelta desired_duration) + : pipeline_type_(pipeline_type), desired_duration_(desired_duration) { + static_assert(sizeof(base::PlatformThreadId) == sizeof(pid_t), + "thread id types incompatible"); + + if (!GetPowerManager()) + return; + + id_ = AdpfMethods::Get().APower_createThreadGroupFn( + GetPowerManager(), threads.data(), threads.size(), + desired_duration.InMicroseconds()); + } + + ~RenderingStageSchedulerAdpf() override { + if (!GetPowerManager()) + return; + + AdpfMethods::Get().APower_destroyThreadGroupFn(GetPowerManager(), id_); + } + + void ReportCpuCompletionTime(base::TimeDelta actual_duration) override { + TRACE_EVENT_INSTANT2( + "benchmark", "RenderingStageSchedulerAdpf::ReportCpuCompletionTime", + TRACE_EVENT_SCOPE_THREAD, "pipeline_type", pipeline_type_, + "utilization_percentage", + static_cast<int>(actual_duration * 100 / desired_duration_)); + + if (!GetPowerManager()) + return; + + AdpfMethods::Get().APower_reportThreadGroupDurationFn( + GetPowerManager(), id_, actual_duration.InMicroseconds()); + } + + private: + int64_t id_; + const char* pipeline_type_; + const base::TimeDelta desired_duration_; +}; + +#endif // OS_ANDROID + +} // namespace + +void RenderingStageScheduler::EnsureInitialized() { +#if defined(OS_ANDROID) + AdpfMethods::Get(); +#endif +} + +std::unique_ptr<RenderingStageScheduler> RenderingStageScheduler::CreateAdpf( + const char* pipeline_type, + std::vector<base::PlatformThreadId> threads, + base::TimeDelta desired_duration) { +#if defined(OS_ANDROID) + return std::make_unique<RenderingStageSchedulerAdpf>( + pipeline_type, std::move(threads), desired_duration); +#endif + return nullptr; +} + +} // namespace gfx
diff --git a/ui/gfx/rendering_stage_scheduler.h b/ui/gfx/rendering_stage_scheduler.h new file mode 100644 index 0000000..701f62b --- /dev/null +++ b/ui/gfx/rendering_stage_scheduler.h
@@ -0,0 +1,34 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_GFX_RENDERING_STAGE_SCHEDULER_H_ +#define UI_GFX_RENDERING_STAGE_SCHEDULER_H_ + +#include <vector> + +#include "base/threading/platform_thread.h" +#include "ui/gfx/gfx_export.h" + +namespace gfx { + +class GFX_EXPORT RenderingStageScheduler { + public: + // Creating instances of this class requires loading native libraries which + // require synchronous file access. This method ensures the synchronous work + // is finished. + static void EnsureInitialized(); + + static std::unique_ptr<RenderingStageScheduler> CreateAdpf( + const char* pipeline_type, + std::vector<base::PlatformThreadId> threads, + base::TimeDelta desired_duration); + + virtual ~RenderingStageScheduler() = default; + + virtual void ReportCpuCompletionTime(base::TimeDelta actual_duration) = 0; +}; + +} // namespace gfx + +#endif // UI_GFX_RENDERING_STAGE_SCHEDULER_H_
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js index d892ab0..1a74846 100644 --- a/ui/login/display_manager.js +++ b/ui/login/display_manager.js
@@ -51,17 +51,6 @@ /** @const */ var ACCELERATOR_APP_LAUNCH_NETWORK_CONFIG = 'app_launch_network_config'; -/* Possible UI states of the error screen. */ -/** @const */ var ERROR_SCREEN_UI_STATE = { - UNKNOWN: 'ui-state-unknown', - UPDATE: 'ui-state-update', - SIGNIN: 'ui-state-signin', - KIOSK_MODE: 'ui-state-kiosk-mode', - LOCAL_STATE_ERROR: 'ui-state-local-state-error', - AUTO_ENROLLMENT_ERROR: 'ui-state-auto-enrollment-error', - ROLLBACK_ERROR: 'ui-state-rollback-error' -}; - /** @const */ var USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled'; cr.define('cr.ui.login', function() {
diff --git a/ui/login/display_manager_types.js b/ui/login/display_manager_types.js index 098e8b7..80da9af6 100644 --- a/ui/login/display_manager_types.js +++ b/ui/login/display_manager_types.js
@@ -57,3 +57,18 @@ MIGRATION: 12, USER_CREATION: 15, }; + +/** + * Possible UI states of the error screen. + * @enum {string} + */ +var ERROR_SCREEN_UI_STATE = { + UNKNOWN: 'ui-state-unknown', + UPDATE: 'ui-state-update', + SIGNIN: 'ui-state-signin', + KIOSK_MODE: 'ui-state-kiosk-mode', + LOCAL_STATE_ERROR: 'ui-state-local-state-error', + AUTO_ENROLLMENT_ERROR: 'ui-state-auto-enrollment-error', + ROLLBACK_ERROR: 'ui-state-rollback-error', + SUPERVISED_USER_CREATION_FLOW: 'ui-state-supervised', +};
diff --git a/ui/views/controls/webview/web_contents_set_background_color.cc b/ui/views/controls/webview/web_contents_set_background_color.cc index 2a9ff959..0cf575a7 100644 --- a/ui/views/controls/webview/web_contents_set_background_color.cc +++ b/ui/views/controls/webview/web_contents_set_background_color.cc
@@ -5,7 +5,7 @@ #include "ui/views/controls/webview/web_contents_set_background_color.h" #include "base/memory/ptr_util.h" -#include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -33,24 +33,13 @@ WebContentsSetBackgroundColor::~WebContentsSetBackgroundColor() = default; -void WebContentsSetBackgroundColor::RenderViewReady() { - web_contents() - ->GetMainFrame() - ->GetRenderViewHost() - ->GetWidget() - ->GetView() - ->SetBackgroundColor(color_); -} - -void WebContentsSetBackgroundColor::RenderViewCreated( - content::RenderViewHost* render_view_host) { - render_view_host->GetWidget()->GetView()->SetBackgroundColor(color_); -} - -void WebContentsSetBackgroundColor::RenderViewHostChanged( - content::RenderViewHost* old_host, - content::RenderViewHost* new_host) { - new_host->GetWidget()->GetView()->SetBackgroundColor(color_); +void WebContentsSetBackgroundColor::RenderFrameCreated( + content::RenderFrameHost* render_frame_host) { + // We set the background color just on the main frame's widget. Other frames + // that are local roots would have a widget of their own, but their background + // colors are part of, and controlled by, the webpage. + if (!render_frame_host->GetParent()) + render_frame_host->GetView()->SetBackgroundColor(color_); } WEB_CONTENTS_USER_DATA_KEY_IMPL(WebContentsSetBackgroundColor)
diff --git a/ui/views/controls/webview/web_contents_set_background_color.h b/ui/views/controls/webview/web_contents_set_background_color.h index 9bac23b4..140ffa4 100644 --- a/ui/views/controls/webview/web_contents_set_background_color.h +++ b/ui/views/controls/webview/web_contents_set_background_color.h
@@ -32,10 +32,7 @@ SkColor color); // content::WebContentsObserver: - void RenderViewReady() override; - void RenderViewCreated(content::RenderViewHost* render_view_host) override; - void RenderViewHostChanged(content::RenderViewHost* old_host, - content::RenderViewHost* new_host) override; + void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; SkColor color_;
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebMessageTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebMessageTest.java index 61e37cb..3621f33 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebMessageTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/WebMessageTest.java
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -20,6 +21,10 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.net.test.util.TestWebServer; +import org.chromium.weblayer.WebLayer; import org.chromium.weblayer.WebMessage; import org.chromium.weblayer.WebMessageCallback; import org.chromium.weblayer.WebMessageReplyProxy; @@ -43,6 +48,7 @@ public WebMessage mLastMessage; public CallbackHelper mCallbackHelper; public CallbackHelper mClosedCallbackHelper; + public CallbackHelper mActiveChangedCallbackHelper; public WebMessageReplyProxy mProxyClosed; WebMessageCallbackImpl(CallbackHelper callbackHelper) { @@ -66,6 +72,11 @@ mProxyClosed = replyProxy; if (mClosedCallbackHelper != null) mClosedCallbackHelper.notifyCalled(); } + + @Override + public void onWebMessageReplyProxyActiveStateChanged(WebMessageReplyProxy replyProxy) { + if (mActiveChangedCallbackHelper != null) mActiveChangedCallbackHelper.notifyCalled(); + } } @Test @@ -115,6 +126,8 @@ webMessageCallback, "x", Arrays.asList("*")); }); + int majorVersion = TestThreadUtils.runOnUiThreadBlockingNoException( + () -> WebLayer.getSupportedMajorVersion(mActivityTestRule.getActivity())); mActivityTestRule.navigateAndWait( mActivityTestRule.getTestDataURL("web_message_test.html")); // web_message_test.html posts a message, wait for it. @@ -125,6 +138,10 @@ assertNull(webMessageCallback.mProxyClosed); assertFalse( runOnUiThreadBlocking(() -> { return webMessageCallback.mLastProxy.isClosed(); })); + if (majorVersion >= 90) { + assertTrue(runOnUiThreadBlocking( + () -> { return webMessageCallback.mLastProxy.isActive(); })); + } webMessageCallback.reset(); webMessageCallback.mClosedCallbackHelper = new CallbackHelper(); @@ -134,8 +151,9 @@ assertNotNull(webMessageCallback.mProxyClosed); assertEquals(webMessageCallback.mProxyClosed, proxy); assertTrue(runOnUiThreadBlocking(() -> { return proxy.isClosed(); })); - - runOnUiThreadBlocking(() -> { activity.getTab().unregisterWebMessageCallback("x"); }); + if (majorVersion >= 90) { + assertFalse(runOnUiThreadBlocking(() -> { return proxy.isActive(); })); + } } @Test @@ -179,4 +197,56 @@ } }); } + + @MinWebLayerVersion(90) + @Test + @SmallTest + @CommandLineFlags.Add("enable-features=BackForwardCache") + public void onActiveChangedForBackForwardCache() throws Exception { + TestWebServer testServer = TestWebServer.start(); + InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl("about:blank"); + assertNotNull(activity); + + // Load a page with a message proxy and wait for the respond. + CallbackHelper callbackHelper = new CallbackHelper(); + WebMessageCallbackImpl webMessageCallback = new WebMessageCallbackImpl(callbackHelper); + String url = mActivityTestRule.getTestDataURL("web_message_test.html"); + int index = url.indexOf("/weblayer"); + assertNotEquals(-1, index); + runOnUiThreadBlocking(() -> { + activity.getTab().registerWebMessageCallback( + webMessageCallback, "x", Arrays.asList(url.substring(0, index))); + }); + mActivityTestRule.navigateAndWait( + mActivityTestRule.getTestDataURL("web_message_test.html")); + callbackHelper.waitForFirst(); + + // There should be a proxy and it should be active. + WebMessageReplyProxy proxy = webMessageCallback.mLastProxy; + assertTrue( + runOnUiThreadBlocking(() -> { return webMessageCallback.mLastProxy.isActive(); })); + webMessageCallback.reset(); + webMessageCallback.mActiveChangedCallbackHelper = new CallbackHelper(); + + // Navigate to a new page. The proxy should be inactive, but not closed. + String url2 = testServer.setResponse("/ok.html", "<html>ok</html>", null); + mActivityTestRule.navigateAndWait(url2); + webMessageCallback.mActiveChangedCallbackHelper.waitForCallback(0); + assertFalse(runOnUiThreadBlocking(() -> { return proxy.isActive(); })); + assertFalse(runOnUiThreadBlocking(() -> { return proxy.isClosed(); })); + + // Navigate back and ensure the page is active. + runOnUiThreadBlocking(() -> { activity.getTab().getNavigationController().goBack(); }); + webMessageCallback.mActiveChangedCallbackHelper.waitForCallback(1); + assertTrue(runOnUiThreadBlocking(() -> { return proxy.isActive(); })); + assertFalse(runOnUiThreadBlocking(() -> { return proxy.isClosed(); })); + + // Post a message, to ensure the page can still get it. + webMessageCallback.reset(); + webMessageCallback.mCallbackHelper = new CallbackHelper(); + runOnUiThreadBlocking(() -> { proxy.postMessage(new WebMessage("2")); }); + webMessageCallback.mCallbackHelper.waitForFirst(); + assertNotNull(webMessageCallback.mLastMessage); + assertEquals("bouncing 2", webMessageCallback.mLastMessage.getContents()); + } }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/WebMessageReplyProxyImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/WebMessageReplyProxyImpl.java index 980275d0e..9eeef1e 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/WebMessageReplyProxyImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/WebMessageReplyProxyImpl.java
@@ -44,6 +44,13 @@ } @CalledByNative + private void onActiveStateChanged() throws RemoteException { + if (WebLayerFactoryImpl.getClientMajorVersion() >= 90) { + mClient.onReplyProxyActiveStateChanged(mId); + } + } + + @CalledByNative private void onNativeDestroyed() throws RemoteException { mNativeWebMessageReplyProxyImpl = 0; mClient.onReplyProxyDestroyed(mId); @@ -61,8 +68,16 @@ } } + @Override + public boolean isActive() { + // Client code checks for closed before calling this. + assert mNativeWebMessageReplyProxyImpl != 0; + return WebMessageReplyProxyImplJni.get().isActive(mNativeWebMessageReplyProxyImpl); + } + @NativeMethods interface Natives { void postMessage(long nativeWebMessageReplyProxyImpl, String message); + boolean isActive(long nativeWebMessageReplyProxyImpl); } }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageCallbackClient.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageCallbackClient.aidl index 91ce8b87..d42f3a0 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageCallbackClient.aidl +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageCallbackClient.aidl
@@ -13,4 +13,7 @@ in String sourceOrigin) = 0; void onPostMessage(in int proxyId, in String message) = 1; void onReplyProxyDestroyed(in int proxyId) = 2; + + // @since 90 + void onReplyProxyActiveStateChanged(in int proxyId) = 3; }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageReplyProxy.aidl b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageReplyProxy.aidl index 208c78d..7d88309 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageReplyProxy.aidl +++ b/weblayer/browser/java/org/chromium/weblayer_private/interfaces/IWebMessageReplyProxy.aidl
@@ -6,4 +6,7 @@ interface IWebMessageReplyProxy { void postMessage(in String message) = 0; + + // @since 90 + boolean isActive() = 1; }
diff --git a/weblayer/browser/js_communication/web_message_browsertest.cc b/weblayer/browser/js_communication/web_message_browsertest.cc index 8d147c1..e58b03c 100644 --- a/weblayer/browser/js_communication/web_message_browsertest.cc +++ b/weblayer/browser/js_communication/web_message_browsertest.cc
@@ -7,6 +7,8 @@ #include "base/callback.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" +#include "content/public/common/content_features.h" +#include "net/dns/mock_host_resolver.h" #include "weblayer/public/js_communication/web_message.h" #include "weblayer/public/js_communication/web_message_host.h" #include "weblayer/public/js_communication/web_message_host_factory.h" @@ -40,6 +42,20 @@ current_connection = nullptr; } + int back_forward_cache_state_changed_call_count() const { + return back_forward_cache_state_changed_call_count_; + } + + void WaitForBackForwardStateToBe(bool value) { + if (value == proxy_->IsInBackForwardCache()) + return; + expected_back_forward_value_ = value; + state_changed_run_loop_ = std::make_unique<base::RunLoop>(); + state_changed_run_loop_->Run(); + state_changed_run_loop_.reset(); + } + + WebMessageReplyProxy* proxy() { return proxy_; } std::vector<base::string16>& messages() { return messages_; } // WebMessageHost: @@ -55,12 +71,22 @@ quit_closure_.Run(); } } + void OnBackForwardCacheStateChanged() override { + ++back_forward_cache_state_changed_call_count_; + if (state_changed_run_loop_ && + expected_back_forward_value_ == proxy_->IsInBackForwardCache()) { + state_changed_run_loop_->Quit(); + } + } private: int call_count_ = 0; + int back_forward_cache_state_changed_call_count_ = 0; base::RepeatingClosure quit_closure_; WebMessageReplyProxy* proxy_; std::vector<base::string16> messages_; + bool expected_back_forward_value_ = false; + std::unique_ptr<base::RunLoop> state_changed_run_loop_; }; // WebMessageHostFactory implementation that creates WebMessageHostImp. @@ -109,4 +135,58 @@ current_connection->messages()[1]); } +class WebMessageTestWithBfCache : public WebLayerBrowserTest { + public: + // WebLayerBrowserTest: + void SetUp() override { + scoped_feature_list_.InitAndEnableFeature(features::kBackForwardCache); + WebLayerBrowserTest::SetUp(); + } + + void SetUpOnMainThread() override { + WebLayerBrowserTest::SetUpOnMainThread(); + host_resolver()->AddRule("*", "127.0.0.1"); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(WebMessageTestWithBfCache, Basic) { + ASSERT_TRUE(embedded_test_server()->Start()); + + GURL url1(embedded_test_server()->GetURL("a.com", "/web_message_test.html")); + + base::RunLoop run_loop; + shell()->tab()->AddWebMessageHostFactory( + std::make_unique<WebMessageHostFactoryImpl>(run_loop.QuitClosure()), + base::ASCIIToUTF16("x"), {"http://a.com:" + url1.port()}); + + auto* navigation_controller = shell()->tab()->GetNavigationController(); + navigation_controller->Navigate(url1); + run_loop.Run(); + + // A WebMessageHostImpl should be created, and it should not be in the cache. + WebMessageHostImpl* web_message_host = current_connection; + ASSERT_TRUE(web_message_host); + EXPECT_FALSE(web_message_host->proxy()->IsInBackForwardCache()); + EXPECT_EQ(0, web_message_host->back_forward_cache_state_changed_call_count()); + + // Navigate to a new host. The old page should go into the cache. + OneShotNavigationObserver observer1(shell()); + navigation_controller->Navigate( + embedded_test_server()->GetURL("b.com", "/simple_page.html")); + observer1.WaitForNavigation(); + EXPECT_TRUE(observer1.completed()); + ASSERT_EQ(current_connection, web_message_host); + web_message_host->WaitForBackForwardStateToBe(true); + EXPECT_EQ(1, web_message_host->back_forward_cache_state_changed_call_count()); + + // Navigate back. + OneShotNavigationObserver observer2(shell()); + navigation_controller->GoBack(); + observer2.WaitForNavigation(); + web_message_host->WaitForBackForwardStateToBe(false); + EXPECT_EQ(2, web_message_host->back_forward_cache_state_changed_call_count()); +} } // namespace weblayer
diff --git a/weblayer/browser/js_communication/web_message_host_factory_wrapper.cc b/weblayer/browser/js_communication/web_message_host_factory_wrapper.cc index 7a6088f..ad0b2d50 100644 --- a/weblayer/browser/js_communication/web_message_host_factory_wrapper.cc +++ b/weblayer/browser/js_communication/web_message_host_factory_wrapper.cc
@@ -35,6 +35,9 @@ m->message = message->message; connection_->OnPostMessage(std::move(m)); } + void OnBackForwardCacheStateChanged() override { + connection_->OnBackForwardCacheStateChanged(); + } // WebMessageReplyProxy: void PostMessage(std::unique_ptr<WebMessage> message) override { @@ -43,6 +46,9 @@ w->message = std::move(message->message); proxy_->PostMessage(std::move(w)); } + bool IsInBackForwardCache() override { + return proxy_->IsInBackForwardCache(); + } private: js_injection::WebMessageReplyProxy* proxy_;
diff --git a/weblayer/browser/js_communication/web_message_reply_proxy_impl.cc b/weblayer/browser/js_communication/web_message_reply_proxy_impl.cc index 8172852..d01203d6 100644 --- a/weblayer/browser/js_communication/web_message_reply_proxy_impl.cc +++ b/weblayer/browser/js_communication/web_message_reply_proxy_impl.cc
@@ -41,6 +41,10 @@ reply_proxy_->PostMessage(std::move(message)); } +bool WebMessageReplyProxyImpl::IsActive(JNIEnv* env) { + return !reply_proxy_->IsInBackForwardCache(); +} + void WebMessageReplyProxyImpl::OnPostMessage( std::unique_ptr<WebMessage> message) { auto* env = base::android::AttachCurrentThread(); @@ -49,4 +53,9 @@ base::android::ConvertUTF16ToJavaString(env, message->message)); } +void WebMessageReplyProxyImpl::OnBackForwardCacheStateChanged() { + Java_WebMessageReplyProxyImpl_onActiveStateChanged( + base::android::AttachCurrentThread(), java_object_); +} + } // namespace weblayer
diff --git a/weblayer/browser/js_communication/web_message_reply_proxy_impl.h b/weblayer/browser/js_communication/web_message_reply_proxy_impl.h index dbcfe01..f21bf5d 100644 --- a/weblayer/browser/js_communication/web_message_reply_proxy_impl.h +++ b/weblayer/browser/js_communication/web_message_reply_proxy_impl.h
@@ -32,8 +32,11 @@ void PostMessage( JNIEnv* env, const base::android::JavaParamRef<jstring>& message_contents); + bool IsActive(JNIEnv* env); + // WebMessageHost: void OnPostMessage(std::unique_ptr<WebMessage> message) override; + void OnBackForwardCacheStateChanged() override; private: WebMessageReplyProxy* reply_proxy_;
diff --git a/weblayer/browser/tab_impl.h b/weblayer/browser/tab_impl.h index 243caad..3ed0aa3 100644 --- a/weblayer/browser/tab_impl.h +++ b/weblayer/browser/tab_impl.h
@@ -66,7 +66,6 @@ #if defined(OS_ANDROID) class BrowserControlsContainerView; enum class ControlsVisibilityReason; -class WebMessageHostFactoryProxy; #endif class TabImpl : public Tab, @@ -392,9 +391,6 @@ cc::BrowserControlsState current_browser_controls_visibility_constraint_ = cc::BrowserControlsState::kShown; - std::map<std::string, std::unique_ptr<WebMessageHostFactoryProxy>> - js_name_to_proxy_; - bool desktop_user_agent_enabled_ = false; #endif
diff --git a/weblayer/public/java/org/chromium/weblayer/Tab.java b/weblayer/public/java/org/chromium/weblayer/Tab.java index 2fc3c60..d3ee9c3 100644 --- a/weblayer/public/java/org/chromium/weblayer/Tab.java +++ b/weblayer/public/java/org/chromium/weblayer/Tab.java
@@ -804,6 +804,14 @@ mProxyIdToProxy.remove(proxyId); mCallback.onWebMessageReplyProxyClosed(proxy); } + + @Override + public void onReplyProxyActiveStateChanged(int proxyId) { + StrictModeWorkaround.apply(); + WebMessageReplyProxy proxy = mProxyIdToProxy.get(proxyId); + assert proxy != null; + mCallback.onWebMessageReplyProxyActiveStateChanged(proxy); + } } private final class TabClientImpl extends ITabClient.Stub {
diff --git a/weblayer/public/java/org/chromium/weblayer/WebMessageCallback.java b/weblayer/public/java/org/chromium/weblayer/WebMessageCallback.java index 520c3bac..294f49b 100644 --- a/weblayer/public/java/org/chromium/weblayer/WebMessageCallback.java +++ b/weblayer/public/java/org/chromium/weblayer/WebMessageCallback.java
@@ -17,6 +17,10 @@ * Each {@link WebMessageReplyProxy} represents a single endpoint. Multiple messages sent to the * same endpoint use the same {@link WebMessageReplyProxy}. * + * <b>WARNING</b>: it is possible to receive messages from an inactive page. This happens if a + * message it sent around the same time the page is put in the back forward cache. As a result + * of this, it is possible for this method to be called with a new proxy that is inactive. + * * @param replyProxy An object that may be used to post a message back to the page. * @param message The message from the page. */ @@ -33,4 +37,13 @@ * @param replyProxy The proxy that has been closed. */ public void onWebMessageReplyProxyClosed(@NonNull WebMessageReplyProxy replyProxy) {} + + /** + * Called when the active state of a proxy changes. + * + * @param proxy The proxy whose active state changed. + * + * @since 90 + */ + public void onWebMessageReplyProxyActiveStateChanged(@NonNull WebMessageReplyProxy proxy) {} }
diff --git a/weblayer/public/java/org/chromium/weblayer/WebMessageReplyProxy.java b/weblayer/public/java/org/chromium/weblayer/WebMessageReplyProxy.java index d274f13..5075249 100644 --- a/weblayer/public/java/org/chromium/weblayer/WebMessageReplyProxy.java +++ b/weblayer/public/java/org/chromium/weblayer/WebMessageReplyProxy.java
@@ -82,4 +82,23 @@ void markClosed() { mIsClosed = true; } + + /** + * Returns whether the channel is active. The channel is active if it is not closed and not in + * the back forward cache. + * + * @return Whether the channel is active. + */ + public boolean isActive() { + ThreadCheck.ensureOnUiThread(); + if (mIsClosed) return false; + if (WebLayer.getSupportedMajorVersionInternal() < 90) { + return true; + } + try { + return mIReplyProxy.isActive(); + } catch (RemoteException e) { + throw new APICallException(e); + } + } }
diff --git a/weblayer/public/js_communication/web_message_host.h b/weblayer/public/js_communication/web_message_host.h index b81ab14..b145bbac 100644 --- a/weblayer/public/js_communication/web_message_host.h +++ b/weblayer/public/js_communication/web_message_host.h
@@ -19,6 +19,12 @@ // Called when the page sends a message to the browser side. virtual void OnPostMessage(std::unique_ptr<WebMessage> message) = 0; + + // Called when the page moves into or out of the back forward cache. + // This function is called when the browser changes the state, which means + // it is possible to receive messages even when the page is in the back + // forward cache. + virtual void OnBackForwardCacheStateChanged() {} }; } // namespace weblayer
diff --git a/weblayer/public/js_communication/web_message_reply_proxy.h b/weblayer/public/js_communication/web_message_reply_proxy.h index e714709..04e2622 100644 --- a/weblayer/public/js_communication/web_message_reply_proxy.h +++ b/weblayer/public/js_communication/web_message_reply_proxy.h
@@ -16,6 +16,9 @@ public: virtual void PostMessage(std::unique_ptr<WebMessage>) = 0; + // Returns true if the page is in the back forward cache. + virtual bool IsInBackForwardCache() = 0; + protected: virtual ~WebMessageReplyProxy() = default; };