diff --git a/AUTHORS b/AUTHORS index 1e5b7ba..a30acbb8 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -1252,6 +1252,7 @@ Yael Aharon <yael.aharon@intel.com> Yan Wang <yan0422.wang@samsung.com> Yang Gu <yang.gu@intel.com> +Yang Liu <jd9668954@gmail.com> Yannic Bonenberger <yannic.bonenberger@gmail.com> Yarin Kaul <yarin.kaul@gmail.com> Yash Vempati <vempatiy@amazon.com>
diff --git a/BUILD.gn b/BUILD.gn index 638981f..aae7eac3 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -209,7 +209,7 @@ ] } - if (is_win || (is_linux && !is_chromeos_lacros) || is_android) { + if (is_win || is_linux || is_android) { deps += [ "//weblayer/shell:weblayer_shell", "//weblayer/test:weblayer_browsertests",
diff --git a/DEPS b/DEPS index 3adc111..a820499 100644 --- a/DEPS +++ b/DEPS
@@ -253,15 +253,15 @@ # 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': 'dcd21712d81b4be7209beac20112a5a3345b1cb2', + 'skia_revision': 'b198752832ed2d4495ce4ed737ddb65484d8b6ee', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'a962d2e94925f79d9ae4b1cd2fc6053189ab43a9', + 'v8_revision': '67ca6c432a19ceee73444a7b2f05435b71a2136a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '5040c4d82bea40f12c4efd8cda3e628a310fb7e0', + 'angle_revision': 'e10803f765b2a9be08cef9e249da2e777d0f3d4e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -300,7 +300,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': '385345037e04f9ee6ffc8b14318f1a079520c41d', + 'freetype_revision': 'aee6b9472732c627ff844d4fb75a588d388b6570', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -328,7 +328,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': 'eb6fd4f0ab9b2a3385a9b8cbd1e5b97be3311d86', + 'devtools_frontend_revision': 'f6f73b8d9eedbc5b6006e61c3be0d843188eac55', # 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. @@ -364,7 +364,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': 'ecc3fe6f0f8b85a2063a51f2cd4464a2110ba7c4', + 'dawn_revision': '359b82da432bdfcd9e3b5d04e84f51a3e6fe0cdc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -836,7 +836,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'nkVSGdbjCt83jz0w-H4xzTwWiNbCQJXvXB_AifbKcUkC', + 'version': 'VgNtqsjcflrAuiNKeIxSjcq3CE9yPDGwJaW5RbpztrMC', }, ], 'dep_type': 'cipd', @@ -847,7 +847,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'C2USfO-oHWUUEhCz_0zrFlxYZqE3zu7aIsWC5ucH5GUC', + 'version': 'JvBPOFe9P3msMz1MGka_9UTu-qRUEuxbK14m7djDb78C', }, ], 'dep_type': 'cipd', @@ -858,7 +858,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': '-8XPUIeY8QEO0Gv1eN8gIqivQklvzJJstBGu7zuO7PMC', + 'version': 'FioUkqctr8a_cSSXVCWZxcbhTFhs3XidDCwMy_-s9YgC', }, ], 'dep_type': 'cipd', @@ -1112,7 +1112,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '37b7ca43eec97bba89a001b6333e4ed9b028af18', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6269a69e32fd1c42897b825c427afc05e668d751', 'condition': 'checkout_chromeos', }, @@ -1515,7 +1515,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '71cbb3f996fe8eafb3937369418dbf9927a776bd', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '06f638cf6004feb20392c233d5984a2a52bc7993', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1593,7 +1593,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/android/aemu/release/linux-amd64', - 'version': '8y8zwfCSl3CIofWUE5oDduiw1Jnl_yhKGRwK5SxWn9wC' + 'version': 'sZ4uxq0EA46Lc0lxfmGRb2znwe8PY0pITymUy9mdJv8C' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1671,7 +1671,7 @@ Var('swiftshader_git') + '/SwiftShader.git' + '@' + Var('swiftshader_revision'), 'src/third_party/text-fragments-polyfill/src': { - 'url': Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + '5959682856f165b1dc7ddeecdc9d890bfaeb6449', + 'url': Var('chromium_git') + '/external/github.com/GoogleChromeLabs/text-fragments-polyfill.git' + '@' + '428dd13167f3ce02e3ca7c086d291d7c079da0dc', 'condition': 'checkout_ios', }, @@ -1697,7 +1697,7 @@ 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb', - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@6d732e01d9ea4f632256b7fddc48980776f3bfc9', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@0559672842807a81e425c7cab7484d75d04fdb71', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1736,7 +1736,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '7afd2efc27572eda0e9b3a8c0831b47f5e6c3353', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '4aa2535add92fe826f766a6c95580548a105bd7d', + Var('webrtc_git') + '/src.git' + '@' + '564de099675d7b66a3cf1d63db5b1ae44f3a37b8', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1806,7 +1806,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f8a7717d9cdeddb631f474baa0ace28d541cf1d4', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@10489b007e219baab83bd474e673e57551e4f30f', 'condition': 'checkout_src_internal', }, @@ -1836,7 +1836,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'JOGVsA7gvndcGEhqaKIu-DKp-1QJLvWAAOAuxpryQa0C', + 'version': '9813WWMrH5MqPee81_USOgOQKPm4VjeROpT8SuwBqSIC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1847,7 +1847,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'Mu_NVIdKabRHqlb8kSri4PHICAnF4EKTzmWKNHVvQQgC', + 'version': 'XK4WVCQ_KI0bCb1neir0h-PC5fHJ3uNkN7lAcr24crcC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/aw_pac_processor.cc b/android_webview/browser/aw_pac_processor.cc index c0c041a..e1daa4c 100644 --- a/android_webview/browser/aw_pac_processor.cc +++ b/android_webview/browser/aw_pac_processor.cc
@@ -22,7 +22,6 @@ #include "base/memory/raw_ptr.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/thread_restrictions.h" -#include "base/time/time.h" #include "net/base/address_list.h" #include "net/base/completion_once_callback.h" #include "net/base/net_errors.h"
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc index c317bdd..41f4d020 100644 --- a/android_webview/browser/aw_permission_manager.cc +++ b/android_webview/browser/aw_permission_manager.cc
@@ -476,9 +476,17 @@ render_frame_host)); } +PermissionStatus AwPermissionManager::GetPermissionStatusForWorker( + PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + return GetPermissionStatus(permission, worker_origin, worker_origin); +} + AwPermissionManager::SubscriptionId AwPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(PermissionStatus)> callback) {
diff --git a/android_webview/browser/aw_permission_manager.h b/android_webview/browser/aw_permission_manager.h index db1c3d31..03920e6 100644 --- a/android_webview/browser/aw_permission_manager.h +++ b/android_webview/browser/aw_permission_manager.h
@@ -56,8 +56,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/android_webview/browser/cookie_manager.h b/android_webview/browser/cookie_manager.h index e71553a..6f1287ca 100644 --- a/android_webview/browser/cookie_manager.h +++ b/android_webview/browser/cookie_manager.h
@@ -14,7 +14,6 @@ #include "base/no_destructor.h" #include "base/thread_annotations.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/cookie_manager.mojom-forward.h"
diff --git a/android_webview/browser/gfx/test/fake_window.cc b/android_webview/browser/gfx/test/fake_window.cc index 9040d1f2..c2593c8 100644 --- a/android_webview/browser/gfx/test/fake_window.cc +++ b/android_webview/browser/gfx/test/fake_window.cc
@@ -13,7 +13,6 @@ #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/init/gl_factory.h"
diff --git a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h index 74b9ac6..b47001c 100644 --- a/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h +++ b/android_webview/browser/gfx/viz_compositor_thread_runner_webview.h
@@ -11,7 +11,6 @@ #include "base/no_destructor.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "components/viz/service/main/viz_compositor_thread_runner.h" namespace base {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java index 3bf308bcc..5e1e7b8 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -29,6 +29,7 @@ import org.chromium.android_webview.test.util.JSUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.test.util.CallbackHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.TestFileUtil; import org.chromium.components.embedder_support.util.WebResourceResponseInfo; @@ -268,6 +269,7 @@ @Test @SmallTest @Feature({"AndroidWebView"}) + @DisabledTest(message = "https://crbug.com/1312394") public void testDoesNotCrashOnInvalidData_NullInputStream() throws Throwable { final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java index aba65f04..2142c93 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPageLoadMetricsTest.java
@@ -19,6 +19,7 @@ import org.chromium.android_webview.AwContents; import org.chromium.android_webview.metrics.AwMetricsServiceClient; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.MetricsUtils; import org.chromium.blink.mojom.WebFeature; @@ -119,6 +120,7 @@ @Test @SmallTest @Feature({"AndroidWebView"}) + @DisabledTest(message = "https://crbug.com/1312527") public void testFirstInputDelay4() throws Throwable { final String data = "<html><head></head><body>" + "<p>Hello World</p><input type='text' id='text1'>"
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index d2bc041..9c38b5e 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1270,6 +1270,8 @@ "system/network/network_detailed_network_view_impl.h", "system/network/network_detailed_view.cc", "system/network/network_detailed_view.h", + "system/network/network_detailed_view_controller.cc", + "system/network/network_detailed_view_controller.h", "system/network/network_feature_pod_button.cc", "system/network/network_feature_pod_button.h", "system/network/network_feature_pod_button_legacy.cc", @@ -2661,6 +2663,7 @@ "system/network/auto_connect_notifier_unittest.cc", "system/network/cellular_setup_notifier_unittest.cc", "system/network/network_detailed_network_view_unittest.cc", + "system/network/network_detailed_view_controller_unittest.cc", "system/network/network_detailed_view_unittest.cc", "system/network/network_feature_pod_button_unittest.cc", "system/network/network_feature_pod_controller_unittest.cc",
diff --git a/ash/ambient/ambient_photo_controller.cc b/ash/ambient/ambient_photo_controller.cc index a30b1e47..4a61739 100644 --- a/ash/ambient/ambient_photo_controller.cc +++ b/ash/ambient/ambient_photo_controller.cc
@@ -4,6 +4,7 @@ #include "ash/ambient/ambient_photo_controller.h" +#include <algorithm> #include <array> #include <string> #include <utility> @@ -17,6 +18,7 @@ #include "ash/public/cpp/ambient/ambient_client.h" #include "ash/public/cpp/ambient/proto/photo_cache_entry.pb.h" #include "ash/public/cpp/image_downloader.h" +#include "ash/public/cpp/shell_window_ids.h" #include "ash/shell.h" #include "base/barrier_closure.h" #include "base/base64.h" @@ -39,6 +41,9 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/display/display.h" +#include "ui/display/screen.h" +#include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" #include "url/gurl.h" @@ -239,11 +244,28 @@ void AmbientPhotoController::FetchTopics(FetchTopicRequestType request_type) { fetch_topic_timer_.Stop(); + + // TODO(b/225043577): Move this screen size logic to a separate class. It's + // here temporarily. + auto* ambient_container = Shell::GetContainer( + Shell::GetPrimaryRootWindow(), kShellWindowId_AmbientModeContainer); + gfx::Size display_size_px = display::Screen::GetScreen() + ->GetDisplayNearestView(ambient_container) + .GetSizeInPixel(); + + // For portrait photos, the server returns image of half requested width. + // When the device is in portrait mode, where only shows one portrait photo, + // it will cause unnecessary scaling. To reduce this effect, always requesting + // the landscape display size. + const int width = std::max(display_size_px.width(), display_size_px.height()); + const int height = + std::min(display_size_px.width(), display_size_px.height()); + Shell::Get() ->ambient_controller() ->ambient_backend_controller() ->FetchScreenUpdateInfo( - kTopicsBatchSize, + kTopicsBatchSize, gfx::Size(width, height), base::BindOnce(&AmbientPhotoController::OnScreenUpdateInfoFetched, weak_factory_.GetWeakPtr(), request_type)); }
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.cc b/ash/ambient/backdrop/ambient_backend_controller_impl.cc index 971e2df7..e16aad32 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.cc +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.cc
@@ -18,7 +18,6 @@ #include "ash/public/cpp/ambient/ambient_prefs.h" #include "ash/public/cpp/ambient/common/ambient_settings.h" #include "ash/public/cpp/ambient/proto/photo_cache_entry.pb.h" -#include "ash/public/cpp/shell_window_ids.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "base/barrier_closure.h" @@ -41,8 +40,6 @@ #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/display/display.h" -#include "ui/display/screen.h" #include "url/gurl.h" namespace ash { @@ -279,14 +276,6 @@ return false; } -gfx::Size GetDisplaySizeInPixel() { - auto* ambient_container = Shell::GetContainer( - Shell::GetPrimaryRootWindow(), kShellWindowId_AmbientModeContainer); - return display::Screen::GetScreen() - ->GetDisplayNearestView(ambient_container) - .GetSizeInPixel(); -} - } // namespace // Helper class for handling Backdrop service requests. @@ -360,10 +349,12 @@ void AmbientBackendControllerImpl::FetchScreenUpdateInfo( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback) { Shell::Get()->ambient_controller()->RequestAccessToken(base::BindOnce( &AmbientBackendControllerImpl::FetchScreenUpdateInfoInternal, - weak_factory_.GetWeakPtr(), num_topics, std::move(callback))); + weak_factory_.GetWeakPtr(), num_topics, screen_size, + std::move(callback))); } void AmbientBackendControllerImpl::GetSettings(GetSettingsCallback callback) { @@ -453,6 +444,7 @@ void AmbientBackendControllerImpl::FetchScreenUpdateInfoInternal( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback, const std::string& gaia_id, const std::string& access_token) { @@ -470,20 +462,13 @@ /*use_new_url=*/features::IsAmbientModeNewUrlEnabled()); auto resource_request = CreateResourceRequest(request); - // For portrait photos, the server returns image of half requested width. - // When the device is in portrait mode, where only shows one portrait photo, - // it will cause unnecessary scaling. To reduce this effect, always requesting - // the landscape display size. - gfx::Size display_size_px = GetDisplaySizeInPixel(); - const int width = std::max(display_size_px.width(), display_size_px.height()); - const int height = - std::min(display_size_px.width(), display_size_px.height()); + DCHECK(!screen_size.IsEmpty()); resource_request->url = net::AppendQueryParameter(resource_request->url, "device-screen-width", - base::NumberToString(width)); + base::NumberToString(screen_size.width())); resource_request->url = net::AppendQueryParameter(resource_request->url, "device-screen-height", - base::NumberToString(height)); + base::NumberToString(screen_size.height())); auto backdrop_url_loader = std::make_unique<BackdropURLLoader>(); auto* loader_ptr = backdrop_url_loader.get();
diff --git a/ash/ambient/backdrop/ambient_backend_controller_impl.h b/ash/ambient/backdrop/ambient_backend_controller_impl.h index d845bb3..eed5b996 100644 --- a/ash/ambient/backdrop/ambient_backend_controller_impl.h +++ b/ash/ambient/backdrop/ambient_backend_controller_impl.h
@@ -30,6 +30,7 @@ // AmbientBackendController: void FetchScreenUpdateInfo( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback) override; void GetSettings(GetSettingsCallback callback) override; void UpdateSettings(const AmbientSettings& settings, @@ -52,6 +53,7 @@ void RequestAccessToken(AmbientClient::GetAccessTokenCallback callback); void FetchScreenUpdateInfoInternal(int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback, const std::string& gaia_id, const std::string& access_token);
diff --git a/ash/app_list/app_list_test_api.cc b/ash/app_list/app_list_test_api.cc index 7735f2a..88601527 100644 --- a/ash/app_list/app_list_test_api.cc +++ b/ash/app_list/app_list_test_api.cc
@@ -461,4 +461,23 @@ .ReorderItemByDragAndDrop(source_index, target_index); } +views::View* AppListTestApi::GetVisibleSearchResultView(int index) { + views::View* app_list = + ShouldUseBubbleAppList() + ? static_cast<views::View*>(GetAppListBubbleView()) + : static_cast<views::View*>(GetAppListView()); + + views::View::Views search_results; + app_list->GetViewsInGroup(kSearchResultViewGroup, &search_results); + + int current_visible_index = -1; + for (auto* view : search_results) { + if (view->GetVisible()) + ++current_visible_index; + if (current_visible_index == index) + return view; + } + return nullptr; +} + } // namespace ash
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc index 03e26f29..538e82a 100644 --- a/ash/app_list/views/app_list_bubble_view.cc +++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -232,6 +232,7 @@ params.show_close_button_when_active = false; params.create_background = false; params.animate_changing_search_icon = false; + params.increase_child_view_padding = true; search_box_view_->Init(params); assistant_button_focus_skipper_ =
diff --git a/ash/app_list/views/search_result_base_view.cc b/ash/app_list/views/search_result_base_view.cc index 4d26b3b..a979c267 100644 --- a/ash/app_list/views/search_result_base_view.cc +++ b/ash/app_list/views/search_result_base_view.cc
@@ -16,6 +16,7 @@ namespace ash { SearchResultBaseView::SearchResultBaseView() { + SetGroup(kSearchResultViewGroup); SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); SetInstallFocusRingOnFocus(false); }
diff --git a/ash/assistant/assistant_controller_impl.cc b/ash/assistant/assistant_controller_impl.cc index 3dcd0bb..55c143d2 100644 --- a/ash/assistant/assistant_controller_impl.cc +++ b/ash/assistant/assistant_controller_impl.cc
@@ -150,6 +150,13 @@ void AssistantControllerImpl::OpenUrl(const GURL& url, bool in_background, bool from_server) { + // app_list search result will be opened by `OpenUrl()`. However, the + // `assistant_` may not be ready. Show a toast to indicate it. + if (!assistant_) { + assistant_ui_controller_.ShowUnboundErrorToast(); + return; + } + if (assistant::util::IsDeepLinkUrl(url)) { NotifyDeepLinkReceived(url); return;
diff --git a/ash/assistant/assistant_controller_impl_unittest.cc b/ash/assistant/assistant_controller_impl_unittest.cc index 03ab6c9..068df987 100644 --- a/ash/assistant/assistant_controller_impl_unittest.cc +++ b/ash/assistant/assistant_controller_impl_unittest.cc
@@ -175,6 +175,19 @@ /*from_server=*/true); } +TEST_F(AssistantControllerImplTest, NotOpenUrlIfAssistantNotReady) { + testing::NiceMock<MockAssistantControllerObserver> controller_observer_mock; + base::ScopedObservation<AssistantController, AssistantControllerObserver> + scoped_controller_obs{&controller_observer_mock}; + scoped_controller_obs.Observe(controller()); + + EXPECT_CALL(controller_observer_mock, OnOpeningUrl).Times(0); + + controller()->SetAssistant(nullptr); + controller()->OpenUrl(GURL("https://g.co/"), /*in_background=*/true, + /*from_server=*/true); +} + TEST_F(AssistantControllerImplTest, OpensFeedbackPageForFeedbackDeeplink) { testing::NiceMock<MockAssistantControllerObserver> controller_observer_mock; base::ScopedObservation<AssistantController, AssistantControllerObserver>
diff --git a/ash/assistant/assistant_ui_controller_impl.cc b/ash/assistant/assistant_ui_controller_impl.cc index dd52807..bda54b12 100644 --- a/ash/assistant/assistant_ui_controller_impl.cc +++ b/ash/assistant/assistant_ui_controller_impl.cc
@@ -115,16 +115,12 @@ // TODO(dmblack): Show a more helpful message to the user. if (assistant_state->assistant_status() == chromeos::assistant::AssistantStatus::NOT_READY) { - ShowToast(kUnboundServiceToastId, - ToastCatalogName::kAssistantUnboundService, - IDS_ASH_ASSISTANT_ERROR_GENERIC); + ShowUnboundErrorToast(); return; } if (!assistant_) { - ShowToast(kUnboundServiceToastId, - ToastCatalogName::kAssistantUnboundService, - IDS_ASH_ASSISTANT_ERROR_GENERIC); + ShowUnboundErrorToast(); return; } @@ -272,6 +268,11 @@ CloseUi(AssistantExitPoint::kOverviewMode); } +void AssistantUiControllerImpl::ShowUnboundErrorToast() { + ShowToast(kUnboundServiceToastId, ToastCatalogName::kAssistantUnboundService, + IDS_ASH_ASSISTANT_ERROR_GENERIC); +} + void AssistantUiControllerImpl::UpdateUiMode( absl::optional<AssistantUiMode> ui_mode, bool due_to_interaction) {
diff --git a/ash/assistant/assistant_ui_controller_impl.h b/ash/assistant/assistant_ui_controller_impl.h index 5068fd4..c6264e0 100644 --- a/ash/assistant/assistant_ui_controller_impl.h +++ b/ash/assistant/assistant_ui_controller_impl.h
@@ -94,6 +94,8 @@ // OverviewObserver: void OnOverviewModeWillStart() override; + void ShowUnboundErrorToast(); + private: // Updates UI mode to |ui_mode| if specified. Otherwise UI mode is updated on // the basis of interaction/widget visibility state. If |due_to_interaction|
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 92ac857..027b1c4 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1163,10 +1163,6 @@ const base::Feature kRedirectToDefaultIdP{"RedirectToDefaultIdP", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables suppression of Displays notifications other than resolution change. -const base::Feature kReduceDisplayNotifications{ - "ReduceDisplayNotifications", base::FEATURE_ENABLED_BY_DEFAULT}; - // Enables or disables Release Notes notifications on non-stable Chrome OS // channels. Used for testing. const base::Feature kReleaseNotesNotificationAllChannels{ @@ -1187,10 +1183,6 @@ const base::Feature kScalableStatusArea{"ScalableStatusArea", base::FEATURE_ENABLED_BY_DEFAULT}; -// Enables or disables flatbed multi-page scanning. -const base::Feature kScanAppMultiPageScan{"ScanAppMultiPageScan", - base::FEATURE_ENABLED_BY_DEFAULT}; - // Controls whether to enable kSecondaryGoogleAccountUsage policy. const base::Feature kSecondaryGoogleAccountUsage{ "SecondaryGoogleAccountUsage", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -2003,10 +1995,6 @@ return base::FeatureList::IsEnabled(kRedirectToDefaultIdP); } -bool IsReduceDisplayNotificationsEnabled() { - return base::FeatureList::IsEnabled(kReduceDisplayNotifications); -} - bool IsReverseScrollGesturesEnabled() { return base::FeatureList::IsEnabled(kReverseScrollGestures); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index d46ddf3..4e16a4e 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -455,8 +455,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kRedirectToDefaultIdP; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kReduceDisplayNotifications; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kReleaseNotesNotificationAllChannels; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kReleaseNotesSuggestionChip; @@ -464,8 +462,6 @@ extern const base::Feature kReverseScrollGestures; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kScalableStatusArea; COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::Feature kScanAppMultiPageScan; -COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSecondaryGoogleAccountUsage; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSemanticColorsDebugOverride; @@ -698,7 +694,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsQuickSettingsNetworkRevampEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsRedirectToDefaultIdPEnabled(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsReduceDisplayNotificationsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsReverseScrollGesturesEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSamlNotificationOnPasswordChangeSuccessEnabled();
diff --git a/ash/projector/projector_metadata_controller.cc b/ash/projector/projector_metadata_controller.cc index d79b78f..6fdfbed 100644 --- a/ash/projector/projector_metadata_controller.cc +++ b/ash/projector/projector_metadata_controller.cc
@@ -16,7 +16,6 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" namespace ash { namespace {
diff --git a/ash/public/cpp/ambient/ambient_backend_controller.h b/ash/public/cpp/ambient/ambient_backend_controller.h index 6a349cff..ce2e0988 100644 --- a/ash/public/cpp/ambient/ambient_backend_controller.h +++ b/ash/public/cpp/ambient/ambient_backend_controller.h
@@ -14,6 +14,7 @@ #include "ash/public/cpp/ash_public_export.h" #include "base/callback_forward.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/geometry/size.h" namespace ash { @@ -112,12 +113,13 @@ virtual ~AmbientBackendController(); // Sends request to retrieve |num_topics| of |ScreenUpdate| from the backdrop - // server. + // server with the specified |screen_size|. // Upon completion, |callback| is run with the parsed |ScreenUpdate|. If any // errors happened during the process, e.g. failed to fetch access token, a // default instance will be returned. virtual void FetchScreenUpdateInfo( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback) = 0; // Get ambient mode Settings from server.
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc index e5c4d38..44dfcd3 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.cc
@@ -85,6 +85,7 @@ void FakeAmbientBackendControllerImpl::FetchScreenUpdateInfo( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback) { ash::ScreenUpdate update;
diff --git a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h index fea5ae0..37e31d4 100644 --- a/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h +++ b/ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h
@@ -25,6 +25,7 @@ // AmbientBackendController: void FetchScreenUpdateInfo( int num_topics, + const gfx::Size& screen_size, OnScreenUpdateInfoFetchedCallback callback) override; void GetSettings(GetSettingsCallback callback) override; void UpdateSettings(const AmbientSettings& settings,
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h index 31fdb71..8868a89 100644 --- a/ash/public/cpp/app_list/app_list_types.h +++ b/ash/public/cpp/app_list/app_list_types.h
@@ -33,6 +33,10 @@ // drag offset is smaller than the threshold. constexpr int kMouseDragThreshold = 2; +// View group for launcher search result views that have a result set. Used +// primarily in browser tests to find shown search result views. +constexpr int kSearchResultViewGroup = 2; + // Id of OEM folder in app list. ASH_PUBLIC_EXPORT extern const char kOemFolderId[];
diff --git a/ash/public/cpp/app_list/vector_icons/BUILD.gn b/ash/public/cpp/app_list/vector_icons/BUILD.gn index b2857307..07ab5b08 100644 --- a/ash/public/cpp/app_list/vector_icons/BUILD.gn +++ b/ash/public/cpp/app_list/vector_icons/BUILD.gn
@@ -17,6 +17,7 @@ "badge_rating.icon", "bookmark.icon", "equal.icon", + "game_generic.icon", "google_black.icon", "history.icon", "mic_black.icon",
diff --git a/ash/public/cpp/app_list/vector_icons/game_generic.icon b/ash/public/cpp/app_list/vector_icons/game_generic.icon new file mode 100644 index 0000000..7974ada4 --- /dev/null +++ b/ash/public/cpp/app_list/vector_icons/game_generic.icon
@@ -0,0 +1,43 @@ +// Copyright 2022 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. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 18, 4, +H_LINE_TO, 2, +CUBIC_TO, 0.9f, 4, 0, 4.9f, 0, 6, +R_V_LINE_TO, 8, +R_CUBIC_TO, 0, 1.1f, 0.9f, 2, 2, 2, +R_H_LINE_TO, 16, +R_CUBIC_TO, 1.1f, 0, 2, -0.9f, 2, -2, +V_LINE_TO, 6, +R_CUBIC_TO, 0, -1.1f, -0.9f, -2, -2, -2, +CLOSE, +R_MOVE_TO, 0, 10, +H_LINE_TO, 2, +V_LINE_TO, 6, +R_H_LINE_TO, 16, +R_V_LINE_TO, 8, +CLOSE, +MOVE_TO, 5, 13, +R_H_LINE_TO, 2, +R_V_LINE_TO, -2, +R_H_LINE_TO, 2, +V_LINE_TO, 9, +H_LINE_TO, 7, +V_LINE_TO, 7, +H_LINE_TO, 5, +R_V_LINE_TO, 2, +H_LINE_TO, 3, +R_V_LINE_TO, 2, +R_H_LINE_TO, 2, +R_V_LINE_TO, 2, +CLOSE, +R_MOVE_TO, 7.5f, 0, +R_ARC_TO, 1.5f, 1.5f, 0, 1, 0, 0, -3, +R_ARC_TO, 1.5f, 1.5f, 0, 0, 0, 0, 3, +CLOSE, +R_MOVE_TO, 3, -3, +R_ARC_TO, 1.5f, 1.5f, 0, 1, 0, 0, -3, +R_ARC_TO, 1.5f, 1.5f, 0, 0, 0, 0, 3, +CLOSE
diff --git a/ash/public/cpp/app_list/vector_icons/omnibox_generic.icon b/ash/public/cpp/app_list/vector_icons/omnibox_generic.icon index 7f0ef652..3db0b39 100644 --- a/ash/public/cpp/app_list/vector_icons/omnibox_generic.icon +++ b/ash/public/cpp/app_list/vector_icons/omnibox_generic.icon
@@ -1,3 +1,7 @@ +// Copyright 2022 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. + CANVAS_DIMENSIONS, 20, NEW_PATH, MOVE_TO, 10, 2,
diff --git a/ash/public/cpp/desk_template.cc b/ash/public/cpp/desk_template.cc index 2130020b..fe2d23f 100644 --- a/ash/public/cpp/desk_template.cc +++ b/ash/public/cpp/desk_template.cc
@@ -32,11 +32,11 @@ switch (app_type) { case AppType::NON_APP: case AppType::CROSTINI_APP: - case AppType::LACROS: return false; case AppType::ARC_APP: case AppType::BROWSER: case AppType::CHROME_APP: + case AppType::LACROS: case AppType::SYSTEM_APP: break; }
diff --git a/ash/public/cpp/test/app_list_test_api.h b/ash/public/cpp/test/app_list_test_api.h index ce984a2d..3e57fee 100644 --- a/ash/public/cpp/test/app_list_test_api.h +++ b/ash/public/cpp/test/app_list_test_api.h
@@ -143,6 +143,10 @@ // drag-and-drop. `source_index` and `target_index` are view indices in the // root apps grid. void ReorderItemInRootByDragAndDrop(int source_index, int target_index); + + // Returns the view at the provided index in the list of visible search result + // views in the launcher search UI. Expects the launcher UI to be shown. + views::View* GetVisibleSearchResultView(int index); }; } // namespace ash
diff --git a/ash/search_box/search_box_view_base.cc b/ash/search_box/search_box_view_base.cc index 947eddfb..c2e77f1 100644 --- a/ash/search_box/search_box_view_base.cc +++ b/ash/search_box/search_box_view_base.cc
@@ -359,7 +359,6 @@ content_container_->AddChildView(std::make_unique<SearchIconImageView>()); search_icon_->SetPaintToLayer(); search_icon_->layer()->SetFillsBoundsOpaquely(false); - content_container_->AddChildView(search_box_); box_layout_->SetFlexForView(search_box_, 1); @@ -397,6 +396,10 @@ kSearchBoxBorderCornerRadius, AppListColorProvider::Get()->GetSearchBoxBackgroundColor())); } + if (params.increase_child_view_padding) { + box_layout_->set_between_child_spacing(kInnerPadding); + } + UpdateSearchBoxBorder(); UpdatePlaceholderTextStyle(); SetupAssistantButton();
diff --git a/ash/search_box/search_box_view_base.h b/ash/search_box/search_box_view_base.h index f6a1922..dafe9e2c 100644 --- a/ash/search_box/search_box_view_base.h +++ b/ash/search_box/search_box_view_base.h
@@ -65,6 +65,10 @@ // Whether to animate the transition when the search icon is changed. bool animate_changing_search_icon = false; + + // Whether we should increase spacing between `search_icon_', 'search_box_', + // and the 'search_box_button_container_'. + bool increase_child_view_padding = false; }; virtual void Init(const InitParams& params);
diff --git a/ash/system/bluetooth/bluetooth_device_list_item_view.cc b/ash/system/bluetooth/bluetooth_device_list_item_view.cc index 5a646969..895a7cf 100644 --- a/ash/system/bluetooth/bluetooth_device_list_item_view.cc +++ b/ash/system/bluetooth/bluetooth_device_list_item_view.cc
@@ -76,6 +76,8 @@ return IDS_BLUETOOTH_A11Y_DEVICE_TYPE_GAME_CONTROLLER; case DeviceType::kKeyboard: return IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD; + case DeviceType::kKeyboardMouseCombo: + return IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO; case DeviceType::kMouse: return IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE; case DeviceType::kTablet: @@ -148,6 +150,8 @@ return ash::kSystemMenuGamepadIcon; case DeviceType::kKeyboard: return ash::kSystemMenuKeyboardIcon; + case DeviceType::kKeyboardMouseCombo: + return ash::kSystemMenuKeyboardIcon; case DeviceType::kMouse: return ash::kSystemMenuMouseIcon; case DeviceType::kTablet:
diff --git a/ash/system/bluetooth/bluetooth_device_list_item_view_unittest.cc b/ash/system/bluetooth/bluetooth_device_list_item_view_unittest.cc index e2c862f8..33e7f27 100644 --- a/ash/system/bluetooth/bluetooth_device_list_item_view_unittest.cc +++ b/ash/system/bluetooth/bluetooth_device_list_item_view_unittest.cc
@@ -216,6 +216,8 @@ IDS_BLUETOOTH_A11Y_DEVICE_TYPE_GAME_CONTROLLER}, {DeviceType::kHeadset, IDS_BLUETOOTH_A11Y_DEVICE_TYPE_HEADSET}, {DeviceType::kKeyboard, IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD}, + {DeviceType::kKeyboardMouseCombo, + IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO}, {DeviceType::kMouse, IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE}, {DeviceType::kPhone, IDS_BLUETOOTH_A11Y_DEVICE_TYPE_PHONE}, {DeviceType::kTablet, IDS_BLUETOOTH_A11Y_DEVICE_TYPE_TABLET}, @@ -349,6 +351,7 @@ {DeviceType::kVideoCamera, &ash::kSystemMenuVideocamIcon}, {DeviceType::kGameController, &ash::kSystemMenuGamepadIcon}, {DeviceType::kKeyboard, &ash::kSystemMenuKeyboardIcon}, + {DeviceType::kKeyboardMouseCombo, &ash::kSystemMenuKeyboardIcon}, {DeviceType::kMouse, &ash::kSystemMenuMouseIcon}, {DeviceType::kTablet, &ash::kSystemMenuTabletIcon}, {DeviceType::kUnknown, &ash::kSystemMenuBluetoothIcon},
diff --git a/ash/system/network/network_detailed_network_view_impl.cc b/ash/system/network/network_detailed_network_view_impl.cc index 0459dca..6a25dec9 100644 --- a/ash/system/network/network_detailed_network_view_impl.cc +++ b/ash/system/network/network_detailed_network_view_impl.cc
@@ -7,6 +7,7 @@ #include "ash/constants/ash_features.h" #include "ash/system/network/network_detailed_view.h" #include "ash/system/tray/detailed_view_delegate.h" +#include "ui/base/metadata/metadata_impl_macros.h" namespace ash { namespace tray { @@ -27,5 +28,8 @@ return this; } +BEGIN_METADATA(NetworkDetailedNetworkViewImpl, views::View) +END_METADATA + } // namespace tray } // namespace ash \ No newline at end of file
diff --git a/ash/system/network/network_detailed_network_view_impl.h b/ash/system/network/network_detailed_network_view_impl.h index fca10529..035ce078 100644 --- a/ash/system/network/network_detailed_network_view_impl.h +++ b/ash/system/network/network_detailed_network_view_impl.h
@@ -8,6 +8,7 @@ #include "ash/ash_export.h" #include "ash/system/network/network_detailed_network_view.h" +#include "ui/base/metadata/metadata_impl_macros.h" namespace ash { @@ -22,6 +23,8 @@ : public NetworkDetailedView, public NetworkDetailedNetworkView { public: + METADATA_HEADER(NetworkDetailedNetworkViewImpl); + NetworkDetailedNetworkViewImpl( DetailedViewDelegate* detailed_view_delegate, NetworkDetailedNetworkView::Delegate* delegate);
diff --git a/ash/system/network/network_detailed_view_controller.cc b/ash/system/network/network_detailed_view_controller.cc new file mode 100644 index 0000000..1a326db --- /dev/null +++ b/ash/system/network/network_detailed_view_controller.cc
@@ -0,0 +1,56 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/network/network_detailed_view_controller.h" + +#include "ash/constants/ash_features.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/system/network/network_detailed_network_view.h" +#include "ash/system/network/network_list_view_controller.h" +#include "ash/system/tray/detailed_view_delegate.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/views/view.h" + +namespace ash { +namespace tray { + +NetworkDetailedViewController::NetworkDetailedViewController( + UnifiedSystemTrayController* tray_controller) + : detailed_view_delegate_( + std::make_unique<DetailedViewDelegate>(tray_controller)) { + DCHECK(ash::features::IsQuickSettingsNetworkRevampEnabled()); +} + +NetworkDetailedViewController::~NetworkDetailedViewController() = default; + +views::View* NetworkDetailedViewController::CreateView() { + DCHECK(!network_detailed_view_); + std::unique_ptr<tray::NetworkDetailedNetworkView> view = + NetworkDetailedNetworkView::Factory::Create(detailed_view_delegate_.get(), + /*delegate=*/this); + network_detailed_view_ = view.get(); + network_list_view_controller_ = + NetworkListViewController::Factory::Create(view.get()); + + // We are expected to return an unowned pointer that the caller is responsible + // for deleting. + return view.release()->GetAsView(); +} + +std::u16string NetworkDetailedViewController::GetAccessibleName() const { + return l10n_util::GetStringUTF16( + IDS_ASH_QUICK_SETTINGS_BUBBLE_NETWORK_SETTINGS_ACCESSIBLE_DESCRIPTION); +} + +void NetworkDetailedViewController::OnNetworkListItemSelected( + const chromeos::network_config::mojom::NetworkStatePropertiesPtr& network) { +} + +void NetworkDetailedViewController::OnMobileToggleClicked(bool new_state) {} + +void NetworkDetailedViewController::OnWifiToggleClicked(bool new_state) {} + +} // namespace tray +} // namespace ash
diff --git a/ash/system/network/network_detailed_view_controller.h b/ash/system/network/network_detailed_view_controller.h new file mode 100644 index 0000000..4214503 --- /dev/null +++ b/ash/system/network/network_detailed_view_controller.h
@@ -0,0 +1,63 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_NETWORK_NETWORK_DETAILED_VIEW_CONTROLLER_H_ +#define ASH_SYSTEM_NETWORK_NETWORK_DETAILED_VIEW_CONTROLLER_H_ + +#include <memory> +#include <string> + +#include "ash/ash_export.h" +#include "ash/system/network/network_detailed_network_view.h" +#include "ash/system/network/network_detailed_view.h" +#include "ash/system/network/network_list_view_controller.h" +#include "ash/system/tray/detailed_view_delegate.h" +#include "ash/system/unified/detailed_view_controller.h" +#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" + +namespace views { +class View; +} // namespace views + +namespace ash { +namespace tray { + +// This class encapsulates the logic to update the detailed Network device +// page within the quick settings and translate user interaction with the +// detailed view into Network state changes. +class ASH_EXPORT NetworkDetailedViewController + : public DetailedViewController, + public NetworkDetailedNetworkView::Delegate { + public: + explicit NetworkDetailedViewController( + UnifiedSystemTrayController* tray_controller); + NetworkDetailedViewController(const NetworkDetailedViewController&) = delete; + NetworkDetailedViewController& operator=( + const NetworkDetailedViewController&) = delete; + ~NetworkDetailedViewController() override; + + // DetailedViewControllerBase: + views::View* CreateView() override; + std::u16string GetAccessibleName() const override; + + private: + // NetworkDetailedView::Delegate: + void OnNetworkListItemSelected( + const chromeos::network_config::mojom::NetworkStatePropertiesPtr& network) + override; + + // NetworkDetailedNetworkView::Delegate: + void OnMobileToggleClicked(bool new_state) override; + void OnWifiToggleClicked(bool new_state) override; + + const std::unique_ptr<DetailedViewDelegate> detailed_view_delegate_; + + NetworkDetailedNetworkView* network_detailed_view_ = nullptr; + std::unique_ptr<NetworkListViewController> network_list_view_controller_; +}; + +} // namespace tray +} // namespace ash + +#endif // ASH_SYSTEM_NETWORK_NETWORK_DETAILED_VIEW_CONTROLLER_H_
diff --git a/ash/system/network/network_detailed_view_controller_unittest.cc b/ash/system/network/network_detailed_view_controller_unittest.cc new file mode 100644 index 0000000..ed979494 --- /dev/null +++ b/ash/system/network/network_detailed_view_controller_unittest.cc
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/network/network_detailed_view_controller.h" + +#include <memory> + +#include "ash/constants/ash_features.h" +#include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" + +namespace ash { +namespace tray { + +class NetworkDetailedViewControllerTest : public AshTestBase { + public: + void SetUp() override { + AshTestBase::SetUp(); + + feature_list_.InitAndEnableFeature(features::kQuickSettingsNetworkRevamp); + + network_detailed_view_controller_ = + std::make_unique<NetworkDetailedViewController>( + /*tray_controller=*/nullptr); + } + + void TearDown() override { + network_detailed_view_controller_.reset(); + + AshTestBase::TearDown(); + } + + private: + base::test::ScopedFeatureList feature_list_; + std::unique_ptr<NetworkDetailedViewController> + network_detailed_view_controller_; +}; + +TEST_F(NetworkDetailedViewControllerTest, CanConstruct) { + EXPECT_TRUE(true); +} + +} // namespace tray +} // namespace ash
diff --git a/ash/system/network/network_feature_pod_controller_unittest.cc b/ash/system/network/network_feature_pod_controller_unittest.cc index f2c0d80..e1595b98 100644 --- a/ash/system/network/network_feature_pod_controller_unittest.cc +++ b/ash/system/network/network_feature_pod_controller_unittest.cc
@@ -214,7 +214,8 @@ const views::View::Views& children = tray_view()->detailed_view()->children(); EXPECT_EQ(1u, children.size()); - EXPECT_STREQ("NetworkListView", children.at(0)->GetClassName()); + EXPECT_STREQ("NetworkDetailedNetworkViewImpl", + children.at(0)->GetClassName()); } void CheckSignalStrengthSubLabel(
diff --git a/ash/system/screen_layout_observer.cc b/ash/system/screen_layout_observer.cc index a37c610b..aa87a48f 100644 --- a/ash/system/screen_layout_observer.cc +++ b/ash/system/screen_layout_observer.cc
@@ -178,18 +178,8 @@ std::u16string GetDisplayAddedMessage(int64_t added_display_id, std::u16string* additional_message_out) { - if (features::IsReduceDisplayNotificationsEnabled()) { - DCHECK(!display::Display::IsInternalDisplayId(added_display_id)); - return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_ADDED, - GetExternalDisplayName(added_display_id)); - } - - if (!display::Display::HasInternalDisplay()) { - return l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL); - } - - return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED, + DCHECK(!display::Display::IsInternalDisplayId(added_display_id)); + return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_ADDED, GetExternalDisplayName(added_display_id)); } @@ -288,8 +278,7 @@ continue; // No notification if the internal display is connected. - if (features::IsReduceDisplayNotificationsEnabled() && - display::Display::IsInternalDisplayId(iter.first)) { + if (display::Display::IsInternalDisplayId(iter.first)) { return false; } @@ -424,8 +413,7 @@ } // Alerting user unassociated display are allowed even when suppressed. - if (features::IsReduceDisplayNotificationsEnabled() && - !should_notify_has_unassociated_display) { + if (!should_notify_has_unassociated_display) { return; }
diff --git a/ash/system/screen_layout_observer_unittest.cc b/ash/system/screen_layout_observer_unittest.cc index abf8693..7ee3a16 100644 --- a/ash/system/screen_layout_observer_unittest.cc +++ b/ash/system/screen_layout_observer_unittest.cc
@@ -50,7 +50,6 @@ void CheckUpdate(); void CloseNotification(); - void ClickNotification(); std::u16string GetDisplayNotificationText() const; std::u16string GetDisplayNotificationAdditionalText() const; @@ -69,11 +68,7 @@ private: const message_center::Notification* GetDisplayNotification() const; }; - -ScreenLayoutObserverTest::ScreenLayoutObserverTest() { - scoped_feature_list_.InitAndDisableFeature( - features::kReduceDisplayNotifications); -} +ScreenLayoutObserverTest::ScreenLayoutObserverTest() = default; ScreenLayoutObserverTest::~ScreenLayoutObserverTest() = default; @@ -92,11 +87,6 @@ base::RunLoop().RunUntilIdle(); } -void ScreenLayoutObserverTest::ClickNotification() { - const message_center::Notification* notification = GetDisplayNotification(); - notification->delegate()->Click(absl::nullopt, absl::nullopt); -} - std::u16string ScreenLayoutObserverTest::GetDisplayNotificationText() const { const message_center::Notification* notification = GetDisplayNotification(); return notification ? notification->title() : std::u16string(); @@ -271,8 +261,6 @@ TEST_F(ScreenLayoutObserverTest, DisplayNotificationsDisabled) { scoped_feature_list_.Reset(); - scoped_feature_list_.InitAndEnableFeature( - features::kReduceDisplayNotifications); UpdateDisplay("500x400"); display::Display::SetInternalDisplayId(display_manager()->first_display_id()); @@ -332,73 +320,6 @@ CloseNotification(); } -// Zooming in Unified Mode results in display size changes rather than changes -// in the UI scales, in which case, we still want to show a notification when -// the source of change is not the settings ui. -TEST_F(ScreenLayoutObserverTest, ZoomingInUnifiedModeNotification) { - UpdateDisplay("500x400,300x200"); - - // Enter unified mode. - display_manager()->SetUnifiedDesktopEnabled(true); - - // Using keyboard shortcuts to change the zoom should result in a - // notification. - CloseNotification(); - int64_t display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id(); - EXPECT_TRUE(display_manager()->ZoomDisplay(display_id, false /* up */)); - EXPECT_EQ( - l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, - GetUnifiedDisplayName(), u"550x200"), - GetDisplayNotificationAdditionalText()); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TITLE), - GetDisplayNotificationText()); - - CloseNotification(); - EXPECT_TRUE(display_manager()->ZoomDisplay(display_id, true /* up */)); - EXPECT_EQ( - l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED, - GetUnifiedDisplayName(), u"1100x400"), - GetDisplayNotificationAdditionalText()); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED_TITLE), - GetDisplayNotificationText()); - - // However, when the source is the settings UI, the ScreenLayoutObserver does - // not produce a notification for resolution changes in Unified Mode. These - // are handled by the ResolutionNotificationController instead. - CloseNotification(); - Shell::Get()->screen_layout_observer()->SetDisplayChangedFromSettingsUI( - display::kUnifiedDisplayId); - EXPECT_TRUE(display_manager()->ZoomDisplay(display_id, false /* up */)); - EXPECT_TRUE(GetDisplayNotificationAdditionalText().empty()); - EXPECT_TRUE(GetDisplayNotificationText().empty()); -} - -// Verify that notification shows up when display is switched from dock mode to -// extend mode. -TEST_F(ScreenLayoutObserverTest, DisplayConfigurationChangedTwice) { - UpdateDisplay("500x400,300x200"); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), - GetDisplayNotificationText()); - - // OnDisplayConfigurationChanged() may be called more than once for a single - // update display in case of primary is swapped or recovered from dock mode. - // Should not remove the notification in such case. - GetScreenLayoutObserver()->OnDisplayConfigurationChanged(); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), - GetDisplayNotificationText()); - - // Back to the single display. It should show that a display was removed. - UpdateDisplay("500x400"); - EXPECT_TRUE(base::StartsWith( - GetDisplayNotificationText(), - l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED, u""), - base::CompareCase::SENSITIVE)); -} - // Verify that no notification is shown when overscan of a screen is changed. TEST_F(ScreenLayoutObserverTest, OverscanDisplay) { UpdateDisplay("500x400, 400x300"); @@ -418,211 +339,4 @@ gfx::Insets()); EXPECT_FALSE(IsNotificationShown()); } - -// Tests that exiting mirror mode by closing the lid shows the correct "exiting -// mirror mode" message. -TEST_F(ScreenLayoutObserverTest, ExitMirrorModeBecauseOfDockedModeMessage) { - UpdateDisplay("500x400,300x200"); - display::Display::SetInternalDisplayId( - display::test::DisplayManagerTestApi(display_manager()) - .GetSecondaryDisplay() - .id()); - - // Mirroring. - UpdateDisplay("500x400,300x200"); - display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); - EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, - GetMirroringDisplayNames()), - GetDisplayNotificationText()); - - // Docked. - CloseNotification(); - display::Display::SetInternalDisplayId(display_manager()->first_display_id()); - UpdateDisplay("300x200"); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), - GetDisplayNotificationText()); -} - -// Special case: tests that exiting mirror mode by removing a display shows the -// correct message. -TEST_F(ScreenLayoutObserverTest, - ExitMirrorModeNoInternalDisplayBecauseOfDisplayRemovedMessage) { - UpdateDisplay("500x400,300x200"); - display::Display::SetInternalDisplayId( - display::test::DisplayManagerTestApi(display_manager()) - .GetSecondaryDisplay() - .id()); - - // Mirroring. - UpdateDisplay("500x400,300x200"); - display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); - EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, - GetMirroringDisplayNames()), - GetDisplayNotificationText()); - - // Removing one of the displays. We show that we exited mirror mode. - CloseNotification(); - UpdateDisplay("500x400"); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), - GetDisplayNotificationText()); -} - -// Tests notification messages shown when adding and removing displays in -// extended mode. -TEST_F(ScreenLayoutObserverTest, AddingRemovingDisplayExtendedModeMessage) { - UpdateDisplay("500x400"); - EXPECT_TRUE(GetDisplayNotificationText().empty()); - - // Adding a display in extended mode. - UpdateDisplay("500x400,300x200"); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), - GetDisplayNotificationText()); - - // Removing a display. - CloseNotification(); - UpdateDisplay("500x400"); - EXPECT_TRUE(base::StartsWith( - GetDisplayNotificationText(), - l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED, u""), - base::CompareCase::SENSITIVE)); -} - -// Tests notification messages shown when entering and exiting unified desktop -// mode. -TEST_F(ScreenLayoutObserverTest, EnteringExitingUnifiedModeMessage) { - UpdateDisplay("500x400"); - EXPECT_TRUE(GetDisplayNotificationText().empty()); - - // Adding a display in extended mode. - UpdateDisplay("500x400,300x200"); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), - GetDisplayNotificationText()); - - // Enter unified mode. - display_manager()->SetUnifiedDesktopEnabled(true); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED), - GetDisplayNotificationText()); - - // Exit unified mode. - display_manager()->SetUnifiedDesktopEnabled(false); - EXPECT_EQ( - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED_EXITING), - GetDisplayNotificationText()); - - // Enter unified mode again and exit via closing the lid. The message "Exiting - // unified mode" should be shown. - display_manager()->SetUnifiedDesktopEnabled(true); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED), - GetDisplayNotificationText()); - - // Close the lid. - display::Display::SetInternalDisplayId(display_manager()->first_display_id()); - UpdateDisplay("300x200"); - display_manager()->SetUnifiedDesktopEnabled(false); - EXPECT_EQ( - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED_EXITING), - GetDisplayNotificationText()); -} - -// Special case: Tests notification messages shown when entering docked mode -// by closing the lid and the internal display is the secondary display. -TEST_F(ScreenLayoutObserverTest, DockedModeWithExternalPrimaryDisplayMessage) { - UpdateDisplay("500x400,300x200"); - EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL), - GetDisplayNotificationText()); - CloseNotification(); - - const int64_t primary_id = display_manager()->GetDisplayAt(0).id(); - const int64_t internal_secondary_id = display_manager()->GetDisplayAt(1).id(); - display::Display::SetInternalDisplayId(internal_secondary_id); - display::DisplayLayoutBuilder builder(primary_id); - builder.AddDisplayPlacement(internal_secondary_id, primary_id, - display::DisplayPlacement::LEFT, 0); - display_manager()->SetLayoutForCurrentDisplays(builder.Build()); - EXPECT_TRUE(GetDisplayNotificationText().empty()); - - // Close the lid. We go to docked mode, but we show no notifications. - UpdateDisplay("500x400"); - EXPECT_FALSE(IsNotificationShown()); -} - -TEST_F(ScreenLayoutObserverTest, MirrorModeAddOrRemoveDisplayMessage) { - const int64_t internal_display_id = - display::test::DisplayManagerTestApi(display_manager()) - .SetFirstDisplayAsInternalDisplay(); - constexpr int first_display_id = 11; - constexpr int second_display_id = 12; - display::ManagedDisplayInfo first_display_info = - display::CreateDisplayInfo(first_display_id, gfx::Rect(1, 1, 500, 400)); - display::ManagedDisplayInfo second_display_info = - display::CreateDisplayInfo(second_display_id, gfx::Rect(2, 2, 500, 400)); - std::vector<display::ManagedDisplayInfo> display_info_list; - display_info_list.push_back(display::CreateDisplayInfo( - internal_display_id, gfx::Rect(0, 0, 200, 100))); - display_info_list.push_back(first_display_info); - display_info_list.push_back(second_display_info); - display_manager()->OnNativeDisplaysChanged(display_info_list); - - // Mirroring across 3 displays. - display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); - EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, - GetMirroringDisplayNames()), - GetDisplayNotificationText()); - - // Mirror mode persists when a display is removed. - CloseNotification(); - display_info_list.erase(display_info_list.end() - 1); - display_manager()->OnNativeDisplaysChanged(display_info_list); - EXPECT_TRUE(GetDisplayNotificationText().empty()); - EXPECT_TRUE(display_manager()->IsInMirrorMode()); - - // Turn off mirror mode. - CloseNotification(); - display_manager()->SetMirrorMode(display::MirrorMode::kOff, absl::nullopt); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), - GetDisplayNotificationText()); - - // Turn on mirror mode. - CloseNotification(); - display_manager()->SetMirrorMode(display::MirrorMode::kNormal, absl::nullopt); - EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, - GetMirroringDisplayNames()), - GetDisplayNotificationText()); - - // Mirror mode ends when only one display is left. - CloseNotification(); - display_info_list.erase(display_info_list.end() - 1); - display_manager()->OnNativeDisplaysChanged(display_info_list); - EXPECT_EQ(l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT), - GetDisplayNotificationText()); - - // Mirror mode is restored when the display is reconncted. - CloseNotification(); - display_info_list.push_back(first_display_info); - display_manager()->OnNativeDisplaysChanged(display_info_list); - EXPECT_EQ(l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING, - GetMirroringDisplayNames()), - GetDisplayNotificationText()); - - // Add the other display, the mirror mode persists. - CloseNotification(); - display_info_list.push_back(second_display_info); - display_manager()->OnNativeDisplaysChanged(display_info_list); - EXPECT_TRUE(GetDisplayNotificationText().empty()); - EXPECT_TRUE(display_manager()->IsInMirrorMode()); -} - -TEST_F(ScreenLayoutObserverTest, ClickNotification) { - // Create notification. - UpdateDisplay("500x400,300x200"); - EXPECT_FALSE(GetDisplayNotificationText().empty()); - - // Click notification. - ClickNotification(); - EXPECT_TRUE(GetDisplayNotificationText().empty()); -} - } // namespace ash
diff --git a/ash/system/toast/toast_manager_impl.cc b/ash/system/toast/toast_manager_impl.cc index de9e81e..7f20fbc 100644 --- a/ash/system/toast/toast_manager_impl.cc +++ b/ash/system/toast/toast_manager_impl.cc
@@ -11,7 +11,6 @@ #include "base/bind.h" #include "base/location.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" namespace ash {
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index 48c2eb6..33ca0e4 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -36,6 +36,7 @@ #include "ash/system/model/clock_model.h" #include "ash/system/model/system_tray_model.h" #include "ash/system/nearby_share/nearby_share_feature_pod_controller.h" +#include "ash/system/network/network_detailed_view_controller.h" #include "ash/system/network/network_feature_pod_controller.h" #include "ash/system/network/network_feature_pod_controller_legacy.h" #include "ash/system/network/unified_network_detailed_view_controller.h" @@ -342,8 +343,14 @@ return; base::RecordAction(base::UserMetricsAction("StatusArea_Network_Detailed")); - ShowDetailedView( - std::make_unique<UnifiedNetworkDetailedViewController>(this)); + + if (ash::features::IsQuickSettingsNetworkRevampEnabled()) { + ShowDetailedView( + std::make_unique<tray::NetworkDetailedViewController>(this)); + } else { + ShowDetailedView( + std::make_unique<UnifiedNetworkDetailedViewController>(this)); + } } void UnifiedSystemTrayController::ShowBluetoothDetailedView() {
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom index bd05c57..b94ecda 100644 --- a/ash/webui/personalization_app/mojom/personalization_app.mojom +++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -188,6 +188,11 @@ // to call multiple times. MakeTransparent(); + // Called to reverse `MakeTransparent()`. Being called while exiting + // fullscreen preview to avoid unexpected transparency. Safe to call + // multiple times, even before `MakeTransparent()` is called. + MakeOpaque(); + // Fetch a list of WallpaperCollection objects from the Backdrop API. Will // be displayed to the user to allow them to select an individual collection // to view in more detail. |collections| will be null on error.
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc index 9223ba4..4ffeb9d 100644 --- a/ash/webui/personalization_app/personalization_app_ui.cc +++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -93,6 +93,7 @@ {"zeroImages", IDS_PERSONALIZATION_APP_NO_IMAGES}, {"oneImage", IDS_PERSONALIZATION_APP_ONE_IMAGE}, {"multipleImages", IDS_PERSONALIZATION_APP_MULTIPLE_IMAGES}, + {"managedSetting", IDS_PERSONALIZATION_APP_MANAGED_SETTING}, // User/avatar related strings. {"avatarLabel", IDS_PERSONALIZATION_APP_AVATAR_LABEL},
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn index 5bc76e3..df4a0bf 100644 --- a/ash/webui/personalization_app/resources/BUILD.gn +++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -130,6 +130,7 @@ ] static_resource_files = [ + "hub_icon_192.png", "icon_192.png", "common/ambient_mode_disabled.svg",
diff --git a/ash/webui/personalization_app/resources/common/constants.ts b/ash/webui/personalization_app/resources/common/constants.ts index cef19ab8..0ce7be7b 100644 --- a/ash/webui/personalization_app/resources/common/constants.ts +++ b/ash/webui/personalization_app/resources/common/constants.ts
@@ -5,7 +5,7 @@ import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js'; import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js'; -import {WallpaperCollection} from '../trusted/personalization_app.mojom-webui.js'; +import {GooglePhotosEnablementState, WallpaperCollection} from '../trusted/personalization_app.mojom-webui.js'; export const trustedOrigin = 'chrome://personalization'; @@ -15,6 +15,7 @@ export enum EventType { SEND_COLLECTIONS = 'send_collections', SEND_GOOGLE_PHOTOS_COUNT = 'send_google_photos_count', + SEND_GOOGLE_PHOTOS_ENABLED = 'send_google_photos_enabled', SEND_GOOGLE_PHOTOS_PHOTOS = 'send_google_photos_photos', SELECT_COLLECTION = 'select_collection', SELECT_GOOGLE_PHOTOS_COLLECTION = 'select_google_photos_collection', @@ -40,6 +41,11 @@ count: number|null, }; +export type SendGooglePhotosEnabledEvent = { + type: EventType.SEND_GOOGLE_PHOTOS_ENABLED, + enabled: GooglePhotosEnablementState, +}; + export type SendGooglePhotosPhotosEvent = { type: EventType.SEND_GOOGLE_PHOTOS_PHOTOS, photos: unknown[]|null, @@ -115,8 +121,9 @@ }; export type Events = SendCollectionsEvent|SendGooglePhotosCountEvent| - SendGooglePhotosPhotosEvent|SelectCollectionEvent| - SelectGooglePhotosCollectionEvent|SelectLocalCollectionEvent| - SendImageCountsEvent|SendImageTilesEvent|SendLocalImagesEvent| - SendLocalImageDataEvent|SendCurrentWallpaperAssetIdEvent| - SendPendingWallpaperAssetIdEvent|SelectImageEvent|SendVisibleEvent; + SendGooglePhotosEnabledEvent|SendGooglePhotosPhotosEvent| + SelectCollectionEvent|SelectGooglePhotosCollectionEvent| + SelectLocalCollectionEvent|SendImageCountsEvent|SendImageTilesEvent| + SendLocalImagesEvent|SendLocalImageDataEvent| + SendCurrentWallpaperAssetIdEvent|SendPendingWallpaperAssetIdEvent| + SelectImageEvent|SendVisibleEvent;
diff --git a/ash/webui/personalization_app/resources/common/icons.html b/ash/webui/personalization_app/resources/common/icons.html index e93b85a..780f227 100644 --- a/ash/webui/personalization_app/resources/common/icons.html +++ b/ash/webui/personalization_app/resources/common/icons.html
@@ -133,6 +133,10 @@ <path d="M8.854 13.812L14.729 7.93801L13.5 6.72901L8.875 11.354L6.521 9.00001L5.292 10.229L8.854 13.812ZM10 18.333C8.84733 18.333 7.764 18.1143 6.75 17.677C5.736 17.2397 4.854 16.646 4.104 15.896C3.354 15.146 2.76033 14.264 2.323 13.25C1.88567 12.236 1.667 11.1527 1.667 10C1.667 8.84734 1.88567 7.76401 2.323 6.75001C2.76033 5.73601 3.354 4.85401 4.104 4.10401C4.854 3.35401 5.736 2.76034 6.75 2.32301C7.764 1.88567 8.84733 1.66701 10 1.66701C11.1527 1.66701 12.236 1.88567 13.25 2.32301C14.264 2.76034 15.146 3.35401 15.896 4.10401C16.646 4.85401 17.2397 5.73601 17.677 6.75001C18.1143 7.76401 18.333 8.84734 18.333 10C18.333 11.1527 18.1143 12.236 17.677 13.25C17.2397 14.264 16.646 15.146 15.896 15.896C15.146 16.646 14.264 17.2397 13.25 17.677C12.236 18.1143 11.1527 18.333 10 18.333ZM10 16.583C11.8193 16.583 13.3713 15.9407 14.656 14.656C15.9407 13.3713 16.583 11.8193 16.583 10C16.583 8.18067 15.9407 6.62867 14.656 5.34401C13.3713 4.05934 11.8193 3.41701 10 3.41701C8.18067 3.41701 6.62867 4.05934 5.344 5.34401C4.05933 6.62867 3.417 8.18067 3.417 10C3.417 11.8193 4.05933 13.3713 5.344 14.656C6.62867 15.9407 8.18067 16.583 10 16.583Z"> </path> </g> + <g id="managed"> + <path d="M2 17V3H12V7H18V17H2ZM8 9H10V11H8V9ZM12 11H14V13H12V15H16V9H12V11ZM8 13H10V15H8V13ZM6 13H4V15H6V13ZM6 9H4V11H6V9ZM8 5H10V7H8V5ZM6 5H4V7H6V5Z"> + </path> + </g> </defs> </svg> </iron-iconset-svg>
diff --git a/ash/webui/personalization_app/resources/common/styles.html b/ash/webui/personalization_app/resources/common/styles.html index 196633e..f6a7843 100644 --- a/ash/webui/personalization_app/resources/common/styles.html +++ b/ash/webui/personalization_app/resources/common/styles.html
@@ -276,5 +276,33 @@ font: var(--personalization-app-label-font); margin: 34px 8px 16px 8px; } + + .ambient-toggle-row-container { + border-radius: 8px; + display: flex; + flex-flow: column nowrap; + height: 48px; + outline: 1px solid rgb(154, 160, 166); + width: 100%; + } + + .ambient-toggle-row { + align-items: center; + display: flex; + flex: 1; + flex-flow: row nowrap; + justify-content: space-between; + margin: 0 20px; + } + + .ambient-toggle-row + .ambient-toggle-row { + border-top: 1px solid var(--cros-separator-color); + } + + .ambient-toggle-row > p { + font: var(--cros-body-1-font); + height: 20px; + margin: 0; + } </style> </template>
diff --git a/ash/webui/personalization_app/resources/hub_icon_192.png b/ash/webui/personalization_app/resources/hub_icon_192.png new file mode 100644 index 0000000..29b35e08 --- /dev/null +++ b/ash/webui/personalization_app/resources/hub_icon_192.png Binary files differ
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html index 6ed45c56..0b00567 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html +++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.html
@@ -11,7 +11,8 @@ grid-template-columns: 1fr 16px minmax(568px, 920px) 16px 1fr; grid-template-rows: auto; } - toggle-row { + toggle-row, + #toggleRowPlaceholder { grid-area: toggles; margin: 0 8px; } @@ -117,9 +118,18 @@ <div id="container"> <template is="dom-if" if="[[shouldShowMainSettings_(path)]]"> <div id="mainSettings"> - <toggle-row checked="[[ambientModeEnabled_]]" - on-click="onClickAmbientModeButton_" on-change="onToggleStateChanged_"> - </toggle-row> + <template is="dom-if" if="[[loadingAmbientMode_(ambientModeEnabled_)]]"> + <div id="toggleRowPlaceholder" class="ambient-toggle-row-container"> + <div class="ambient-toggle-row"> + <div class="ambient-primary-text-placeholder placeholder"></div> + </div> + </div> + </template> + <template is="dom-if" if="[[!loadingAmbientMode_(ambientModeEnabled_)]]"> + <toggle-row checked="[[ambientModeEnabled_]]" + on-click="onClickAmbientModeButton_" on-change="onToggleStateChanged_"> + </toggle-row> + </template> <template is="dom-if" if="[[ambientModeEnabled_]]"> <ambient-preview></ambient-preview> <template is="dom-if" if="[[loadingSettings_]]">
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts index e38cffe..2024cea0 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts +++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_subpage_element.ts
@@ -136,6 +136,10 @@ return path === Paths.AmbientAlbums; } + private loadingAmbientMode_(): boolean { + return this.ambientModeEnabled_ === null; + } + private computeLoadingSettings_(): boolean { return this.albums_ === null || this.topicSource_ === null || this.temperatureUnit_ === null;
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.html b/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.html index 906b091a..2a9b7c88 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.html +++ b/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.html
@@ -1,31 +1,7 @@ -<style> - #container { - border-radius: 8px; - display: flex; - flex-flow: column nowrap; - height: 48px; - outline: 1px solid rgb(154, 160, 166); - width: 100%; - } - .row { - align-items: center; - display: flex; - flex: 1; - flex-flow: row nowrap; - justify-content: space-between; - margin: 0 20px; - } - .row + .row { - border-top: 1px solid var(--cros-separator-color); - } - .row > p { - font: var(--cros-body-1-font); - height: 20px; - margin: 0; - } +<style include="common-style"> </style> -<div id="container"> - <div class="row"> +<div class="ambient-toggle-row-container"> + <div class="ambient-toggle-row"> <p>$i18n{ambientModePageDescription}</p> <cr-toggle id="toggle" checked="{{checked}}" aria-label$="[[getAriaLabel_(checked)]]">
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.ts index 0177b5e..9ef47a4 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.ts +++ b/ash/webui/personalization_app/resources/trusted/ambient/toggle_row_element.ts
@@ -6,6 +6,7 @@ * @fileoverview This component displays a description text and a toggle button. */ +import '../../common/styles.js'; import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js'; import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.m.js';
diff --git a/ash/webui/personalization_app/resources/trusted/iframe_api.ts b/ash/webui/personalization_app/resources/trusted/iframe_api.ts index 2b4c333..d26c4d4 100644 --- a/ash/webui/personalization_app/resources/trusted/iframe_api.ts +++ b/ash/webui/personalization_app/resources/trusted/iframe_api.ts
@@ -17,7 +17,7 @@ import {CollectionsGrid} from '../untrusted/collections_grid.js'; import {ImagesGrid} from '../untrusted/images_grid.js'; -import {WallpaperCollection, WallpaperImage} from './personalization_app.mojom-webui.js'; +import {GooglePhotosEnablementState, WallpaperCollection, WallpaperImage} from './personalization_app.mojom-webui.js'; /** * TODO(b:197023872) this class is deprecated and should be removed by more @@ -48,6 +48,18 @@ } /** + * Sends whether the user is allowed to access Google Photos to untrusted. + */ + sendGooglePhotosEnabled( + target: CollectionsGrid, enabled: GooglePhotosEnablementState) { + const event: constants.SendGooglePhotosEnabledEvent = { + type: constants.EventType.SEND_GOOGLE_PHOTOS_ENABLED, + enabled + }; + target.onMessageReceived(event); + } + + /** * Sends the list of Google Photos photos to untrusted. */ sendGooglePhotosPhotos(target: CollectionsGrid, photos: Array<Url>|null) {
diff --git a/ash/webui/personalization_app/resources/trusted/personalization_app.ts b/ash/webui/personalization_app/resources/trusted/personalization_app.ts index 22e2db6..4ed527c 100644 --- a/ash/webui/personalization_app/resources/trusted/personalization_app.ts +++ b/ash/webui/personalization_app/resources/trusted/personalization_app.ts
@@ -103,6 +103,10 @@ export {WallpaperSelected} from './wallpaper/wallpaper_selected_element.js'; PersonalizationStore.getInstance().init(emptyState()); +const link = document.querySelector('link[rel=\'icon\']') as HTMLLinkElement; +if (loadTimeData.getBoolean('isPersonalizationHubEnabled')) { + link!.href = '/hub_icon_192.png'; +} document.title = loadTimeData.getBoolean('isPersonalizationHubEnabled') ? loadTimeData.getString('personalizationTitle') : loadTimeData.getString('wallpaperLabel');
diff --git a/ash/webui/personalization_app/resources/trusted/personalization_test_api.ts b/ash/webui/personalization_app/resources/trusted/personalization_test_api.ts index 1508066..05f1c1b 100644 --- a/ash/webui/personalization_app/resources/trusted/personalization_test_api.ts +++ b/ash/webui/personalization_app/resources/trusted/personalization_test_api.ts
@@ -6,6 +6,7 @@ import {PersonalizationStore} from './personalization_store.js'; import {setFullscreenEnabledAction} from './wallpaper/wallpaper_actions.js'; +import {getWallpaperProvider} from './wallpaper/wallpaper_interface_provider.js'; /** * @fileoverview provides useful functions for e2e browsertests. @@ -17,10 +18,21 @@ store.dispatch(setFullscreenEnabledAction(true)); } +function makeTransparent() { + const wallpaperProvider = getWallpaperProvider(); + wallpaperProvider.makeTransparent(); +} + declare global { interface Window { - personalizationTestApi: {enterFullscreen: () => void}; + personalizationTestApi: { + enterFullscreen: () => void, + makeTransparent: () => void, + }; } } -window.personalizationTestApi = {enterFullscreen}; +window.personalizationTestApi = { + enterFullscreen, + makeTransparent +};
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts index 19803e2..a7233000 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_collections_element.ts
@@ -16,7 +16,7 @@ import {isNonEmptyArray, isNullOrArray, isNullOrNumber} from '../../common/utils.js'; import {CollectionsGrid} from '../../untrusted/collections_grid.js'; import {IFrameApi} from '../iframe_api.js'; -import {GooglePhotosPhoto, WallpaperCollection, WallpaperImage, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js'; +import {GooglePhotosEnablementState, GooglePhotosPhoto, WallpaperCollection, WallpaperImage, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js'; import {WithPersonalizationStore} from '../personalization_store.js'; import {getTemplate} from './wallpaper_collections_element.html.js'; @@ -70,6 +70,14 @@ googlePhotosCountLoading_: Boolean, /** + * Whether the user is allowed to access Google Photos. + */ + googlePhotosEnabled_: { + type: Number, + observer: 'onGooglePhotosEnabledChanged_', + }, + + /** * Contains a mapping of collection id to an array of images. */ images_: Object, @@ -113,6 +121,7 @@ private googlePhotosLoading_: boolean; private googlePhotosCount_: number|null; private googlePhotosCountLoading_: boolean; + private googlePhotosEnabled_: GooglePhotosEnablementState; private images_: Record<string, WallpaperImage[]>; private imagesLoading_: Record<string, boolean>; private localImages_: FilePath[]; @@ -156,6 +165,8 @@ this.watch( 'googlePhotosCountLoading_', state => state.wallpaper.loading.googlePhotos.count); + this.watch( + 'googlePhotosEnabled_', state => state.wallpaper.googlePhotos.enabled); this.watch('images_', state => state.wallpaper.backdrop.images); this.watch('imagesLoading_', state => state.wallpaper.loading.images); this.watch('localImages_', state => state.wallpaper.local.images); @@ -266,6 +277,15 @@ } /** + * Invoked on changes to whether the user is allowed to access Google Photos. + */ + private onGooglePhotosEnabledChanged_( + googlePhotosEnabled: WallpaperCollections['googlePhotosEnabled_']) { + IFrameApi.getInstance().sendGooglePhotosEnabled( + this.$.collectionsGrid, googlePhotosEnabled); + } + + /** * Send updated local images list. */ private onLocalImagesChanged_(
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts index 8f7276d6..acdf09b 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
@@ -267,6 +267,9 @@ const {tabletMode} = await provider.isInTabletMode(); const shouldPreview = tabletMode && loadTimeData.getBoolean('fullScreenPreviewEnabled'); + if (shouldPreview) { + provider.makeTransparent(); + } store.endBatchUpdate(); const {success} = await (() => { if (isWallpaperImage(image)) { @@ -354,12 +357,14 @@ export async function confirmPreviewWallpaper( provider: WallpaperProviderInterface): Promise<void> { await provider.confirmPreviewWallpaper(); + provider.makeOpaque(); } /** Cancel preview wallpaper and show the previous wallpaper. */ export async function cancelPreviewWallpaper( provider: WallpaperProviderInterface): Promise<void> { await provider.cancelPreviewWallpaper(); + provider.makeOpaque(); } /**
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_interface_provider.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_interface_provider.ts index 0d6d799..2ce7812d 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_interface_provider.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_interface_provider.ts
@@ -24,7 +24,6 @@ export function getWallpaperProvider(): WallpaperProviderInterface { if (!wallpaperProvider) { wallpaperProvider = WallpaperProvider.getRemote(); - wallpaperProvider.makeTransparent(); } return wallpaperProvider; }
diff --git a/ash/webui/personalization_app/resources/untrusted/collections_grid.html b/ash/webui/personalization_app/resources/untrusted/collections_grid.html index 4fb3f81..03773e66 100644 --- a/ash/webui/personalization_app/resources/untrusted/collections_grid.html +++ b/ash/webui/personalization_app/resources/untrusted/collections_grid.html
@@ -9,6 +9,7 @@ opacity: 0.3; } + .photo-inner-container.google-photos-empty:not([selectable]), .photo-inner-container.photo-empty:not([selectable]) { cursor: default; } @@ -20,10 +21,15 @@ } .google-photos-empty .photo-images-container.photo-images-container-0 { - /* Google Photos tile's zero state should stay white even in dark mode. */ + /* Background color should stay light even in dark mode. */ background-color: white; } + .google-photos-empty[managed] .photo-images-container.photo-images-container-0 { + /* Background color should stay light even in dark mode. */ + background-color: var(--google-grey-200); + } + .photo-images-container.photo-images-container-0 img { flex: none; height: 64px; @@ -32,6 +38,16 @@ width: initial; } + .google-photos-empty[managed] .photo-images-container.photo-images-container-0 img { + /* Background color should stay light even in dark mode. */ + background-color: white; + border-radius: 100%; + box-sizing: border-box; + filter: grayscale(100%); + height: 54px; + padding: 4px; + } + .photo-images-container.photo-images-container-3 img { height: 50%; } @@ -44,7 +60,32 @@ z-index: 2; } - .photo-text-container > p { + .photo-text-container div { + align-items: center; + display: flex; + flex-direction: row; + justify-content: center; + } + + .photo-text-container iron-icon[icon='personalization:managed'] { + --iron-icon-fill-color: var(--cros-icon-color-secondary); + --iron-icon-height: 16px; + --iron-icon-width: 16px; + display: none; + flex: 0 0 auto; + margin-inline-end: 8px; + } + + .google-photos-empty[managed] iron-icon[icon='personalization:managed'] { + /* Icon color should stay light even in dark mode. */ + --iron-icon-fill-color: var(--cros-icon-color-secondary-light); + } + + .photo-inner-container[managed] iron-icon[icon='personalization:managed'] { + display: block; + } + + .photo-text-container p { color: white; font: var(--cros-annotation-2-font); margin: 0; @@ -56,11 +97,18 @@ white-space: nowrap; } - .photo-text-container > p:first-child { + .photo-text-container iron-icon[icon='personalization:managed']+p, + .photo-text-container p:first-child { font: var(--cros-headline-1-font); } - .photo-empty .photo-text-container > p { + .google-photos-empty[managed] .photo-text-container p { + /* Text color should stay light even in dark mode. */ + color: var(--cros-text-color-secondary-light); + text-shadow: none; + } + + .photo-empty .photo-text-container p { color: var(--cros-button-label-color-secondary); text-shadow: none; } @@ -77,6 +125,11 @@ width: 100%; z-index: 1; } + + .google-photos-empty[managed] .photo-gradient-mask, + .photo-empty .photo-gradient-mask { + display: none; + } </style> <iron-list items="[[tiles_]]" grid> <template> @@ -108,17 +161,23 @@ <template is="dom-if" if="[[isEmptyTile_(item)]]"> <div tabindex$="[[tabIndex]]" role="button" aria-disabled$="[[!isSelectableTile_(item)]]" - class$="[[getClassForEmptyTile_(item)]]" selectable$="[[isSelectableTile_(item)]]" + class$="[[getClassForEmptyTile_(item)]]" + managed$="[[isManagedTile_(item)]]" + selectable$="[[isSelectableTile_(item)]]" on-click="onCollectionSelected_" on-keypress="onCollectionSelected_"> <div class$="[[getClassForImagesContainer_(item)]]"> <img is="cr-auto-img" auto-src="[[getImageUrlForEmptyTile_(item)]]" aria-hidden="true" clear-src> </div> <div class="photo-text-container"> - <p title$="[[item.name]]">[[item.name]]</p> + <div> + <iron-icon icon="personalization:managed" title$="[[geti18n_('managedSetting')]]"> + </iron-icon> + <p title$="[[item.name]]">[[item.name]]</p> + </div> <p title$="[[item.count]]">[[item.count]]</p> </div> - <div class="photo-gradient-mask" hidden$="[[!isGooglePhotosTile_(item)]]"></div> + <div class="photo-gradient-mask"></div> </div> </template> <template is="dom-if" if="[[isImageTile_(item)]]">
diff --git a/ash/webui/personalization_app/resources/untrusted/collections_grid.ts b/ash/webui/personalization_app/resources/untrusted/collections_grid.ts index 1e6934d..d86ce0fd 100644 --- a/ash/webui/personalization_app/resources/untrusted/collections_grid.ts +++ b/ash/webui/personalization_app/resources/untrusted/collections_grid.ts
@@ -13,7 +13,7 @@ import {Events, EventType, kMaximumGooglePhotosPreviews, kMaximumLocalImagePreviews} from '../common/constants.js'; import {getCountText, getLoadingPlaceholderAnimationDelay, getNumberOfGridItemsPerRow, isNonEmptyArray, isNullOrArray, isNullOrNumber, isSelectionEvent} from '../common/utils.js'; -import {WallpaperCollection} from '../trusted/personalization_app.mojom-webui.js'; +import {GooglePhotosEnablementState, WallpaperCollection} from '../trusted/personalization_app.mojom-webui.js'; import {selectCollection, selectGooglePhotosCollection, selectLocalCollection, validateReceivedData} from '../untrusted/iframe_api.js'; import {getTemplate} from './collections_grid.html.js'; @@ -163,6 +163,11 @@ googlePhotosCount_: Number, /** + * Whether the user is allowed to access Google Photos. + */ + googlePhotosEnabled_: Number, + + /** * Mapping of collection id to number of images. Loads in progressively * after collections_. */ @@ -194,6 +199,7 @@ private collections_: WallpaperCollection[]; private googlePhotos_: unknown[]|null; private googlePhotosCount_: number|null; + private googlePhotosEnabled_: GooglePhotosEnablementState; private imageCounts_: {[key: string]: number|null}; private localImages_: FilePath[]; private localImageData_: {[key: string]: string}; @@ -320,6 +326,14 @@ this.googlePhotosCount_ = null; } break; + case EventType.SEND_GOOGLE_PHOTOS_ENABLED: + if (isValid) { + this.googlePhotosEnabled_ = event.enabled; + } else { + this.googlePhotos_ = null; + this.googlePhotosCount_ = null; + } + break; case EventType.SEND_GOOGLE_PHOTOS_PHOTOS: if (isValid) { this.googlePhotos_ = event.photos; @@ -464,8 +478,14 @@ return this.isTileTypeImage_(item) && !this.isEmptyTile_(item); } + private isManagedTile_(item: Tile|null): boolean { + return this.isGooglePhotosTile_(item) && + this.googlePhotosEnabled_ === GooglePhotosEnablementState.kDisabled; + } + private isSelectableTile_(item: Tile|null): item is ImageTile|FailureTile { - return this.isGooglePhotosTile_(item) || this.isImageTile_(item); + return (this.isGooglePhotosTile_(item) && !this.isManagedTile_(item)) || + this.isImageTile_(item); } /**
diff --git a/ash/webui/personalization_app/resources/untrusted/iframe_api.ts b/ash/webui/personalization_app/resources/untrusted/iframe_api.ts index 98ff28c..9020f34a 100644 --- a/ash/webui/personalization_app/resources/untrusted/iframe_api.ts +++ b/ash/webui/personalization_app/resources/untrusted/iframe_api.ts
@@ -4,6 +4,7 @@ import * as constants from '../common/constants.js'; import {isNullOrArray, isNullOrNumber} from '../common/utils.js'; +import {GooglePhotosEnablementState} from '../trusted/personalization_app.mojom-webui.js'; import {onMessageReceived} from '../trusted/wallpaper/untrusted_message_handler.js'; /** @@ -63,12 +64,14 @@ case constants.EventType.SEND_COLLECTIONS: { return isNullOrArray(event.collections); } - case constants.EventType.SEND_GOOGLE_PHOTOS_COUNT: { + case constants.EventType.SEND_GOOGLE_PHOTOS_COUNT: return isNullOrNumber(event.count); - } - case constants.EventType.SEND_GOOGLE_PHOTOS_PHOTOS: { + case constants.EventType.SEND_GOOGLE_PHOTOS_ENABLED: + return typeof event.enabled === 'number' && + event.enabled >= GooglePhotosEnablementState.MIN_VALUE && + event.enabled <= GooglePhotosEnablementState.MAX_VALUE; + case constants.EventType.SEND_GOOGLE_PHOTOS_PHOTOS: return isNullOrArray(event.photos); - } case constants.EventType.SEND_IMAGE_COUNTS: return typeof event.counts === 'object'; case constants.EventType.SEND_LOCAL_IMAGE_DATA: {
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h index 544f6be..5922ed7c 100644 --- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h +++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
@@ -41,6 +41,8 @@ void MakeTransparent() override {} + void MakeOpaque() override {} + void FetchCollections(FetchCollectionsCallback callback) override; void FetchImagesForCollection(
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js index a9f1bf6..6e589d9 100644 --- a/ash/webui/scanning/resources/scanning_app.js +++ b/ash/webui/scanning/resources/scanning_app.js
@@ -315,14 +315,6 @@ value: 0, }, - /** @private {boolean} */ - scanAppMultiPageScanEnabled_: { - type: Boolean, - value: function() { - return loadTimeData.getBoolean('scanAppMultiPageScanEnabled'); - } - }, - /** {boolean} */ multiPageScanChecked: Boolean, @@ -343,7 +335,7 @@ showMultiPageCheckbox_: { type: Boolean, computed: 'computeShowMultiPageCheckbox_(showScanSettings_, ' + - 'selectedSource, selectedFileType, scanAppMultiPageScanEnabled_)', + 'selectedSource, selectedFileType)', reflectToAttribute: true, }, @@ -1254,8 +1246,8 @@ * @private */ computeShowMultiPageCheckbox_() { - return this.scanAppMultiPageScanEnabled_ && this.showScanSettings_ && - this.isPDFSelected_() && this.isFlatbedSelected_(); + return this.showScanSettings_ && this.isPDFSelected_() && + this.isFlatbedSelected_(); }, /** @@ -1286,8 +1278,6 @@ /** @private */ onIsMultiPageScanChange_() { - assert(!this.isMultiPageScan_ || this.scanAppMultiPageScanEnabled_); - const nextPageNum = this.isMultiPageScan_ ? 1 : 0; this.browserProxy_.getPluralString('scanButtonText', nextPageNum) .then(
diff --git a/ash/webui/scanning/scanning_ui.cc b/ash/webui/scanning/scanning_ui.cc index aa1a900..a6c3da3 100644 --- a/ash/webui/scanning/scanning_ui.cc +++ b/ash/webui/scanning/scanning_ui.cc
@@ -150,12 +150,6 @@ handler->AddStringToPluralMap(str.name, str.id); } -void AddFeatureFlags(content::WebUIDataSource* html_source) { - html_source->AddBoolean( - "scanAppMultiPageScanEnabled", - base::FeatureList::IsEnabled(chromeos::features::kScanAppMultiPageScan)); -} - } // namespace ScanningUI::ScanningUI( @@ -186,8 +180,6 @@ html_source->AddResourcePath("accessibility_features.mojom-lite.js", IDR_ACCESSIBILITY_FEATURES_MOJO_LITE_JS); - AddFeatureFlags(html_source); - AddScanningAppStrings(html_source); auto handler =
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc index c047dd4..1114b4c 100644 --- a/ash/wm/desks/desk_mini_view.cc +++ b/ash/wm/desks/desk_mini_view.cc
@@ -478,10 +478,6 @@ should_commit_name_changes_ = true; desk_name_view_->UpdateViewAppearance(); - // Set the unelided desk name so that the full name shows up for the user to - // be able to change it. - desk_name_view_->SetText(desk_->name()); - // Set the Overview highlight to move focus with the DeskNameView. auto* highlight_controller = Shell::Get() ->overview_controller() @@ -580,7 +576,6 @@ } void DeskMiniView::LayoutDeskNameView(const gfx::Rect& preview_bounds) { - const int previous_width = desk_name_view_->width(); const gfx::Size desk_name_view_size = desk_name_view_->GetPreferredSize(); // Desk preview's width is supposed to be larger than kMinDeskNameViewWidth, // but it might be not the truth for tests with extreme abnormal size of @@ -604,11 +599,6 @@ kLabelPreviewSpacing, text_width, desk_name_view_size.height()}; desk_name_view_->SetBoundsRect(desk_name_view_bounds); - - // A change in the DeskNameView's width might mean the need - // to elide the text differently. - if (previous_width != desk_name_view_bounds.width()) - OnDeskNameChanged(desk_->name()); } } // namespace ash
diff --git a/base/BUILD.gn b/base/BUILD.gn index 31c2885..1e6b678 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -1912,6 +1912,7 @@ "files/file_path_watcher_stub.cc", "memory/page_size_nacl.cc", "process/process_stubs.cc", + "profiler/stack_sampler_posix.cc", "sync_socket_nacl.cc", "threading/platform_thread_linux.cc", ]
diff --git a/base/android/application_status_listener_unittest.cc b/base/android/application_status_listener_unittest.cc index 23b7ffa..cf9e989 100644 --- a/base/android/application_status_listener_unittest.cc +++ b/base/android/application_status_listener_unittest.cc
@@ -11,7 +11,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace base {
diff --git a/base/fuchsia/build_info_unittest.cc b/base/fuchsia/build_info_unittest.cc index b8ff3b0..e0c1540 100644 --- a/base/fuchsia/build_info_unittest.cc +++ b/base/fuchsia/build_info_unittest.cc
@@ -16,7 +16,6 @@ #include "base/test/test_future.h" #include "base/threading/sequence_bound.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace base {
diff --git a/base/task/sequence_manager/thread_controller.cc b/base/task/sequence_manager/thread_controller.cc index 551fb2c2..d143605 100644 --- a/base/task/sequence_manager/thread_controller.cc +++ b/base/task/sequence_manager/thread_controller.cc
@@ -18,7 +18,7 @@ } void ThreadController::RunLevelTracker::OnRunLoopStarted(State initial_state) { - run_levels_.emplace(initial_state); + run_levels_.emplace(initial_state, run_levels_.empty()); } void ThreadController::RunLevelTracker::OnRunLoopEnded() { @@ -45,7 +45,7 @@ // Already running a task? if (run_levels_.top().state() == kRunningTask) { // #task-in-task-implies-nested - run_levels_.emplace(kRunningTask); + run_levels_.emplace(kRunningTask, true); } else { // Simply going from kIdle or kSelectingNextTask to kRunningTask. run_levels_.top().UpdateState(kRunningTask); @@ -78,7 +78,7 @@ // DoIdleWork() can be invoked without DoWork() being first invoked at this // run-level. We need to create a nested kIdle RunLevel or we break // #done-task-while-not-running-implies-done-nested. - run_levels_.emplace(kIdle); + run_levels_.emplace(kIdle, true); } else { // Simply going kIdle at the current run-level. run_levels_.top().UpdateState(kIdle); @@ -96,16 +96,30 @@ ThreadController::RunLevelTracker::TraceObserverForTesting* ThreadController::RunLevelTracker::trace_observer_for_testing_ = nullptr; -ThreadController::RunLevelTracker::RunLevel::RunLevel(State initial_state) { +ThreadController::RunLevelTracker::RunLevel::RunLevel(State initial_state, + bool is_nested) + : is_nested_(is_nested), + thread_controller_sample_metadata_("ThreadController active", + base::SampleMetadataScope::kThread) { UpdateState(initial_state); } ThreadController::RunLevelTracker::RunLevel::~RunLevel() { UpdateState(kIdle); + // Intentionally ordered after UpdateState(kIdle), reinstantiates + // thread_controller_sample_metadata_ when yielding back to a parent RunLevel + // (which is active by definition as it is currently running this one). + if (is_nested_) { + thread_controller_sample_metadata_.Set(++thread_controller_active_id_); + } } ThreadController::RunLevelTracker::RunLevel::RunLevel(RunLevel&& other) - : state_(std::exchange(other.state_, kIdle)) {} + : state_(std::exchange(other.state_, kIdle)), + is_nested_(std::exchange(other.is_nested_, false)), + thread_controller_sample_metadata_( + other.thread_controller_sample_metadata_), + thread_controller_active_id_(other.thread_controller_active_id_) {} ThreadController::RunLevelTracker::RunLevel& ThreadController::RunLevelTracker::RunLevel::operator=(RunLevel&& other) { state_ = std::exchange(other.state_, kIdle); @@ -128,7 +142,11 @@ // Change of state. if (is_active) { TRACE_EVENT_BEGIN0("base", "ThreadController active"); + // Overriding the annotation from the previous RunLevel is intentional. Only + // the top RunLevel is ever updated, which holds the relevant state. + thread_controller_sample_metadata_.Set(++thread_controller_active_id_); } else { + thread_controller_sample_metadata_.Remove(); TRACE_EVENT_END0("base", "ThreadController active"); // TODO(crbug.com/1021571): Remove this once fixed. PERFETTO_INTERNAL_ADD_EMPTY_EVENT();
diff --git a/base/task/sequence_manager/thread_controller.h b/base/task/sequence_manager/thread_controller.h index f5b7468..b96c7e8 100644 --- a/base/task/sequence_manager/thread_controller.h +++ b/base/task/sequence_manager/thread_controller.h
@@ -10,6 +10,7 @@ #include "base/base_export.h" #include "base/message_loop/message_pump.h" +#include "base/profiler/sample_metadata.h" #include "base/run_loop.h" #include "base/task/sequence_manager/lazy_now.h" #include "base/task/sequence_manager/tasks.h" @@ -216,7 +217,7 @@ private: class RunLevel { public: - explicit RunLevel(State initial_state); + explicit RunLevel(State initial_state, bool is_nested); ~RunLevel(); // Moveable for STL compat. Marks |other| as idle so it noops on @@ -230,6 +231,10 @@ private: State state_ = kIdle; + bool is_nested_; + + SampleMetadata thread_controller_sample_metadata_; + size_t thread_controller_active_id_ = 0; }; std::stack<RunLevel, std::vector<RunLevel>> run_levels_;
diff --git a/base/test/test_io_thread.h b/base/test/test_io_thread.h index ad2d362..6ec87e0 100644 --- a/base/test/test_io_thread.h +++ b/base/test/test_io_thread.h
@@ -10,7 +10,6 @@ #include "base/memory/ref_counted.h" #include "base/task/task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace base {
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h index bef83a0..a22b320 100644 --- a/base/threading/thread_restrictions.h +++ b/base/threading/thread_restrictions.h
@@ -13,7 +13,6 @@ #include "base/dcheck_is_on.h" #include "base/gtest_prod_util.h" #include "base/location.h" -#include "base/time/time.h" #include "build/build_config.h" // -----------------------------------------------------------------------------
diff --git a/build/config/fuchsia/test/README.md b/build/config/fuchsia/test/README.md index de6f173..9c36f5c7 100644 --- a/build/config/fuchsia/test/README.md +++ b/build/config/fuchsia/test/README.md
@@ -59,7 +59,7 @@ `fuchsia.ui.policy.Presenter` is additionally required by tests that create views. -#### vulkan_capabilities.test-cmx +#### vulkan.shard.test-cml and vulkan_capabilities.test-cmx Corresponds to the `VULKAN` flag. Required for enabling GPU-accelerated rendering of the web content.
diff --git a/build/config/fuchsia/test/vulkan.shard.test-cml b/build/config/fuchsia/test/vulkan.shard.test-cml new file mode 100644 index 0000000..a1360de --- /dev/null +++ b/build/config/fuchsia/test/vulkan.shard.test-cml
@@ -0,0 +1,10 @@ +{ + use: [ + { + protocol: [ + "fuchsia.sysmem.Allocator", + "fuchsia.vulkan.loader.Loader", + ], + }, + ], +}
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index fa924352..b9a31019 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -62,7 +62,6 @@ "java/res/drawable-hdpi/infobar_chrome.png", "java/res/drawable-hdpi/infobar_mobile_friendly.png", "java/res/drawable-hdpi/infobar_restore.png", - "java/res/drawable-hdpi/infobar_screen_share.png", "java/res/drawable-hdpi/infobar_translate.png", "java/res/drawable-hdpi/location_bar_incognito_badge.png", "java/res/drawable-hdpi/menu_update.png", @@ -138,7 +137,6 @@ "java/res/drawable-mdpi/infobar_chrome.png", "java/res/drawable-mdpi/infobar_mobile_friendly.png", "java/res/drawable-mdpi/infobar_restore.png", - "java/res/drawable-mdpi/infobar_screen_share.png", "java/res/drawable-mdpi/infobar_translate.png", "java/res/drawable-mdpi/location_bar_incognito_badge.png", "java/res/drawable-mdpi/menu_update.png", @@ -222,7 +220,6 @@ "java/res/drawable-xhdpi/infobar_chrome.png", "java/res/drawable-xhdpi/infobar_mobile_friendly.png", "java/res/drawable-xhdpi/infobar_restore.png", - "java/res/drawable-xhdpi/infobar_screen_share.png", "java/res/drawable-xhdpi/infobar_translate.png", "java/res/drawable-xhdpi/location_bar_incognito_badge.png", "java/res/drawable-xhdpi/menu_update.png", @@ -292,7 +289,6 @@ "java/res/drawable-xxhdpi/infobar_chrome.png", "java/res/drawable-xxhdpi/infobar_mobile_friendly.png", "java/res/drawable-xxhdpi/infobar_restore.png", - "java/res/drawable-xxhdpi/infobar_screen_share.png", "java/res/drawable-xxhdpi/infobar_translate.png", "java/res/drawable-xxhdpi/location_bar_incognito_badge.png", "java/res/drawable-xxhdpi/menu_update.png", @@ -360,7 +356,6 @@ "java/res/drawable-xxxhdpi/infobar_chrome.png", "java/res/drawable-xxxhdpi/infobar_mobile_friendly.png", "java/res/drawable-xxxhdpi/infobar_restore.png", - "java/res/drawable-xxxhdpi/infobar_screen_share.png", "java/res/drawable-xxxhdpi/infobar_translate.png", "java/res/drawable-xxxhdpi/location_bar_incognito_badge.png", "java/res/drawable-xxxhdpi/menu_update.png",
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected deleted file mode 100644 index ecb3dee..0000000 --- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected +++ /dev/null
@@ -1,1769 +0,0 @@ -<?xml version="1.0" ?> -<manifest - xmlns:android="http://schemas.android.com/apk/res/android" - package="org.chromium.chrome.stable" - platformBuildVersionCode="31" - platformBuildVersionName="12" - android:isolatedSplits="true"> - <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/> - <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.CHILD_SERVICE" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.DEBUG" android:label="Debug web pages" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS" android:protectionLevel="signatureOrSystem"/> - <permission android:name="$PACKAGE.permission.TRANSLATE" android:protectionLevel="signature"/> - <queries> # DIFF-ANCHOR: 9588fea7 - <package android:name="com.google.ar.core"/> - </queries> # DIFF-ANCHOR: 9588fea7 - <uses-feature android:glEsVersion="0x00020000"/> - <uses-feature android:name="android.hardware.camera" android:required="false"/> - <uses-feature android:name="android.hardware.location.gps" android:required="false"/> - <uses-feature android:name="android.hardware.microphone" android:required="false"/> - <uses-feature android:name="android.hardware.screen.landscape" android:required="false"/> - <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="false"/> - <uses-feature android:name="android.hardware.sensor.gyroscope" android:required="false"/> - <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> - <uses-feature android:name="android.hardware.vr.headtracking" android:required="false" android:version="1"/> - <uses-feature android:name="android.hardware.vr.high_performance" android:required="false"/> - <uses-feature android:name="android.software.vr.mode" android:required="false"/> - <uses-permission android:name="$PACKAGE.TOS_ACKED"/> - <uses-permission android:name="$PACKAGE.permission.C2D_MESSAGE"/> - <uses-permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS"/> - <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> - <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - <uses-permission android:name="android.permission.CAMERA"/> - <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> - <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> - <uses-permission android:name="android.permission.GET_ACCOUNTS"/> - <uses-permission android:name="android.permission.INTERNET"/> - <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/> - <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> - <uses-permission android:name="android.permission.NFC"/> - <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> - <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - <uses-permission android:name="android.permission.RECORD_AUDIO"/> - <uses-permission android:name="android.permission.USE_CREDENTIALS"/> - <uses-permission android:name="android.permission.VIBRATE"/> - <uses-permission android:name="android.permission.WAKE_LOCK"/> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> - <uses-permission android:name="com.chrome.permission.DEVICE_EXTRAS"/> - <uses-permission android:name="com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS"/> - <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> - <uses-permission-sdk-23 android:name="android.permission.ACCESS_WIFI_STATE"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_ADVERTISE"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_CONNECT"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/> - <uses-permission-sdk-23 android:name="android.permission.READ_CONTACTS"/> - <uses-permission-sdk-23 android:name="android.permission.READ_MEDIA_IMAGES"/> - <uses-permission-sdk-23 android:name="android.permission.READ_MEDIA_VIDEO"/> - <uses-permission-sdk-23 android:name="android.permission.REORDER_TASKS"/> - <uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> - <uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC"/> - <uses-permission-sdk-23 android:name="android.permission.USE_FINGERPRINT"/> - <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="31"/> - <application - android:name="org.chromium.chrome.browser.base.SplitMonochromeApplication" - android:allowAudioPlaybackCapture="false" - android:allowBackup="false" - android:appComponentFactory="org.chromium.chrome.browser.base.SplitCompatAppComponentFactory" - android:extractNativeLibs="false" - android:icon="@drawable/ic_launcher" - android:label="@string/app_name" - android:largeHeap="false" - android:manageSpaceActivity="@string/manage_space_activity" - android:multiArch="true" - android:networkSecurityConfig="@xml/network_security_config" - android:roundIcon="@drawable/ic_launcher_round" - android:supportsRtl="true" - android:use32bitAbi="true" - android:zygotePreloadName="org.chromium.content_public.app.ZygotePreload"> - <activity # DIFF-ANCHOR: ea1a94af - android:name="com.google.android.gms.common.api.GoogleApiActivity" - android:exported="false" - android:theme="@android:style/Theme.Translucent.NoTitleBar"> - </activity> # DIFF-ANCHOR: ea1a94af - <activity # DIFF-ANCHOR: a2bae37c - android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity" - android:enabled="false" - android:exported="false" - android:stateNotNeeded="true" - android:theme="@style/Theme.PlayCore.Transparent"> - </activity> # DIFF-ANCHOR: a2bae37c - <activity # DIFF-ANCHOR: 53a4871f - android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity" - android:enabled="false" - android:exported="false" - android:launchMode="singleInstance" - android:process=":playcore_missing_splits_activity" - android:stateNotNeeded="true"> - </activity> # DIFF-ANCHOR: 53a4871f - <activity # DIFF-ANCHOR: 28dc9019 - android:name="com.google.ar.core.InstallActivity" - android:configChanges="keyboardHidden|orientation|screenSize" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleTop" - android:theme="@android:style/Theme.Material.Light.Dialog.Alert"> - </activity> # DIFF-ANCHOR: 28dc9019 - <activity # DIFF-ANCHOR: a4438884 - android:name="org.chromium.android_webview.devui.MainActivity" - android:exported="true" - android:icon="@drawable/icon_webview" - android:label="WebView DevTools" - android:launchMode="singleTask" - android:process=":webview_apk" - android:taskAffinity="$PACKAGE.org.chromium.android_webview.devui" - android:theme="@style/Theme.DevUi.DayNight" - android:visibleToInstantApps="true" - android:windowSoftInputMode="adjustPan"> - <intent-filter> # DIFF-ANCHOR: a167e73d - <action android:name="com.android.webview.SHOW_DEV_UI"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: a167e73d - </activity> # DIFF-ANCHOR: a4438884 - <activity # DIFF-ANCHOR: aeabab17 - android:name="org.chromium.android_webview.nonembedded.LicenseActivity" - android:exported="true" - android:label="@string/license_activity_title" - android:process=":webview_apk"> - <intent-filter> # DIFF-ANCHOR: 23298d3b - <action android:name="android.settings.WEBVIEW_LICENSE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 23298d3b - <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" android:value="true"/> - </activity> # DIFF-ANCHOR: aeabab17 - <activity # DIFF-ANCHOR: 93d41352 - android:name="org.chromium.chrome.browser.BrowserRestartActivity" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleInstance" - android:process=":browser_restart_process" - android:theme="@style/Theme.BrowserUI.Translucent.NoTitleBar"> - </activity> # DIFF-ANCHOR: 93d41352 - <activity # DIFF-ANCHOR: 61b2c776 - android:name="org.chromium.chrome.browser.ChromeTabbedActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="true" - android:hardwareAccelerated="false" - android:launchMode="singleTask" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - <meta-data android:name="android.activity.launch_mode" android:value="singleInstancePerTask"/> - </activity> # DIFF-ANCHOR: 61b2c776 - <activity # DIFF-ANCHOR: 610e8ccf - android:name="org.chromium.chrome.browser.ChromeTabbedActivity2" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:launchMode="singleTask" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:taskAffinity="$PACKAGE.ChromeTabbedActivity2" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 610e8ccf - <activity # DIFF-ANCHOR: 76686af9 - android:name="org.chromium.chrome.browser.LauncherShortcutActivity" - android:excludeFromRecents="true" - android:exported="false" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 76686af9 - <activity # DIFF-ANCHOR: 8f3f76d9 - android:name="org.chromium.chrome.browser.app.download.home.DownloadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 8f3f76d9 - <activity # DIFF-ANCHOR: 3d32d400 - android:name="org.chromium.chrome.browser.app.feed.feedmanagement.FeedManagementActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Settings" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 3d32d400 - <activity # DIFF-ANCHOR: 98c8c9be - android:name="org.chromium.chrome.browser.app.feed.followmanagement.FollowManagementActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Settings" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - <intent-filter> # DIFF-ANCHOR: 0bc48fdf - <action android:name="org.chromium.chrome.browser.app.feed.followmanagement.FollowManagementActivity.ACTIVATE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 0bc48fdf - </activity> # DIFF-ANCHOR: 98c8c9be - <activity # DIFF-ANCHOR: 50c7105b - android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity" - android:excludeFromRecents="true" - android:exported="false" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.Translucent"> - </activity> # DIFF-ANCHOR: 50c7105b - <activity # DIFF-ANCHOR: aeab60ac - android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:screenOrientation="portrait" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: aeab60ac - <activity # DIFF-ANCHOR: 170e9f21 - android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: 170e9f21 - <activity # DIFF-ANCHOR: da2eedc8 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: da2eedc8 - <activity # DIFF-ANCHOR: a208e726 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay" - android:windowSoftInputMode="stateHidden"> - <intent-filter> # DIFF-ANCHOR: 47a8059b - <action android:name="$PACKAGE.ADDBOOKMARK"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 47a8059b - </activity> # DIFF-ANCHOR: a208e726 - <activity # DIFF-ANCHOR: e0427380 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.DialogWhenLarge"> - </activity> # DIFF-ANCHOR: e0427380 - <activity # DIFF-ANCHOR: b66ce3f2 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/edit_bookmark" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateHidden"> - </activity> # DIFF-ANCHOR: b66ce3f2 - <activity # DIFF-ANCHOR: 0a21ad35 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/bookmark_choose_folder" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateAlwaysHidden"> - </activity> # DIFF-ANCHOR: 0a21ad35 - <activity # DIFF-ANCHOR: 209b5ded - android:name="org.chromium.chrome.browser.browserservices.ClearDataDialogActivity" - android:exported="false" - android:theme="@style/Theme.Chromium.ClearDataDialogActivity"> - </activity> # DIFF-ANCHOR: 209b5ded - <activity # DIFF-ANCHOR: 2b0ee4cd - android:name="org.chromium.chrome.browser.browserservices.ManageTrustedWebActivityDataActivity" - android:exported="true" - android:theme="@style/Theme.Chromium.Activity.Fullscreen.Transparent"> - <intent-filter> # DIFF-ANCHOR: 38d9d906 - <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 38d9d906 - <intent-filter> # DIFF-ANCHOR: 38d9d906 - <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 38d9d906 - </activity> # DIFF-ANCHOR: 2b0ee4cd - <activity # DIFF-ANCHOR: 44266a6a - android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 44266a6a - <activity # DIFF-ANCHOR: 4d923622 - android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity.FakeTranslucent" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 4d923622 - <activity # DIFF-ANCHOR: 1acdfd19 - android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:excludeFromRecents="true" - android:relinquishTaskIdentity="true" - android:taskAffinity="" - android:theme="@style/LauncherTheme"> - </activity> # DIFF-ANCHOR: 1acdfd19 - <activity # DIFF-ANCHOR: 2121eb0d - android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: 2121eb0d - <activity # DIFF-ANCHOR: 67932092 - android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleInstance" - android:theme="@style/Theme.BrowserUI.AlertDialog.NoActionBar" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: 67932092 - <activity # DIFF-ANCHOR: bb612a34 - android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: bb612a34 - <activity # DIFF-ANCHOR: 05911131 - android:name="org.chromium.chrome.browser.history.HistoryActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 05911131 - <activity # DIFF-ANCHOR: b98302dc - android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 8f811d02 - <action android:name="org.chromium.chrome.browser.incognito.OPEN_PRIVATE_TAB"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 8f811d02 - </activity> # DIFF-ANCHOR: b98302dc - <activity # DIFF-ANCHOR: 349d8ca5 - android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 349d8ca5 - <activity # DIFF-ANCHOR: ecd48344 - android:name="org.chromium.chrome.browser.media.MediaLauncherActivity" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="image/*"/> - <data android:mimeType="video/*"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - </activity> # DIFF-ANCHOR: ecd48344 - <activity # DIFF-ANCHOR: d706d96e - android:name="org.chromium.chrome.browser.media.PictureInPictureActivity" - android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: d706d96e - <activity # DIFF-ANCHOR: 9023f153 - android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - </activity> # DIFF-ANCHOR: 9023f153 - <activity # DIFF-ANCHOR: e86e2b49 - android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: e86e2b49 - <activity # DIFF-ANCHOR: 01e92ad4 - android:name="org.chromium.chrome.browser.price_tracking.PriceDropNotificationManager$DismissNotificationChromeActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 01e92ad4 - <activity # DIFF-ANCHOR: 24aedc77 - android:name="org.chromium.chrome.browser.price_tracking.PriceDropNotificationManager$TrampolineActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 24aedc77 - <activity # DIFF-ANCHOR: bec48e1f - android:name="org.chromium.chrome.browser.printing.PrintShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/sharing_print_baseline" - android:label="@string/print_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="message/rfc822"/> - <data android:mimeType="multipart/related"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: bec48e1f - <activity # DIFF-ANCHOR: 7468a722 - android:name="org.chromium.chrome.browser.searchwidget.SearchActivity" - android:clearTaskOnLaunch="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="false" - android:hardwareAccelerated="false" - android:label="Search" - android:launchMode="singleTask" - android:taskAffinity="" - android:theme="@style/Theme.Chromium.SearchActivity" - android:windowSoftInputMode="adjustResize"> - </activity> # DIFF-ANCHOR: 7468a722 - <activity # DIFF-ANCHOR: f1aedff1 - android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/ic_launcher" - android:label="@string/send_tab_to_self_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: f1aedff1 - <activity # DIFF-ANCHOR: d32b85df - android:name="org.chromium.chrome.browser.settings.SettingsActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/settings" - android:theme="@style/Theme.Chromium.Settings"> - </activity> # DIFF-ANCHOR: d32b85df - <activity # DIFF-ANCHOR: 44158f9b - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/ic_devices_48dp" - android:label="@string/shared_clipboard_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: 44158f9b - <activity # DIFF-ANCHOR: fbf1ba15 - android:name="org.chromium.chrome.browser.signin.SyncConsentActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.DialogWhenLarge"> - </activity> # DIFF-ANCHOR: fbf1ba15 - <activity # DIFF-ANCHOR: d2967c86 - android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/storage_management_activity_label" - android:theme="@style/Theme.Chromium.Settings.ManageSpace"> - </activity> # DIFF-ANCHOR: d2967c86 - <activity # DIFF-ANCHOR: 8492e3fd - android:name="org.chromium.chrome.browser.sync.ui.PassphraseActivity" - android:autoRemoveFromRecents="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: 8492e3fd - <activity # DIFF-ANCHOR: 45a98fa4 - android:name="org.chromium.chrome.browser.sync.ui.SyncTrustedVaultProxyActivity" - android:excludeFromRecents="true" - android:exported="false" - android:theme="@style/Theme.MaterialComponents"> - </activity> # DIFF-ANCHOR: 45a98fa4 - <activity # DIFF-ANCHOR: 43bfa5de - android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="true" - android:noHistory="true" - android:theme="@style/Theme.MaterialComponents"> - </activity> # DIFF-ANCHOR: 43bfa5de - <activity # DIFF-ANCHOR: b007dcaa - android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity" - android:enableVrMode="@string/gvr_vr_mode_component" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: b007dcaa - <activity # DIFF-ANCHOR: 5e628a6c - android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode" - android:enableVrMode="@string/gvr_vr_mode_component" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleInstance" - android:theme="@style/VrActivityTheme"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 5e628a6c - <activity # DIFF-ANCHOR: 9bb1f409 - android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 0d72b7f0 - <action android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity.ACTIVATE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 0d72b7f0 - </activity> # DIFF-ANCHOR: 9bb1f409 - <activity # DIFF-ANCHOR: f1dc024a - android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:label="@string/webapp_activity_title" - android:persistableMode="persistNever" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Webapp.Translucent" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: f1dc024a - <activity # DIFF-ANCHOR: 5e467d8a - android:name="org.chromium.chrome.browser.webapps.WebappActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:documentLaunchMode="intoExisting" - android:exported="false" - android:hardwareAccelerated="false" - android:label="@string/webapp_activity_title" - android:launchMode="singleTop" - android:persistableMode="persistNever" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Webapp" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 5e467d8a - <activity # DIFF-ANCHOR: aea75380 - android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity" - android:excludeFromRecents="true" - android:exported="true" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: faf519ad - <action android:name="com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: faf519ad - <intent-filter> # DIFF-ANCHOR: 9c5197e9 - <action android:name="org.webapk.ACTION_START_WEBAPK"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 9c5197e9 - </activity> # DIFF-ANCHOR: aea75380 - <activity # DIFF-ANCHOR: 66a0be05 - android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 66a0be05 - <activity # DIFF-ANCHOR: a1fac31f - android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity" - android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" - android:excludeFromRecents="true" - android:exported="true" - android:label="@string/cablev2_activity_title" - android:launchMode="singleTop" - android:permission="com.google.android.gms.auth.cryptauth.permission.CABLEV2_SERVER_LINK" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: a1fac31f - <activity # DIFF-ANCHOR: b21cfcff - android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorUSBActivity" - android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" - android:excludeFromRecents="true" - android:exported="false" - android:label="@string/cablev2_activity_title" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - <intent-filter> # DIFF-ANCHOR: 5873407a - <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> - </intent-filter> # DIFF-ANCHOR: 5873407a - <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/> - </activity> # DIFF-ANCHOR: b21cfcff - <activity # DIFF-ANCHOR: 1d9b4077 - android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:hardwareAccelerated="true" - android:label="Chrome.CafExpandedControllerActivity" - android:launchMode="singleTask" - android:noHistory="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: 1d9b4077 - <activity-alias # DIFF-ANCHOR: 9da0e5b6 - android:name="com.google.android.apps.chrome.IntentDispatcher" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: a5330430 - <action android:name="android.intent.action.MAIN"/> - <category android:name="android.intent.category.NOTIFICATION_PREFERENCES"/> - </intent-filter> # DIFF-ANCHOR: a5330430 - <intent-filter> # DIFF-ANCHOR: 436dfef3 - <action android:name="android.intent.action.MEDIA_SEARCH"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 436dfef3 - <intent-filter> # DIFF-ANCHOR: 8f70c92f - <action android:name="android.intent.action.SEARCH"/> - </intent-filter> # DIFF-ANCHOR: 8f70c92f - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="application/xhtml+xml"/> - <data android:mimeType="text/html"/> - <data android:mimeType="text/plain"/> - <data android:scheme="about"/> - <data android:scheme="googlechrome"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:host="*"/> - <data android:mimeType="*/*"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\.mht"/> - <data android:pathPattern="/.*\\.mhtml"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:host="*"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\.mht"/> - <data android:pathPattern="/.*\\.mhtml"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="multipart/related"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="about"/> - <data android:scheme="googlechrome"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="application/xhtml+xml"/> - <data android:mimeType="text/html"/> - <data android:mimeType="text/plain"/> - <data android:scheme="content"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="message/rfc822"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="multipart/related"/> - <data android:scheme="content"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 7a3b3be8 - <action android:name="android.nfc.action.NDEF_DISCOVERED"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 7a3b3be8 - <intent-filter> # DIFF-ANCHOR: 2a3a3c3d - <action android:name="android.speech.action.VOICE_SEARCH_RESULTS"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 2a3a3c3d - <intent-filter> # DIFF-ANCHOR: 19f73fdc - <action android:name="android.web.action.APP_ATTRIBUTION"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 19f73fdc - <intent-filter> # DIFF-ANCHOR: 83919a44 - <action android:name="com.sec.android.airview.HOVER"/> - </intent-filter> # DIFF-ANCHOR: 83919a44 - <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> - </activity-alias> # DIFF-ANCHOR: 9da0e5b6 - <activity-alias # DIFF-ANCHOR: 5042984f - android:name="com.google.android.apps.chrome.Main" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.ChromeTabbedActivity"> - <intent-filter> # DIFF-ANCHOR: a5330430 - <action android:name="android.intent.action.MAIN"/> - <category android:name="android.intent.category.APP_BROWSER"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <category android:name="android.intent.category.LAUNCHER"/> - </intent-filter> # DIFF-ANCHOR: a5330430 - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - <meta-data android:name="android.app.shortcuts" android:resource="@xml/launchershortcuts"/> - </activity-alias> # DIFF-ANCHOR: 5042984f - <activity-alias # DIFF-ANCHOR: 03398466 - android:name="com.google.android.apps.chrome.TranslateDispatcher" - android:exported="true" - android:permission="$PACKAGE.permission.TRANSLATE" - android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: 75e5f897 - <action android:name="org.chromium.chrome.browser.translate.TRANSLATE_TAB"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 75e5f897 - </activity-alias> # DIFF-ANCHOR: 03398466 - <activity-alias # DIFF-ANCHOR: dcfe2999 - android:name="com.google.android.apps.chrome.webapps.WebappActivity" - android:label="@string/webapp_activity_title" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappActivity"> - </activity-alias> # DIFF-ANCHOR: dcfe2999 - <activity-alias # DIFF-ANCHOR: 8e23336d - android:name="com.google.android.apps.chrome.webapps.WebappManager" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"> - </activity-alias> # DIFF-ANCHOR: 8e23336d - <activity-alias # DIFF-ANCHOR: da85c28e - android:name="org.chromium.android_webview.SafeModeState" - android:enabled="false" - android:process=":webview_apk" - android:targetActivity="org.chromium.android_webview.devui.MainActivity" - android:visibleToInstantApps="true"> - </activity-alias> # DIFF-ANCHOR: da85c28e - <activity-alias # DIFF-ANCHOR: b7cc06e9 - android:name="org.chromium.android_webview.devui.DeveloperModeState" - android:enabled="false" - android:process=":webview_apk" - android:targetActivity="org.chromium.android_webview.devui.MainActivity" - android:visibleToInstantApps="true"> - </activity-alias> # DIFF-ANCHOR: b7cc06e9 - <activity-alias # DIFF-ANCHOR: 32e34aba - android:name="org.chromium.android_webview.devui.MonochromeLauncherActivity" - android:enabled="false" - android:exported="true" - android:label="WebView DevTools" - android:targetActivity="org.chromium.android_webview.devui.MainActivity"> - <intent-filter> # DIFF-ANCHOR: a5330430 - <action android:name="android.intent.action.MAIN"/> - <category android:name="android.intent.category.LAUNCHER"/> - </intent-filter> # DIFF-ANCHOR: a5330430 - </activity-alias> # DIFF-ANCHOR: 32e34aba - <activity-alias # DIFF-ANCHOR: 5c83a464 - android:name="org.chromium.chrome.browser.download.DownloadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:targetActivity="org.chromium.chrome.browser.app.download.home.DownloadActivity" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity-alias> # DIFF-ANCHOR: 5c83a464 - <activity-alias # DIFF-ANCHOR: b4a6221b - android:name="org.chromium.chrome.browser.media.AudioLauncherActivity" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.media.MediaLauncherActivity" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="audio/*"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - </activity-alias> # DIFF-ANCHOR: b4a6221b - <activity-alias # DIFF-ANCHOR: 7c349c4f - android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher" - android:exported="false" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: 9fe4b527 - <action android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 9fe4b527 - </activity-alias> # DIFF-ANCHOR: 7c349c4f - <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true"/> - <meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions"/> - <meta-data android:name="com.android.webview.WebViewLibrary" android:value="libmonochrome.so"/> - <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/> - <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> - <meta-data android:name="com.google.ar.core" android:value="optional"/> - <meta-data android:name="com.google.ar.core.min_apk_version" android:value="202940000"/> - <meta-data android:name="com.samsung.android.sdk.multiwindow.enable" android:value="true"/> - <meta-data android:name="com.samsung.android.sdk.multiwindow.penwindow.enable" android:value="true"/> - <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="5"/> - <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/> - <meta-data android:name="org.chromium.content.browser.SMART_CLIP_PROVIDER" android:value="org.chromium.content_public.browser.SmartClipProvider"/> - <provider # DIFF-ANCHOR: bc0a9a7a - android:name="com.google.firebase.provider.FirebaseInitProvider" - android:authorities="$PACKAGE.firebaseinitprovider" - android:directBootAware="true" - android:exported="false" - android:initOrder="100"> - </provider> # DIFF-ANCHOR: bc0a9a7a - <provider # DIFF-ANCHOR: a5e78e63 - android:name="org.chromium.android_webview.nonembedded.LicenseContentProvider" - android:authorities="$PACKAGE.LicenseContentProvider" - android:exported="true" - android:grantUriPermissions="true" - android:process=":webview_apk"> - </provider> # DIFF-ANCHOR: a5e78e63 - <provider # DIFF-ANCHOR: bfe37944 - android:name="org.chromium.android_webview.services.DeveloperModeContentProvider" - android:authorities="$PACKAGE.DeveloperModeContentProvider" - android:exported="true" - android:process=":webview_service" - android:visibleToInstantApps="true"> - </provider> # DIFF-ANCHOR: bfe37944 - <provider # DIFF-ANCHOR: ecfff997 - android:name="org.chromium.android_webview.services.SafeModeContentProvider" - android:authorities="$PACKAGE.SafeModeContentProvider" - android:exported="true" - android:process=":webview_service" - android:visibleToInstantApps="true"> - </provider> # DIFF-ANCHOR: ecfff997 - <provider # DIFF-ANCHOR: c2150e02 - android:name="org.chromium.chrome.browser.attribution_reporting.AttributionReportingProvider" - android:authorities="$PACKAGE.AttributionReporting" - android:exported="true"> - </provider> # DIFF-ANCHOR: c2150e02 - <provider # DIFF-ANCHOR: b73a881a - android:name="org.chromium.chrome.browser.download.DownloadFileProvider" - android:authorities="$PACKAGE.DownloadFileProvider" - android:exported="false" - android:grantUriPermissions="true"> - <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> - </provider> # DIFF-ANCHOR: b73a881a - <provider # DIFF-ANCHOR: f1c2d7e1 - android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider" - android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE" - android:exported="true"> - <path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/> - </provider> # DIFF-ANCHOR: f1c2d7e1 - <provider # DIFF-ANCHOR: 67014fab - android:name="org.chromium.chrome.browser.util.ChromeFileProvider" - android:authorities="$PACKAGE.FileProvider" - android:exported="false" - android:grantUriPermissions="true"> - <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> - </provider> # DIFF-ANCHOR: 67014fab - <provider # DIFF-ANCHOR: cb51666f - android:name="org.chromium.ui.dragdrop.DropDataContentProvider" - android:authorities="$PACKAGE.DropDataProvider" - android:exported="false" - android:grantUriPermissions="true"> - </provider> # DIFF-ANCHOR: cb51666f - <receiver # DIFF-ANCHOR: 58d39a0f - android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider" - android:exported="true" - android:label="@string/bookmark_widget_title"> - <intent-filter> # DIFF-ANCHOR: 1ebe78e9 - <action android:name=".BOOKMARK_APPWIDGET_UPDATE"/> - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 1ebe78e9 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmark_widget_info"/> - </receiver> # DIFF-ANCHOR: 58d39a0f - <receiver # DIFF-ANCHOR: 0a6f8fa5 - android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 0a6f8fa5 - <receiver # DIFF-ANCHOR: f1c9c29d - android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" - android:exported="true" - android:permission="com.google.android.c2dm.permission.SEND"> - <intent-filter> # DIFF-ANCHOR: aae22013 - <action android:name="com.google.android.c2dm.intent.RECEIVE"/> - </intent-filter> # DIFF-ANCHOR: aae22013 - </receiver> # DIFF-ANCHOR: f1c9c29d - <receiver # DIFF-ANCHOR: 68e22783 - android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 68e22783 - <receiver # DIFF-ANCHOR: f6d77f5a - android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: f6d77f5a - <receiver # DIFF-ANCHOR: be2dce69 - android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy" - android:exported="false"> - </receiver> # DIFF-ANCHOR: be2dce69 - <receiver # DIFF-ANCHOR: 31a8399a - android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: e5bb6a36 - <action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/> - <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/> - <data android:scheme="package"/> - </intent-filter> # DIFF-ANCHOR: e5bb6a36 - </receiver> # DIFF-ANCHOR: 31a8399a - <receiver # DIFF-ANCHOR: 2f4b69ac - android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 2f4b69ac - <receiver # DIFF-ANCHOR: fd245bee - android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: fd245bee - <receiver # DIFF-ANCHOR: 2b9c19aa - android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 2b9c19aa - <receiver # DIFF-ANCHOR: d8a2af42 - android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: d8a2af42 - <receiver # DIFF-ANCHOR: df76237f - android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 1c1c5ed8 - <action android:name="org.chromium.chrome.browser.notifications.CLICK_NOTIFICATION"/> - <action android:name="org.chromium.chrome.browser.notifications.CLOSE_NOTIFICATION"/> - </intent-filter> # DIFF-ANCHOR: 1c1c5ed8 - </receiver> # DIFF-ANCHOR: df76237f - <receiver # DIFF-ANCHOR: a9b53579 - android:name="org.chromium.chrome.browser.notifications.channels.LocaleChangedBroadcastReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: 5458f2a2 - <action android:name="android.intent.action.LOCALE_CHANGED"/> - </intent-filter> # DIFF-ANCHOR: 5458f2a2 - </receiver> # DIFF-ANCHOR: a9b53579 - <receiver # DIFF-ANCHOR: 64dc49ab - android:name="org.chromium.chrome.browser.notifications.permissions.NotificationPermissionChangeReceiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 772631d2 - <action android:name="android.app.action.APP_BLOCK_STATE_CHANGED"/> - </intent-filter> # DIFF-ANCHOR: 772631d2 - </receiver> # DIFF-ANCHOR: 64dc49ab - <receiver # DIFF-ANCHOR: 0cefd906 - android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 0cefd906 - <receiver # DIFF-ANCHOR: 7d28c8e4 - android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 7d28c8e4 - <receiver # DIFF-ANCHOR: 05f19ac3 - android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 05f19ac3 - <receiver # DIFF-ANCHOR: a3a6e991 - android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: a3a6e991 - <receiver # DIFF-ANCHOR: 226134db - android:name="org.chromium.chrome.browser.quickactionsearchwidget.QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderDino" - android:exported="true" - android:label="@string/dino_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/quick_action_search_widget_dino_info"/> - </receiver> # DIFF-ANCHOR: 226134db - <receiver # DIFF-ANCHOR: 5a0b9536 - android:name="org.chromium.chrome.browser.quickactionsearchwidget.QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderSearch" - android:exported="true" - android:label="@string/quick_action_search_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/quick_action_search_widget_small_info"/> - </receiver> # DIFF-ANCHOR: 5a0b9536 - <receiver # DIFF-ANCHOR: a0d83ae5 - android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider" - android:exported="true" - android:label="@string/search_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/search_widget_info"/> - </receiver> # DIFF-ANCHOR: a0d83ae5 - <receiver # DIFF-ANCHOR: 2f1fe689 - android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: 4b5ec7a9 - <action android:name="android.intent.action.USER_PRESENT"/> - </intent-filter> # DIFF-ANCHOR: 4b5ec7a9 - </receiver> # DIFF-ANCHOR: 2f1fe689 - <receiver # DIFF-ANCHOR: 124ac9a1 - android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 124ac9a1 - <receiver # DIFF-ANCHOR: 84094425 - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 84094425 - <receiver # DIFF-ANCHOR: 352611a4 - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 352611a4 - <receiver # DIFF-ANCHOR: 420d0678 - android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 420d0678 - <receiver # DIFF-ANCHOR: 9015e3cf - android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: e8cce90c - <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> - </intent-filter> # DIFF-ANCHOR: e8cce90c - </receiver> # DIFF-ANCHOR: 9015e3cf - <receiver # DIFF-ANCHOR: c787586e - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: c787586e - <service android:name="androidx.browser.customtabs.PostMessageService"/> - <service # DIFF-ANCHOR: 749391ed - android:name="com.google.android.gms.cast.framework.ReconnectionService" - android:exported="false"> - </service> # DIFF-ANCHOR: 749391ed - <service # DIFF-ANCHOR: 48ce9d28 - android:name="com.google.android.gms.cast.framework.media.MediaNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 48ce9d28 - <service # DIFF-ANCHOR: 7e26656b - android:name="com.google.firebase.components.ComponentDiscoveryService" - android:directBootAware="true" - android:exported="false"> - <meta-data android:name="com.google.firebase.components:com.google.firebase.dynamicloading.DynamicLoadingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - </service> # DIFF-ANCHOR: 7e26656b - <service # DIFF-ANCHOR: 2295960c - android:name="com.google.firebase.messaging.FirebaseMessagingService" - android:directBootAware="true" - android:exported="false"> - <intent-filter android:priority="-500"> # DIFF-ANCHOR: 69e70070 - <action android:name="com.google.firebase.MESSAGING_EVENT"/> - </intent-filter> # DIFF-ANCHOR: 69e70070 - </service> # DIFF-ANCHOR: 2295960c - <service # DIFF-ANCHOR: 4c2196d9 - android:name="com.google.ipc.invalidation.ticl.android2.channel.GcmRegistrationTaskService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: 4c2196d9 - <service # DIFF-ANCHOR: 1d3bf514 - android:name="org.chromium.android_webview.js_sandbox.service.JsSandboxService0" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:process=":js_sandboxed_process0" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 1d3bf514 - <service # DIFF-ANCHOR: b9ec52c4 - android:name="org.chromium.android_webview.nonembedded.AwComponentUpdateService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE" - android:process=":webview_apk"> - </service> # DIFF-ANCHOR: b9ec52c4 - <service # DIFF-ANCHOR: 3cd6d713 - android:name="org.chromium.android_webview.services.AwMinidumpUploadJobService" - android:exported="true" - android:permission="android.permission.BIND_JOB_SERVICE" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: 3cd6d713 - <service # DIFF-ANCHOR: 65cddb26 - android:name="org.chromium.android_webview.services.AwVariationsSeedFetcher" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: 65cddb26 - <service # DIFF-ANCHOR: c756cf8d - android:name="org.chromium.android_webview.services.ComponentsProviderService" - android:exported="true" - android:process=":webview_service" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: c756cf8d - <service # DIFF-ANCHOR: 5cda9608 - android:name="org.chromium.android_webview.services.CrashReceiverService" - android:exported="true" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: 5cda9608 - <service # DIFF-ANCHOR: adce9ea1 - android:name="org.chromium.android_webview.services.DeveloperUiService" - android:exported="true" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: adce9ea1 - <service # DIFF-ANCHOR: eecf2fee - android:name="org.chromium.android_webview.services.MetricsBridgeService" - android:exported="true" - android:process=":webview_service" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: eecf2fee - <service # DIFF-ANCHOR: bda8b561 - android:name="org.chromium.android_webview.services.MetricsUploadService" - android:exported="true" - android:process=":webview_service" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: bda8b561 - <service # DIFF-ANCHOR: 47046f1b - android:name="org.chromium.android_webview.services.SafeModeService" - android:exported="true" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: 47046f1b - <service # DIFF-ANCHOR: dc926e35 - android:name="org.chromium.android_webview.services.VariationsSeedServer" - android:exported="true" - android:process=":webview_service"> - </service> # DIFF-ANCHOR: dc926e35 - <service # DIFF-ANCHOR: c34d99ad - android:name="org.chromium.chrome.browser.ChromeBackgroundService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: c34d99ad - <service # DIFF-ANCHOR: ac44dbad - android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetService" - android:exported="false" - android:permission="android.permission.BIND_REMOTEVIEWS"> - </service> # DIFF-ANCHOR: ac44dbad - <service # DIFF-ANCHOR: 90d2ec9b - android:name="org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: 90d2ec9b - <service # DIFF-ANCHOR: f72bb7bc - android:name="org.chromium.chrome.browser.crash.MinidumpUploadService" - android:exported="false"> - </service> # DIFF-ANCHOR: f72bb7bc - <service # DIFF-ANCHOR: ee1c39a8 - android:name="org.chromium.chrome.browser.customtabs.CustomTabsConnectionService" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: d46bf795 - <action android:name="android.support.customtabs.action.CustomTabsService"/> - <category android:name="androidx.browser.customtabs.category.ColorSchemeCustomization"/> - <category android:name="androidx.browser.customtabs.category.NavBarColorCustomization"/> - <category android:name="androidx.browser.trusted.category.ImmersiveMode"/> - <category android:name="androidx.browser.trusted.category.LaunchSiteSettings"/> - <category android:name="androidx.browser.trusted.category.LaunchWebApkSiteSettings"/> - <category android:name="androidx.browser.trusted.category.TrustedWebActivities"/> - <category android:name="androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1"/> - <category android:name="androidx.browser.trusted.category.WebShareTargetV2"/> - </intent-filter> # DIFF-ANCHOR: d46bf795 - </service> # DIFF-ANCHOR: ee1c39a8 - <service # DIFF-ANCHOR: 4b22c3f5 - android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager" - android:exported="false"> - </service> # DIFF-ANCHOR: 4b22c3f5 - <service # DIFF-ANCHOR: 413310e5 - android:name="org.chromium.chrome.browser.download.DownloadForegroundService" - android:exported="false"> - </service> # DIFF-ANCHOR: 413310e5 - <service # DIFF-ANCHOR: 7e3ff13a - android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7e3ff13a - <service # DIFF-ANCHOR: ac8469ff - android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: ac8469ff - <service # DIFF-ANCHOR: 7ef9e4e5 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 7ef9e4e5 - <service # DIFF-ANCHOR: 41fa6492 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 41fa6492 - <service # DIFF-ANCHOR: 1260bca4 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 1260bca4 - <service # DIFF-ANCHOR: 4b2220c4 - android:name="org.chromium.chrome.browser.notifications.NotificationJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: 4b2220c4 - <service # DIFF-ANCHOR: 7fb8c03f - android:name="org.chromium.chrome.browser.notifications.NotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7fb8c03f - <service android:name="org.chromium.chrome.browser.omaha.OmahaClient" android:exported="false"/> - <service # DIFF-ANCHOR: 53256720 - android:name="org.chromium.chrome.browser.photo_picker.DecoderService" - android:description="@string/decoder_description" - android:exported="false" - android:isolatedProcess="true" - android:process=":decoder_service"> - </service> # DIFF-ANCHOR: 53256720 - <service # DIFF-ANCHOR: 064aae37 - android:name="org.chromium.chrome.browser.prerender.ChromePrerenderService" - android:exported="true"> - </service> # DIFF-ANCHOR: 064aae37 - <service # DIFF-ANCHOR: 6d9cb216 - android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 69e70070 - <action android:name="com.google.firebase.MESSAGING_EVENT"/> - </intent-filter> # DIFF-ANCHOR: 69e70070 - </service> # DIFF-ANCHOR: 6d9cb216 - <service # DIFF-ANCHOR: 7b05db30 - android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7b05db30 - <service # DIFF-ANCHOR: dcd6fa39 - android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender" - android:exported="false"> - </service> # DIFF-ANCHOR: dcd6fa39 - <service # DIFF-ANCHOR: c26364a8 - android:name="org.chromium.chrome.browser.tracing.TracingNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: c26364a8 - <service # DIFF-ANCHOR: 8fc286d0 - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskGcmTaskService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: 8fc286d0 - <service # DIFF-ANCHOR: a550decc - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: a550decc - <service # DIFF-ANCHOR: 2a1cd701 - android:name="org.chromium.components.payments.PaymentDetailsUpdateService" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: c68af934 - <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/> - </intent-filter> # DIFF-ANCHOR: c68af934 - </service> # DIFF-ANCHOR: 2a1cd701 - <service # DIFF-ANCHOR: 0c6c4fd9 - android:name="org.chromium.content.app.PrivilegedProcessService0" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process0"> - </service> # DIFF-ANCHOR: 0c6c4fd9 - <service # DIFF-ANCHOR: 6f89af32 - android:name="org.chromium.content.app.PrivilegedProcessService1" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process1"> - </service> # DIFF-ANCHOR: 6f89af32 - <service # DIFF-ANCHOR: 40e0d738 - android:name="org.chromium.content.app.PrivilegedProcessService2" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process2"> - </service> # DIFF-ANCHOR: 40e0d738 - <service # DIFF-ANCHOR: b197517d - android:name="org.chromium.content.app.PrivilegedProcessService3" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process3"> - </service> # DIFF-ANCHOR: b197517d - <service # DIFF-ANCHOR: 52303702 - android:name="org.chromium.content.app.PrivilegedProcessService4" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process4"> - </service> # DIFF-ANCHOR: 52303702 - <service # DIFF-ANCHOR: b1e3e8bd - android:name="org.chromium.content.app.SandboxedProcessService0" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process0" - android:useAppZygote="true" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: b1e3e8bd - <service # DIFF-ANCHOR: 76d1ccf8 - android:name="org.chromium.content.app.SandboxedProcessService1" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process1" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 76d1ccf8 - <service # DIFF-ANCHOR: 38b95266 - android:name="org.chromium.content.app.SandboxedProcessService10" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process10" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 38b95266 - <service # DIFF-ANCHOR: e4a2e4a2 - android:name="org.chromium.content.app.SandboxedProcessService11" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process11" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: e4a2e4a2 - <service # DIFF-ANCHOR: d9b2ffba - android:name="org.chromium.content.app.SandboxedProcessService12" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process12" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: d9b2ffba - <service # DIFF-ANCHOR: b41bb17d - android:name="org.chromium.content.app.SandboxedProcessService13" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process13" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: b41bb17d - <service # DIFF-ANCHOR: aec0ea21 - android:name="org.chromium.content.app.SandboxedProcessService14" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process14" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: aec0ea21 - <service # DIFF-ANCHOR: cf88a5e5 - android:name="org.chromium.content.app.SandboxedProcessService15" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process15" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: cf88a5e5 - <service # DIFF-ANCHOR: 7d85889d - android:name="org.chromium.content.app.SandboxedProcessService16" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process16" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 7d85889d - <service # DIFF-ANCHOR: dae26ed4 - android:name="org.chromium.content.app.SandboxedProcessService17" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process17" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: dae26ed4 - <service # DIFF-ANCHOR: 2c6cf029 - android:name="org.chromium.content.app.SandboxedProcessService18" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process18" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 2c6cf029 - <service # DIFF-ANCHOR: 1d2f0988 - android:name="org.chromium.content.app.SandboxedProcessService19" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process19" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 1d2f0988 - <service # DIFF-ANCHOR: 4a39041b - android:name="org.chromium.content.app.SandboxedProcessService2" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process2" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 4a39041b - <service # DIFF-ANCHOR: 073533bf - android:name="org.chromium.content.app.SandboxedProcessService20" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process20" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 073533bf - <service # DIFF-ANCHOR: d24da41d - android:name="org.chromium.content.app.SandboxedProcessService21" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process21" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: d24da41d - <service # DIFF-ANCHOR: 594d8b32 - android:name="org.chromium.content.app.SandboxedProcessService22" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process22" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 594d8b32 - <service # DIFF-ANCHOR: 5528c0c3 - android:name="org.chromium.content.app.SandboxedProcessService23" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process23" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 5528c0c3 - <service # DIFF-ANCHOR: b7ab2ba3 - android:name="org.chromium.content.app.SandboxedProcessService24" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process24" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: b7ab2ba3 - <service # DIFF-ANCHOR: cec6cb64 - android:name="org.chromium.content.app.SandboxedProcessService25" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process25" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: cec6cb64 - <service # DIFF-ANCHOR: 5b4a00fe - android:name="org.chromium.content.app.SandboxedProcessService26" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process26" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 5b4a00fe - <service # DIFF-ANCHOR: ad49d203 - android:name="org.chromium.content.app.SandboxedProcessService27" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process27" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: ad49d203 - <service # DIFF-ANCHOR: 573298e9 - android:name="org.chromium.content.app.SandboxedProcessService28" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process28" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 573298e9 - <service # DIFF-ANCHOR: 79897b32 - android:name="org.chromium.content.app.SandboxedProcessService29" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process29" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 79897b32 - <service # DIFF-ANCHOR: 84335864 - android:name="org.chromium.content.app.SandboxedProcessService3" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process3" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 84335864 - <service # DIFF-ANCHOR: c4bd371e - android:name="org.chromium.content.app.SandboxedProcessService30" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process30" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: c4bd371e - <service # DIFF-ANCHOR: 394a9fd0 - android:name="org.chromium.content.app.SandboxedProcessService31" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process31" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 394a9fd0 - <service # DIFF-ANCHOR: b811afb8 - android:name="org.chromium.content.app.SandboxedProcessService32" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process32" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: b811afb8 - <service # DIFF-ANCHOR: 2811ddd3 - android:name="org.chromium.content.app.SandboxedProcessService33" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process33" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 2811ddd3 - <service # DIFF-ANCHOR: 73ae1688 - android:name="org.chromium.content.app.SandboxedProcessService34" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process34" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 73ae1688 - <service # DIFF-ANCHOR: c476f324 - android:name="org.chromium.content.app.SandboxedProcessService35" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process35" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: c476f324 - <service # DIFF-ANCHOR: 75d5304b - android:name="org.chromium.content.app.SandboxedProcessService36" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process36" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 75d5304b - <service # DIFF-ANCHOR: dc6d0617 - android:name="org.chromium.content.app.SandboxedProcessService37" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process37" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: dc6d0617 - <service # DIFF-ANCHOR: e31efe49 - android:name="org.chromium.content.app.SandboxedProcessService38" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process38" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: e31efe49 - <service # DIFF-ANCHOR: 5736507e - android:name="org.chromium.content.app.SandboxedProcessService39" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process39" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 5736507e - <service # DIFF-ANCHOR: a161be24 - android:name="org.chromium.content.app.SandboxedProcessService4" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process4" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: a161be24 - <service # DIFF-ANCHOR: 8e591688 - android:name="org.chromium.content.app.SandboxedProcessService5" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process5" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 8e591688 - <service # DIFF-ANCHOR: 705141d0 - android:name="org.chromium.content.app.SandboxedProcessService6" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process6" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 705141d0 - <service # DIFF-ANCHOR: 38ed2189 - android:name="org.chromium.content.app.SandboxedProcessService7" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process7" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: 38ed2189 - <service # DIFF-ANCHOR: aa417956 - android:name="org.chromium.content.app.SandboxedProcessService8" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process8" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: aa417956 - <service # DIFF-ANCHOR: e2f3bbbd - android:name="org.chromium.content.app.SandboxedProcessService9" - android:exported="true" - android:externalService="true" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process9" - android:visibleToInstantApps="true"> - </service> # DIFF-ANCHOR: e2f3bbbd - </application> -</manifest>
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected deleted file mode 100644 index 54c307b..0000000 --- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected +++ /dev/null
@@ -1,1552 +0,0 @@ -<?xml version="1.0" ?> -<manifest - xmlns:android="http://schemas.android.com/apk/res/android" - package="org.chromium.chrome.stable" - platformBuildVersionCode="31" - platformBuildVersionName="12" - android:isolatedSplits="true"> - <permission android:name="$PACKAGE.TOS_ACKED" android:protectionLevel="signatureOrSystem"/> - <permission android:name="$PACKAGE.permission.C2D_MESSAGE" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.CHILD_SERVICE" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.DEBUG" android:label="Debug web pages" android:protectionLevel="signature"/> - <permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS" android:protectionLevel="signatureOrSystem"/> - <permission android:name="$PACKAGE.permission.TRANSLATE" android:protectionLevel="signature"/> - <queries> # DIFF-ANCHOR: 9588fea7 - <package android:name="com.google.ar.core"/> - </queries> # DIFF-ANCHOR: 9588fea7 - <uses-feature android:glEsVersion="0x00020000"/> - <uses-feature android:name="android.hardware.camera" android:required="false"/> - <uses-feature android:name="android.hardware.location.gps" android:required="false"/> - <uses-feature android:name="android.hardware.microphone" android:required="false"/> - <uses-feature android:name="android.hardware.screen.landscape" android:required="false"/> - <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="false"/> - <uses-feature android:name="android.hardware.sensor.gyroscope" android:required="false"/> - <uses-feature android:name="android.hardware.touchscreen" android:required="false"/> - <uses-feature android:name="android.hardware.vr.headtracking" android:required="false" android:version="1"/> - <uses-feature android:name="android.hardware.vr.high_performance" android:required="false"/> - <uses-feature android:name="android.software.vr.mode" android:required="false"/> - <uses-permission android:name="$PACKAGE.TOS_ACKED"/> - <uses-permission android:name="$PACKAGE.permission.C2D_MESSAGE"/> - <uses-permission android:name="$PACKAGE.permission.READ_WRITE_BOOKMARK_FOLDERS"/> - <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> - <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - <uses-permission android:name="android.permission.CAMERA"/> - <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> - <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> - <uses-permission android:name="android.permission.GET_ACCOUNTS"/> - <uses-permission android:name="android.permission.INTERNET"/> - <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/> - <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> - <uses-permission android:name="android.permission.NFC"/> - <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> - <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - <uses-permission android:name="android.permission.RECORD_AUDIO"/> - <uses-permission android:name="android.permission.USE_CREDENTIALS"/> - <uses-permission android:name="android.permission.VIBRATE"/> - <uses-permission android:name="android.permission.WAKE_LOCK"/> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> - <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> - <uses-permission android:name="com.chrome.permission.DEVICE_EXTRAS"/> - <uses-permission android:name="com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS"/> - <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> - <uses-permission-sdk-23 android:name="android.permission.ACCESS_WIFI_STATE"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_ADVERTISE"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_CONNECT"/> - <uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/> - <uses-permission-sdk-23 android:name="android.permission.READ_CONTACTS"/> - <uses-permission-sdk-23 android:name="android.permission.READ_MEDIA_IMAGES"/> - <uses-permission-sdk-23 android:name="android.permission.READ_MEDIA_VIDEO"/> - <uses-permission-sdk-23 android:name="android.permission.REORDER_TASKS"/> - <uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> - <uses-permission-sdk-23 android:name="android.permission.USE_BIOMETRIC"/> - <uses-permission-sdk-23 android:name="android.permission.USE_FINGERPRINT"/> - <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="31"/> - <application - android:name="org.chromium.chrome.browser.base.SplitChromeApplication" - android:allowAudioPlaybackCapture="false" - android:allowBackup="false" - android:appComponentFactory="org.chromium.chrome.browser.base.SplitCompatAppComponentFactory" - android:extractNativeLibs="false" - android:icon="@drawable/ic_launcher" - android:label="@string/app_name" - android:largeHeap="false" - android:manageSpaceActivity="@string/manage_space_activity" - android:multiArch="true" - android:networkSecurityConfig="@xml/network_security_config" - android:roundIcon="@drawable/ic_launcher_round" - android:supportsRtl="true" - android:use32bitAbi="true" - android:zygotePreloadName="org.chromium.chrome.app.TrichromeZygotePreload"> - <activity # DIFF-ANCHOR: ea1a94af - android:name="com.google.android.gms.common.api.GoogleApiActivity" - android:exported="false" - android:theme="@android:style/Theme.Translucent.NoTitleBar"> - </activity> # DIFF-ANCHOR: ea1a94af - <activity # DIFF-ANCHOR: a2bae37c - android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity" - android:enabled="false" - android:exported="false" - android:stateNotNeeded="true" - android:theme="@style/Theme.PlayCore.Transparent"> - </activity> # DIFF-ANCHOR: a2bae37c - <activity # DIFF-ANCHOR: 53a4871f - android:name="com.google.android.play.core.missingsplits.PlayCoreMissingSplitsActivity" - android:enabled="false" - android:exported="false" - android:launchMode="singleInstance" - android:process=":playcore_missing_splits_activity" - android:stateNotNeeded="true"> - </activity> # DIFF-ANCHOR: 53a4871f - <activity # DIFF-ANCHOR: 28dc9019 - android:name="com.google.ar.core.InstallActivity" - android:configChanges="keyboardHidden|orientation|screenSize" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleTop" - android:theme="@android:style/Theme.Material.Light.Dialog.Alert"> - </activity> # DIFF-ANCHOR: 28dc9019 - <activity # DIFF-ANCHOR: 93d41352 - android:name="org.chromium.chrome.browser.BrowserRestartActivity" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleInstance" - android:process=":browser_restart_process" - android:theme="@style/Theme.BrowserUI.Translucent.NoTitleBar"> - </activity> # DIFF-ANCHOR: 93d41352 - <activity # DIFF-ANCHOR: 61b2c776 - android:name="org.chromium.chrome.browser.ChromeTabbedActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="true" - android:hardwareAccelerated="false" - android:launchMode="singleTask" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - <meta-data android:name="android.activity.launch_mode" android:value="singleInstancePerTask"/> - </activity> # DIFF-ANCHOR: 61b2c776 - <activity # DIFF-ANCHOR: 610e8ccf - android:name="org.chromium.chrome.browser.ChromeTabbedActivity2" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:launchMode="singleTask" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:taskAffinity="$PACKAGE.ChromeTabbedActivity2" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 610e8ccf - <activity # DIFF-ANCHOR: 76686af9 - android:name="org.chromium.chrome.browser.LauncherShortcutActivity" - android:excludeFromRecents="true" - android:exported="false" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 76686af9 - <activity # DIFF-ANCHOR: 8f3f76d9 - android:name="org.chromium.chrome.browser.app.download.home.DownloadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 8f3f76d9 - <activity # DIFF-ANCHOR: 3d32d400 - android:name="org.chromium.chrome.browser.app.feed.feedmanagement.FeedManagementActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Settings" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 3d32d400 - <activity # DIFF-ANCHOR: 98c8c9be - android:name="org.chromium.chrome.browser.app.feed.followmanagement.FollowManagementActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Settings" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - <intent-filter> # DIFF-ANCHOR: 0bc48fdf - <action android:name="org.chromium.chrome.browser.app.feed.followmanagement.FollowManagementActivity.ACTIVATE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 0bc48fdf - </activity> # DIFF-ANCHOR: 98c8c9be - <activity # DIFF-ANCHOR: 50c7105b - android:name="org.chromium.chrome.browser.app.reengagement.ReengagementActivity" - android:excludeFromRecents="true" - android:exported="false" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.Translucent"> - </activity> # DIFF-ANCHOR: 50c7105b - <activity # DIFF-ANCHOR: aeab60ac - android:name="org.chromium.chrome.browser.app.video_tutorials.VideoPlayerActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:screenOrientation="portrait" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: aeab60ac - <activity # DIFF-ANCHOR: 170e9f21 - android:name="org.chromium.chrome.browser.app.video_tutorials.VideoTutorialListActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: 170e9f21 - <activity # DIFF-ANCHOR: da2eedc8 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: da2eedc8 - <activity # DIFF-ANCHOR: a208e726 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay" - android:windowSoftInputMode="stateHidden"> - <intent-filter> # DIFF-ANCHOR: 47a8059b - <action android:name="$PACKAGE.ADDBOOKMARK"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 47a8059b - </activity> # DIFF-ANCHOR: a208e726 - <activity # DIFF-ANCHOR: e0427380 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkAddEditFolderActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.DialogWhenLarge"> - </activity> # DIFF-ANCHOR: e0427380 - <activity # DIFF-ANCHOR: b66ce3f2 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkEditActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/edit_bookmark" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateHidden"> - </activity> # DIFF-ANCHOR: b66ce3f2 - <activity # DIFF-ANCHOR: 0a21ad35 - android:name="org.chromium.chrome.browser.bookmarks.BookmarkFolderSelectActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/bookmark_choose_folder" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateAlwaysHidden"> - </activity> # DIFF-ANCHOR: 0a21ad35 - <activity # DIFF-ANCHOR: 209b5ded - android:name="org.chromium.chrome.browser.browserservices.ClearDataDialogActivity" - android:exported="false" - android:theme="@style/Theme.Chromium.ClearDataDialogActivity"> - </activity> # DIFF-ANCHOR: 209b5ded - <activity # DIFF-ANCHOR: 2b0ee4cd - android:name="org.chromium.chrome.browser.browserservices.ManageTrustedWebActivityDataActivity" - android:exported="true" - android:theme="@style/Theme.Chromium.Activity.Fullscreen.Transparent"> - <intent-filter> # DIFF-ANCHOR: 38d9d906 - <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 38d9d906 - <intent-filter> # DIFF-ANCHOR: 38d9d906 - <action android:name="android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 38d9d906 - </activity> # DIFF-ANCHOR: 2b0ee4cd - <activity # DIFF-ANCHOR: 44266a6a - android:name="org.chromium.chrome.browser.customtabs.CustomTabActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 44266a6a - <activity # DIFF-ANCHOR: 4d923622 - android:name="org.chromium.chrome.browser.customtabs.TranslucentCustomTabActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity.FakeTranslucent" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 4d923622 - <activity # DIFF-ANCHOR: 1acdfd19 - android:name="org.chromium.chrome.browser.document.ChromeLauncherActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:excludeFromRecents="true" - android:relinquishTaskIdentity="true" - android:taskAffinity="" - android:theme="@style/LauncherTheme"> - </activity> # DIFF-ANCHOR: 1acdfd19 - <activity # DIFF-ANCHOR: 2121eb0d - android:name="org.chromium.chrome.browser.firstrun.FirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.DialogWhenLarge" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: 2121eb0d - <activity # DIFF-ANCHOR: 67932092 - android:name="org.chromium.chrome.browser.firstrun.LightweightFirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleInstance" - android:theme="@style/Theme.BrowserUI.AlertDialog.NoActionBar" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: 67932092 - <activity # DIFF-ANCHOR: bb612a34 - android:name="org.chromium.chrome.browser.firstrun.TabbedModeFirstRunActivity" - android:autoRemoveFromRecents="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:label="@string/fre_activity_label" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="stateHidden|adjustPan"> - </activity> # DIFF-ANCHOR: bb612a34 - <activity # DIFF-ANCHOR: 05911131 - android:name="org.chromium.chrome.browser.history.HistoryActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 05911131 - <activity # DIFF-ANCHOR: b98302dc - android:name="org.chromium.chrome.browser.incognito.IncognitoTabLauncher" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 8f811d02 - <action android:name="org.chromium.chrome.browser.incognito.OPEN_PRIVATE_TAB"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 8f811d02 - </activity> # DIFF-ANCHOR: b98302dc - <activity # DIFF-ANCHOR: 349d8ca5 - android:name="org.chromium.chrome.browser.instantapps.AuthenticatedProxyActivity" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 349d8ca5 - <activity # DIFF-ANCHOR: ecd48344 - android:name="org.chromium.chrome.browser.media.MediaLauncherActivity" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="image/*"/> - <data android:mimeType="video/*"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - </activity> # DIFF-ANCHOR: ecd48344 - <activity # DIFF-ANCHOR: d706d96e - android:name="org.chromium.chrome.browser.media.PictureInPictureActivity" - android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: d706d96e - <activity # DIFF-ANCHOR: 9023f153 - android:name="org.chromium.chrome.browser.multiwindow.MultiInstanceChromeTabbedActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:theme="@style/Theme.Chromium.TabbedMode" - android:windowSoftInputMode="adjustResize"> - </activity> # DIFF-ANCHOR: 9023f153 - <activity # DIFF-ANCHOR: e86e2b49 - android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$TrampolineActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: e86e2b49 - <activity # DIFF-ANCHOR: 01e92ad4 - android:name="org.chromium.chrome.browser.price_tracking.PriceDropNotificationManager$DismissNotificationChromeActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 01e92ad4 - <activity # DIFF-ANCHOR: 24aedc77 - android:name="org.chromium.chrome.browser.price_tracking.PriceDropNotificationManager$TrampolineActivity" - android:autoRemoveFromRecents="true" - android:documentLaunchMode="always" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - </activity> # DIFF-ANCHOR: 24aedc77 - <activity # DIFF-ANCHOR: bec48e1f - android:name="org.chromium.chrome.browser.printing.PrintShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/sharing_print_baseline" - android:label="@string/print_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="message/rfc822"/> - <data android:mimeType="multipart/related"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: bec48e1f - <activity # DIFF-ANCHOR: 7468a722 - android:name="org.chromium.chrome.browser.searchwidget.SearchActivity" - android:clearTaskOnLaunch="true" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="false" - android:hardwareAccelerated="false" - android:label="Search" - android:launchMode="singleTask" - android:taskAffinity="" - android:theme="@style/Theme.Chromium.SearchActivity" - android:windowSoftInputMode="adjustResize"> - </activity> # DIFF-ANCHOR: 7468a722 - <activity # DIFF-ANCHOR: f1aedff1 - android:name="org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/ic_launcher" - android:label="@string/send_tab_to_self_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: f1aedff1 - <activity # DIFF-ANCHOR: d32b85df - android:name="org.chromium.chrome.browser.settings.SettingsActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/settings" - android:theme="@style/Theme.Chromium.Settings"> - </activity> # DIFF-ANCHOR: d32b85df - <activity # DIFF-ANCHOR: 44158f9b - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardShareActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:icon="@drawable/ic_devices_48dp" - android:label="@string/shared_clipboard_share_activity_title" - android:noHistory="true" - android:theme="@style/Theme.Chromium.Activity.TranslucentNoAnimations"> - <intent-filter> # DIFF-ANCHOR: 4ee601b7 - <action android:name="android.intent.action.SEND"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="text/plain"/> - </intent-filter> # DIFF-ANCHOR: 4ee601b7 - </activity> # DIFF-ANCHOR: 44158f9b - <activity # DIFF-ANCHOR: fbf1ba15 - android:name="org.chromium.chrome.browser.signin.SyncConsentActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.DialogWhenLarge"> - </activity> # DIFF-ANCHOR: fbf1ba15 - <activity # DIFF-ANCHOR: d2967c86 - android:name="org.chromium.chrome.browser.site_settings.ManageSpaceActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:label="@string/storage_management_activity_label" - android:theme="@style/Theme.Chromium.Settings.ManageSpace"> - </activity> # DIFF-ANCHOR: d2967c86 - <activity # DIFF-ANCHOR: 8492e3fd - android:name="org.chromium.chrome.browser.sync.ui.PassphraseActivity" - android:autoRemoveFromRecents="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: 8492e3fd - <activity # DIFF-ANCHOR: 45a98fa4 - android:name="org.chromium.chrome.browser.sync.ui.SyncTrustedVaultProxyActivity" - android:excludeFromRecents="true" - android:exported="false" - android:theme="@style/Theme.MaterialComponents"> - </activity> # DIFF-ANCHOR: 45a98fa4 - <activity # DIFF-ANCHOR: 43bfa5de - android:name="org.chromium.chrome.browser.test_dummy.TestDummyActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:exported="true" - android:noHistory="true" - android:theme="@style/Theme.MaterialComponents"> - </activity> # DIFF-ANCHOR: 43bfa5de - <activity # DIFF-ANCHOR: b007dcaa - android:name="org.chromium.chrome.browser.vr.VrCancelAnimationActivity" - android:enableVrMode="@string/gvr_vr_mode_component" - android:excludeFromRecents="true" - android:exported="false" - android:noHistory="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: b007dcaa - <activity # DIFF-ANCHOR: 5e628a6c - android:name="org.chromium.chrome.browser.vr.VrFirstRunActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode" - android:enableVrMode="@string/gvr_vr_mode_component" - android:excludeFromRecents="true" - android:exported="false" - android:launchMode="singleInstance" - android:theme="@style/VrActivityTheme"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 5e628a6c - <activity # DIFF-ANCHOR: 9bb1f409 - android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity" - android:exported="true" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 0d72b7f0 - <action android:name="org.chromium.chrome.browser.webapps.ActivateWebApkActivity.ACTIVATE"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 0d72b7f0 - </activity> # DIFF-ANCHOR: 9bb1f409 - <activity # DIFF-ANCHOR: f1dc024a - android:name="org.chromium.chrome.browser.webapps.SameTaskWebApkActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:exported="false" - android:hardwareAccelerated="false" - android:label="@string/webapp_activity_title" - android:persistableMode="persistNever" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Webapp.Translucent" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: f1dc024a - <activity # DIFF-ANCHOR: 5e467d8a - android:name="org.chromium.chrome.browser.webapps.WebappActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize|uiMode|density" - android:documentLaunchMode="intoExisting" - android:exported="false" - android:hardwareAccelerated="false" - android:label="@string/webapp_activity_title" - android:launchMode="singleTop" - android:persistableMode="persistNever" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:theme="@style/Theme.Chromium.Webapp" - android:windowSoftInputMode="adjustResize"> - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - </activity> # DIFF-ANCHOR: 5e467d8a - <activity # DIFF-ANCHOR: aea75380 - android:name="org.chromium.chrome.browser.webapps.WebappLauncherActivity" - android:excludeFromRecents="true" - android:exported="true" - android:taskAffinity="" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: faf519ad - <action android:name="com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: faf519ad - <intent-filter> # DIFF-ANCHOR: 9c5197e9 - <action android:name="org.webapk.ACTION_START_WEBAPK"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 9c5197e9 - </activity> # DIFF-ANCHOR: aea75380 - <activity # DIFF-ANCHOR: 66a0be05 - android:name="org.chromium.chrome.browser.webapps.launchpad.LaunchpadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity> # DIFF-ANCHOR: 66a0be05 - <activity # DIFF-ANCHOR: a1fac31f - android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorActivity" - android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" - android:excludeFromRecents="true" - android:exported="true" - android:label="@string/cablev2_activity_title" - android:launchMode="singleTop" - android:permission="com.google.android.gms.auth.cryptauth.permission.CABLEV2_SERVER_LINK" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - </activity> # DIFF-ANCHOR: a1fac31f - <activity # DIFF-ANCHOR: b21cfcff - android:name="org.chromium.chrome.browser.webauth.authenticator.CableAuthenticatorUSBActivity" - android:configChanges="density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" - android:excludeFromRecents="true" - android:exported="false" - android:label="@string/cablev2_activity_title" - android:launchMode="singleTop" - android:theme="@style/Theme.Chromium.Activity.Fullscreen"> - <intent-filter> # DIFF-ANCHOR: 5873407a - <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> - </intent-filter> # DIFF-ANCHOR: 5873407a - <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" android:resource="@xml/phone_as_a_security_key_accessory_filter"/> - </activity> # DIFF-ANCHOR: b21cfcff - <activity # DIFF-ANCHOR: 1d9b4077 - android:name="org.chromium.components.media_router.caf.remoting.CafExpandedControllerActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:excludeFromRecents="true" - android:hardwareAccelerated="true" - android:label="Chrome.CafExpandedControllerActivity" - android:launchMode="singleTask" - android:noHistory="true" - android:theme="@style/Theme.Chromium.Activity"> - </activity> # DIFF-ANCHOR: 1d9b4077 - <activity-alias # DIFF-ANCHOR: 9da0e5b6 - android:name="com.google.android.apps.chrome.IntentDispatcher" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: a5330430 - <action android:name="android.intent.action.MAIN"/> - <category android:name="android.intent.category.NOTIFICATION_PREFERENCES"/> - </intent-filter> # DIFF-ANCHOR: a5330430 - <intent-filter> # DIFF-ANCHOR: 436dfef3 - <action android:name="android.intent.action.MEDIA_SEARCH"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 436dfef3 - <intent-filter> # DIFF-ANCHOR: 8f70c92f - <action android:name="android.intent.action.SEARCH"/> - </intent-filter> # DIFF-ANCHOR: 8f70c92f - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="application/xhtml+xml"/> - <data android:mimeType="text/html"/> - <data android:mimeType="text/plain"/> - <data android:scheme="about"/> - <data android:scheme="googlechrome"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:host="*"/> - <data android:mimeType="*/*"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\.mht"/> - <data android:pathPattern="/.*\\.mhtml"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:host="*"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\..*\\.mht"/> - <data android:pathPattern="/.*\\..*\\.mhtml"/> - <data android:pathPattern="/.*\\.mht"/> - <data android:pathPattern="/.*\\.mhtml"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="multipart/related"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="about"/> - <data android:scheme="googlechrome"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="application/xhtml+xml"/> - <data android:mimeType="text/html"/> - <data android:mimeType="text/plain"/> - <data android:scheme="content"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="message/rfc822"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="multipart/related"/> - <data android:scheme="content"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <intent-filter> # DIFF-ANCHOR: 7a3b3be8 - <action android:name="android.nfc.action.NDEF_DISCOVERED"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:scheme="http"/> - <data android:scheme="https"/> - </intent-filter> # DIFF-ANCHOR: 7a3b3be8 - <intent-filter> # DIFF-ANCHOR: 2a3a3c3d - <action android:name="android.speech.action.VOICE_SEARCH_RESULTS"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 2a3a3c3d - <intent-filter> # DIFF-ANCHOR: 19f73fdc - <action android:name="android.web.action.APP_ATTRIBUTION"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 19f73fdc - <intent-filter> # DIFF-ANCHOR: 83919a44 - <action android:name="com.sec.android.airview.HOVER"/> - </intent-filter> # DIFF-ANCHOR: 83919a44 - <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> - </activity-alias> # DIFF-ANCHOR: 9da0e5b6 - <activity-alias # DIFF-ANCHOR: 5042984f - android:name="com.google.android.apps.chrome.Main" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.ChromeTabbedActivity"> - <intent-filter> # DIFF-ANCHOR: a5330430 - <action android:name="android.intent.action.MAIN"/> - <category android:name="android.intent.category.APP_BROWSER"/> - <category android:name="android.intent.category.BROWSABLE"/> - <category android:name="android.intent.category.DEFAULT"/> - <category android:name="android.intent.category.LAUNCHER"/> - </intent-filter> # DIFF-ANCHOR: a5330430 - <intent-filter> # DIFF-ANCHOR: dea53031 - <action android:name="org.chromium.chrome.browser.dummy.action"/> - <category android:name="com.google.intent.category.CARDBOARD"/> - <category android:name="com.google.intent.category.DAYDREAM"/> - </intent-filter> # DIFF-ANCHOR: dea53031 - <meta-data android:name="android.app.shortcuts" android:resource="@xml/launchershortcuts"/> - </activity-alias> # DIFF-ANCHOR: 5042984f - <activity-alias # DIFF-ANCHOR: 03398466 - android:name="com.google.android.apps.chrome.TranslateDispatcher" - android:exported="true" - android:permission="$PACKAGE.permission.TRANSLATE" - android:targetActivity="org.chromium.chrome.browser.document.ChromeLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: 75e5f897 - <action android:name="org.chromium.chrome.browser.translate.TRANSLATE_TAB"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 75e5f897 - </activity-alias> # DIFF-ANCHOR: 03398466 - <activity-alias # DIFF-ANCHOR: dcfe2999 - android:name="com.google.android.apps.chrome.webapps.WebappActivity" - android:label="@string/webapp_activity_title" - android:resizeableActivity="true" - android:supportsPictureInPicture="true" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappActivity"> - </activity-alias> # DIFF-ANCHOR: dcfe2999 - <activity-alias # DIFF-ANCHOR: 8e23336d - android:name="com.google.android.apps.chrome.webapps.WebappManager" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"> - </activity-alias> # DIFF-ANCHOR: 8e23336d - <activity-alias # DIFF-ANCHOR: 5c83a464 - android:name="org.chromium.chrome.browser.download.DownloadActivity" - android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize" - android:exported="false" - android:targetActivity="org.chromium.chrome.browser.app.download.home.DownloadActivity" - android:theme="@style/Theme.Chromium.Activity.Fullscreen" - android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> - </activity-alias> # DIFF-ANCHOR: 5c83a464 - <activity-alias # DIFF-ANCHOR: b4a6221b - android:name="org.chromium.chrome.browser.media.AudioLauncherActivity" - android:enabled="false" - android:excludeFromRecents="true" - android:exported="true" - android:targetActivity="org.chromium.chrome.browser.media.MediaLauncherActivity" - android:theme="@style/Theme.BrowserUI.NoDisplay"> - <intent-filter> # DIFF-ANCHOR: 13c9b0a8 - <action android:name="android.intent.action.VIEW"/> - <category android:name="android.intent.category.DEFAULT"/> - <data android:mimeType="audio/*"/> - <data android:scheme="content"/> - <data android:scheme="file"/> - </intent-filter> # DIFF-ANCHOR: 13c9b0a8 - </activity-alias> # DIFF-ANCHOR: b4a6221b - <activity-alias # DIFF-ANCHOR: 7c349c4f - android:name="org.chromium.chrome.browser.webapps.SecureWebAppLauncher" - android:exported="false" - android:targetActivity="org.chromium.chrome.browser.webapps.WebappLauncherActivity"> - <intent-filter> # DIFF-ANCHOR: 9fe4b527 - <action android:name="org.chromium.chrome.browser.webapps.WebappManager.ACTION_START_SECURE_WEBAPP"/> - <category android:name="android.intent.category.DEFAULT"/> - </intent-filter> # DIFF-ANCHOR: 9fe4b527 - </activity-alias> # DIFF-ANCHOR: 7c349c4f - <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true"/> - <meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions"/> - <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/> - <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> - <meta-data android:name="com.google.ar.core" android:value="optional"/> - <meta-data android:name="com.google.ar.core.min_apk_version" android:value="202940000"/> - <meta-data android:name="com.samsung.android.sdk.multiwindow.enable" android:value="true"/> - <meta-data android:name="com.samsung.android.sdk.multiwindow.penwindow.enable" android:value="true"/> - <meta-data android:name="org.chromium.content.browser.NUM_PRIVILEGED_SERVICES" android:value="5"/> - <meta-data android:name="org.chromium.content.browser.NUM_SANDBOXED_SERVICES" android:value="40"/> - <meta-data android:name="org.chromium.content.browser.SMART_CLIP_PROVIDER" android:value="org.chromium.content_public.browser.SmartClipProvider"/> - <provider # DIFF-ANCHOR: bc0a9a7a - android:name="com.google.firebase.provider.FirebaseInitProvider" - android:authorities="$PACKAGE.firebaseinitprovider" - android:directBootAware="true" - android:exported="false" - android:initOrder="100"> - </provider> # DIFF-ANCHOR: bc0a9a7a - <provider # DIFF-ANCHOR: c2150e02 - android:name="org.chromium.chrome.browser.attribution_reporting.AttributionReportingProvider" - android:authorities="$PACKAGE.AttributionReporting" - android:exported="true"> - </provider> # DIFF-ANCHOR: c2150e02 - <provider # DIFF-ANCHOR: b73a881a - android:name="org.chromium.chrome.browser.download.DownloadFileProvider" - android:authorities="$PACKAGE.DownloadFileProvider" - android:exported="false" - android:grantUriPermissions="true"> - <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> - </provider> # DIFF-ANCHOR: b73a881a - <provider # DIFF-ANCHOR: f1c2d7e1 - android:name="org.chromium.chrome.browser.provider.ChromeBrowserProvider" - android:authorities="$PACKAGE.ChromeBrowserProvider;$PACKAGE.browser;$PACKAGE" - android:exported="true"> - <path-permission android:path="/bookmarks/search_suggest_query" android:readPermission="android.permission.GLOBAL_SEARCH"/> - </provider> # DIFF-ANCHOR: f1c2d7e1 - <provider # DIFF-ANCHOR: 67014fab - android:name="org.chromium.chrome.browser.util.ChromeFileProvider" - android:authorities="$PACKAGE.FileProvider" - android:exported="false" - android:grantUriPermissions="true"> - <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> - </provider> # DIFF-ANCHOR: 67014fab - <provider # DIFF-ANCHOR: cb51666f - android:name="org.chromium.ui.dragdrop.DropDataContentProvider" - android:authorities="$PACKAGE.DropDataProvider" - android:exported="false" - android:grantUriPermissions="true"> - </provider> # DIFF-ANCHOR: cb51666f - <receiver # DIFF-ANCHOR: 58d39a0f - android:name="com.google.android.apps.chrome.appwidget.bookmarks.BookmarkThumbnailWidgetProvider" - android:exported="true" - android:label="@string/bookmark_widget_title"> - <intent-filter> # DIFF-ANCHOR: 1ebe78e9 - <action android:name=".BOOKMARK_APPWIDGET_UPDATE"/> - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 1ebe78e9 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmark_widget_info"/> - </receiver> # DIFF-ANCHOR: 58d39a0f - <receiver # DIFF-ANCHOR: 0a6f8fa5 - android:name="com.google.android.gms.cast.framework.media.MediaIntentReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 0a6f8fa5 - <receiver # DIFF-ANCHOR: f1c9c29d - android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" - android:exported="true" - android:permission="com.google.android.c2dm.permission.SEND"> - <intent-filter> # DIFF-ANCHOR: aae22013 - <action android:name="com.google.android.c2dm.intent.RECEIVE"/> - </intent-filter> # DIFF-ANCHOR: aae22013 - </receiver> # DIFF-ANCHOR: f1c9c29d - <receiver # DIFF-ANCHOR: 68e22783 - android:name="org.chromium.chrome.browser.announcement.AnnouncementNotificationManager$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 68e22783 - <receiver # DIFF-ANCHOR: f6d77f5a - android:name="org.chromium.chrome.browser.app.send_tab_to_self.SendTabToSelfNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: f6d77f5a - <receiver # DIFF-ANCHOR: be2dce69 - android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetProxy" - android:exported="false"> - </receiver> # DIFF-ANCHOR: be2dce69 - <receiver # DIFF-ANCHOR: 31a8399a - android:name="org.chromium.chrome.browser.browserservices.ClientAppBroadcastReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: e5bb6a36 - <action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/> - <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED"/> - <data android:scheme="package"/> - </intent-filter> # DIFF-ANCHOR: e5bb6a36 - </receiver> # DIFF-ANCHOR: 31a8399a - <receiver # DIFF-ANCHOR: 2f4b69ac - android:name="org.chromium.chrome.browser.browserservices.ui.trustedwebactivity.DisclosureAcceptanceBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 2f4b69ac - <receiver # DIFF-ANCHOR: fd245bee - android:name="org.chromium.chrome.browser.customtabs.CustomTabsShareBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: fd245bee - <receiver # DIFF-ANCHOR: 2b9c19aa - android:name="org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 2b9c19aa - <receiver # DIFF-ANCHOR: d8a2af42 - android:name="org.chromium.chrome.browser.notifications.NotificationService$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: d8a2af42 - <receiver # DIFF-ANCHOR: df76237f - android:name="org.chromium.chrome.browser.notifications.NotificationServiceImpl$Receiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 1c1c5ed8 - <action android:name="org.chromium.chrome.browser.notifications.CLICK_NOTIFICATION"/> - <action android:name="org.chromium.chrome.browser.notifications.CLOSE_NOTIFICATION"/> - </intent-filter> # DIFF-ANCHOR: 1c1c5ed8 - </receiver> # DIFF-ANCHOR: df76237f - <receiver # DIFF-ANCHOR: a9b53579 - android:name="org.chromium.chrome.browser.notifications.channels.LocaleChangedBroadcastReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: 5458f2a2 - <action android:name="android.intent.action.LOCALE_CHANGED"/> - </intent-filter> # DIFF-ANCHOR: 5458f2a2 - </receiver> # DIFF-ANCHOR: a9b53579 - <receiver # DIFF-ANCHOR: 64dc49ab - android:name="org.chromium.chrome.browser.notifications.permissions.NotificationPermissionChangeReceiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 772631d2 - <action android:name="android.app.action.APP_BLOCK_STATE_CHANGED"/> - </intent-filter> # DIFF-ANCHOR: 772631d2 - </receiver> # DIFF-ANCHOR: 64dc49ab - <receiver # DIFF-ANCHOR: 0cefd906 - android:name="org.chromium.chrome.browser.notifications.scheduler.DisplayAgent$Receiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 0cefd906 - <receiver # DIFF-ANCHOR: 7d28c8e4 - android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$CompleteNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 7d28c8e4 - <receiver # DIFF-ANCHOR: 05f19ac3 - android:name="org.chromium.chrome.browser.offlinepages.AutoFetchNotifier$InProgressCancelReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 05f19ac3 - <receiver # DIFF-ANCHOR: a3a6e991 - android:name="org.chromium.chrome.browser.omaha.UpdateNotificationController$UpdateNotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: a3a6e991 - <receiver # DIFF-ANCHOR: 226134db - android:name="org.chromium.chrome.browser.quickactionsearchwidget.QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderDino" - android:exported="true" - android:label="@string/dino_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/quick_action_search_widget_dino_info"/> - </receiver> # DIFF-ANCHOR: 226134db - <receiver # DIFF-ANCHOR: 5a0b9536 - android:name="org.chromium.chrome.browser.quickactionsearchwidget.QuickActionSearchWidgetProvider$QuickActionSearchWidgetProviderSearch" - android:exported="true" - android:label="@string/quick_action_search_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/quick_action_search_widget_small_info"/> - </receiver> # DIFF-ANCHOR: 5a0b9536 - <receiver # DIFF-ANCHOR: a0d83ae5 - android:name="org.chromium.chrome.browser.searchwidget.SearchWidgetProvider" - android:exported="true" - android:label="@string/search_widget_title"> - <intent-filter> # DIFF-ANCHOR: 4ed161a4 - <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> - </intent-filter> # DIFF-ANCHOR: 4ed161a4 - <meta-data android:name="android.appwidget.provider" android:resource="@xml/search_widget_info"/> - </receiver> # DIFF-ANCHOR: a0d83ae5 - <receiver # DIFF-ANCHOR: 2f1fe689 - android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$PhoneUnlockedReceiver" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: 4b5ec7a9 - <action android:name="android.intent.action.USER_PRESENT"/> - </intent-filter> # DIFF-ANCHOR: 4b5ec7a9 - </receiver> # DIFF-ANCHOR: 2f1fe689 - <receiver # DIFF-ANCHOR: 124ac9a1 - android:name="org.chromium.chrome.browser.sharing.click_to_call.ClickToCallMessageHandler$TapReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 124ac9a1 - <receiver # DIFF-ANCHOR: 84094425 - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TapReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 84094425 - <receiver # DIFF-ANCHOR: 352611a4 - android:name="org.chromium.chrome.browser.sharing.shared_clipboard.SharedClipboardMessageHandler$TryAgainReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 352611a4 - <receiver # DIFF-ANCHOR: 420d0678 - android:name="org.chromium.chrome.browser.sharing.sms_fetcher.SmsFetcherMessageHandler$NotificationReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: 420d0678 - <receiver # DIFF-ANCHOR: 9015e3cf - android:name="org.chromium.chrome.browser.upgrade.PackageReplacedBroadcastReceiver" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: e8cce90c - <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/> - </intent-filter> # DIFF-ANCHOR: e8cce90c - </receiver> # DIFF-ANCHOR: 9015e3cf - <receiver # DIFF-ANCHOR: c787586e - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskBroadcastReceiver" - android:exported="false"> - </receiver> # DIFF-ANCHOR: c787586e - <service android:name="androidx.browser.customtabs.PostMessageService"/> - <service # DIFF-ANCHOR: 749391ed - android:name="com.google.android.gms.cast.framework.ReconnectionService" - android:exported="false"> - </service> # DIFF-ANCHOR: 749391ed - <service # DIFF-ANCHOR: 48ce9d28 - android:name="com.google.android.gms.cast.framework.media.MediaNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 48ce9d28 - <service # DIFF-ANCHOR: 7e26656b - android:name="com.google.firebase.components.ComponentDiscoveryService" - android:directBootAware="true" - android:exported="false"> - <meta-data android:name="com.google.firebase.components:com.google.firebase.dynamicloading.DynamicLoadingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.iid.Registrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - <meta-data android:name="com.google.firebase.components:com.google.firebase.messaging.FirebaseMessagingRegistrar" android:value="com.google.firebase.components.ComponentRegistrar"/> - </service> # DIFF-ANCHOR: 7e26656b - <service # DIFF-ANCHOR: 2295960c - android:name="com.google.firebase.messaging.FirebaseMessagingService" - android:directBootAware="true" - android:exported="false"> - <intent-filter android:priority="-500"> # DIFF-ANCHOR: 69e70070 - <action android:name="com.google.firebase.MESSAGING_EVENT"/> - </intent-filter> # DIFF-ANCHOR: 69e70070 - </service> # DIFF-ANCHOR: 2295960c - <service # DIFF-ANCHOR: 4c2196d9 - android:name="com.google.ipc.invalidation.ticl.android2.channel.GcmRegistrationTaskService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: 4c2196d9 - <service # DIFF-ANCHOR: c34d99ad - android:name="org.chromium.chrome.browser.ChromeBackgroundService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: c34d99ad - <service # DIFF-ANCHOR: ac44dbad - android:name="org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetService" - android:exported="false" - android:permission="android.permission.BIND_REMOTEVIEWS"> - </service> # DIFF-ANCHOR: ac44dbad - <service # DIFF-ANCHOR: 90d2ec9b - android:name="org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: 90d2ec9b - <service # DIFF-ANCHOR: f72bb7bc - android:name="org.chromium.chrome.browser.crash.MinidumpUploadService" - android:exported="false"> - </service> # DIFF-ANCHOR: f72bb7bc - <service # DIFF-ANCHOR: ee1c39a8 - android:name="org.chromium.chrome.browser.customtabs.CustomTabsConnectionService" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: d46bf795 - <action android:name="android.support.customtabs.action.CustomTabsService"/> - <category android:name="androidx.browser.customtabs.category.ColorSchemeCustomization"/> - <category android:name="androidx.browser.customtabs.category.NavBarColorCustomization"/> - <category android:name="androidx.browser.trusted.category.ImmersiveMode"/> - <category android:name="androidx.browser.trusted.category.LaunchSiteSettings"/> - <category android:name="androidx.browser.trusted.category.LaunchWebApkSiteSettings"/> - <category android:name="androidx.browser.trusted.category.TrustedWebActivities"/> - <category android:name="androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1"/> - <category android:name="androidx.browser.trusted.category.WebShareTargetV2"/> - </intent-filter> # DIFF-ANCHOR: d46bf795 - </service> # DIFF-ANCHOR: ee1c39a8 - <service # DIFF-ANCHOR: 4b22c3f5 - android:name="org.chromium.chrome.browser.download.DownloadBroadcastManager" - android:exported="false"> - </service> # DIFF-ANCHOR: 4b22c3f5 - <service # DIFF-ANCHOR: 413310e5 - android:name="org.chromium.chrome.browser.download.DownloadForegroundService" - android:exported="false"> - </service> # DIFF-ANCHOR: 413310e5 - <service # DIFF-ANCHOR: 7e3ff13a - android:name="org.chromium.chrome.browser.incognito.IncognitoNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7e3ff13a - <service # DIFF-ANCHOR: ac8469ff - android:name="org.chromium.chrome.browser.media.MediaCaptureNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: ac8469ff - <service # DIFF-ANCHOR: 7ef9e4e5 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$CastListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 7ef9e4e5 - <service # DIFF-ANCHOR: 41fa6492 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PlaybackListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 41fa6492 - <service # DIFF-ANCHOR: 1260bca4 - android:name="org.chromium.chrome.browser.media.ui.ChromeMediaNotificationControllerServices$PresentationListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: f401157d - <action android:name="android.intent.action.MEDIA_BUTTON"/> - </intent-filter> # DIFF-ANCHOR: f401157d - </service> # DIFF-ANCHOR: 1260bca4 - <service # DIFF-ANCHOR: 4b2220c4 - android:name="org.chromium.chrome.browser.notifications.NotificationJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: 4b2220c4 - <service # DIFF-ANCHOR: 7fb8c03f - android:name="org.chromium.chrome.browser.notifications.NotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7fb8c03f - <service android:name="org.chromium.chrome.browser.omaha.OmahaClient" android:exported="false"/> - <service # DIFF-ANCHOR: 53256720 - android:name="org.chromium.chrome.browser.photo_picker.DecoderService" - android:description="@string/decoder_description" - android:exported="false" - android:isolatedProcess="true" - android:process=":decoder_service"> - </service> # DIFF-ANCHOR: 53256720 - <service # DIFF-ANCHOR: 064aae37 - android:name="org.chromium.chrome.browser.prerender.ChromePrerenderService" - android:exported="true"> - </service> # DIFF-ANCHOR: 064aae37 - <service # DIFF-ANCHOR: 6d9cb216 - android:name="org.chromium.chrome.browser.services.gcm.ChromeGcmListenerService" - android:exported="false"> - <intent-filter> # DIFF-ANCHOR: 69e70070 - <action android:name="com.google.firebase.MESSAGING_EVENT"/> - </intent-filter> # DIFF-ANCHOR: 69e70070 - </service> # DIFF-ANCHOR: 6d9cb216 - <service # DIFF-ANCHOR: 7b05db30 - android:name="org.chromium.chrome.browser.services.gcm.GCMBackgroundService" - android:exported="false"> - </service> # DIFF-ANCHOR: 7b05db30 - <service # DIFF-ANCHOR: dcd6fa39 - android:name="org.chromium.chrome.browser.services.gcm.InvalidationGcmUpstreamSender" - android:exported="false"> - </service> # DIFF-ANCHOR: dcd6fa39 - <service # DIFF-ANCHOR: c26364a8 - android:name="org.chromium.chrome.browser.tracing.TracingNotificationService" - android:exported="false"> - </service> # DIFF-ANCHOR: c26364a8 - <service # DIFF-ANCHOR: 8fc286d0 - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskGcmTaskService" - android:exported="true" - android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE"> - <intent-filter> # DIFF-ANCHOR: 99686c45 - <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY"/> - </intent-filter> # DIFF-ANCHOR: 99686c45 - </service> # DIFF-ANCHOR: 8fc286d0 - <service # DIFF-ANCHOR: a550decc - android:name="org.chromium.components.background_task_scheduler.internal.BackgroundTaskJobService" - android:exported="false" - android:permission="android.permission.BIND_JOB_SERVICE"> - </service> # DIFF-ANCHOR: a550decc - <service # DIFF-ANCHOR: 2a1cd701 - android:name="org.chromium.components.payments.PaymentDetailsUpdateService" - android:exported="true"> - <intent-filter> # DIFF-ANCHOR: c68af934 - <action android:name="org.chromium.intent.action.UPDATE_PAYMENT_DETAILS"/> - </intent-filter> # DIFF-ANCHOR: c68af934 - </service> # DIFF-ANCHOR: 2a1cd701 - <service # DIFF-ANCHOR: 0c6c4fd9 - android:name="org.chromium.content.app.PrivilegedProcessService0" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process0"> - </service> # DIFF-ANCHOR: 0c6c4fd9 - <service # DIFF-ANCHOR: 6f89af32 - android:name="org.chromium.content.app.PrivilegedProcessService1" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process1"> - </service> # DIFF-ANCHOR: 6f89af32 - <service # DIFF-ANCHOR: 40e0d738 - android:name="org.chromium.content.app.PrivilegedProcessService2" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process2"> - </service> # DIFF-ANCHOR: 40e0d738 - <service # DIFF-ANCHOR: b197517d - android:name="org.chromium.content.app.PrivilegedProcessService3" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process3"> - </service> # DIFF-ANCHOR: b197517d - <service # DIFF-ANCHOR: 52303702 - android:name="org.chromium.content.app.PrivilegedProcessService4" - android:exported="false" - android:isolatedProcess="false" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":privileged_process4"> - </service> # DIFF-ANCHOR: 52303702 - <service # DIFF-ANCHOR: b1e3e8bd - android:name="org.chromium.content.app.SandboxedProcessService0" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process0" - android:useAppZygote="true"> - </service> # DIFF-ANCHOR: b1e3e8bd - <service # DIFF-ANCHOR: 76d1ccf8 - android:name="org.chromium.content.app.SandboxedProcessService1" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process1"> - </service> # DIFF-ANCHOR: 76d1ccf8 - <service # DIFF-ANCHOR: 38b95266 - android:name="org.chromium.content.app.SandboxedProcessService10" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process10"> - </service> # DIFF-ANCHOR: 38b95266 - <service # DIFF-ANCHOR: e4a2e4a2 - android:name="org.chromium.content.app.SandboxedProcessService11" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process11"> - </service> # DIFF-ANCHOR: e4a2e4a2 - <service # DIFF-ANCHOR: d9b2ffba - android:name="org.chromium.content.app.SandboxedProcessService12" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process12"> - </service> # DIFF-ANCHOR: d9b2ffba - <service # DIFF-ANCHOR: b41bb17d - android:name="org.chromium.content.app.SandboxedProcessService13" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process13"> - </service> # DIFF-ANCHOR: b41bb17d - <service # DIFF-ANCHOR: aec0ea21 - android:name="org.chromium.content.app.SandboxedProcessService14" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process14"> - </service> # DIFF-ANCHOR: aec0ea21 - <service # DIFF-ANCHOR: cf88a5e5 - android:name="org.chromium.content.app.SandboxedProcessService15" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process15"> - </service> # DIFF-ANCHOR: cf88a5e5 - <service # DIFF-ANCHOR: 7d85889d - android:name="org.chromium.content.app.SandboxedProcessService16" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process16"> - </service> # DIFF-ANCHOR: 7d85889d - <service # DIFF-ANCHOR: dae26ed4 - android:name="org.chromium.content.app.SandboxedProcessService17" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process17"> - </service> # DIFF-ANCHOR: dae26ed4 - <service # DIFF-ANCHOR: 2c6cf029 - android:name="org.chromium.content.app.SandboxedProcessService18" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process18"> - </service> # DIFF-ANCHOR: 2c6cf029 - <service # DIFF-ANCHOR: 1d2f0988 - android:name="org.chromium.content.app.SandboxedProcessService19" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process19"> - </service> # DIFF-ANCHOR: 1d2f0988 - <service # DIFF-ANCHOR: 4a39041b - android:name="org.chromium.content.app.SandboxedProcessService2" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process2"> - </service> # DIFF-ANCHOR: 4a39041b - <service # DIFF-ANCHOR: 073533bf - android:name="org.chromium.content.app.SandboxedProcessService20" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process20"> - </service> # DIFF-ANCHOR: 073533bf - <service # DIFF-ANCHOR: d24da41d - android:name="org.chromium.content.app.SandboxedProcessService21" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process21"> - </service> # DIFF-ANCHOR: d24da41d - <service # DIFF-ANCHOR: 594d8b32 - android:name="org.chromium.content.app.SandboxedProcessService22" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process22"> - </service> # DIFF-ANCHOR: 594d8b32 - <service # DIFF-ANCHOR: 5528c0c3 - android:name="org.chromium.content.app.SandboxedProcessService23" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process23"> - </service> # DIFF-ANCHOR: 5528c0c3 - <service # DIFF-ANCHOR: b7ab2ba3 - android:name="org.chromium.content.app.SandboxedProcessService24" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process24"> - </service> # DIFF-ANCHOR: b7ab2ba3 - <service # DIFF-ANCHOR: cec6cb64 - android:name="org.chromium.content.app.SandboxedProcessService25" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process25"> - </service> # DIFF-ANCHOR: cec6cb64 - <service # DIFF-ANCHOR: 5b4a00fe - android:name="org.chromium.content.app.SandboxedProcessService26" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process26"> - </service> # DIFF-ANCHOR: 5b4a00fe - <service # DIFF-ANCHOR: ad49d203 - android:name="org.chromium.content.app.SandboxedProcessService27" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process27"> - </service> # DIFF-ANCHOR: ad49d203 - <service # DIFF-ANCHOR: 573298e9 - android:name="org.chromium.content.app.SandboxedProcessService28" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process28"> - </service> # DIFF-ANCHOR: 573298e9 - <service # DIFF-ANCHOR: 79897b32 - android:name="org.chromium.content.app.SandboxedProcessService29" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process29"> - </service> # DIFF-ANCHOR: 79897b32 - <service # DIFF-ANCHOR: 84335864 - android:name="org.chromium.content.app.SandboxedProcessService3" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process3"> - </service> # DIFF-ANCHOR: 84335864 - <service # DIFF-ANCHOR: c4bd371e - android:name="org.chromium.content.app.SandboxedProcessService30" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process30"> - </service> # DIFF-ANCHOR: c4bd371e - <service # DIFF-ANCHOR: 394a9fd0 - android:name="org.chromium.content.app.SandboxedProcessService31" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process31"> - </service> # DIFF-ANCHOR: 394a9fd0 - <service # DIFF-ANCHOR: b811afb8 - android:name="org.chromium.content.app.SandboxedProcessService32" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process32"> - </service> # DIFF-ANCHOR: b811afb8 - <service # DIFF-ANCHOR: 2811ddd3 - android:name="org.chromium.content.app.SandboxedProcessService33" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process33"> - </service> # DIFF-ANCHOR: 2811ddd3 - <service # DIFF-ANCHOR: 73ae1688 - android:name="org.chromium.content.app.SandboxedProcessService34" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process34"> - </service> # DIFF-ANCHOR: 73ae1688 - <service # DIFF-ANCHOR: c476f324 - android:name="org.chromium.content.app.SandboxedProcessService35" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process35"> - </service> # DIFF-ANCHOR: c476f324 - <service # DIFF-ANCHOR: 75d5304b - android:name="org.chromium.content.app.SandboxedProcessService36" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process36"> - </service> # DIFF-ANCHOR: 75d5304b - <service # DIFF-ANCHOR: dc6d0617 - android:name="org.chromium.content.app.SandboxedProcessService37" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process37"> - </service> # DIFF-ANCHOR: dc6d0617 - <service # DIFF-ANCHOR: e31efe49 - android:name="org.chromium.content.app.SandboxedProcessService38" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process38"> - </service> # DIFF-ANCHOR: e31efe49 - <service # DIFF-ANCHOR: 5736507e - android:name="org.chromium.content.app.SandboxedProcessService39" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process39"> - </service> # DIFF-ANCHOR: 5736507e - <service # DIFF-ANCHOR: a161be24 - android:name="org.chromium.content.app.SandboxedProcessService4" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process4"> - </service> # DIFF-ANCHOR: a161be24 - <service # DIFF-ANCHOR: 8e591688 - android:name="org.chromium.content.app.SandboxedProcessService5" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process5"> - </service> # DIFF-ANCHOR: 8e591688 - <service # DIFF-ANCHOR: 705141d0 - android:name="org.chromium.content.app.SandboxedProcessService6" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process6"> - </service> # DIFF-ANCHOR: 705141d0 - <service # DIFF-ANCHOR: 38ed2189 - android:name="org.chromium.content.app.SandboxedProcessService7" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process7"> - </service> # DIFF-ANCHOR: 38ed2189 - <service # DIFF-ANCHOR: aa417956 - android:name="org.chromium.content.app.SandboxedProcessService8" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process8"> - </service> # DIFF-ANCHOR: aa417956 - <service # DIFF-ANCHOR: e2f3bbbd - android:name="org.chromium.content.app.SandboxedProcessService9" - android:exported="False" - android:isolatedProcess="true" - android:permission="$PACKAGE.permission.CHILD_SERVICE" - android:process=":sandboxed_process9"> - </service> # DIFF-ANCHOR: e2f3bbbd - <uses-static-library android:name="org.chromium.trichromelibrary" android:certDigest="32a2fc74d731105859e5a85df16d95f102d85b22099b8064c5d8915c61dad1e0" android:version="$VERSION_NUMBER"/> - </application> -</manifest>
diff --git a/chrome/android/java/res/drawable-hdpi/infobar_screen_share.png b/chrome/android/java/res/drawable-hdpi/infobar_screen_share.png deleted file mode 100644 index 353bd69..0000000 --- a/chrome/android/java/res/drawable-hdpi/infobar_screen_share.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/infobar_screen_share.png b/chrome/android/java/res/drawable-mdpi/infobar_screen_share.png deleted file mode 100644 index 6854b81..0000000 --- a/chrome/android/java/res/drawable-mdpi/infobar_screen_share.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/infobar_screen_share.png b/chrome/android/java/res/drawable-xhdpi/infobar_screen_share.png deleted file mode 100644 index 532394f..0000000 --- a/chrome/android/java/res/drawable-xhdpi/infobar_screen_share.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/infobar_screen_share.png b/chrome/android/java/res/drawable-xxhdpi/infobar_screen_share.png deleted file mode 100644 index aa88c7f92a..0000000 --- a/chrome/android/java/res/drawable-xxhdpi/infobar_screen_share.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/infobar_screen_share.png b/chrome/android/java/res/drawable-xxxhdpi/infobar_screen_share.png deleted file mode 100644 index c8959196..0000000 --- a/chrome/android/java/res/drawable-xxxhdpi/infobar_screen_share.png +++ /dev/null Binary files differ
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl.java index 0f7911f..2f79ecc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/notifications/ContextualNotificationPermissionRequesterImpl.java
@@ -40,13 +40,27 @@ ChromeFeatureList.NOTIFICATION_PERMISSION_VARIANT, FIELD_TRIAL_ENABLE_CONTEXTUAL_PERMISSION_REQUESTS, false); if (!isContextualPermissionRequestEnabled) return; - Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); - if (!(activity instanceof ChromeTabbedActivity)) return; - - ChromeTabbedActivity chromeTabbedActivity = (ChromeTabbedActivity) activity; NotificationPermissionController permissionController = - NotificationPermissionController.from(chromeTabbedActivity.getWindowAndroid()); + getNotificationPermissionController(); if (permissionController == null) return; permissionController.requestPermissionIfNeeded(true /* contextual */); } + + @Override + public boolean doesAppLevelSettingsAllowSiteNotifications() { + NotificationPermissionController permissionController = + getNotificationPermissionController(); + if (permissionController == null) return true; + return permissionController.doesAppLevelSettingsAllowSiteNotifications(); + } + + private NotificationPermissionController getNotificationPermissionController() { + Activity activity = ApplicationStatus.getLastTrackedFocusedActivity(); + if (!(activity instanceof ChromeTabbedActivity)) return null; + + // TODO(shaktisahu): Maybe split out the contextual permission logic out of + // NotificationPermissionController entirely to serve non-chrome activities. + ChromeTabbedActivity chromeTabbedActivity = (ChromeTabbedActivity) activity; + return NotificationPermissionController.from(chromeTabbedActivity.getWindowAndroid()); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java index 5ed808b..9c0cbca 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/init/StartupTabPreloaderTest.java
@@ -190,6 +190,7 @@ @Test @LargeTest @DisableFeatures(ChromeFeatureList.ELIDE_TAB_PRELOAD_AT_STARTUP) + @DisabledTest(message = "https://crbug.com/1271158") public void testStartupTabPreloaderStartupLoadingMetricsRecordedWhenTabTaken() throws Exception { // Force the browser to regard itself as being in the foreground to work around the
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java index 3abc16eb..bc2ad4e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -493,7 +493,7 @@ // If the ContentSettingsType.NUM_TYPES value changes *and* a new value has been exposed on // Android, then please update this code block to include a test for your new type. // Otherwise, just update count in the assert. - Assert.assertEquals(76, ContentSettingsType.NUM_TYPES); + Assert.assertEquals(77, ContentSettingsType.NUM_TYPES); websitePreferenceBridge.addContentSettingException( new ContentSettingException(ContentSettingsType.COOKIES, googleOrigin, ContentSettingValues.DEFAULT, preferenceSource));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java index 3376ca9..a8e88ab 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
@@ -1118,6 +1118,7 @@ */ @Test @MediumTest + @Restriction(Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE) // See crbug.com/1312473 public void testCloseAll() throws TimeoutException { TabModel model = sActivityTestRule.getActivity().getTabModelSelector().getModel(false); ChromeTabCreator tabCreator = TestThreadUtils.runOnUiThreadBlockingNoException(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java index 9ee9bcf..35d60db4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/items/OfflineContentAggregatorNotificationBridgeUiTest.java
@@ -89,6 +89,11 @@ new ContextualNotificationPermissionRequester() { @Override public void requestPermissionIfNeeded() {} + + @Override + public boolean doesAppLevelSettingsAllowSiteNotifications() { + return false; + } }); }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 04249a0f..ce2889b 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10975,11 +10975,6 @@ Press |<ph name="ACCELERATOR">$1<ex>Esc</ex></ph>| to show your cursor </message> - <!-- Media Capture messages --> - <message name="IDS_MEDIA_CAPTURE_SCREEN_INFOBAR_TEXT" desc="Text requesting permission for a site to access the device's screen."> - <ph name="HOST">$1<ex>html5rocks.com</ex></ph> wants to share your screen - </message> - <!-- Sensor messages --> <message name="IDS_SENSORS_ALLOWED_TOOLTIP" desc="Location bar icon tooltip text when a page is allowed to use device's sensors."> This site is using motion or light sensors.
diff --git a/chrome/app/generated_resources_grd/IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_SOURCE.png.sha1 b/chrome/app/generated_resources_grd/IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_SOURCE.png.sha1 deleted file mode 100644 index d1e924e9..0000000 --- a/chrome/app/generated_resources_grd/IDS_MEDIA_SCREEN_CAPTURE_NOTIFICATION_SOURCE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -33f4d4a42b06f6de5402213f1ab8cd15efff19ee \ No newline at end of file
diff --git a/chrome/app_shim/chrome_main_app_mode_mac.mm b/chrome/app_shim/chrome_main_app_mode_mac.mm index 4eb71fe4..d52f957a 100644 --- a/chrome/app_shim/chrome_main_app_mode_mac.mm +++ b/chrome/app_shim/chrome_main_app_mode_mac.mm
@@ -25,7 +25,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_executor.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/app/chrome_crash_reporter_client.h" #include "chrome/app_shim/app_shim_controller.h" #include "chrome/common/chrome_constants.h"
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 2ff5b977..97d87ea0 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -3152,8 +3152,8 @@ "media/android/cdm/per_device_provisioning_permission.h", "media/android/router/chrome_media_router_client.cc", "media/android/router/chrome_media_router_client.h", - "media/webrtc/screen_capture_infobar_delegate_android.cc", - "media/webrtc/screen_capture_infobar_delegate_android.h", + "media/webrtc/screen_capture_permission_handler_android.cc", + "media/webrtc/screen_capture_permission_handler_android.h", "memory_details_android.cc", "metrics/chrome_android_metrics_provider.cc", "metrics/chrome_android_metrics_provider.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index a47ac36..81d3b71 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2442,6 +2442,19 @@ kPasswordChangeInSettingsVariationWithForcedWarningForEverySite), nullptr}}; +// The variations of --password-domain-capabilities-fetching. +const FeatureEntry::FeatureParam + kPasswordDomainCapabilitiesFetchingVariationLiveExperiment[] = { + {password_manager::features::kPasswordChangeLiveExperimentParam.name, + "true"}}; + +const FeatureEntry::FeatureVariation + kPasswordDomainCapabilitiesFetchingFeatureVariations[] = { + {"Live experiment", + kPasswordDomainCapabilitiesFetchingVariationLiveExperiment, + std::size(kPasswordDomainCapabilitiesFetchingVariationLiveExperiment), + nullptr}}; + // The variations of --password-change-support. const FeatureEntry::FeatureParam kPasswordChangeVariationWithForcedDialogAfterEverySuccessfulSubmission[] = { @@ -5107,17 +5120,8 @@ FEATURE_WITH_PARAMS_VALUE_TYPE(reading_list::switches::kReadLater, kReadLaterVariations, "Collections")}, -#else - {flag_descriptions::kReadLaterFlagId, flag_descriptions::kReadLaterName, - flag_descriptions::kReadLaterDescription, kOsDesktop, - FEATURE_VALUE_TYPE(reading_list::switches::kReadLater)}, #endif - {"read-later-new-badge-promo", - flag_descriptions::kReadLaterNewBadgePromoName, - flag_descriptions::kReadLaterNewBadgePromoDescription, kOsDesktop, - FEATURE_VALUE_TYPE(features::kReadLaterNewBadgePromo)}, - #if BUILDFLAG(IS_ANDROID) {"read-later-reminder-notification", flag_descriptions::kReadLaterReminderNotificationName, @@ -5156,10 +5160,6 @@ flag_descriptions::kScrollableTabStripButtonsDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kScrollableTabStripButtons)}, - {flag_descriptions::kSidePanelFlagId, flag_descriptions::kSidePanelName, - flag_descriptions::kSidePanelDescription, kOsDesktop, - FEATURE_VALUE_TYPE(features::kSidePanel)}, - {flag_descriptions::kSidePanelDragAndDropFlagId, flag_descriptions::kSidePanelDragAndDropName, flag_descriptions::kSidePanelDragAndDropDescription, kOsDesktop, @@ -5443,6 +5443,11 @@ "")}, #endif + {"enable-web-authentication-passkeys-ui-experiment", + flag_descriptions::kEnableWebAuthenticationPasskeysUIExperimentName, + flag_descriptions::kEnableWebAuthenticationPasskeysUIExperimentDescription, + kOsDesktop, FEATURE_VALUE_TYPE(device::kWebAuthPasskeysUIExperiment)}, + #if BUILDFLAG(IS_CHROMEOS_ASH) {"enable-web-authentication-chromeos-authenticator", flag_descriptions::kEnableWebAuthenticationChromeOSAuthenticatorName, @@ -6064,11 +6069,6 @@ flag_descriptions::kPcieBillboardNotificationDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kPcieBillboardNotification)}, - {"reduce-display-notifications", - flag_descriptions::kReduceDisplayNotificationsName, - flag_descriptions::kReduceDisplayNotificationsDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kReduceDisplayNotifications)}, - {"use-search-click-for-right-click", flag_descriptions::kUseSearchClickForRightClickName, flag_descriptions::kUseSearchClickForRightClickDescription, kOsCrOS, @@ -6686,8 +6686,10 @@ flag_descriptions::kPasswordDomainCapabilitiesFetchingName, flag_descriptions::kPasswordDomainCapabilitiesFetchingDescription, kOsAndroid, - FEATURE_VALUE_TYPE( - password_manager::features::kPasswordDomainCapabilitiesFetching)}, + FEATURE_WITH_PARAMS_VALUE_TYPE( + password_manager::features::kPasswordDomainCapabilitiesFetching, + kPasswordDomainCapabilitiesFetchingFeatureVariations, + "PasswordDomainCapabilitiesFetchingFeatureVariations")}, {"password-scripts-fetching", flag_descriptions::kPasswordScriptsFetchingName, flag_descriptions::kPasswordScriptsFetchingDescription, kOsAndroid, @@ -6748,12 +6750,6 @@ FEATURE_VALUE_TYPE(media::kMediaFoundationVideoCapture)}, #endif // BUILDFLAG(IS_WIN) -#if BUILDFLAG(IS_CHROMEOS_ASH) - {"scan-app-multi-page-scan", flag_descriptions::kScanAppMultiPageScanName, - flag_descriptions::kScanAppMultiPageScanDescription, kOsCrOS, - FEATURE_VALUE_TYPE(chromeos::features::kScanAppMultiPageScan)}, -#endif // BUILDFLAG(IS_CHROMEOS_ASH) - {"color-provider-redirection-for-theme-provider", flag_descriptions::kColorProviderRedirectionForThemeProviderName, flag_descriptions::kColorProviderRedirectionForThemeProviderDescription,
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h index 84afa632..21d86351 100644 --- a/chrome/browser/android/resource_id.h +++ b/chrome/browser/android/resource_id.h
@@ -33,8 +33,6 @@ // Android only infobars. DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_FROZEN_TAB, R.drawable.infobar_restore) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_LITE_MODE, R.drawable.preview_pin_round) -DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_MEDIA_STREAM_SCREEN, - R.drawable.infobar_screen_share) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_NOTIFICATIONS_OFF, R.drawable.permission_push_notification_off) DECLARE_RESOURCE_ID(IDR_ANDROID_INFOBAR_PREVIEWS, R.drawable.infobar_chrome)
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index bb1f9f0..5cf6cdd2 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -1576,11 +1576,6 @@ } IN_PROC_BROWSER_TEST_P(WebViewTest, Shim_TestTerminateAfterExit) { - // TODO(crbug.com/1267977): fix this test to work with site isolation for - // <webview>. - if (content::SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled()) - return; - content::ScopedAllowRendererCrashes scoped_allow_renderer_crashes; TestHelper("testTerminateAfterExit", "web_view/shim", NO_TEST_SERVER); }
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc index a3cc56f5..3c9f0a84 100644 --- a/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc +++ b/chrome/browser/ash/accessibility/spoken_feedback_app_list_browsertest.cc
@@ -5,6 +5,7 @@ #include "ash/app_list/app_list_controller_impl.h" #include "ash/app_list/app_list_model_provider.h" #include "ash/app_list/model/app_list_item.h" +#include "ash/app_list/views/apps_grid_view.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/tablet_mode.h" @@ -13,6 +14,7 @@ #include "ash/shell.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" +#include "base/test/simple_test_tick_clock.h" #include "chrome/browser/ash/accessibility/spoken_feedback_browsertest.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_list_client_impl.h" @@ -36,6 +38,8 @@ #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/display/display.h" #include "ui/display/manager/display_manager.h" +#include "ui/events/base_event_utils.h" +#include "ui/events/test/event_generator.h" namespace ash { namespace { @@ -150,11 +154,11 @@ enum SpokenFeedbackAppListTestVariant { kTestAsNormalUser, kTestAsGuestUser }; -class SpokenFeedbackAppListBaseTest - : public LoggedInSpokenFeedbackTest, - public ::testing::WithParamInterface<SpokenFeedbackAppListTestVariant> { +class SpokenFeedbackAppListBaseTest : public LoggedInSpokenFeedbackTest { public: - explicit SpokenFeedbackAppListBaseTest(bool productivity_launcher_enabled) { + SpokenFeedbackAppListBaseTest(SpokenFeedbackAppListTestVariant variant, + bool productivity_launcher_enabled) + : variant_(variant) { feature_list_.InitWithFeatureState(ash::features::kProductivityLauncher, productivity_launcher_enabled); } @@ -180,7 +184,7 @@ } void SetUpCommandLine(base::CommandLine* command_line) override { - if (GetParam() == kTestAsGuestUser) { + if (variant_ == kTestAsGuestUser) { command_line->AppendSwitch(switches::kGuestSession); command_line->AppendSwitch(::switches::kIncognito); command_line->AppendSwitchASCII(switches::kLoginProfile, "user"); @@ -234,15 +238,19 @@ } private: + const SpokenFeedbackAppListTestVariant variant_; std::unique_ptr<ui::ScopedAnimationDurationScaleMode> zero_duration_mode_; base::test::ScopedFeatureList feature_list_; }; // Tests with feature ProductivityLauncher disabled. -class SpokenFeedbackAppListTest : public SpokenFeedbackAppListBaseTest { +class SpokenFeedbackAppListTest + : public SpokenFeedbackAppListBaseTest, + public ::testing::WithParamInterface<SpokenFeedbackAppListTestVariant> { public: SpokenFeedbackAppListTest() - : SpokenFeedbackAppListBaseTest(/*productivity_launcher_enabled=*/false) { + : SpokenFeedbackAppListBaseTest(/*variant=*/GetParam(), + /*productivity_launcher_enabled=*/false) { } ~SpokenFeedbackAppListTest() override = default; }; @@ -332,10 +340,12 @@ // Tests with feature ProductivityLauncher enabled. class SpokenFeedbackAppListProductivityLauncherTest - : public SpokenFeedbackAppListBaseTest { + : public SpokenFeedbackAppListBaseTest, + public ::testing::WithParamInterface<SpokenFeedbackAppListTestVariant> { public: SpokenFeedbackAppListProductivityLauncherTest() - : SpokenFeedbackAppListBaseTest(/*productivity_launcher_enabled=*/true) {} + : SpokenFeedbackAppListBaseTest(/*variant=*/GetParam(), + /*productivity_launcher_enabled=*/true) {} ~SpokenFeedbackAppListProductivityLauncherTest() override = default; }; @@ -345,14 +355,19 @@ kTestAsGuestUser)); class SpokenFeedbackAppListSearchProductivityLauncherTest - : public SpokenFeedbackAppListProductivityLauncherTest { + : public SpokenFeedbackAppListBaseTest, + public ::testing::WithParamInterface< + std::tuple<SpokenFeedbackAppListTestVariant, bool /*tablet_mode*/>> { public: - SpokenFeedbackAppListSearchProductivityLauncherTest() = default; + SpokenFeedbackAppListSearchProductivityLauncherTest() + : SpokenFeedbackAppListBaseTest(/*variant=*/std::get<0>(GetParam()), + /*productivity_launcher=*/true), + tablet_mode_(std::get<1>(GetParam())) {} ~SpokenFeedbackAppListSearchProductivityLauncherTest() override = default; // SpokenFeedbackAppListProductivityLauncherTest: void SetUpOnMainThread() override { - SpokenFeedbackAppListProductivityLauncherTest::SetUpOnMainThread(); + SpokenFeedbackAppListBaseTest::SetUpOnMainThread(); AppListClientImpl* app_list_client = AppListClientImpl::GetInstance(); @@ -370,22 +385,47 @@ ASSERT_TRUE(apps_provider_); ASSERT_TRUE(web_provider_); app_list_client->SetSearchControllerForTest(std::move(search_controller)); + + ShellTestApi().SetTabletModeEnabledForTest(tablet_mode_); } void TearDownOnMainThread() override { AppListClientImpl::GetInstance()->SetSearchControllerForTest(nullptr); - SpokenFeedbackAppListProductivityLauncherTest::TearDownOnMainThread(); + SpokenFeedbackAppListBaseTest::TearDownOnMainThread(); + } + + void ShowAppList() { + if (tablet_mode_) { + // Minimize the test window to transition to tablet mode home screen. + sm_.Call([this]() { browser()->window()->Minimize(); }); + } else { + // Focus the home button and press it to open the bubble launcher. + sm_.Call([this]() { + EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF)); + }); + sm_.ExpectSpeechPattern("Launcher"); + sm_.ExpectSpeech("Button"); + sm_.ExpectSpeech("Shelf"); + sm_.ExpectSpeech("Tool bar"); + + sm_.Call([this]() { SendKeyPressWithSearch(ui::VKEY_SPACE); }); + } } protected: + // Whether the test runs in tablet mode. + const bool tablet_mode_; + TestSearchProvider* apps_provider_ = nullptr; TestSearchProvider* web_provider_ = nullptr; }; -INSTANTIATE_TEST_SUITE_P(TestAsNormalAndGuestUser, +// Instantiate test by user variant and tablet mode state. +INSTANTIATE_TEST_SUITE_P(TestAsNormalAndGuestUserInTabletAndClamshell, SpokenFeedbackAppListSearchProductivityLauncherTest, - ::testing::Values(kTestAsNormalUser, - kTestAsGuestUser)); + ::testing::Combine(::testing::Values(kTestAsNormalUser, + kTestAsGuestUser), + ::testing::Bool())); // Checks that when an app list item with a notification badge is focused, an // announcement is made that the item requests your attention. @@ -1454,27 +1494,11 @@ sm_.Replay(); } -// This test is flaky on chromeos: http://crbug.com/1300248 -#if BUILDFLAG(IS_CHROMEOS) -#define MAYBE_LauncherSearchInClamshell DISABLED_LauncherSearchInClamshell -#else -#define MAYBE_LauncherSearchInClamshell LauncherSearchInClamshell -#endif IN_PROC_BROWSER_TEST_P(SpokenFeedbackAppListSearchProductivityLauncherTest, - MAYBE_LauncherSearchInClamshell) { + LauncherSearch) { EnableChromeVox(); + ShowAppList(); - // Focus the shelf. This selects the launcher button. - sm_.Call([this]() { - EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF)); - }); - sm_.ExpectSpeechPattern("Launcher"); - sm_.ExpectSpeech("Button"); - sm_.ExpectSpeech("Shelf"); - sm_.ExpectSpeech("Tool bar"); - - // Activate the launcher button. This opens bubble launcher. - sm_.Call([this]() { SendKeyPressWithSearch(ui::VKEY_SPACE); }); sm_.ExpectSpeechPattern("Search your device,*"); sm_.ExpectSpeech("Edit text"); @@ -1538,8 +1562,6 @@ sm_.ExpectSpeech("A"); sm_.ExpectSpeech("app 0"); - sm_.ExpectSpeech("List item 1 of 3"); - sm_.ExpectSpeech("Apps"); // Verify traversal works after result change. for (int i = 1; i < 3; ++i) { @@ -1562,20 +1584,10 @@ } IN_PROC_BROWSER_TEST_P(SpokenFeedbackAppListSearchProductivityLauncherTest, - VocalizeResultCountInClamshell) { + TouchExploreLauncherSearchResult) { EnableChromeVox(); + ShowAppList(); - // Focus the shelf. This selects the launcher button. - sm_.Call([this]() { - EXPECT_TRUE(PerformAcceleratorAction(AcceleratorAction::FOCUS_SHELF)); - }); - sm_.ExpectSpeechPattern("Launcher"); - sm_.ExpectSpeech("Button"); - sm_.ExpectSpeech("Shelf"); - sm_.ExpectSpeech("Tool bar"); - - // Activate the launcher button. This opens bubble launcher. - sm_.Call([this]() { SendKeyPressWithSearch(ui::VKEY_SPACE); }); sm_.ExpectSpeechPattern("Search your device,*"); sm_.ExpectSpeech("Edit text"); @@ -1589,119 +1601,47 @@ sm_.ExpectSpeech("G"); sm_.ExpectSpeech("Displaying 8 results for g"); - // Update the query, to initiate new search. - sm_.Call([this]() { - apps_provider_->set_best_match_count(0); - apps_provider_->set_count(3); - web_provider_->set_count(2); - SendKeyPress(ui::VKEY_A); + base::SimpleTestTickClock clock; + clock.SetNowTicks(base::TimeTicks::Now()); + auto* clock_ptr = &clock; + ui::SetEventTickClockForTesting(clock_ptr); + + auto* root_window = Shell::Get()->GetPrimaryRootWindow(); + ui::test::EventGenerator generator(root_window); + auto* generator_ptr = &generator; + + // Start touch exploration, and go to the third result in the UI (expected to + // be "app 2"). + sm_.Call([clock_ptr, generator_ptr]() { + views::View* target_view = + ash::AppListTestApi().GetVisibleSearchResultView(/*index=*/2); + ASSERT_TRUE(target_view); + + gfx::Point touch_point = target_view->GetBoundsInScreen().CenterPoint(); + ui::TouchEvent touch_press( + ui::ET_TOUCH_PRESSED, touch_point, base::TimeTicks::Now(), + ui::PointerDetails(ui::EventPointerType::kTouch, 0)); + generator_ptr->Dispatch(&touch_press); + + clock_ptr->Advance(base::Seconds(1)); + + ui::TouchEvent touch_move( + ui::ET_TOUCH_MOVED, touch_point, base::TimeTicks::Now(), + ui::PointerDetails(ui::EventPointerType::kTouch, 0)); + generator_ptr->Dispatch(&touch_move); }); - sm_.ExpectSpeech("A"); - sm_.ExpectSpeech("Displaying 5 results for ga"); - + // The result under touch pointer should be announced. + sm_.ExpectSpeech("app 2"); + sm_.ExpectSpeech("List item 1 of 3"); + sm_.ExpectSpeech("Apps"); sm_.Replay(); } IN_PROC_BROWSER_TEST_P(SpokenFeedbackAppListSearchProductivityLauncherTest, - LauncherSearchInTablet) { - ShellTestApi().SetTabletModeEnabledForTest(true); + VocalizeResultCount) { EnableChromeVox(); - - // Minimize the test window to transition to tablet mode home screen. - sm_.Call([this]() { browser()->window()->Minimize(); }); - - sm_.ExpectSpeechPattern("Search your device,*"); - sm_.ExpectSpeech("Edit text"); - - sm_.Call([this]() { - apps_provider_->set_best_match_count(2); - apps_provider_->set_count(3); - web_provider_->set_count(4); - SendKeyPress(ui::VKEY_G); - }); - - sm_.ExpectSpeech("G"); - sm_.ExpectSpeech("app 0"); - sm_.ExpectSpeech("List item 1 of 2"); - sm_.ExpectSpeech("Best Match"); - sm_.ExpectSpeech("List box"); - - // Traverse best match results; - for (int i = 1; i < 2; ++i) { - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech(base::StringPrintf("app %d", i)); - sm_.ExpectSpeech(base::StringPrintf("List item %d of 2", i + 1)); - } - - // Traverse non-best-match app results. - for (int i = 2; i < 5; ++i) { - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech(base::StringPrintf("app %d", i)); - sm_.ExpectSpeech(base::StringPrintf("List item %d of 3", (i - 2) % 3 + 1)); - if (i == 2) { - sm_.ExpectSpeech("Apps"); - sm_.ExpectSpeech("List box"); - } - } - - // Traverse omnibox results. - for (int i = 0; i < 3; ++i) { - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech(base::StringPrintf("item %d", i)); - sm_.ExpectSpeech(base::StringPrintf("List item %d of 3", i + 1)); - if (i == 0) { - sm_.ExpectSpeech("Websites"); - sm_.ExpectSpeech("List box"); - } - } - - // Cycle focus to the close button. - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech("Clear searchbox text"); - - // Go back to the last result. - sm_.Call([this]() { SendKeyPress(ui::VKEY_UP); }); - sm_.ExpectSpeech("item 2"); - - // Update the query, to initiate new search. - sm_.Call([this]() { - apps_provider_->set_best_match_count(0); - apps_provider_->set_count(3); - web_provider_->set_count(2); - SendKeyPress(ui::VKEY_A); - }); - - sm_.ExpectSpeech("A"); - sm_.ExpectSpeech("app 0"); - - // Verify traversal works after result change. - for (int i = 1; i < 3; ++i) { - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech(base::StringPrintf("app %d", i)); - sm_.ExpectSpeech(base::StringPrintf("List item %d of 3", i + 1)); - } - - for (int i = 0; i < 2; ++i) { - sm_.Call([this]() { SendKeyPress(ui::VKEY_DOWN); }); - sm_.ExpectSpeech(base::StringPrintf("item %d", i)); - sm_.ExpectSpeech(base::StringPrintf("List item %d of 2", i + 1)); - if (i == 0) { - sm_.ExpectSpeech("Websites"); - sm_.ExpectSpeech("List box"); - } - } - - sm_.Replay(); -} - -IN_PROC_BROWSER_TEST_P(SpokenFeedbackAppListSearchProductivityLauncherTest, - VocalizeResultCountInTablet) { - ShellTestApi().SetTabletModeEnabledForTest(true); - EnableChromeVox(); - - // Minimize the test window to transition to tablet mode home screen. - sm_.Call([this]() { browser()->window()->Minimize(); }); + ShowAppList(); sm_.ExpectSpeechPattern("Search your device,*"); sm_.ExpectSpeech("Edit text");
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc index f909b47..27249ae 100644 --- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc +++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -27,6 +27,8 @@ #include "ash/system/unified/unified_system_tray.h" #include "base/bind.h" #include "base/command_line.h" +#include "base/task/post_task.h" +#include "base/test/scoped_feature_list.h" #include "base/test/simple_test_tick_clock.h" #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" @@ -1692,4 +1694,56 @@ sm_.Replay(); } +class DeskTemplatesSpokenFeedbackTest : public LoggedInSpokenFeedbackTest { + public: + DeskTemplatesSpokenFeedbackTest() = default; + DeskTemplatesSpokenFeedbackTest(const DeskTemplatesSpokenFeedbackTest&) = + delete; + DeskTemplatesSpokenFeedbackTest& operator=( + const DeskTemplatesSpokenFeedbackTest&) = delete; + ~DeskTemplatesSpokenFeedbackTest() override = default; + + private: + base::test::ScopedFeatureList scoped_feature_list_{features::kDesksTemplates}; +}; + +IN_PROC_BROWSER_TEST_F(DeskTemplatesSpokenFeedbackTest, DeskTemplatesBasic) { + EnableChromeVox(); + + // Enter overview first. This is how we reach the desk templates UI. + sm_.Call([this]() { + (PerformAcceleratorAction(AcceleratorAction::TOGGLE_OVERVIEW)); + }); + + sm_.ExpectSpeech( + "Entered window overview mode. Swipe to navigate, or press tab if using " + "a keyboard."); + + // Reverse tab to focus the save desk as template button. + sm_.Call([this]() { SendKeyPressWithShift(ui::VKEY_TAB); }); + sm_.ExpectSpeechPattern("Save desk as a template"); + sm_.ExpectSpeech("Button"); + + // Hit enter on the save desk as template button. It should take us to the + // templates grid, which triggers an accessibility alert. This should nudge + // the template name view but not say anything extra. + sm_.Call([this]() { SendKeyPress(ui::VKEY_RETURN); }); + sm_.ExpectSpeech("Viewing templates. Press tab to navigate."); + + // The first item in the tab order is the template card, which is a button. It + // has the same name as the desk it was created from, in this case the default + // desk name is "Desk 1". + sm_.Call([this]() { SendKeyPress(ui::VKEY_TAB); }); + sm_.ExpectSpeechPattern("Desk 1"); + sm_.ExpectSpeech("Button"); + + // The next item is the textfield inside the template card, which also has the + // same name as the desk it was created from. + sm_.Call([this]() { SendKeyPress(ui::VKEY_TAB); }); + sm_.ExpectSpeechPattern("Desk 1"); + sm_.ExpectSpeech("Edit text"); + + sm_.Replay(); +} + } // namespace ash
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc index 822db1f..5d6f194 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
@@ -13,7 +13,6 @@ #include "base/system/sys_info.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chrome/browser/ash/attestation/machine_certificate_uploader.h" namespace policy {
diff --git a/chrome/browser/ash/printing/history/print_job_database_impl.cc b/chrome/browser/ash/printing/history/print_job_database_impl.cc index 57bbe8e..ca41f88 100644 --- a/chrome/browser/ash/printing/history/print_job_database_impl.cc +++ b/chrome/browser/ash/printing/history/print_job_database_impl.cc
@@ -12,7 +12,6 @@ #include "base/task/sequenced_task_runner.h" #include "base/task/thread_pool.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "base/time/time.h" #include "chrome/browser/ash/printing/history/print_job_info.pb.h" #include "components/leveldb_proto/public/proto_database_provider.h"
diff --git a/chrome/browser/ash/scanning/scan_service.cc b/chrome/browser/ash/scanning/scan_service.cc index 938ff6099..f6b16610 100644 --- a/chrome/browser/ash/scanning/scan_service.cc +++ b/chrome/browser/ash/scanning/scan_service.cc
@@ -228,8 +228,6 @@ scanning::mojom::ScanSettingsPtr settings, mojo::PendingRemote<scanning::mojom::ScanJobObserver> observer, StartMultiPageScanCallback callback) { - DCHECK( - base::FeatureList::IsEnabled(chromeos::features::kScanAppMultiPageScan)); if (multi_page_controller_receiver_.is_bound()) { LOG(ERROR) << "Unable to start multi-page scan, controller already bound."; std::move(callback).Run(mojo::NullRemote());
diff --git a/chrome/browser/ash/scanning/scan_service_unittest.cc b/chrome/browser/ash/scanning/scan_service_unittest.cc index 153e6df..46883b2 100644 --- a/chrome/browser/ash/scanning/scan_service_unittest.cc +++ b/chrome/browser/ash/scanning/scan_service_unittest.cc
@@ -10,7 +10,6 @@ #include <string> #include <vector> -#include "ash/constants/ash_features.h" #include "ash/webui/scanning/mojom/scanning.mojom-test-utils.h" #include "ash/webui/scanning/mojom/scanning.mojom.h" #include "ash/webui/scanning/scanning_uma.h" @@ -21,7 +20,6 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "base/unguessable_token.h" @@ -403,7 +401,6 @@ ash::FakeChromeUserManager* const user_manager_; user_manager::ScopedUserManager user_manager_owner_; std::unique_ptr<ScanService> scan_service_; - base::test::ScopedFeatureList scoped_feature_list_; private: mojo::Remote<mojo_ipc::ScanService> scan_service_remote_; @@ -790,8 +787,6 @@ // Test that a multi-page scan can be performed successfully. TEST_F(ScanServiceTest, MultiPageScan) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -847,8 +842,6 @@ // Test that when a multi-page scan fails, the scan job is marked as failed. TEST_F(ScanServiceTest, MultiPageScanFails) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -888,9 +881,6 @@ // Test that attempting to start a second multi-page scan while another // multi-page scan session is going will fail. TEST_F(ScanServiceTest, StartingAnotherMultiPageScan) { - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); - fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); const std::vector<std::string> scan_data = {CreatePng()}; @@ -917,8 +907,6 @@ // images. TEST_F(ScanServiceTest, MultiPageScanRemoveWithTwoPages) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -964,8 +952,6 @@ // images. TEST_F(ScanServiceTest, MultiPageScanRemoveWithThreePages) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -1018,8 +1004,6 @@ // multi-page scan session is reset and a new session can be started. TEST_F(ScanServiceTest, MultiPageScanRemoveLastPage) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -1063,8 +1047,6 @@ // one scanned image. TEST_F(ScanServiceTest, MultiPageScanRescanWithOnePage) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName}); @@ -1109,8 +1091,6 @@ // three scanned images. TEST_F(ScanServiceTest, MultiPageScanRescanWithThreePages) { base::HistogramTester histogram_tester; - scoped_feature_list_.InitWithFeatures( - {chromeos::features::kScanAppMultiPageScan}, {}); fake_lorgnette_scanner_manager_.SetGetScannerNamesResponse( {kFirstTestScannerName});
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_integration_browsertest.cc index 898bb93..adf2ae0 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_integration_browsertest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_integration_browsertest.cc
@@ -12,6 +12,7 @@ #include "ash/webui/personalization_app/personalization_app_url_constants.h" #include "base/callback.h" #include "base/files/file_path.h" +#include "base/memory/raw_ptr.h" #include "base/path_service.h" #include "base/run_loop.h" #include "base/scoped_observation.h" @@ -35,6 +36,8 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/aura/window.h" +#include "ui/aura/window_observer.h" +#include "ui/base/class_property.h" #include "ui/compositor/layer.h" #include "ui/display/test/display_manager_test_api.h" #include "ui/gfx/geometry/rect.h" @@ -121,6 +124,53 @@ << error_bounding_rect.ToString(); } +template <typename T> +class WindowPropertyWaiter : public aura::WindowObserver { + public: + WindowPropertyWaiter(aura::Window* window, const ui::ClassProperty<T>* key) + : window_(window), key_(key) {} + ~WindowPropertyWaiter() override = default; + + void Wait() { + base::RunLoop loop; + quit_closure_ = loop.QuitClosure(); + + make_transparent_observation_.Observe(window_); + + loop.Run(); + } + + void OnWindowPropertyChanged(aura::Window* window, + const void* key, + intptr_t old) override { + if (key != key_) { + return; + } + + if (quit_closure_) { + std::move(quit_closure_).Run(); + make_transparent_observation_.Reset(); + } + } + + private: + base::ScopedObservation<aura::Window, aura::WindowObserver> + make_transparent_observation_{this}; + base::OnceClosure quit_closure_; + aura::Window* window_; + const raw_ptr<const ui::ClassProperty<T>> key_; +}; + +void CallJavascriptAndWaitForPropertyChange(content::WebContents* web_contents, + const std::u16string& javascript) { + WindowPropertyWaiter<bool> window_property_waiter( + web_contents->GetTopLevelNativeWindow(), + chromeos::kWindowManagerManagesOpacityKey); + web_contents->GetMainFrame()->ExecuteJavaScriptForTests(javascript, + base::DoNothing()); + window_property_waiter.Wait(); +} + class WallpaperChangeWaiter : public ash::WallpaperControllerObserver { public: WallpaperChangeWaiter() = default; @@ -240,6 +290,9 @@ Browser* browser; content::WebContents* web_contents = LaunchAppAtWallpaperSubpage(&browser); + CallJavascriptAndWaitForPropertyChange( + web_contents, u"personalizationTestApi.makeTransparent();"); + EXPECT_TRUE(web_contents->GetTopLevelNativeWindow()->GetTransparent()); EXPECT_FALSE(web_contents->GetTopLevelNativeWindow()->GetProperty( chromeos::kWindowManagerManagesOpacityKey)); @@ -252,6 +305,9 @@ content::WebContents* web_contents = LaunchAppAtWallpaperSubpage(&browser); aura::Window* window = web_contents->GetTopLevelNativeWindow(); + CallJavascriptAndWaitForPropertyChange( + web_contents, u"personalizationTestApi.makeTransparent();"); + ash::WindowBackdrop* window_backdrop = ash::WindowBackdrop::Get(window); EXPECT_EQ(ash::WindowBackdrop::BackdropMode::kDisabled, window_backdrop->mode()); @@ -265,6 +321,9 @@ Browser* browser; content::WebContents* web_contents = LaunchAppAtWallpaperSubpage(&browser); + CallJavascriptAndWaitForPropertyChange( + web_contents, u"personalizationTestApi.makeTransparent();"); + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser); EXPECT_EQ(SK_ColorTRANSPARENT, browser_view->contents_web_view()->GetBackground()->get_color()); @@ -301,6 +360,9 @@ Browser* browser; content::WebContents* web_contents = LaunchAppAtWallpaperSubpage(&browser); + CallJavascriptAndWaitForPropertyChange( + web_contents, u"personalizationTestApi.makeTransparent();"); + WallpaperChangeWaiter wallpaper_changer; wallpaper_changer.SetWallpaperAndWait();
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc index c91ce37a..b70d2c0 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
@@ -138,6 +138,18 @@ ->SetBackgroundVisible(false); } +void PersonalizationAppWallpaperProviderImpl::MakeOpaque() { + auto* web_contents = web_ui_->GetWebContents(); + + // Reversing `contents_web_view` is sufficient to make the view opaque, + // as `window_backdrop`, `top_level_window` and `web_contents` are not + // highly impactful to the animated theme change effect. + static_cast<ContentsWebView*>(BrowserView::GetBrowserViewForNativeWindow( + web_contents->GetTopLevelNativeWindow()) + ->contents_web_view()) + ->SetBackgroundVisible(true); +} + void PersonalizationAppWallpaperProviderImpl::FetchCollections( FetchCollectionsCallback callback) { pending_collections_callbacks_.push_back(std::move(callback));
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h index 324b721..8618c42 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
@@ -86,6 +86,11 @@ // see the chosen wallpaper. This is safe to call multiple times in a row. void MakeTransparent() override; + // Configure the window to be opaque so that after exiting the "full screen + // preview" mode, the transparent background will be reversed. This is safe + // to call multiple times in a row. + void MakeOpaque() override; + void FetchCollections(FetchCollectionsCallback callback) override; void FetchImagesForCollection(
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.cc index 40a3224..00f0d5f9f 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.cc
@@ -36,10 +36,13 @@ ? l10n_util::GetStringUTF16( IDS_PERSONALIZATION_APP_PERSONALIZATION_HUB_TITLE) : l10n_util::GetStringUTF16(IDS_PERSONALIZATION_APP_WALLPAPER_LABEL); - web_app::CreateIconInfoForSystemWebApp( - info->start_url, - {{"app_icon_192.png", 192, IDR_ASH_PERSONALIZATION_APP_ICON_192_PNG}}, - *info); + std::initializer_list<web_app::IconResourceInfo> icons = { + {"app_icon_192.png", 192, IDR_ASH_PERSONALIZATION_APP_ICON_192_PNG}}; + if (ash::features::IsPersonalizationHubEnabled()) { + icons = {{"app_hub_icon_192.png", 192, + IDR_ASH_PERSONALIZATION_APP_HUB_ICON_192_PNG}}; + } + web_app::CreateIconInfoForSystemWebApp(info->start_url, icons, *info); info->display_mode = blink::mojom::DisplayMode::kStandalone; info->user_display_mode = blink::mojom::DisplayMode::kStandalone; @@ -61,3 +64,7 @@ bool PersonalizationSystemAppDelegate::ShouldShowInLauncher() const { return false; } + +bool PersonalizationSystemAppDelegate::ShouldAnimateThemeChanges() const { + return true; +}
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.h b/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.h index d40c132f..65fc2213 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.h +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_system_app_delegate.h
@@ -22,6 +22,7 @@ bool ShouldCaptureNavigations() const override; bool IsAppEnabled() const override; bool ShouldShowInLauncher() const override; + bool ShouldAnimateThemeChanges() const override; }; // Return a WebAppInstallInfo used to install the app.
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc index 99b727d7..1c55f0a 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -3025,7 +3025,8 @@ HistoryServiceFactory::GetForProfileWithoutCreating(profile); // Create a safe_browsing::VerdictCacheManager that will handle deletion of // ContentSettingsType::PASSWORD_PROTECTION entries. - safe_browsing::VerdictCacheManager sb_cache_manager(history_service, map); + safe_browsing::VerdictCacheManager sb_cache_manager(history_service, map, + profile->GetPrefs()); GURL url("https://example.com");
diff --git a/chrome/browser/cart/commerce_hint_service.cc b/chrome/browser/cart/commerce_hint_service.cc index 770f832..b182bc869 100644 --- a/chrome/browser/cart/commerce_hint_service.cc +++ b/chrome/browser/cart/commerce_hint_service.cc
@@ -166,6 +166,14 @@ std::move(callback).Run(should_skip, std::move(ptr)); } + void OnCartExtraction(OnCartExtractionCallback callback) override { + std::move(callback).Run( + commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetProductIDExtractionJSON(), + commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetCartProductExtractionScript()); + } + private: GURL binding_url_; base::WeakPtr<CommerceHintService> service_;
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc index fcc5afb6..2fb4bb7 100644 --- a/chrome/browser/chrome_browser_interface_binders.cc +++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -884,20 +884,16 @@ task_module::mojom::TaskModuleHandler, NewTabPageUI>(map); } - if (reading_list::switches::IsReadingListEnabled()) { - RegisterWebUIControllerInterfaceBinder< - read_later::mojom::PageHandlerFactory, ReadLaterUI>(map); - } + RegisterWebUIControllerInterfaceBinder<read_later::mojom::PageHandlerFactory, + ReadLaterUI>(map); - if (base::FeatureList::IsEnabled(features::kSidePanel)) { - if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) { - RegisterWebUIControllerInterfaceBinder< - side_panel::mojom::BookmarksPageHandlerFactory, BookmarksSidePanelUI>( - map); - } else { - RegisterWebUIControllerInterfaceBinder< - side_panel::mojom::BookmarksPageHandlerFactory, ReadLaterUI>(map); - } + if (base::FeatureList::IsEnabled(features::kUnifiedSidePanel)) { + RegisterWebUIControllerInterfaceBinder< + side_panel::mojom::BookmarksPageHandlerFactory, BookmarksSidePanelUI>( + map); + } else { + RegisterWebUIControllerInterfaceBinder< + side_panel::mojom::BookmarksPageHandlerFactory, ReadLaterUI>(map); } if (features::IsReadAnythingEnabled()) {
diff --git a/chrome/browser/chromeos/extensions/default_app_order.cc b/chrome/browser/chromeos/extensions/default_app_order.cc index d4440a30..4c4769ba 100644 --- a/chrome/browser/chromeos/extensions/default_app_order.cc +++ b/chrome/browser/chromeos/extensions/default_app_order.cc
@@ -15,7 +15,6 @@ #include "base/json/json_file_value_serializer.h" #include "base/path_service.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "chrome/browser/ash/file_manager/app_id.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
diff --git a/chrome/browser/device_identity/device_oauth2_token_service.cc b/chrome/browser/device_identity/device_oauth2_token_service.cc index ead85c9e..341715a 100644 --- a/chrome/browser/device_identity/device_oauth2_token_service.cc +++ b/chrome/browser/device_identity/device_oauth2_token_service.cc
@@ -13,7 +13,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/device_identity/device_oauth2_token_store.h" #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/devtools/device/android_device_manager.cc b/chrome/browser/devtools/device/android_device_manager.cc index 20f9353..d4d81f0 100644 --- a/chrome/browser/devtools/device/android_device_manager.cc +++ b/chrome/browser/devtools/device/android_device_manager.cc
@@ -20,7 +20,6 @@ #include "base/task/thread_pool.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chrome/browser/devtools/device/usb/usb_device_manager_helper.h" #include "chrome/browser/devtools/device/usb/usb_device_provider.h" #include "content/public/browser/browser_task_traits.h"
diff --git a/chrome/browser/download/download_status_updater.cc b/chrome/browser/download/download_status_updater.cc index 80ac006..3c126c2a4 100644 --- a/chrome/browser/download/download_status_updater.cc +++ b/chrome/browser/download/download_status_updater.cc
@@ -105,7 +105,8 @@ // Ignore downloads loaded from history, which are in a terminal state. // TODO(benjhayden): Use the Observer interface to distinguish between // historical and started downloads. - if (item->GetState() == download::DownloadItem::IN_PROGRESS) { + if (item->GetState() == download::DownloadItem::IN_PROGRESS && + !item->IsTransient()) { UpdateAppIconDownloadProgress(item); new WasInProgressData(item); } @@ -116,7 +117,8 @@ void DownloadStatusUpdater::OnDownloadUpdated(content::DownloadManager* manager, download::DownloadItem* item) { UpdatePrefsOnDownloadUpdated(manager, item); - if (item->GetState() == download::DownloadItem::IN_PROGRESS) { + if (item->GetState() == download::DownloadItem::IN_PROGRESS && + !item->IsTransient()) { // If the item was interrupted/cancelled and then resumed/restarted, then // set WasInProgress so that UpdateAppIconDownloadProgress() will be called // when it completes.
diff --git a/chrome/browser/download/download_status_updater_unittest.cc b/chrome/browser/download/download_status_updater_unittest.cc index 53d7a93..7d995dff 100644 --- a/chrome/browser/download/download_status_updater_unittest.cc +++ b/chrome/browser/download/download_status_updater_unittest.cc
@@ -135,6 +135,7 @@ download::DownloadItem::DownloadState state = i < in_progress_count ? download::DownloadItem::IN_PROGRESS : download::DownloadItem::CANCELLED; + EXPECT_CALL(*item, IsTransient()).WillRepeatedly(Return(false)); EXPECT_CALL(*item, GetState()).WillRepeatedly(Return(state)); manager_items_[manager_index].push_back(item.get()); all_owned_items_.push_back(std::move(item)); @@ -444,3 +445,27 @@ EXPECT_EQ(current_time + base::Hours(2), download_prefs->GetLastCompleteTime()); } + +// Tests that transient download will not trigger any updates. +TEST_F(DownloadStatusUpdaterTest, TransientDownload) { + SetupManagers(/*manager_count=*/1); + AddItems(/*manager_index=*/0, /*item_count=*/2, /*in_progress_count=*/0); + LinkManager(0); + + std::unique_ptr<download::MockDownloadItem> item = + std::make_unique<StrictMock<download::MockDownloadItem>>(); + + EXPECT_CALL(*item, GetState()) + .WillRepeatedly(Return(download::DownloadItem::IN_PROGRESS)); + EXPECT_CALL(*item, IsTransient()).WillRepeatedly(Return(true)); + manager_items_[0].push_back(item.get()); + all_owned_items_.push_back(std::move(item)); + manager_observers_[0]->OnDownloadCreated( + managers_[0].get(), manager_items_[0][manager_items_[0].size() - 1]); + + float progress = -1; + int download_count = -1; + EXPECT_TRUE(updater_->GetProgress(&progress, &download_count)); + EXPECT_FLOAT_EQ(0.0f, progress); + EXPECT_EQ(0, download_count); +}
diff --git a/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc b/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc index f81d833..f45985e 100644 --- a/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc +++ b/chrome/browser/enterprise/connectors/enterprise_connectors_policy_handler_unittest.cc
@@ -129,6 +129,7 @@ if (policy_scope()) EXPECT_EQ(policy_is_set, prefs.GetInteger(policy_scope(), &pref_scope)); + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. auto* value_set_in_map = policy_map.GetValueUnsafe(kPolicyName); if (value_set_in_map) { ASSERT_EQ(*value_set_in_map, *value_set_in_pref);
diff --git a/chrome/browser/enterprise/reporting/extension_request/extension_request_policy_handler.cc b/chrome/browser/enterprise/reporting/extension_request/extension_request_policy_handler.cc index cf79cebc..ff2ce27 100644 --- a/chrome/browser/enterprise/reporting/extension_request/extension_request_policy_handler.cc +++ b/chrome/browser/enterprise/reporting/extension_request/extension_request_policy_handler.cc
@@ -26,9 +26,7 @@ bool ExtensionRequestPolicyHandler::CheckPolicySettings( const policy::PolicyMap& policies, policy::PolicyErrorMap* errors) { - // |GetValueUnsafe| is used to differentiate between the policy value being - // unset vs being set with an incorrect type. - if (!policies.GetValueUnsafe(policy_name())) + if (!policies.IsPolicySet(policy_name())) return true; if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors)) return false;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index 43bfaef..3c785b90 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -23,7 +23,7 @@ #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/common/extensions/api/passwords_private.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/extensions/native_bindings_apitest.cc b/chrome/browser/extensions/native_bindings_apitest.cc index aa5b79d7..f4f26614 100644 --- a/chrome/browser/extensions/native_bindings_apitest.cc +++ b/chrome/browser/extensions/native_bindings_apitest.cc
@@ -7,6 +7,7 @@ #include "base/command_line.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu_test_util.h" @@ -20,6 +21,7 @@ #include "extensions/browser/event_router.h" #include "extensions/browser/extension_action.h" #include "extensions/browser/extension_action_manager.h" +#include "extensions/browser/extension_function_histogram_value.h" #include "extensions/browser/extension_host_test_helper.h" #include "extensions/browser/extension_util.h" #include "extensions/browser/process_manager.h" @@ -322,6 +324,7 @@ // End-to-end test for promise support on bindings for MV3 extensions, using a // few tabs APIs. Also ensures callbacks still work for the API as expected. IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, PromiseBasedAPI) { + base::HistogramTester histogram_tester; ASSERT_TRUE(StartEmbeddedTestServer()); TestExtensionDir test_dir; @@ -460,12 +463,25 @@ ResultCatcher catcher; ASSERT_TRUE(LoadExtension(test_dir.UnpackedPath())); ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); + + // The above test makes 2 calls to chrome.tabs.create, so check that those + // have been logged in the histograms we expect them to be. + EXPECT_EQ(2, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionCalls", + functions::HistogramValue::TABS_CREATE)); + EXPECT_EQ(2, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionServiceWorkerCalls", + functions::HistogramValue::TABS_CREATE)); + EXPECT_EQ(2, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionMV3Calls", + functions::HistogramValue::TABS_CREATE)); } // Tests that calling an API which supports promises using an MV2 extension does // not get a promise based return and still needs to use callbacks when // required. IN_PROC_BROWSER_TEST_F(NativeBindingsApiTest, MV2PromisesNotSupported) { + base::HistogramTester histogram_tester; ASSERT_TRUE(StartEmbeddedTestServer()); TestExtensionDir test_dir; @@ -555,6 +571,19 @@ ResultCatcher catcher; ASSERT_TRUE(LoadExtension(test_dir.UnpackedPath())); ASSERT_TRUE(catcher.GetNextResult()) << catcher.message(); + + // The above test makes 2 calls to chrome.tabs.create, so check that those + // have been logged in the histograms we expect, but not to the histograms + // specifcally tracking service worker and MV3 calls. + EXPECT_EQ(2, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionCalls", + functions::HistogramValue::TABS_CREATE)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionServiceWorkerCalls", + functions::HistogramValue::TABS_CREATE)); + EXPECT_EQ(0, histogram_tester.GetBucketCount( + "Extensions.Functions.ExtensionMV3Calls", + functions::HistogramValue::TABS_CREATE)); } IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/browser/first_run/first_run_internal_win.cc b/chrome/browser/first_run/first_run_internal_win.cc index 28bfd4d..3e7bd543 100644 --- a/chrome/browser/first_run/first_run_internal_win.cc +++ b/chrome/browser/first_run/first_run_internal_win.cc
@@ -21,7 +21,6 @@ #include "base/process/process.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h"
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 7962182..cfd4e76 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -535,11 +535,6 @@ "expiry_milestone": 102 }, { - "name": "autofill-use-renderer-ids", - "owners": [ "kazinova@google.com" ], - "expiry_milestone": 96 - }, - { "name": "autofill-visual-improvements-for-suggestion-ui", "owners": [ "koerber", "vasilii" ], "expiry_milestone": 103 @@ -2938,6 +2933,11 @@ "expiry_milestone": 92 }, { + "name": "enable-web-authentication-passkeys-ui-experiment", + "owners": [ "agl" ], + "expiry_milestone": 103 + }, + { "name": "enable-web-bluetooth", "owners": [ "web-bluetooth@google.com" ], "expiry_milestone": 110 @@ -3104,8 +3104,8 @@ }, { "name": "enhanced-network-voices", - "owners": ["joelriley@google.com", "leileilei@google.com"], - "expiry_milestone": 100 + "owners": ["joelriley@google.com", "ajitnarayanan@google.com"], + "expiry_milestone": 110 }, { "name": "esim-policy", @@ -4579,7 +4579,7 @@ { "name": "optimization-guide-push-notifications", "owners": [ "robertogden", "chrome-intelligence-core@google.com" ], - "expiry_milestone": 100 + "expiry_milestone": 103 }, { "name": "origin-agent-cluster-default", @@ -5032,11 +5032,6 @@ "expiry_milestone": 102 }, { - "name": "read-later-new-badge-promo", - "owners": [ "chrome-desktop-ui-sea@google.com", "corising" ], - "expiry_milestone": 93 - }, - { "name": "read-later-reminder-notification", "owners": [ "wylieb" ], "expiry_milestone": 102 @@ -5189,11 +5184,6 @@ "expiry_milestone": 105 }, { - "name": "scan-app-multi-page-scan", - "owners": [ "gavinwill", "cros-peripherals@google.com" ], - "expiry_milestone": 112 - }, - { "name": "scheduler-configuration", "owners": [ "kerrnel", "mnissler" ], // This flag never expires because some users need to override CPU security @@ -5390,8 +5380,8 @@ }, { "name": "show-metered-toggle", - "owners": [ "stevenjb" ], - "expiry_milestone": 100 + "owners": [ "stevenjb", "azeemarshad", "cros-connectivity@google.com" ], + "expiry_milestone": 106 }, { "name": "show-overdraw-feedback",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 85ab2f0..147e6d16 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1267,6 +1267,11 @@ "Enable the ChromeOS platform authenticator for the Web Authentication " "API."; +const char kEnableWebAuthenticationPasskeysUIExperimentName[] = + "Passkeys UI exploration"; +const char kEnableWebAuthenticationPasskeysUIExperimentDescription[] = + "Enable some experimental tweaks to the WebAuthn UI for passkeys."; + const char kEnableZeroCopyTabCaptureName[] = "Zero-copy tab capture"; const char kEnableZeroCopyTabCaptureDescription[] = "Enable zero-copy content tab for getDisplayMedia() APIs."; @@ -2176,11 +2181,6 @@ "lacros-chrome browser's notification permission page " "and the ChromeOS settings app."; -const char kReadLaterNewBadgePromoName[] = "Reading list 'New' badge promo"; -const char kReadLaterNewBadgePromoDescription[] = - "Causes a 'New' badge to appear on the entry point for adding to the " - "reading list in the tab context menu."; - const char kRecordWebAppDebugInfoName[] = "Record web app debug info"; const char kRecordWebAppDebugInfoDescription[] = "Enables recording additional web app related debugging data to be " @@ -2274,12 +2274,6 @@ const char kShoppingListName[] = "Shopping List"; const char kShoppingListDescription[] = "Enable shopping list in bookmarks."; -const char kSidePanelFlagId[] = "side-panel"; -const char kSidePanelName[] = "Side panel"; -const char kSidePanelDescription[] = - "Enables a browser-level side panel for a useful and persistent way to " - "access your Reading List and Bookmarks."; - const char kSidePanelDragAndDropFlagId[] = "side-panel-drag-and-drop"; const char kSidePanelDragAndDropName[] = "Side panel drag and drop"; const char kSidePanelDragAndDropDescription[] = @@ -3856,12 +3850,6 @@ "Match very short input words to beginning of words in bookmark " "suggestions."; -const char kReadLaterFlagId[] = "read-later"; -const char kReadLaterName[] = "Reading List"; -const char kReadLaterDescription[] = - "Click on the Bookmark icon or right click on a tab to add tabs to a " - "reading list."; - const char kScreenAIName[] = "Screen AI"; const char kScreenAIDescription[] = "Enables Screen AI local machine intelligence library to use the screen " @@ -5180,11 +5168,6 @@ "Forces the continue section of the app launcher to show. If there are no " "file suggestions available, the suggestions will be faked."; -const char kReduceDisplayNotificationsName[] = "Reduce display notifications"; -const char kReduceDisplayNotificationsDescription[] = - "If enabled, notifications for display rotation, display removed, display " - "mirroring, and display extending will be suppressed."; - const char kReleaseNotesNotificationAllChannelsName[] = "Release Notes Notification All Channels"; const char kReleaseNotesNotificationAllChannelsDescription[] = @@ -5204,11 +5187,6 @@ "Enables the input overlay feature for some Android game apps, " "so it can play with a keyboard and a mouse instead of touch screen"; -const char kScanAppMultiPageScanName[] = - "Enable multi-page scanning in Scan app"; -const char kScanAppMultiPageScanDescription[] = - "Enables creating a single PDF file from multiple flatbed scans"; - const char kSecondaryGoogleAccountUsageName[] = "Enable Secondary Google account usage policy."; const char kSecondaryGoogleAccountUsageDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 37c386ad..f917fdf7 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -710,6 +710,9 @@ extern const char kEnableWebAuthenticationChromeOSAuthenticatorName[]; extern const char kEnableWebAuthenticationChromeOSAuthenticatorDescription[]; +extern const char kEnableWebAuthenticationPasskeysUIExperimentName[]; +extern const char kEnableWebAuthenticationPasskeysUIExperimentDescription[]; + extern const char kEnableZeroCopyTabCaptureName[]; extern const char kEnableZeroCopyTabCaptureDescription[]; @@ -1229,9 +1232,6 @@ extern const char kReadLaterName[]; extern const char kReadLaterDescription[]; -extern const char kReadLaterNewBadgePromoName[]; -extern const char kReadLaterNewBadgePromoDescription[]; - extern const char kRecordWebAppDebugInfoName[]; extern const char kRecordWebAppDebugInfoDescription[]; @@ -1284,10 +1284,6 @@ extern const char kShoppingListName[]; extern const char kShoppingListDescription[]; -extern const char kSidePanelFlagId[]; -extern const char kSidePanelName[]; -extern const char kSidePanelDescription[]; - extern const char kSidePanelDragAndDropFlagId[]; extern const char kSidePanelDragAndDropName[]; extern const char kSidePanelDragAndDropDescription[]; @@ -2977,9 +2973,6 @@ extern const char kForceShowContinueSectionName[]; extern const char kForceShowContinueSectionDescription[]; -extern const char kReduceDisplayNotificationsName[]; -extern const char kReduceDisplayNotificationsDescription[]; - extern const char kReleaseNotesNotificationAllChannelsName[]; extern const char kReleaseNotesNotificationAllChannelsDescription[]; @@ -2992,9 +2985,6 @@ extern const char kArcInputOverlayName[]; extern const char kArcInputOverlayDescription[]; -extern const char kScanAppMultiPageScanName[]; -extern const char kScanAppMultiPageScanDescription[]; - extern const char kSecondaryGoogleAccountUsageName[]; extern const char kSecondaryGoogleAccountUsageDescription[];
diff --git a/chrome/browser/lacros/lacros_prefs.cc b/chrome/browser/lacros/lacros_prefs.cc index 61ca315..6e09f6f 100644 --- a/chrome/browser/lacros/lacros_prefs.cc +++ b/chrome/browser/lacros/lacros_prefs.cc
@@ -13,9 +13,14 @@ const char kShowedExperimentalBannerPref[] = "lacros.showed_experimental_banner"; +const char kPrimaryProfileFirstRunFinished[] = + "lacros.primary_profile_first_run_finished"; + void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(kShowedExperimentalBannerPref, /*default_value=*/false); + registry->RegisterBooleanPref(kPrimaryProfileFirstRunFinished, + /*default_value=*/false); } void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
diff --git a/chrome/browser/lacros/lacros_prefs.h b/chrome/browser/lacros/lacros_prefs.h index 4705edcb..cf6bcc3 100644 --- a/chrome/browser/lacros/lacros_prefs.h +++ b/chrome/browser/lacros/lacros_prefs.h
@@ -17,6 +17,10 @@ // been shown to the user. extern const char kShowedExperimentalBannerPref[]; +// Boolean which indicates whether the user finished the Lacros First Run +// Experience. +extern const char kPrimaryProfileFirstRunFinished[]; + // Local state prefs are also known as browser-wide prefs. This function // registers Lacros-related local state prefs. void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
diff --git a/chrome/browser/local_discovery/service_discovery_client_mac.h b/chrome/browser/local_discovery/service_discovery_client_mac.h index 2058d07..49fd3a39 100644 --- a/chrome/browser/local_discovery/service_discovery_client_mac.h +++ b/chrome/browser/local_discovery/service_discovery_client_mac.h
@@ -13,7 +13,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chrome/browser/local_discovery/service_discovery_shared_client.h" namespace base {
diff --git a/chrome/browser/media/webrtc/capture_policy_utils.cc b/chrome/browser/media/webrtc/capture_policy_utils.cc index e6115cf..2d1c353 100644 --- a/chrome/browser/media/webrtc/capture_policy_utils.cc +++ b/chrome/browser/media/webrtc/capture_policy_utils.cc
@@ -6,12 +6,17 @@ #include "base/containers/cxx20_erase_vector.h" #include "build/build_config.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "components/content_settings/browser/page_specific_content_settings.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/web_contents.h" +#include "url/gurl.h" #include "url/origin.h" #if !BUILDFLAG(IS_ANDROID) @@ -101,6 +106,30 @@ return AllowedScreenCaptureLevel::kDisallowed; } +bool IsGetDisplayMediaSetSelectAllScreensAllowed( + content::BrowserContext* context, + const GURL& url) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_ASH) + Profile* profile = Profile::FromBrowserContext(context); + if (!profile) + return false; + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(profile); + if (!host_content_settings_map) + return false; + const base::Value auto_accept_enabled = + host_content_settings_map->GetWebsiteSetting( + url, url, + ContentSettingsType::GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, + /*info=*/nullptr); + return auto_accept_enabled.is_int() && + auto_accept_enabled.GetInt() == ContentSetting::CONTENT_SETTING_ALLOW; +#else + // This API is currently only available on ChromeOS. + return false; +#endif +} + DesktopMediaList::WebContentsFilter GetIncludableWebContentsFilter( const GURL& request_origin, AllowedScreenCaptureLevel capture_level) {
diff --git a/chrome/browser/media/webrtc/capture_policy_utils.h b/chrome/browser/media/webrtc/capture_policy_utils.h index 2c0793c..c883b34 100644 --- a/chrome/browser/media/webrtc/capture_policy_utils.h +++ b/chrome/browser/media/webrtc/capture_policy_utils.h
@@ -13,6 +13,7 @@ class PrefService; namespace content { +class BrowserContext; class WebContents; } @@ -58,6 +59,11 @@ AllowedScreenCaptureLevel capture_level); void ShowCaptureTerminatedDialog(content::WebContents* contents); + +bool IsGetDisplayMediaSetSelectAllScreensAllowed( + content::BrowserContext* context, + const GURL& url); + } // namespace capture_policy #endif // CHROME_BROWSER_MEDIA_WEBRTC_CAPTURE_POLICY_UTILS_H_
diff --git a/chrome/browser/media/webrtc/multi_capture_browsertest.cc b/chrome/browser/media/webrtc/multi_capture_browsertest.cc new file mode 100644 index 0000000..958d2e8 --- /dev/null +++ b/chrome/browser/media/webrtc/multi_capture_browsertest.cc
@@ -0,0 +1,274 @@ +// Copyright 2022 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 <string> + +#include "base/values.h" +#include "chrome/browser/media/webrtc/capture_policy_utils.h" +#include "chrome/browser/media/webrtc/webrtc_browsertest_base.h" +#include "chrome/browser/policy/policy_test_utils.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/common/pref_names.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/ui_test_utils.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_pref_names.h" +#include "components/policy/core/common/policy_types.h" +#include "components/policy/policy_constants.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/origin.h" + +#if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_CHROMEOS_ASH) +#define MULTI_CAPTURE_SUPPORTED_ON_PLATFORM true +#else +#define MULTI_CAPTURE_SUPPORTED_ON_PLATFORM false +#endif + +class SelectAllScreensTest : public InProcessBrowserTest { + public: + SelectAllScreensTest() = default; + ~SelectAllScreensTest() override = default; + + SelectAllScreensTest(const SelectAllScreensTest&) = delete; + SelectAllScreensTest& operator=(const SelectAllScreensTest&) = delete; + + void SetUpInProcessBrowserTestFixture() override { + provider_.SetDefaultReturns( + true /* is_initialization_complete_return */, + true /* is_first_policy_load_complete_return */); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); + SetUpGeneralMockExpectations(); + } + + void SetUpGeneralMockExpectations() { + testing::ExpectationSet allowed_initial_calls; + allowed_initial_calls += + EXPECT_CALL(provider_, IsInitializationComplete(testing::_)) + .Times(testing::AnyNumber()); + allowed_initial_calls += + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete(testing::_)) + .Times(testing::AnyNumber()); + EXPECT_CALL(initialization_end_checkpoint, Call()) + .After(allowed_initial_calls); + } + + protected: + testing::MockFunction<void()> initialization_end_checkpoint; + testing::StrictMock<policy::MockConfigurationPolicyProvider> provider_; +}; + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensDisabledByDefault) { + initialization_end_checkpoint.Call(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + EXPECT_FALSE(capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), GURL(""))); +} + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensDisabledWithEmptyPolicy) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(base::Value::List()), nullptr); + provider_.UpdateChromePolicy(policies); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + EXPECT_FALSE(capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), GURL(""))); +} + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensEnabledWithCorrectUrl) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + base::Value::List allowed_origins; + allowed_origins.Append(base::Value("https://www.chromium.org")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + + base::RunLoop().RunUntilIdle(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + const bool multi_capture_allowed = + capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://www.chromium.org")); + EXPECT_EQ(multi_capture_allowed, MULTI_CAPTURE_SUPPORTED_ON_PLATFORM); +} + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensEnabledWithCorrectUrlWildcard) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + base::Value::List allowed_origins; + allowed_origins.Append(base::Value("[*.]chromium.org")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + + base::RunLoop().RunUntilIdle(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + const bool multi_capture_allowed = + capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://sub.chromium.org")); + EXPECT_EQ(multi_capture_allowed, MULTI_CAPTURE_SUPPORTED_ON_PLATFORM); +} + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensDisabledWithWrongUrlWildCard) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + base::Value::List allowed_origins; + allowed_origins.Append(base::Value("[*.]chrome.org")); + allowed_origins.Append(base::Value("[*.]chromium.com")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + + base::RunLoop().RunUntilIdle(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + EXPECT_FALSE(capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://www.chromium.org"))); +} + +IN_PROC_BROWSER_TEST_F(SelectAllScreensTest, + SelectAllScreensEnabledWithMultipleAllowedOrigins) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + base::Value::List allowed_origins; + allowed_origins.Append(base::Value("[*.]chrome.org")); + allowed_origins.Append(base::Value("[*.]chromium.org")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + + base::RunLoop().RunUntilIdle(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + const bool multi_capture_allowed = + capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://www.chromium.org")); + EXPECT_EQ(multi_capture_allowed, MULTI_CAPTURE_SUPPORTED_ON_PLATFORM); +} + +IN_PROC_BROWSER_TEST_F( + SelectAllScreensTest, + SelectAllScreensEnabledWithMultipleAllowedOriginsDynamicRefresh) { + initialization_end_checkpoint.Call(); + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policy::PolicyMap policies; + base::Value::List allowed_origins; + allowed_origins.Append(base::Value("[*.]chrome.org")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + base::RunLoop().RunUntilIdle(); + + Browser* current_browser = browser(); + TabStripModel* current_tab_strip_model = current_browser->tab_strip_model(); + content::WebContents* current_web_contents = + current_tab_strip_model->GetWebContentsAt(0); + + bool multi_capture_allowed = + capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://www.chromium.org")); + EXPECT_FALSE(multi_capture_allowed); + + EXPECT_CALL(provider_, IsInitializationComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + EXPECT_CALL(provider_, IsFirstPolicyLoadComplete( + policy::PolicyDomain::POLICY_DOMAIN_CHROME)); + + policies.Clear(); + base::Value::List new_allowed_origins; + new_allowed_origins.Append(base::Value("[*.]chrome.org")); + new_allowed_origins.Append(base::Value("[*.]chromium.org")); + policies.Set(policy::key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, + policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + base::Value(std::move(new_allowed_origins)), nullptr); + provider_.UpdateChromePolicy(policies); + + base::RunLoop().RunUntilIdle(); + + multi_capture_allowed = + capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowed( + current_web_contents->GetBrowserContext(), + GURL("https://www.chromium.org")); + EXPECT_EQ(multi_capture_allowed, MULTI_CAPTURE_SUPPORTED_ON_PLATFORM); +}
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.h b/chrome/browser/media/webrtc/native_desktop_media_list.h index 4d5e5f0..9078b12 100644 --- a/chrome/browser/media/webrtc/native_desktop_media_list.h +++ b/chrome/browser/media/webrtc/native_desktop_media_list.h
@@ -10,7 +10,6 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/browser/media/webrtc/desktop_media_list_base.h" #include "content/public/browser/desktop_media_id.h" #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc index 5fc4683..693307d 100644 --- a/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc +++ b/chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc
@@ -34,7 +34,7 @@ #if BUILDFLAG(IS_ANDROID) #include <vector> -#include "chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h" +#include "chrome/browser/media/webrtc/screen_capture_permission_handler_android.h" #include "components/permissions/permission_uma_util.h" #include "components/permissions/permission_util.h" #include "content/public/common/content_features.h" @@ -239,8 +239,10 @@ const content::MediaStreamRequest& request = it->second.begin()->second.request; #if BUILDFLAG(IS_ANDROID) + // TODO(https://crbug.com/1157166): This should be split into + // DisplayMediaAccessHandler and DesktopCaptureAccessHandler. if (blink::IsScreenCaptureMediaType(request.video_type)) { - ScreenCaptureInfoBarDelegateAndroid::Create( + screen_capture::GetScreenCapturePermissionAndroid( web_contents, request, base::BindOnce( &PermissionBubbleMediaAccessHandler::OnAccessRequestResponse,
diff --git a/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc b/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc deleted file mode 100644 index 1716d18..0000000 --- a/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.cc +++ /dev/null
@@ -1,125 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h" - -#include "base/callback_helpers.h" -#include "chrome/browser/android/android_theme_resources.h" -#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" -#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" -#include "chrome/grit/generated_resources.h" -#include "components/infobars/android/confirm_infobar.h" -#include "components/infobars/content/content_infobar_manager.h" -#include "components/infobars/core/infobar.h" -#include "components/strings/grit/components_strings.h" -#include "components/url_formatter/elide_url.h" -#include "content/public/browser/desktop_media_id.h" -#include "content/public/browser/web_contents.h" -#include "third_party/blink/public/common/mediastream/media_stream_request.h" -#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h" -#include "ui/base/l10n/l10n_util.h" - -// static -void ScreenCaptureInfoBarDelegateAndroid::Create( - content::WebContents* web_contents, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback) { - infobars::ContentInfoBarManager* infobar_manager = - infobars::ContentInfoBarManager::FromWebContents(web_contents); - - infobar_manager->AddInfoBar(std::make_unique<infobars::ConfirmInfoBar>( - std::unique_ptr<ConfirmInfoBarDelegate>( - new ScreenCaptureInfoBarDelegateAndroid(web_contents, request, - std::move(callback))))); -} - -ScreenCaptureInfoBarDelegateAndroid::ScreenCaptureInfoBarDelegateAndroid( - content::WebContents* web_contents, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback) - : web_contents_(web_contents), - request_(request), - callback_(std::move(callback)) { - DCHECK(request.video_type == - blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE || - request.video_type == - blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE || - request.video_type == - blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB); -} - -ScreenCaptureInfoBarDelegateAndroid::~ScreenCaptureInfoBarDelegateAndroid() { - if (!callback_.is_null()) { - std::move(callback_).Run( - blink::MediaStreamDevices(), - blink::mojom::MediaStreamRequestResult::FAILED_DUE_TO_SHUTDOWN, - nullptr); - } -} - -infobars::InfoBarDelegate::InfoBarIdentifier -ScreenCaptureInfoBarDelegateAndroid::GetIdentifier() const { - return SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID; -} - -std::u16string ScreenCaptureInfoBarDelegateAndroid::GetMessageText() const { - return l10n_util::GetStringFUTF16( - IDS_MEDIA_CAPTURE_SCREEN_INFOBAR_TEXT, - url_formatter::FormatUrlForSecurityDisplay(request_.security_origin)); -} - -int ScreenCaptureInfoBarDelegateAndroid::GetIconId() const { - return IDR_ANDROID_INFOBAR_MEDIA_STREAM_SCREEN; -} - -std::u16string ScreenCaptureInfoBarDelegateAndroid::GetButtonLabel( - InfoBarButton button) const { - return l10n_util::GetStringUTF16((button == BUTTON_OK) ? IDS_PERMISSION_ALLOW - : IDS_PERMISSION_DENY); -} - -bool ScreenCaptureInfoBarDelegateAndroid::Accept() { - RunCallback(blink::mojom::MediaStreamRequestResult::OK); - return true; -} - -bool ScreenCaptureInfoBarDelegateAndroid::Cancel() { - RunCallback(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED); - return true; -} - -void ScreenCaptureInfoBarDelegateAndroid::InfoBarDismissed() { - RunCallback(blink::mojom::MediaStreamRequestResult::PERMISSION_DISMISSED); -} - -void ScreenCaptureInfoBarDelegateAndroid::RunCallback( - blink::mojom::MediaStreamRequestResult result) { - DCHECK(!callback_.is_null()); - - blink::MediaStreamDevices devices; - std::unique_ptr<content::MediaStreamUI> ui; - if (result == blink::mojom::MediaStreamRequestResult::OK) { - // TODO(https://crbug.com/1157166): Customize current tab capture prompt. - if (request_.video_type == - blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB) { - content::DesktopMediaID screen_id; - screen_id.type = content::DesktopMediaID::TYPE_WEB_CONTENTS; - screen_id.web_contents_id = content::WebContentsMediaCaptureId( - request_.render_process_id, request_.render_frame_id); - devices.push_back(blink::MediaStreamDevice( - request_.video_type, screen_id.ToString(), "Current Tab")); - } else { - content::DesktopMediaID screen_id = content::DesktopMediaID( - content::DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId); - devices.push_back(blink::MediaStreamDevice( - request_.video_type, screen_id.ToString(), "Screen")); - } - - ui = MediaCaptureDevicesDispatcher::GetInstance() - ->GetMediaStreamCaptureIndicator() - ->RegisterMediaStream(web_contents_, devices); - } - - std::move(callback_).Run(devices, result, std::move(ui)); -}
diff --git a/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h b/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h deleted file mode 100644 index 8c7b4e6..0000000 --- a/chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_MEDIA_WEBRTC_SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID_H_ -#define CHROME_BROWSER_MEDIA_WEBRTC_SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID_H_ - -#include "base/memory/raw_ptr.h" -#include "chrome/browser/media/media_access_handler.h" -#include "components/infobars/core/confirm_infobar_delegate.h" -#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h" - -namespace content { -class WebContents; -} - -// An infobar that allows the user to share their screen with the current page. -class ScreenCaptureInfoBarDelegateAndroid : public ConfirmInfoBarDelegate { - public: - // Creates a screen capture infobar and delegate and adds the infobar to the - // infobars::ContentInfoBarManager associated with |web_contents|. - static void Create(content::WebContents* web_contents, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback); - - ScreenCaptureInfoBarDelegateAndroid( - const ScreenCaptureInfoBarDelegateAndroid&) = delete; - ScreenCaptureInfoBarDelegateAndroid& operator=( - const ScreenCaptureInfoBarDelegateAndroid&) = delete; - - private: - ScreenCaptureInfoBarDelegateAndroid( - content::WebContents* web_contents, - const content::MediaStreamRequest& request, - content::MediaResponseCallback callback); - ~ScreenCaptureInfoBarDelegateAndroid() override; - - // ConfirmInfoBarDelegate: - infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; - std::u16string GetMessageText() const override; - int GetIconId() const override; - std::u16string GetButtonLabel(InfoBarButton button) const override; - bool Accept() override; - bool Cancel() override; - void InfoBarDismissed() override; - - // Runs |callback_|, passing it the |result|, and (if permission was granted) - // the appropriate stream device and UI object for video capture. - void RunCallback(blink::mojom::MediaStreamRequestResult result); - - raw_ptr<content::WebContents> web_contents_; - const content::MediaStreamRequest request_; - content::MediaResponseCallback callback_; -}; - -#endif // CHROME_BROWSER_MEDIA_WEBRTC_SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/media/webrtc/screen_capture_permission_handler_android.cc b/chrome/browser/media/webrtc/screen_capture_permission_handler_android.cc new file mode 100644 index 0000000..5bda37e --- /dev/null +++ b/chrome/browser/media/webrtc/screen_capture_permission_handler_android.cc
@@ -0,0 +1,58 @@ +// Copyright 2022 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/media/webrtc/screen_capture_permission_handler_android.h" + +#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" +#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" +#include "content/public/browser/desktop_media_id.h" +#include "content/public/browser/web_contents.h" +#include "content/public/common/content_features.h" +#include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h" + +namespace screen_capture { +void GetScreenCapturePermissionAndroid( + content::WebContents* web_contents, + const content::MediaStreamRequest& request, + content::MediaResponseCallback callback) { + DCHECK(!callback.is_null()); + DCHECK(request.video_type == + blink::mojom::MediaStreamType::GUM_DESKTOP_VIDEO_CAPTURE || + request.video_type == + blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE || + request.video_type == + blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB); + + // TODO(https://crbug.com/1157166): Implement a capture prompt. + blink::mojom::MediaStreamRequestResult result = + base::FeatureList::IsEnabled(features::kUserMediaScreenCapturing) + ? blink::mojom::MediaStreamRequestResult::OK + : blink::mojom::MediaStreamRequestResult::INVALID_STATE; + + blink::MediaStreamDevices devices; + std::unique_ptr<content::MediaStreamUI> ui; + if (result == blink::mojom::MediaStreamRequestResult::OK) { + if (request.video_type == + blink::mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE_THIS_TAB) { + content::DesktopMediaID screen_id; + screen_id.type = content::DesktopMediaID::TYPE_WEB_CONTENTS; + screen_id.web_contents_id = content::WebContentsMediaCaptureId( + request.render_process_id, request.render_frame_id); + devices.push_back(blink::MediaStreamDevice( + request.video_type, screen_id.ToString(), "Current Tab")); + } else { + content::DesktopMediaID screen_id = content::DesktopMediaID( + content::DesktopMediaID::TYPE_SCREEN, webrtc::kFullDesktopScreenId); + devices.push_back(blink::MediaStreamDevice( + request.video_type, screen_id.ToString(), "Screen")); + } + + ui = MediaCaptureDevicesDispatcher::GetInstance() + ->GetMediaStreamCaptureIndicator() + ->RegisterMediaStream(web_contents, devices); + } + + std::move(callback).Run(devices, result, std::move(ui)); +} +} // namespace screen_capture
diff --git a/chrome/browser/media/webrtc/screen_capture_permission_handler_android.h b/chrome/browser/media/webrtc/screen_capture_permission_handler_android.h new file mode 100644 index 0000000..16517767 --- /dev/null +++ b/chrome/browser/media/webrtc/screen_capture_permission_handler_android.h
@@ -0,0 +1,21 @@ +// Copyright 2022 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_MEDIA_WEBRTC_SCREEN_CAPTURE_PERMISSION_HANDLER_ANDROID_H_ +#define CHROME_BROWSER_MEDIA_WEBRTC_SCREEN_CAPTURE_PERMISSION_HANDLER_ANDROID_H_ + +#include "content/public/browser/media_stream_request.h" + +namespace content { +class WebContents; +} + +namespace screen_capture { +void GetScreenCapturePermissionAndroid( + content::WebContents* web_contents, + const content::MediaStreamRequest& request, + content::MediaResponseCallback callback); +} + +#endif // CHROME_BROWSER_MEDIA_WEBRTC_SCREEN_CAPTURE_PERMISSION_HANDLER_ANDROID_H_
diff --git a/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc b/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc index 4dde4d3..3c1be71 100644 --- a/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc +++ b/chrome/browser/metrics/desktop_platform_features_metrics_provider.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/read_later/reading_list_model_factory.h" #include "components/reading_list/core/reading_list_model.h" -#include "components/reading_list/features/reading_list_switches.h" #include "ui/native_theme/native_theme.h" namespace { @@ -55,18 +54,16 @@ UMA_HISTOGRAM_ENUMERATION("Browser.DarkModeStatus", status); // Record how many items are in the reading list. - if (reading_list::switches::IsReadingListEnabled()) { - std::vector<Profile*> profiles = - g_browser_process->profile_manager()->GetLoadedProfiles(); - for (Profile* profile : profiles) { - ReadingListModel* model = - ReadingListModelFactory::GetForBrowserContext(profile); - if (model && model->loaded()) { - UMA_HISTOGRAM_COUNTS_1000("ReadingList.Unread.Count.OnUMAUpload", - model->unread_size()); - UMA_HISTOGRAM_COUNTS_1000("ReadingList.Read.Count.OnUMAUpload", - model->size() - model->unread_size()); - } + std::vector<Profile*> profiles = + g_browser_process->profile_manager()->GetLoadedProfiles(); + for (Profile* profile : profiles) { + ReadingListModel* model = + ReadingListModelFactory::GetForBrowserContext(profile); + if (model && model->loaded()) { + UMA_HISTOGRAM_COUNTS_1000("ReadingList.Unread.Count.OnUMAUpload", + model->unread_size()); + UMA_HISTOGRAM_COUNTS_1000("ReadingList.Read.Count.OnUMAUpload", + model->size() - model->unread_size()); } }
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java index f654f35..f725a17 100644 --- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java +++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
@@ -6,9 +6,11 @@ import androidx.annotation.IntDef; import androidx.annotation.Nullable; +import androidx.core.app.NotificationManagerCompat; import org.chromium.base.BuildInfo; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; import org.chromium.base.UnownedUserData; import org.chromium.base.UnownedUserDataKey; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -194,6 +196,26 @@ } /** + * See {@link + * ContextualNotificationPermissionRequester#doesAppLevelSettingsAllowSiteNotifications()} for + * more details. + * @return Whether or not the site should is allowed to request the notification permission. + * TODO(shaktisahu): Determine the rules for showing site notification permission. + */ + public boolean doesAppLevelSettingsAllowSiteNotifications() { + NotificationManagerCompat manager = + NotificationManagerCompat.from(ContextUtils.getApplicationContext()); + boolean notificationsEnabledAtAppLevel = manager.areNotificationsEnabled(); + if (!BuildInfo.isAtLeastT()) return notificationsEnabledAtAppLevel; + + boolean hasPermission = mAndroidPermissionDelegate.hasPermission( + PermissionConstants.NOTIFICATION_PERMISSION); + boolean canRequestPermission = mAndroidPermissionDelegate.canRequestPermission( + PermissionConstants.NOTIFICATION_PERMISSION); + return hasPermission || canRequestPermission; + } + + /** * Records the current status of the notification permission (Allowed/Denied) and if denied we * include how many times we've asked or if the permission is denied by policy. */
diff --git a/chrome/browser/notifications/notification_permission_browsertest.cc b/chrome/browser/notifications/notification_permission_browsertest.cc new file mode 100644 index 0000000..40e1f4c --- /dev/null +++ b/chrome/browser/notifications/notification_permission_browsertest.cc
@@ -0,0 +1,268 @@ +// Copyright 2022 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/chrome_content_browser_client.h" +#include "chrome/browser/notifications/notification_permission_context.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/common/content_client.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/browser_test_utils.h" +#include "content/public/test/content_mock_cert_verifier.h" +#include "content/public/test/test_navigation_observer.h" +#include "net/dns/mock_host_resolver.h" +#include "net/test/embedded_test_server/embedded_test_server.h" + +namespace { + +const char kTestFilePath[] = + "/notifications/notification_permission_checker.html"; +const char kTesterHost[] = "notification.com"; +const char kIsolatedEmbedderHost[] = "isolated.com"; +const char kEmbedderHost[] = "normal.com"; + +// A ChromeContentBrowserClient that returns a non-default +// StoragePartitionConfig for the given Origin. +class StoragePartitioningChromeContentBrowserClient + : public ChromeContentBrowserClient { + public: + explicit StoragePartitioningChromeContentBrowserClient( + const std::string& partitioned_host) + : partitioned_host_(partitioned_host) {} + + ~StoragePartitioningChromeContentBrowserClient() override = default; + + content::StoragePartitionConfig GetStoragePartitionConfigForSite( + content::BrowserContext* browser_context, + const GURL& site) override { + if (site.host() == partitioned_host_) { + return content::StoragePartitionConfig::Create( + browser_context, partitioned_host_, /*partition_name=*/"", + /*in_memory=*/false); + } + return ChromeContentBrowserClient::GetStoragePartitionConfigForSite( + browser_context, site); + } + + private: + std::string partitioned_host_; +}; + +} // namespace + +class NotificationPermissionBrowserTest : public InProcessBrowserTest { + public: + NotificationPermissionBrowserTest() + : partitioning_client_(kIsolatedEmbedderHost) {} + + NotificationPermissionBrowserTest(const NotificationPermissionBrowserTest&) = + delete; + NotificationPermissionBrowserTest& operator=( + const NotificationPermissionBrowserTest&) = delete; + ~NotificationPermissionBrowserTest() override { + CHECK_EQ(&partitioning_client_, + SetBrowserClientForTesting(original_client_)); + } + + void SetUpOnMainThread() override { + host_resolver()->AddRule("*", "127.0.0.1"); + mock_cert_verifier_.mock_cert_verifier()->set_default_result(net::OK); + + https_server_ = std::make_unique<net::EmbeddedTestServer>( + net::EmbeddedTestServer::TYPE_HTTPS); + https_server_->ServeFilesFromSourceDirectory(server_root_); + EXPECT_TRUE(https_server_->Start()); + + original_client_ = SetBrowserClientForTesting(&partitioning_client_); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + mock_cert_verifier_.SetUpCommandLine(command_line); + } + + void SetUpInProcessBrowserTestFixture() override { + mock_cert_verifier_.SetUpInProcessBrowserTestFixture(); + } + + void TearDownInProcessBrowserTestFixture() override { + mock_cert_verifier_.TearDownInProcessBrowserTestFixture(); + } + + protected: + void GrantNotificationPermissionForTest(const GURL& url) const { + NotificationPermissionContext::UpdatePermission( + browser()->profile(), url.DeprecatedGetOriginAsURL(), + CONTENT_SETTING_ALLOW); + } + + std::string GetNotificationPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "getNotificationPermission()"); + } + + std::string GetServiceWorkerNotificationPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "getServiceWorkerNotificationPermission()"); + } + + std::string QueryNotificationPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "queryNotificationPermission()"); + } + + std::string QueryServiceWorkerNotificationPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "queryServiceWorkerNotificationPermission()"); + } + + std::string RequestNotificationPermission( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "requestNotificationPermission()"); + } + + std::string GetPushPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "getPushPermission()"); + } + + std::string GetServiceWorkerPushPermissionState( + const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "getServiceWorkerPushPermission()"); + } + + std::string RequestPushPermission(const content::ToRenderFrameHost& adapter) { + return RunJs(adapter, "requestPushPermission()"); + } + + GURL TesterUrl() const { + return https_server_->GetURL(kTesterHost, kTestFilePath); + } + + GURL IsolatedEmbedderUrl() const { + return https_server_->GetURL(kIsolatedEmbedderHost, kTestFilePath); + } + + GURL EmbedderUrl() const { + return https_server_->GetURL(kEmbedderHost, kTestFilePath); + } + + content::WebContents* GetActiveWebContents() const { + return browser()->tab_strip_model()->GetActiveWebContents(); + } + + content::RenderFrameHost* CreateChildIframe( + content::RenderFrameHost* parent_rfh, + const GURL& iframe_src) { + // For now assume this is the only child iframe. + EXPECT_FALSE(ChildFrameAt(parent_rfh, 0)); + + content::TestNavigationObserver navigation_observer(GetActiveWebContents()); + EXPECT_TRUE(ExecJs( + parent_rfh, + content::JsReplace("const iframe = document.createElement('iframe');" + "iframe.id = 'child_iframe';" + "iframe.src = $1;" + "document.body.appendChild(iframe);", + iframe_src))); + navigation_observer.Wait(); + EXPECT_TRUE(navigation_observer.last_navigation_succeeded()); + EXPECT_EQ(net::OK, navigation_observer.last_net_error_code()); + EXPECT_EQ(iframe_src, navigation_observer.last_navigation_url()); + + content::RenderFrameHost* iframe = ChildFrameAt(parent_rfh, 0); + EXPECT_TRUE(iframe); + return iframe; + } + + private: + std::string RunJs(const content::ToRenderFrameHost& adapter, + const std::string& js) { + std::string result; + EXPECT_TRUE(content::ExecuteScriptAndExtractString( + adapter.render_frame_host(), js, &result)); + return result; + } + + const base::FilePath server_root_{FILE_PATH_LITERAL("chrome/test/data")}; + std::unique_ptr<net::EmbeddedTestServer> https_server_; + content::ContentMockCertVerifier mock_cert_verifier_; + + raw_ptr<content::ContentBrowserClient> original_client_ = nullptr; + StoragePartitioningChromeContentBrowserClient partitioning_client_; +}; + +// Tests that notification permissions aren't delegated to an embedded frame +// as other permissions are. If 'example.com' was granted notification +// permissions by the user when it was a top-level frame, then it retains that +// permission when iframed in another page, regardless of the other page's +// permission status. +IN_PROC_BROWSER_TEST_F(NotificationPermissionBrowserTest, + PermissionNotDelegated) { + GrantNotificationPermissionForTest(TesterUrl()); + + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), TesterUrl())); + EXPECT_EQ("granted", GetNotificationPermissionState(GetActiveWebContents())); + EXPECT_EQ("granted", GetServiceWorkerNotificationPermissionState( + GetActiveWebContents())); + + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), EmbedderUrl())); + EXPECT_EQ("default", GetNotificationPermissionState(GetActiveWebContents())); + + content::RenderFrameHost* iframe = + CreateChildIframe(GetActiveWebContents()->GetMainFrame(), TesterUrl()); + EXPECT_EQ(TesterUrl(), iframe->GetLastCommittedURL()); + EXPECT_EQ("granted", GetNotificationPermissionState(iframe)); + EXPECT_EQ("granted", GetServiceWorkerNotificationPermissionState(iframe)); + EXPECT_EQ("granted", GetPushPermissionState(iframe)); + EXPECT_EQ("granted", GetServiceWorkerPushPermissionState(iframe)); +} + +// Tests that iframes not using their normal StoragePartition don't have +// notification permission, even if they would have permission outside of an +// isolated app. +IN_PROC_BROWSER_TEST_F(NotificationPermissionBrowserTest, + IframesInNonDefaultPartitionDontGetPermission) { + GrantNotificationPermissionForTest(TesterUrl()); + + // Verify that TesterUrl() has notification/push permission. + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), TesterUrl())); + content::RenderFrameHost* main_frame = GetActiveWebContents()->GetMainFrame(); + EXPECT_EQ("granted", GetNotificationPermissionState(main_frame)); + EXPECT_EQ("granted", GetServiceWorkerNotificationPermissionState(main_frame)); + EXPECT_EQ("granted", QueryNotificationPermissionState(main_frame)); + EXPECT_EQ("granted", + QueryServiceWorkerNotificationPermissionState(main_frame)); + EXPECT_EQ("granted", GetPushPermissionState(main_frame)); + EXPECT_EQ("granted", GetServiceWorkerPushPermissionState(main_frame)); + + // Load a site that uses a dedicated StoragePartition and verify that it has + // default notification/push permissions. + EXPECT_TRUE(ui_test_utils::NavigateToURL(browser(), IsolatedEmbedderUrl())); + main_frame = GetActiveWebContents()->GetMainFrame(); + EXPECT_EQ("default", GetNotificationPermissionState(main_frame)); + EXPECT_EQ("denied", GetServiceWorkerNotificationPermissionState(main_frame)); + EXPECT_EQ("prompt", QueryNotificationPermissionState(main_frame)); + EXPECT_EQ("prompt", + QueryServiceWorkerNotificationPermissionState(main_frame)); + EXPECT_EQ("prompt", GetPushPermissionState(main_frame)); + EXPECT_EQ("prompt", GetServiceWorkerPushPermissionState(main_frame)); + + // Load TesterUrl() in an iframe inside the dedicated StoragePartition page. + // Even though TesterUrl() has notification/push permission when in a main + // frame, it shouldn't when it's embedded in a different StoragePartition. + content::RenderFrameHost* iframe = + CreateChildIframe(GetActiveWebContents()->GetMainFrame(), TesterUrl()); + EXPECT_EQ(TesterUrl(), iframe->GetLastCommittedURL()); + EXPECT_EQ("denied", GetNotificationPermissionState(iframe)); + EXPECT_EQ("denied", GetServiceWorkerNotificationPermissionState(iframe)); + EXPECT_EQ("denied", QueryNotificationPermissionState(iframe)); + EXPECT_EQ("denied", QueryServiceWorkerNotificationPermissionState(iframe)); + EXPECT_EQ("denied", RequestNotificationPermission(iframe)); + EXPECT_EQ("denied", GetPushPermissionState(iframe)); + EXPECT_EQ("denied", GetServiceWorkerPushPermissionState(iframe)); + EXPECT_EQ("NotAllowedError: Registration failed - permission denied", + RequestPushPermission(iframe)); +}
diff --git a/chrome/browser/notifications/persistent_notification_handler.cc b/chrome/browser/notifications/persistent_notification_handler.cc index 32eedd9..81b397ba 100644 --- a/chrome/browser/notifications/persistent_notification_handler.cc +++ b/chrome/browser/notifications/persistent_notification_handler.cc
@@ -106,8 +106,10 @@ #endif // BUILDFLAG(ENABLE_BACKGROUND_MODE) blink::mojom::PermissionStatus permission_status = - profile->GetPermissionController()->GetPermissionStatusForServiceWorker( - content::PermissionType::NOTIFICATIONS, url::Origin::Create(origin)); + profile->GetPermissionController() + ->GetPermissionStatusForOriginWithoutContext( + content::PermissionType::NOTIFICATIONS, + url::Origin::Create(origin)); // Don't process click events when the |origin| doesn't have permission. This // can't be a DCHECK because of potential races with native notifications.
diff --git a/chrome/browser/offline_pages/recent_tab_helper.cc b/chrome/browser/offline_pages/recent_tab_helper.cc index 66480c9..23fbcfb05 100644 --- a/chrome/browser/offline_pages/recent_tab_helper.cc +++ b/chrome/browser/offline_pages/recent_tab_helper.cc
@@ -14,7 +14,6 @@ #include "base/strings/string_number_conversions.h" #include "base/system/sys_info.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chrome/browser/offline_pages/offline_page_mhtml_archiver.h" #include "chrome/browser/offline_pages/offline_page_model_factory.h" #include "chrome/browser/offline_pages/offline_page_utils.h"
diff --git a/chrome/browser/password_manager/android/DEPS b/chrome/browser/password_manager/android/DEPS index 3136276..ee80da4 100644 --- a/chrome/browser/password_manager/android/DEPS +++ b/chrome/browser/password_manager/android/DEPS
@@ -2,4 +2,5 @@ "-content/public/android/java", "+content/public/android/java/src/org/chromium/content_public", "+components/device_reauth", + "+components/password_manager/core/browser", ]
diff --git a/chrome/browser/password_manager/android/account_chooser_dialog_android.cc b/chrome/browser/password_manager/android/account_chooser_dialog_android.cc index 40c38e04..5472316f 100644 --- a/chrome/browser/password_manager/android/account_chooser_dialog_android.cc +++ b/chrome/browser/password_manager/android/account_chooser_dialog_android.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/passwords/account_avatar_fetcher.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "components/device_reauth/biometric_authenticator.h" #include "components/password_manager/core/browser/password_bubble_experiment.h"
diff --git a/chrome/browser/password_manager/android/auto_signin_first_run_dialog_android.cc b/chrome/browser/password_manager/android/auto_signin_first_run_dialog_android.cc index 8c981ecc..c8a1938 100644 --- a/chrome/browser/password_manager/android/auto_signin_first_run_dialog_android.cc +++ b/chrome/browser/password_manager/android/auto_signin_first_run_dialog_android.cc
@@ -9,7 +9,7 @@ #include "chrome/android/chrome_jni_headers/AutoSigninFirstRunDialog_jni.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/password_manager/core/browser/password_bubble_experiment.h"
diff --git a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc index 1539b2a..b0184a7 100644 --- a/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc +++ b/chrome/browser/password_manager/android/generated_password_saved_message_delegate.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/password_manager/android/generated_password_saved_message_delegate.h" #include "chrome/browser/android/android_theme_resources.h" #include "chrome/browser/android/resource_mapper.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "components/messages/android/message_dispatcher_bridge.h" #include "components/password_manager/core/common/password_manager_features.h"
diff --git a/chrome/browser/password_manager/android/password_accessory_controller_impl.cc b/chrome/browser/password_manager/android/password_accessory_controller_impl.cc index 30d3d709..15cf2ad 100644 --- a/chrome/browser/password_manager/android/password_accessory_controller_impl.cc +++ b/chrome/browser/password_manager/android/password_accessory_controller_impl.cc
@@ -27,7 +27,7 @@ #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ssl/security_state_tab_helper.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/grit/generated_resources.h" #include "components/autofill/core/browser/ui/accessory_sheet_data.h"
diff --git a/chrome/browser/password_manager/android/password_store_android_backend.cc b/chrome/browser/password_manager/android/password_store_android_backend.cc index db0bb75..39b3b7428 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend.cc +++ b/chrome/browser/password_manager/android/password_store_android_backend.cc
@@ -150,58 +150,10 @@ } // namespace -PasswordStoreAndroidBackend::MetricsRecorder::MetricsRecorder() = default; - -PasswordStoreAndroidBackend::MetricsRecorder::MetricsRecorder( - MetricInfix metric_infix) - : metric_infix_(std::move(metric_infix)) {} - -PasswordStoreAndroidBackend::MetricsRecorder::MetricsRecorder( - MetricsRecorder&&) = default; - -PasswordStoreAndroidBackend::MetricsRecorder& -PasswordStoreAndroidBackend::MetricsRecorder::MetricsRecorder::operator=( - MetricsRecorder&&) = default; - -PasswordStoreAndroidBackend::MetricsRecorder::~MetricsRecorder() = default; - -void PasswordStoreAndroidBackend::MetricsRecorder::RecordMetrics( - bool success, - absl::optional<AndroidBackendError> error) const { - auto BuildMetricName = [this](base::StringPiece suffix) { - return base::StrCat({"PasswordManager.PasswordStoreAndroidBackend.", - *metric_infix_, ".", suffix}); - }; - base::TimeDelta duration = base::Time::Now() - start_; - base::UmaHistogramMediumTimes(BuildMetricName("Latency"), duration); - base::UmaHistogramBoolean(BuildMetricName("Success"), success); - if (!error.has_value()) - return; - - DCHECK(!success); - // In case of AndroidBackend error, we report additional metrics. - base::UmaHistogramEnumeration( - "PasswordManager.PasswordStoreAndroidBackend.ErrorCode", - error.value().type); - base::UmaHistogramEnumeration(BuildMetricName("ErrorCode"), - error.value().type); - if (error.value().type == AndroidBackendErrorType::kExternalError) { - DCHECK(error.value().api_error_code.has_value()); - base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( - "PasswordManager.PasswordStoreAndroidBackend.APIError", - base::HistogramBase::kUmaTargetedHistogramFlag); - histogram->Add(error.value().api_error_code.value()); - histogram = base::SparseHistogram::FactoryGet( - BuildMetricName("APIError"), - base::HistogramBase::kUmaTargetedHistogramFlag); - histogram->Add(error.value().api_error_code.value()); - } -} - class PasswordStoreAndroidBackend::ClearAllLocalPasswordsMetricRecorder { public: explicit ClearAllLocalPasswordsMetricRecorder( - PasswordStoreAndroidBackend::MetricsRecorder metrics_recorder) + PasswordStoreBackendMetricsRecorder metrics_recorder) : metrics_recorder_(std::move(metrics_recorder)) {} void OnAllRemovalsFinished() { @@ -229,20 +181,20 @@ private: int total_count_ = 0; int failure_count_ = 0; - MetricsRecorder metrics_recorder_; + PasswordStoreBackendMetricsRecorder metrics_recorder_; }; PasswordStoreAndroidBackend::JobReturnHandler::JobReturnHandler() = default; PasswordStoreAndroidBackend::JobReturnHandler::JobReturnHandler( LoginsOrErrorReply callback, - MetricsRecorder metrics_recorder) + PasswordStoreBackendMetricsRecorder metrics_recorder) : success_callback_(std::move(callback)), metrics_recorder_(std::move(metrics_recorder)) {} PasswordStoreAndroidBackend::JobReturnHandler::JobReturnHandler( PasswordStoreChangeListReply callback, - MetricsRecorder metrics_recorder) + PasswordStoreBackendMetricsRecorder metrics_recorder) : success_callback_(std::move(callback)), metrics_recorder_(std::move(metrics_recorder)) {} @@ -458,7 +410,8 @@ // this callback more gracefully when it's implemented. PasswordStoreChangeListReply record_metrics_and_run_completion = base::BindOnce( - [](MetricsRecorder metrics_recorder, base::OnceClosure completion, + [](PasswordStoreBackendMetricsRecorder metrics_recorder, + base::OnceClosure completion, absl::optional<PasswordStoreChangeList> changes) { // Errors are not recorded at the moment. // TODO(https://crbug.com/1278807): Implement error handling, when @@ -467,7 +420,9 @@ /*error=*/absl::nullopt); std::move(completion).Run(); }, - MetricsRecorder(MetricInfix("DisableAutoSignInForOriginsAsync")), + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreAndroidBackend"), + MetricInfix("DisableAutoSignInForOriginsAsync")), std::move(completion)); GetAllLoginsAsync( @@ -492,7 +447,7 @@ void PasswordStoreAndroidBackend::ClearAllLocalPasswords() { LoginsOrErrorReply cleaning_callback = base::BindOnce( [](base::WeakPtr<PasswordStoreAndroidBackend> weak_self, - MetricsRecorder metrics_recorder, + PasswordStoreBackendMetricsRecorder metrics_recorder, LoginsResultOrError logins_or_error) { if (!weak_self || absl::holds_alternative<PasswordStoreBackendError>( logins_or_error)) { @@ -529,7 +484,9 @@ std::move(callbacks_chain).Run(); }, weak_ptr_factory_.GetWeakPtr(), - MetricsRecorder(MetricInfix("ClearAllLocalPasswords"))); + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreAndroidBackend"), + MetricInfix("ClearAllLocalPasswords"))); GetAllLoginsForAccount(PasswordStoreOperationTarget::kLocalStorage, std::move(cleaning_callback)); @@ -592,7 +549,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_); request_for_job_.emplace( job_id, JobReturnHandler(std::move(callback), - MetricsRecorder(std::move(metric_infix)))); + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreAndroidBackend"), + std::move(metric_infix)))); } PasswordStoreAndroidBackend::JobReturnHandler @@ -660,8 +619,8 @@ // TODO(https://crbug.com/1229655) Switch to using base::PassThrough to handle // this callback more gracefully when it's implemented. return base::BindOnce( - [](MetricsRecorder metrics_recorder, LoginsReply callback, - LoginsResultOrError results) { + [](PasswordStoreBackendMetricsRecorder metrics_recorder, + LoginsReply callback, LoginsResultOrError results) { metrics_recorder.RecordMetrics( /*success=*/!( absl::holds_alternative<PasswordStoreBackendError>(results)), @@ -669,7 +628,9 @@ std::move(callback).Run( GetLoginsOrEmptyListOnFailure(std::move(results))); }, - MetricsRecorder(metric_infix), std::move(callback)); + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreAndroidBackend"), metric_infix), + std::move(callback)); } // static @@ -680,7 +641,7 @@ // TODO(https://crbug.com/1229655) Switch to using base::PassThrough to handle // this callback more gracefully when it's implemented. return base::BindOnce( - [](MetricsRecorder metrics_recorder, + [](PasswordStoreBackendMetricsRecorder metrics_recorder, PasswordStoreChangeListReply callback, absl::optional<PasswordStoreChangeList> results) { // Errors are not recorded at the moment. @@ -690,7 +651,9 @@ /*error=*/absl::nullopt); std::move(callback).Run(std::move(results)); }, - MetricsRecorder(metric_infix), std::move(callback)); + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreAndroidBackend"), metric_infix), + std::move(callback)); } void PasswordStoreAndroidBackend::GetAllLoginsForAccount(
diff --git a/chrome/browser/password_manager/android/password_store_android_backend.h b/chrome/browser/password_manager/android/password_store_android_backend.h index cd793a2..82e5e05f 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend.h +++ b/chrome/browser/password_manager/android/password_store_android_backend.h
@@ -19,6 +19,8 @@ #include "chrome/browser/password_manager/android/password_store_android_backend_bridge.h" #include "chrome/browser/password_manager/android/password_sync_controller_delegate_android.h" #include "components/password_manager/core/browser/password_store_backend.h" +#include "components/password_manager/core/browser/password_store_backend_metrics_recorder.h" +#include "components/password_manager/core/browser/password_store_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/abseil-cpp/absl/types/variant.h" @@ -49,36 +51,6 @@ private: SEQUENCE_CHECKER(main_sequence_checker_); - using MetricInfix = base::StrongAlias<struct MetricNameTag, std::string>; - - // Records metrics for an asynchronous job or a series of jobs. The job is - // expected to have started when the MetricsRecorder instance is created. - // Latency is reported in RecordMetrics() under that assumption. - class MetricsRecorder { - public: - MetricsRecorder(); - explicit MetricsRecorder(MetricInfix metric_name); - MetricsRecorder(MetricsRecorder&&); - MetricsRecorder& operator=(MetricsRecorder&&); - ~MetricsRecorder(); - - // Records the following metrics: - // - "PasswordManager.PasswordStoreAndroidBackend.<metric_infix_>.Latency" - // - "PasswordManager.PasswordStoreAndroidBackend.<metric_infix_>.Success" - // When |error| is specified, the following metrcis are recorded in - // addition: - // - "PasswordManager.PasswordStoreAndroidBackend.APIError" - // - "PasswordManager.PasswordStoreAndroidBackend.ErrorCode" - // - "PasswordManager.PasswordStoreAndroidBackend.<metric_infix_>.APIError" - // - "PasswordManager.PasswordStoreAndroidBackend.<metric_infix_>.ErrorCode" - void RecordMetrics(bool success, - absl::optional<AndroidBackendError> error) const; - - private: - MetricInfix metric_infix_; - base::Time start_ = base::Time::Now(); - }; - class ClearAllLocalPasswordsMetricRecorder; // Wraps the handler for an asynchronous job (if successful) and invokes the @@ -91,9 +63,9 @@ JobReturnHandler(); JobReturnHandler(LoginsOrErrorReply callback, - MetricsRecorder metrics_recorder); + PasswordStoreBackendMetricsRecorder metrics_recorder); JobReturnHandler(PasswordStoreChangeListReply callback, - MetricsRecorder metrics_recorder); + PasswordStoreBackendMetricsRecorder metrics_recorder); JobReturnHandler(JobReturnHandler&&); JobReturnHandler& operator=(JobReturnHandler&&); ~JobReturnHandler(); @@ -113,7 +85,7 @@ private: absl::variant<LoginsOrErrorReply, PasswordStoreChangeListReply> success_callback_; - MetricsRecorder metrics_recorder_; + PasswordStoreBackendMetricsRecorder metrics_recorder_; }; using JobId = PasswordStoreAndroidBackendBridge::JobId;
diff --git a/chrome/browser/password_manager/android/password_store_android_backend_bridge_impl.cc b/chrome/browser/password_manager/android/password_store_android_backend_bridge_impl.cc index f4938e7..02b4db3 100644 --- a/chrome/browser/password_manager/android/password_store_android_backend_bridge_impl.cc +++ b/chrome/browser/password_manager/android/password_store_android_backend_bridge_impl.cc
@@ -11,6 +11,7 @@ #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "chrome/browser/password_manager/android/jni_headers/PasswordStoreAndroidBackendBridgeImpl_jni.h" +#include "components/password_manager/core/browser/android_backend_error.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/sync/password_proto_utils.h" #include "components/sync/protocol/list_passwords_result.pb.h"
diff --git a/chrome/browser/password_manager/android/save_password_infobar_delegate_android.cc b/chrome/browser/password_manager/android/save_password_infobar_delegate_android.cc index c2d202ab..c0f2601 100644 --- a/chrome/browser/password_manager/android/save_password_infobar_delegate_android.cc +++ b/chrome/browser/password_manager/android/save_password_infobar_delegate_android.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/android/infobars/save_password_infobar.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/infobars/content/content_infobar_manager.h"
diff --git a/chrome/browser/password_manager/android/save_update_password_message_delegate.cc b/chrome/browser/password_manager/android/save_update_password_message_delegate.cc index 8deff3b..6feec7d 100644 --- a/chrome/browser/password_manager/android/save_update_password_message_delegate.cc +++ b/chrome/browser/password_manager/android/save_update_password_message_delegate.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/password_manager/android/password_infobar_utils.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "components/messages/android/message_dispatcher_bridge.h" #include "components/messages/android/messages_feature.h"
diff --git a/chrome/browser/password_manager/android/update_password_infobar_delegate_android.cc b/chrome/browser/password_manager/android/update_password_infobar_delegate_android.cc index e50c565..3f8d0c3 100644 --- a/chrome/browser/password_manager/android/update_password_infobar_delegate_android.cc +++ b/chrome/browser/password_manager/android/update_password_infobar_delegate_android.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/android/infobars/update_password_infobar.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/infobars/content/content_infobar_manager.h"
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc index 626ceb68..6250fe1e 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -38,9 +38,9 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/translate/chrome_translate_client.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/password_generation_popup_controller_impl.h" #include "chrome/browser/ui/passwords/passwords_client_ui_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/common/channel_info.h" #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc index c39c2393..7e56f2b 100644 --- a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc +++ b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc
@@ -82,6 +82,7 @@ permissions::PermissionRequestManager::CreateForWebContents(web_contents()); manager_ = permissions::PermissionRequestManager::FromWebContents(web_contents()); + manager_->set_enabled_app_level_notification_permission_for_testing(true); prompt_factory_ = std::make_unique<permissions::MockPermissionPromptFactory>(manager_); }
diff --git a/chrome/browser/permissions/permission_manager_browsertest.cc b/chrome/browser/permissions/permission_manager_browsertest.cc index 419ab8b..bb8b14e 100644 --- a/chrome/browser/permissions/permission_manager_browsertest.cc +++ b/chrome/browser/permissions/permission_manager_browsertest.cc
@@ -53,13 +53,15 @@ SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) override { SubscriptionId result = permissions::PermissionManager::SubscribePermissionStatusChange( - permission, render_frame_host, requesting_origin, callback); + permission, render_process_host, render_frame_host, + requesting_origin, callback); std::move(callback_).Run(); return result;
diff --git a/chrome/browser/permissions/permission_prompt_android_unittest.cc b/chrome/browser/permissions/permission_prompt_android_unittest.cc index 4c3074c8..b0181da 100644 --- a/chrome/browser/permissions/permission_prompt_android_unittest.cc +++ b/chrome/browser/permissions/permission_prompt_android_unittest.cc
@@ -37,6 +37,8 @@ permissions::PermissionRequestManager::CreateForWebContents(web_contents()); permission_request_manager_ = permissions::PermissionRequestManager::FromWebContents(web_contents()); + permission_request_manager_ + ->set_enabled_app_level_notification_permission_for_testing(true); } base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc index 52f77679..c381bf9 100644 --- a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc +++ b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
@@ -2389,9 +2389,10 @@ }; // Test that video conferencing action buttons function correctly. +// TODO(crbug.com/1312401): Test is flaky. IN_PROC_BROWSER_TEST_F( VideoConferencingVideoPictureInPictureWindowControllerBrowserTest, - VideoConferencingActions) { + DISABLED_VideoConferencingActions) { // Enter PiP. LoadTabAndEnterPictureInPicture( browser(), base::FilePath(kPictureInPictureVideoConferencingPage));
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index e5fbdb0..7cc5dd6 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -558,6 +558,9 @@ { key::kScreenCaptureAllowedByOrigins, prefs::kScreenCaptureAllowedByOrigins, base::Value::Type::LIST }, + { key::kGetDisplayMediaSetSelectAllScreensAllowedForUrls, + prefs::kManagedGetDisplayMediaSetSelectAllScreensAllowedForUrls, + base::Value::Type::LIST }, { key::kWindowCaptureAllowedByOrigins, prefs::kWindowCaptureAllowedByOrigins, base::Value::Type::LIST },
diff --git a/chrome/browser/policy/developer_tools_policy_handler.cc b/chrome/browser/policy/developer_tools_policy_handler.cc index 6d3eabd..d145c562 100644 --- a/chrome/browser/policy/developer_tools_policy_handler.cc +++ b/chrome/browser/policy/developer_tools_policy_handler.cc
@@ -108,6 +108,8 @@ // not have a valid value, returns |nullopt|. absl::optional<Availability> GetValueFromDeveloperToolsAvailabilityPolicy( const PolicyMap& policies) { + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. const base::Value* developer_tools_availability = policies.GetValueUnsafe(key::kDeveloperToolsAvailability); @@ -146,13 +148,17 @@ bool DeveloperToolsPolicyHandler::CheckPolicySettings( const policy::PolicyMap& policies, policy::PolicyErrorMap* errors) { + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. // Deprecated boolean policy DeveloperToolsDisabled. const base::Value* developer_tools_disabled = policies.GetValueUnsafe(key::kDeveloperToolsDisabled); PolicyCheckResult developer_tools_disabled_result = CheckDeveloperToolsDisabled(developer_tools_disabled, errors); - // Enumerated policy DeveloperToolsAvailability + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. + // Enumerated policy DeveloperToolsAvailability. const base::Value* developer_tools_availability = policies.GetValueUnsafe(key::kDeveloperToolsAvailability); PolicyCheckResult developer_tools_availability_result =
diff --git a/chrome/browser/policy/javascript_policy_handler.cc b/chrome/browser/policy/javascript_policy_handler.cc index 86777557..aca22b8 100644 --- a/chrome/browser/policy/javascript_policy_handler.cc +++ b/chrome/browser/policy/javascript_policy_handler.cc
@@ -21,6 +21,8 @@ bool JavascriptPolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. const base::Value* javascript_enabled = policies.GetValueUnsafe(key::kJavascriptEnabled); const base::Value* default_setting =
diff --git a/chrome/browser/policy/network_prediction_policy_handler.cc b/chrome/browser/policy/network_prediction_policy_handler.cc index 48f6e2a..cdd1adb 100644 --- a/chrome/browser/policy/network_prediction_policy_handler.cc +++ b/chrome/browser/policy/network_prediction_policy_handler.cc
@@ -19,6 +19,8 @@ bool NetworkPredictionPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. // Deprecated boolean preference. const base::Value* network_prediction_enabled = policies.GetValueUnsafe(key::kDnsPrefetchingEnabled);
diff --git a/chrome/browser/policy/networking/network_configuration_updater.cc b/chrome/browser/policy/networking/network_configuration_updater.cc index a19e7b4..30fec269 100644 --- a/chrome/browser/policy/networking/network_configuration_updater.cc +++ b/chrome/browser/policy/networking/network_configuration_updater.cc
@@ -175,11 +175,12 @@ base::ListValue* certificates) { const PolicyMap& policies = policy_service_->GetPolicies( PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); - const base::Value* policy_value = policies.GetValueUnsafe(policy_key_); + const base::Value* policy_value = + policies.GetValue(policy_key_, base::Value::Type::STRING); - if (!policy_value) + if (!policies.IsPolicySet(policy_key_)) VLOG(2) << LogHeader() << " is not set."; - else if (!policy_value->is_string()) + else if (!policy_value) LOG(ERROR) << LogHeader() << " is not a string value."; const std::string onc_blob = policy_value && policy_value->is_string()
diff --git a/chrome/browser/policy/webhid_device_policy_handler.cc b/chrome/browser/policy/webhid_device_policy_handler.cc index 5620f220..d172bb4 100644 --- a/chrome/browser/policy/webhid_device_policy_handler.cc +++ b/chrome/browser/policy/webhid_device_policy_handler.cc
@@ -41,13 +41,14 @@ bool WebHidDevicePolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { - const base::Value* value = policies.GetValueUnsafe(policy_name()); - if (!value) + if (!policies.IsPolicySet(policy_name())) return true; - if (!SchemaValidatingPolicyHandler::CheckPolicySettings(policies, errors)) return false; + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::LIST); + DCHECK(value); int item_index = 0; for (const auto& item : value->GetListDeprecated()) { int url_index = 0;
diff --git a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc index c62af30..ca67068 100644 --- a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc +++ b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc
@@ -50,10 +50,8 @@ bool WebUsbAllowDevicesForUrlsPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { - const base::Value* value = policies.GetValueUnsafe(policy_name()); - if (!value) + if (!policies.IsPolicySet(policy_name())) return true; - bool result = SchemaValidatingPolicyHandler::CheckPolicySettings(policies, errors); @@ -62,6 +60,9 @@ if (!result) return result; + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::LIST); + DCHECK(value); int item_index = 0; for (const auto& item : value->GetListDeprecated()) { // The vendor and product ID descriptors of a USB devices should be
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index d9d6b4c..9de8e09 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -743,6 +743,7 @@ #endif const char kStabilityExtensionRendererLaunchCount[] = "user_experience_metrics.stability.extension_renderer_launch_count"; +const char kShowReadingListInBookmarkBar[] = "bookmark_bar.show_reading_list"; // Register local state used only for migration (clearing or moving to a new // key). @@ -967,6 +968,8 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) registry->RegisterIntegerPref(kPhoneHubCameraRollPendingStatePrefName, 0); #endif // BUILDFLAG(IS_CHROMEOS_ASH) + + registry->RegisterBooleanPref(kShowReadingListInBookmarkBar, true); } } // namespace @@ -1910,6 +1913,9 @@ crostini::RemoveDuplicateContainerEntries(profile_prefs); #endif + // Added 03/2022 + profile_prefs->ClearPref(kShowReadingListInBookmarkBar); + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS
diff --git a/chrome/browser/prefs/pref_service_incognito_allowlist.cc b/chrome/browser/prefs/pref_service_incognito_allowlist.cc index 215340f..f06891e 100644 --- a/chrome/browser/prefs/pref_service_incognito_allowlist.cc +++ b/chrome/browser/prefs/pref_service_incognito_allowlist.cc
@@ -88,7 +88,6 @@ bookmarks::prefs::kManagedBookmarks, bookmarks::prefs::kManagedBookmarksFolderName, bookmarks::prefs::kShowAppsShortcutInBookmarkBar, - bookmarks::prefs::kShowReadingListInBookmarkBar, bookmarks::prefs::kShowManagedBookmarksInBookmarkBar, bookmarks::prefs::kShowBookmarkBar, #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/printing/print_job_worker.h b/chrome/browser/printing/print_job_worker.h index 3a0d2be..a654507 100644 --- a/chrome/browser/printing/print_job_worker.h +++ b/chrome/browser/printing/print_job_worker.h
@@ -11,7 +11,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/values.h" #include "build/build_config.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc index f7d16b3..231b5d6 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -82,7 +82,7 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/exclusive_access/keyboard_lock_controller.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h" #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble_controller.h" #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc index 81467a8..76fd4b3 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -117,6 +117,14 @@ #include "ui/aura/window.h" #endif +#if defined(USE_AURA) +#include "ui/aura/window.h" +#endif + +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) +#include "ui/events/test/event_generator.h" +#endif + using content::WebContents; using extensions::MimeHandlerViewGuest; using extensions::TestMimeHandlerViewGuest; @@ -1583,6 +1591,20 @@ InProcessBrowserTest::SetUp(); } + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + gfx::NativeWindow window = browser()->window()->GetNativeWindow(); +#if defined(USE_AURA) + // When using aura, we need to get the root window in order to send events + // properly. + window = window->GetRootWindow(); +#endif + event_generator_ = std::make_unique<ui::test::EventGenerator>(window); + // This is needed to send the mouse event to the correct window on Mac. A + // no-op on other platforms. + event_generator_->set_target(ui::test::EventGenerator::Target::APPLICATION); + } + void SetUpCommandLine(base::CommandLine* command_line) override { // Tests in this suite make use of documents with no significant // rendered content, and such documents do not accept input for 500ms @@ -1601,15 +1623,26 @@ void AttemptLensRegionSearch() { // |menu_observer_| will cause the search lens for image menu item to be - // clicked. + // clicked. Sets a callback to simulate dragging a region on the screen once + // the region search UI has been set up. + menu_observer_ = std::make_unique<ContextMenuNotificationObserver>( + IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH, ui::EF_MOUSE_BUTTON, + base::BindOnce(&SearchByRegionBrowserTest::SimulateDrag, + base::Unretained(this))); + RightClickToOpenContextMenu(); + } + + void AttemptFullscreenLensRegionSearch() { + // |menu_observer_| will cause the search lens for image menu item to be + // clicked. Omit event flags to simulate entering through the keyboard. menu_observer_ = std::make_unique<ContextMenuNotificationObserver>( IDC_CONTENT_CONTEXT_LENS_REGION_SEARCH); RightClickToOpenContextMenu(); } // This attempts region search on the menu item designated for non-Google - // DSEs. - void AttemptNonGoogleRegionSearch() { + // DSEs as if entering the menu item via keyboard. + void AttemptFullscreenNonGoogleRegionSearch() { // |menu_observer_| will cause the search lens for image menu item to be // clicked. menu_observer_ = std::make_unique<ContextMenuNotificationObserver>( @@ -1617,6 +1650,18 @@ RightClickToOpenContextMenu(); } + // This attempts region search on the menu item designated for non-Google + // DSEs with mouse button event flags. + void AttemptNonGoogleRegionSearch() { + // |menu_observer_| will cause the search lens for image menu item to be + // clicked. + menu_observer_ = std::make_unique<ContextMenuNotificationObserver>( + IDC_CONTENT_CONTEXT_WEB_REGION_SEARCH, ui::EF_MOUSE_BUTTON, + base::BindOnce(&SearchByRegionBrowserTest::SimulateDrag, + base::Unretained(this))); + RightClickToOpenContextMenu(); + } + GURL GetNonGoogleRegionSearchURL() { static const char kImageSearchURL[] = "/imagesearch"; return embedded_test_server()->GetURL(kImageSearchURL); @@ -1634,6 +1679,16 @@ content::SimulateMouseClick(tab, 0, blink::WebMouseEvent::Button::kRight); } + // Simulates a valid drag for Lens region search. Must be called after the UI + // is set up or else the event will not be properly received by the feature. + void SimulateDrag() { + content::WebContents* tab = + browser()->tab_strip_model()->GetActiveWebContents(); + gfx::Point center = tab->GetContainerBounds().CenterPoint(); + event_generator_->MoveMouseTo(center); + event_generator_->DragMouseBy(100, 100); + } + // Sets up a custom test default search engine in order to test region search // for non-Google DSEs. void SetupNonGoogleRegionSearchEngine() { @@ -1659,11 +1714,11 @@ model->SetUserSelectedDefaultSearchProvider(template_url); } - private: void TearDownInProcessBrowserTestFixture() override { menu_observer_.reset(); } + std::unique_ptr<ui::test::EventGenerator> event_generator_; std::unique_ptr<ContextMenuNotificationObserver> menu_observer_; }; @@ -1672,7 +1727,7 @@ SetupAndLoadPage("/empty.html"); ui_test_utils::AllBrowserTabAddedWaiter add_tab; - // The browser should open a new tab for a region search. + // The browser should open a draggable UI for a region search. AttemptLensRegionSearch(); content::WebContents* new_tab = add_tab.Wait(); content::WaitForLoadStop(new_tab); @@ -1688,6 +1743,26 @@ } IN_PROC_BROWSER_TEST_F(SearchByRegionBrowserTest, + LensRegionSearchWithFullscreenRegionNewTab) { + SetupAndLoadPage("/empty.html"); + ui_test_utils::AllBrowserTabAddedWaiter add_tab; + + // The browser should open a new tab for a region search. + AttemptFullscreenLensRegionSearch(); + content::WebContents* new_tab = add_tab.Wait(); + content::WaitForLoadStop(new_tab); + + std::string expected_content = GetLensRegionSearchURL().GetContent(); + std::string new_tab_content = new_tab->GetLastCommittedURL().GetContent(); + // Match strings up to the query. + std::size_t query_start_pos = new_tab_content.find("?"); + // Match the query parameters, without the value of start_time. + EXPECT_THAT(new_tab_content, testing::MatchesRegex( + expected_content.substr(0, query_start_pos) + + ".*ep=crs&s=&st=\\d+")); +} + +IN_PROC_BROWSER_TEST_F(SearchByRegionBrowserTest, NonGoogleRegionSearchWithValidRegionNewTab) { SetupAndLoadPage("/empty.html"); SetupNonGoogleRegionSearchEngine(); @@ -1702,6 +1777,22 @@ std::string new_tab_content = new_tab->GetLastCommittedURL().GetContent(); EXPECT_EQ(expected_content, new_tab_content); } + +IN_PROC_BROWSER_TEST_F(SearchByRegionBrowserTest, + NonGoogleRegionSearchWithFullscreenRegionNewTab) { + SetupAndLoadPage("/empty.html"); + SetupNonGoogleRegionSearchEngine(); + ui_test_utils::AllBrowserTabAddedWaiter add_tab; + + // The browser should open a new tab for a region search. + AttemptFullscreenNonGoogleRegionSearch(); + content::WebContents* new_tab = add_tab.Wait(); + content::WaitForLoadStop(new_tab); + + std::string expected_content = GetNonGoogleRegionSearchURL().GetContent(); + std::string new_tab_content = new_tab->GetLastCommittedURL().GetContent(); + EXPECT_EQ(expected_content, new_tab_content); +} #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) // Maintains image search test state. In particular, note that |menu_observer_|
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc index 2830615..1d76d45 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h" #include "base/bind.h" +#include "base/callback.h" #include "base/location.h" #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" @@ -14,8 +15,12 @@ #include "content/public/test/test_utils.h" ContextMenuNotificationObserver::ContextMenuNotificationObserver( - int command_to_execute) - : command_to_execute_(command_to_execute) { + int command_to_execute, + int event_flags, + base::OnceClosure callback) + : command_to_execute_(command_to_execute), + event_flags_(event_flags), + callback_(std::move(callback)) { RenderViewContextMenu::RegisterMenuShownCallbackForTesting(base::BindOnce( &ContextMenuNotificationObserver::MenuShown, base::Unretained(this))); } @@ -33,8 +38,10 @@ void ContextMenuNotificationObserver::ExecuteCommand( RenderViewContextMenu* context_menu) { - context_menu->ExecuteCommand(command_to_execute_, 0); + context_menu->ExecuteCommand(command_to_execute_, event_flags_); context_menu->Cancel(); + if (!callback_.is_null()) + std::move(callback_).Run(); } ContextMenuWaiter::ContextMenuWaiter() {
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h index d7df912..5e37a89 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest_util.h
@@ -14,8 +14,13 @@ class ContextMenuNotificationObserver { public: - // Wait for a context menu to be shown, and then execute |command_to_execute|. - explicit ContextMenuNotificationObserver(int command_to_execute); + // Wait for a context menu to be shown, and then execute |command_to_execute| + // with specified |event_flags|. Also executes |callback| after executing the + // command if provided. + explicit ContextMenuNotificationObserver( + int command_to_execute, + int event_flags = 0, + base::OnceClosure callback = base::NullCallback()); ContextMenuNotificationObserver(const ContextMenuNotificationObserver&) = delete; @@ -30,6 +35,8 @@ void ExecuteCommand(RenderViewContextMenu* context_menu); int command_to_execute_; + int event_flags_; + base::OnceClosure callback_; }; class ContextMenuWaiter {
diff --git a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js index 338b2fc..6fc04a0 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js +++ b/chrome/browser/resources/chromeos/accessibility/common/automation_predicate.js
@@ -212,10 +212,10 @@ */ static touchLeaf(node) { return !!(!node.firstChild && node.name) || node.role === Role.BUTTON || - node.role === Role.CHECK_BOX || node.role === Role.LIST_BOX || - node.role === Role.POP_UP_BUTTON || node.role === Role.PORTAL || - node.role === Role.RADIO_BUTTON || node.role === Role.SLIDER || - node.role === Role.SWITCH || node.role === Role.TEXT_FIELD || + node.role === Role.CHECK_BOX || node.role === Role.POP_UP_BUTTON || + node.role === Role.PORTAL || node.role === Role.RADIO_BUTTON || + node.role === Role.SLIDER || node.role === Role.SWITCH || + node.role === Role.TEXT_FIELD || node.role === Role.TEXT_FIELD_WITH_COMBO_BOX || (node.role === Role.MENU_ITEM && !hasActionableDescendant(node)) || // Simple list items should be leaves. @@ -269,7 +269,7 @@ * @return {boolean} */ static leaf(node) { - return AutomationPredicate.touchLeaf(node) || + return AutomationPredicate.touchLeaf(node) || node.role === Role.LIST_BOX || // A node acting as a label should be a leaf if it has no actionable // controls. (!!node.labelFor && node.labelFor.length > 0 &&
diff --git a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts index 7822e35..532bb089 100644 --- a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts +++ b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts
@@ -204,8 +204,8 @@ return; case 'a': - // Take over CTRL+A. - if (hasCtrlModifier(e)) { + // Take over Ctrl+A (but not Ctrl-Shift-A or Ctrl-Alt-A). + if (hasCtrlModifier(e) && !e.shiftKey && !e.altKey) { e.preventDefault(); break; }
diff --git a/chrome/browser/resources/read_later/app.ts b/chrome/browser/resources/read_later/app.ts index 7ea30445..c0b902d9 100644 --- a/chrome/browser/resources/read_later/app.ts +++ b/chrome/browser/resources/read_later/app.ts
@@ -172,18 +172,11 @@ item.displayTimeSinceUpdate}`; } - private shouldShowCurrentPageActionButton_(): boolean { - return loadTimeData.getBoolean('currentPageActionButtonEnabled'); - } - /** * @return The appropriate text for the empty state subheader */ private getEmptyStateSubheaderText_(): string { - if (this.shouldShowCurrentPageActionButton_()) { - return loadTimeData.getString('emptyStateAddFromDialogSubheader'); - } - return loadTimeData.getString('emptyStateSubheader'); + return loadTimeData.getString('emptyStateAddFromDialogSubheader'); } /**
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js index 85d8177..a1439d57f 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
@@ -435,7 +435,10 @@ if (!this.device_ || !this.isDeviceConnected_) { return false; } - return this.device_.deviceProperties.deviceType === mojom.DeviceType.kMouse; + return this.device_.deviceProperties.deviceType === + mojom.DeviceType.kMouse || + this.device_.deviceProperties.deviceType === + mojom.DeviceType.kKeyboardMouseCombo; } /** @@ -447,7 +450,9 @@ return false; } return this.device_.deviceProperties.deviceType === - mojom.DeviceType.kKeyboard; + mojom.DeviceType.kKeyboard || + this.device_.deviceProperties.deviceType === + mojom.DeviceType.kKeyboardMouseCombo; } /**
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js index 534276e9..fa750c7e 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
@@ -264,6 +264,8 @@ return 'bluetoothA11yDeviceTypeGameController'; case deviceType.kKeyboard: return 'bluetoothA11yDeviceTypeKeyboard'; + case deviceType.kKeyboardMouseCombo: + return 'bluetoothA11yDeviceTypeKeyboardMouseCombo'; case deviceType.kMouse: return 'bluetoothA11yDeviceTypeMouse'; case deviceType.kTablet:
diff --git a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc index fcc915a..aad2aef2 100644 --- a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc
@@ -80,7 +80,7 @@ false /* store_last_modified */, false /* restore_session */); cache_manager_ = std::make_unique<VerdictCacheManager>( - nullptr, content_setting_map_.get()); + nullptr, content_setting_map_.get(), &test_pref_service_); referrer_chain_provider_ = std::make_unique<MockReferrerChainProvider>(); TestingProfile::Builder builder;
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 4ff082f..4d451c2 100644 --- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc +++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -272,7 +272,7 @@ /*store_last_modified=*/false, /*restore_session=*/false); cache_manager_ = std::make_unique<VerdictCacheManager>( - nullptr, content_setting_map_.get()); + nullptr, content_setting_map_.get(), &test_pref_service_); service_ = NewMockPasswordProtectionService(); fake_user_event_service_ = static_cast<syncer::FakeUserEventService*>(
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc index 9b3be057..87211a1 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -255,10 +255,12 @@ } if (!can_upload_enterprise_data_.contains(token_and_connector)) { - // Get the URL first since |request| is about to move. + // Get data from `request` before calling `IsAuthorized` since it is about + // to move. GURL url = request->GetUrlWithParams(); + bool per_profile_request = request->per_profile_request(); IsAuthorized( - std::move(url), + std::move(url), per_profile_request, base::BindOnce(&BinaryUploadService::MaybeUploadForDeepScanningCallback, weakptr_factory_.GetWeakPtr(), std::move(request)), dm_token, connector); @@ -835,6 +837,7 @@ void BinaryUploadService::IsAuthorized( const GURL& url, + bool per_profile_request, AuthorizationCallback callback, const std::string& dm_token, enterprise_connectors::AnalysisConnector connector) { @@ -861,6 +864,7 @@ url); request->set_device_token(dm_token); request->set_analysis_connector(connector); + request->set_per_profile_request(per_profile_request); QueueForDeepScanning(std::move(request)); } return; @@ -900,7 +904,8 @@ std::string dm_token = it->first.first; enterprise_connectors::AnalysisConnector connector = it->first.second; it = can_upload_enterprise_data_.erase(it); - IsAuthorized(url, base::DoNothing(), dm_token, connector); + IsAuthorized(url, /*per_profile_request*/ false, base::DoNothing(), + dm_token, connector); } }
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h index c78677b..9530d2c3 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.h
@@ -227,6 +227,7 @@ // data. using AuthorizationCallback = base::OnceCallback<void(bool)>; void IsAuthorized(const GURL& url, + bool per_profile_request, AuthorizationCallback callback, const std::string& dm_token, enterprise_connectors::AnalysisConnector connector);
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc index cc72f1c2..56dd1c4 100644 --- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc +++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service_unittest.cc
@@ -308,7 +308,8 @@ // response. base::RunLoop run_loop; service_->IsAuthorized( - GURL(), base::BindLambdaForTesting([&run_loop](bool authorized) { + GURL(), /*per_profile_request*/ false, + base::BindLambdaForTesting([&run_loop](bool authorized) { EXPECT_TRUE(authorized); run_loop.Quit(); }), @@ -595,7 +596,8 @@ // The 24 hours timer should be started on the first IsAuthorized call. ValidateAuthorizationTimerIdle(); service_->IsAuthorized( - GURL(), base::DoNothing(), "fake_device_token", + GURL(), /*per_profile_request*/ false, base::DoNothing(), + "fake_device_token", enterprise_connectors::AnalysisConnector::ANALYSIS_CONNECTOR_UNSPECIFIED); ValidateAuthorizationTimerStarted(); } @@ -611,14 +613,14 @@ enterprise_connectors::AnalysisConnector::FILE_ATTACHED, enterprise_connectors::AnalysisConnector::FILE_DOWNLOADED, enterprise_connectors::AnalysisConnector::PRINT}) { - service_->IsAuthorized(GURL(), base::BindOnce([](bool authorized) { - EXPECT_TRUE(authorized); - }), - "valid_dm_token", connector); - service_->IsAuthorized(GURL(), base::BindOnce([](bool authorized) { - EXPECT_FALSE(authorized); - }), - "invalid_dm_token", connector); + service_->IsAuthorized( + GURL(), /*per_profile_request*/ false, + base::BindOnce([](bool authorized) { EXPECT_TRUE(authorized); }), + "valid_dm_token", connector); + service_->IsAuthorized( + GURL(), /*per_profile_request*/ false, + base::BindOnce([](bool authorized) { EXPECT_FALSE(authorized); }), + "invalid_dm_token", connector); } }
diff --git a/chrome/browser/safe_browsing/verdict_cache_manager_factory.cc b/chrome/browser/safe_browsing/verdict_cache_manager_factory.cc index f2b19286..e94e9c3 100644 --- a/chrome/browser/safe_browsing/verdict_cache_manager_factory.cc +++ b/chrome/browser/safe_browsing/verdict_cache_manager_factory.cc
@@ -41,7 +41,8 @@ return new VerdictCacheManager( HistoryServiceFactory::GetForProfile(profile, ServiceAccessType::EXPLICIT_ACCESS), - HostContentSettingsMapFactory::GetForProfile(profile)); + HostContentSettingsMapFactory::GetForProfile(profile), + profile->GetPrefs()); } content::BrowserContext* VerdictCacheManagerFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/speech/DEPS b/chrome/browser/speech/DEPS index b68b77cc..08bbda9 100644 --- a/chrome/browser/speech/DEPS +++ b/chrome/browser/speech/DEPS
@@ -4,6 +4,4 @@ "+content/public/browser/tts_controller.h", "+components/live_caption", "+components/soda", - "+services/network/network_context.h", - "+services/network/public/cpp" ]
diff --git a/chrome/browser/speech/chrome_speech_recognition_service.cc b/chrome/browser/speech/chrome_speech_recognition_service.cc index b1b1475..597a159 100644 --- a/chrome/browser/speech/chrome_speech_recognition_service.cc +++ b/chrome/browser/speech/chrome_speech_recognition_service.cc
@@ -14,11 +14,9 @@ #include "components/user_prefs/user_prefs.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/service_process_host.h" -#include "content/public/browser/storage_partition.h" #include "media/base/media_switches.h" #include "media/mojo/mojom/speech_recognition_service.mojom.h" -#include "services/network/network_context.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" namespace speech {
diff --git a/chrome/browser/speech/chrome_speech_recognition_service.h b/chrome/browser/speech/chrome_speech_recognition_service.h index 48db2cf..27698c17 100644 --- a/chrome/browser/speech/chrome_speech_recognition_service.h +++ b/chrome/browser/speech/chrome_speech_recognition_service.h
@@ -5,11 +5,11 @@ #ifndef CHROME_BROWSER_SPEECH_CHROME_SPEECH_RECOGNITION_SERVICE_H_ #define CHROME_BROWSER_SPEECH_CHROME_SPEECH_RECOGNITION_SERVICE_H_ +#include "base/files/file_path.h" #include "base/memory/raw_ptr.h" #include "chrome/browser/speech/speech_recognition_service.h" -#include "components/keyed_service/core/keyed_service.h" #include "media/mojo/mojom/speech_recognition_service.mojom.h" -#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/remote.h" class PrefService;
diff --git a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc index bdb8cc2..ed46e25 100644 --- a/chrome/browser/subresource_filter/ad_tagging_browsertest.cc +++ b/chrome/browser/subresource_filter/ad_tagging_browsertest.cc
@@ -684,7 +684,7 @@ ui_test_utils::NavigateToURL(browser(), GetURL("frame_factory.html"))); // Create a frame and abort its initial load in vanilla script. The children - // of this vanilla frame should be taggged correctly. + // of this vanilla frame should be tagged correctly. content::RenderFrameHost* vanilla_frame_with_aborted_load = CreateFrameWithDocWriteAbortedLoad(GetWebContents()); @@ -1111,6 +1111,274 @@ AdTaggingEventWithScriptInStackBrowserTest, ::testing::Bool()); +class AdTaggingFencedFrameBrowserTest : public AdTaggingBrowserTest { + public: + AdTaggingFencedFrameBrowserTest() = default; + ~AdTaggingFencedFrameBrowserTest() override = default; + + content::test::FencedFrameTestHelper& fenced_frame_test_helper() { + return fenced_frame_test_helper_; + } + + void SetUpOnMainThread() override { + AdTaggingBrowserTest::SetUpOnMainThread(); + observer_ = std::make_unique<TestSubresourceFilterObserver>(web_contents()); + } + + bool EvaluatedSubframeLoad(const GURL url) { + return observer_->GetSubframeLoadPolicy(url).has_value(); + } + + bool IsAdSubframe(RenderFrameHost* host) { + return observer_->GetIsAdSubframe(host->GetFrameTreeNodeId()); + } + + RenderFrameHost* PrimaryMainFrame() { return web_contents()->GetMainFrame(); } + + private: + content::test::FencedFrameTestHelper fenced_frame_test_helper_; + std::unique_ptr<TestSubresourceFilterObserver> observer_; +}; + +// Test that a fenced frame itself can be tagged as an ad and that iframes +// nested within it see it as an ancestor ad frame. +IN_PROC_BROWSER_TEST_F(AdTaggingFencedFrameBrowserTest, + FencedFrameMatchingSuffixRuleIsTagged) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetURL("frame_factory.html?primary"))); + + // Create a fenced frame which should be tagged as an ad. + const GURL kUrl = GetURL("frame_factory.html?fencedframe&ad=true"); + RenderFrameHost* fenced_frame = CreateFencedFrame(PrimaryMainFrame(), kUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kUrl)); + EXPECT_TRUE(IsAdSubframe(fenced_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + fenced_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedBlockingRule, + blink::mojom::FrameCreationStackEvidence::kNotCreatedByAdScript)); + + // Create an iframe in the fenced frame that doesn't match any rules. Since + // the fenced frame was tagged as an ad, this should be as well. + GURL kInnerUrl = GetURL("test_div.html"); + RenderFrameHost* inner_frame = CreateSrcFrame(fenced_frame, kInnerUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kInnerUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + // Note: kCreatedByAdScript is expected since any script running in an ad is + // considered ad script. + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/true, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); +} + +// Test that a fenced frame created by ad script is tagged as an ad. +IN_PROC_BROWSER_TEST_F(AdTaggingFencedFrameBrowserTest, + FencedFrameCreatedByAdScriptIsTagged) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetURL("frame_factory.html?primary"))); + + { + // Create a fenced frame from an ad script so it should be tagged as an ad. + const GURL kUrl = GetURL("frame_factory.html?fencedframe"); + RenderFrameHost* fenced_frame = + CreateFencedFrameFromAdScript(PrimaryMainFrame(), kUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kUrl)); + EXPECT_TRUE(IsAdSubframe(fenced_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + fenced_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + + // Create a plain frame in the fenced frame. Since the fenced frame was + // tagged as an ad, this should be as well. + const GURL kInnerUrl = GetURL("test_div.html"); + RenderFrameHost* inner_frame = CreateSrcFrame(fenced_frame, kInnerUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kInnerUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/true, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + } + + // Create a fenced frame from a non-ad script, ensure it isn't tagged. + { + const GURL kUrl = GetURL("frame_factory.html?non+ad+fencedframe"); + RenderFrameHost* fenced_frame = CreateFencedFrame(PrimaryMainFrame(), kUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kUrl)); + EXPECT_FALSE(IsAdSubframe(fenced_frame)); + } +} + +// Test that a fenced frame not matching any rules, created in an ad-frame is +// also tagged as an ad. +IN_PROC_BROWSER_TEST_F(AdTaggingFencedFrameBrowserTest, + FencedFrameWithAdParentIsTagged) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetURL("frame_factory.html?primary"))); + + { + // Create a fenced frame to an ad URL. + const GURL kAdUrl = GetURL("frame_factory.html?fencedframe&ad=true"); + RenderFrameHost* ad_frame = CreateFencedFrame(PrimaryMainFrame(), kAdUrl); + + ASSERT_TRUE(EvaluatedSubframeLoad(kAdUrl)); + ASSERT_TRUE(IsAdSubframe(ad_frame)); + + // Create another fenced frame, nested in the first one, that doesn't match + // any rules. Since the first fenced frame was tagged as an ad, the inner + // one should be as well. + const GURL kInnerUrl = GetURL("test_div.html?nested+in+fenced+frame"); + RenderFrameHost* inner_frame = CreateFencedFrame(ad_frame, kInnerUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kInnerUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + // Note: kCreatedByAdScript is expected since any script running in an ad + // is considered ad script. + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/true, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + } + + { + // Create an iframe to an ad URL + const GURL kAdUrl = GetURL("frame_factory.html?iframe&ad=true"); + RenderFrameHost* ad_frame = CreateSrcFrame(PrimaryMainFrame(), kAdUrl); + + ASSERT_TRUE(EvaluatedSubframeLoad(kAdUrl)); + ASSERT_TRUE(IsAdSubframe(ad_frame)); + + // Create a fenced frame, nested in the ad iframe, that doesn't match any + // rules. Since the iframe was tagged as an ad, the fenced frame should be + // as well. + const GURL kInnerUrl = GetURL("test_div.html?nested+in+iframe"); + RenderFrameHost* inner_frame = CreateFencedFrame(ad_frame, kInnerUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kInnerUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + // Note: kCreatedByAdScript is expected since any script running in an ad + // is considered ad script. + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/true, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + } +} + +// Test ad tagging for iframes nested within a fenced frame. +IN_PROC_BROWSER_TEST_F(AdTaggingFencedFrameBrowserTest, + IFrameNestedInFencedFrameIsTagged) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetURL("frame_factory.html?primary"))); + + // Create a fenced frame into which we'll nest iframes. + const GURL kOuterUrl = GetURL("frame_factory.html?fencedframe"); + RenderFrameHost* fenced_frame = + CreateFencedFrame(PrimaryMainFrame(), kOuterUrl); + + ASSERT_TRUE(EvaluatedSubframeLoad(kOuterUrl)); + ASSERT_FALSE(IsAdSubframe(fenced_frame)); + + // Create an iframe inside the fenced frame that matches an ad rule. It + // should be tagged as an ad. + { + const GURL kAdUrl = GetURL("test_div.html?ad=true"); + RenderFrameHost* inner_frame = CreateSrcFrame(fenced_frame, kAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kAdUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedBlockingRule, + blink::mojom::FrameCreationStackEvidence::kNotCreatedByAdScript)); + } + + // Create an iframe inside the fenced frame that doesn't match any rules but + // is created from an ad script. It should be tagged as an ad. + { + const GURL kNotAdUrl = GetURL("test_div.html?not+an+ad"); + RenderFrameHost* inner_frame = + CreateSrcFrameFromAdScript(fenced_frame, kNotAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kNotAdUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + } + + // Create an iframe inside the fenced frame that doesn't match any rules. It + // should not be tagged as an ad. + { + const GURL kNotAdUrl = GetURL("test_div.html?also+not+an+ad"); + RenderFrameHost* inner_frame = CreateSrcFrame(fenced_frame, kNotAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kNotAdUrl)); + EXPECT_FALSE(IsAdSubframe(inner_frame)); + } +} + +// Test ad tagging for fenced frames nested within a fenced frame. +IN_PROC_BROWSER_TEST_F(AdTaggingFencedFrameBrowserTest, + FencedFrameNestedInFencedFrameIsTagged) { + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetURL("frame_factory.html?primary"))); + + // Create a fenced frame into which we'll nest other fenced frames. + const GURL kOuterUrl = GetURL("frame_factory.html?fencedframe"); + RenderFrameHost* fenced_frame = + CreateFencedFrame(PrimaryMainFrame(), kOuterUrl); + + ASSERT_TRUE(EvaluatedSubframeLoad(kOuterUrl)); + ASSERT_FALSE(IsAdSubframe(fenced_frame)); + + // Create a fenced frame inside the fenced frame that matches an ad rule. It + // should be tagged as an ad. + { + const GURL kAdUrl = GetURL("test_div.html?ad=true"); + RenderFrameHost* inner_frame = CreateFencedFrame(fenced_frame, kAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kAdUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedBlockingRule, + blink::mojom::FrameCreationStackEvidence::kNotCreatedByAdScript)); + } + + // Create a fenced frame inside the fenced frame that doesn't match any rules + // but is created from an ad script. It should be tagged as an ad. + { + const GURL kNotAdUrl = GetURL("test_div.html?not+an+ad"); + RenderFrameHost* inner_frame = + CreateFencedFrameFromAdScript(fenced_frame, kNotAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kNotAdUrl)); + EXPECT_TRUE(IsAdSubframe(inner_frame)); + EXPECT_TRUE(EvidenceForFrameComprises( + inner_frame, /*parent_is_ad=*/false, + blink::mojom::FilterListResult::kMatchedNoRules, + blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript)); + } + + // Create a fenced frame inside the fenced frame that doesn't match any + // rules. It should not be tagged as an ad. + { + const GURL kNotAdUrl = GetURL("test_div.html?also+not+an+ad"); + RenderFrameHost* inner_frame = CreateFencedFrame(fenced_frame, kNotAdUrl); + + EXPECT_TRUE(EvaluatedSubframeLoad(kNotAdUrl)); + EXPECT_FALSE(IsAdSubframe(inner_frame)); + } +} + } // namespace } // namespace subresource_filter
diff --git a/chrome/browser/sync/test/integration/local_sync_test.cc b/chrome/browser/sync/test/integration/local_sync_test.cc index c0b068d7..de7029be 100644 --- a/chrome/browser/sync/test/integration/local_sync_test.cc +++ b/chrome/browser/sync/test/integration/local_sync_test.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/browser_sync/browser_sync_switches.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/sync/base/command_line_switches.h" #include "components/sync/base/model_type.h" #include "components/sync/driver/sync_service_impl.h" @@ -95,11 +94,12 @@ // TODO(crbug.com/1109640): Consider whether all of these types should really // be enabled in Local Sync mode. syncer::ModelTypeSet expected_active_data_types = syncer::ModelTypeSet( - syncer::BOOKMARKS, syncer::PREFERENCES, syncer::PASSWORDS, - syncer::AUTOFILL_PROFILE, syncer::AUTOFILL, syncer::AUTOFILL_WALLET_DATA, - syncer::AUTOFILL_WALLET_METADATA, syncer::THEMES, syncer::TYPED_URLS, - syncer::EXTENSIONS, syncer::SEARCH_ENGINES, syncer::SESSIONS, - syncer::APPS, syncer::APP_SETTINGS, syncer::EXTENSION_SETTINGS, + syncer::BOOKMARKS, syncer::READING_LIST, syncer::PREFERENCES, + syncer::PASSWORDS, syncer::AUTOFILL_PROFILE, syncer::AUTOFILL, + syncer::AUTOFILL_WALLET_DATA, syncer::AUTOFILL_WALLET_METADATA, + syncer::THEMES, syncer::TYPED_URLS, syncer::EXTENSIONS, + syncer::SEARCH_ENGINES, syncer::SESSIONS, syncer::APPS, + syncer::APP_SETTINGS, syncer::EXTENSION_SETTINGS, syncer::HISTORY_DELETE_DIRECTIVES, syncer::DEVICE_INFO, syncer::PRIORITY_PREFERENCES, syncer::WEB_APPS, syncer::PROXY_TABS, syncer::NIGORI); @@ -114,10 +114,6 @@ expected_active_data_types.Put(syncer::DICTIONARY); #endif - if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater)) { - expected_active_data_types.Put(syncer::READING_LIST); - } - EXPECT_EQ(service->GetActiveDataTypes(), expected_active_data_types); // Verify certain features are disabled.
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc index 73b129e..33150cc 100644 --- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc +++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -48,6 +48,10 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "components/signin/public/base/signin_switches.h" +#endif + namespace { using testing::ElementsAre; @@ -89,8 +93,13 @@ // all Javascript changes to it are discarded, and thus any tests that cover // updating a password become flaky. feature_list_.InitWithFeatures( - {password_manager::features::kEnablePasswordsAccountStorage, - password_manager::features::kFillOnAccountSelect}, + { + password_manager::features::kEnablePasswordsAccountStorage, + password_manager::features::kFillOnAccountSelect, +#if BUILDFLAG(IS_CHROMEOS_LACROS) + switches::kLacrosNonSyncingProfiles, +#endif + }, {}); }
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc index 4eabeeca..6c793fec 100644 --- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -5,6 +5,7 @@ #include "base/callback_list.h" #include "base/files/file_util.h" #include "base/path_service.h" +#include "base/test/scoped_feature_list.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -20,6 +21,10 @@ #include "components/sync/driver/sync_service_impl.h" #include "content/public/test/browser_test.h" +#if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "components/signin/public/base/signin_switches.h" +#endif + namespace { #if !BUILDFLAG(IS_CHROMEOS_ASH) @@ -67,6 +72,11 @@ Profile* profile() { return GetProfile(0); } private: +#if BUILDFLAG(IS_CHROMEOS_LACROS) + base::test::ScopedFeatureList feature_list_{ + switches::kLacrosNonSyncingProfiles}; +#endif + base::CallbackListSubscription test_signin_client_subscription_; };
diff --git a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc index 31d5170a..c631b70d 100644 --- a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc +++ b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/touch_to_fill/android/jni_headers/Credential_jni.h" #include "chrome/browser/touch_to_fill/android/jni_headers/TouchToFillBridge_jni.h" #include "chrome/browser/touch_to_fill/touch_to_fill_controller.h" // nogncheck -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "components/password_manager/core/browser/origin_credential_store.h" #include "ui/android/view_android.h" #include "ui/android/window_android.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 6604a31..996e49fa 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -134,8 +134,6 @@ "passwords/account_avatar_fetcher.h", "passwords/manage_passwords_state.cc", "passwords/manage_passwords_state.h", - "passwords/manage_passwords_view_utils.cc", - "passwords/manage_passwords_view_utils.h", "passwords/password_generation_popup_controller.cc", "passwords/password_generation_popup_controller.h", "passwords/password_generation_popup_controller_impl.cc", @@ -147,6 +145,8 @@ "passwords/settings/password_manager_presenter.cc", "passwords/settings/password_manager_presenter.h", "passwords/settings/password_ui_view.h", + "passwords/ui_utils.cc", + "passwords/ui_utils.h", "passwords/well_known_change_password_navigation_throttle.cc", "passwords/well_known_change_password_navigation_throttle.h", "prefs/pref_watcher.cc", @@ -3231,6 +3231,8 @@ if (is_chromeos_lacros) { sources += [ + "startup/first_run_lacros.cc", + "startup/first_run_lacros.h", "views/chrome_browser_main_extra_parts_views_lacros.cc", "views/chrome_browser_main_extra_parts_views_lacros.h", "views/frame/browser_frame_lacros.cc", @@ -3915,7 +3917,7 @@ } } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { sources += [ "startup/web_app_info_recorder_utils.cc", "startup/web_app_info_recorder_utils.h", @@ -4384,8 +4386,6 @@ "views/location_bar/permission_request_chip.h", "views/location_bar/selected_keyword_view.cc", "views/location_bar/selected_keyword_view.h", - "views/location_bar/star_menu_model.cc", - "views/location_bar/star_menu_model.h", "views/location_bar/star_view.cc", "views/location_bar/star_view.h", "views/location_bar/zoom_bubble_view.cc", @@ -4617,8 +4617,6 @@ "views/qrcode_generator/qrcode_generator_bubble.h", "views/qrcode_generator/qrcode_generator_icon_view.cc", "views/qrcode_generator/qrcode_generator_icon_view.h", - "views/read_later/read_later_button.cc", - "views/read_later/read_later_button.h", "views/reader_mode/reader_mode_icon_view.cc", "views/reader_mode/reader_mode_icon_view.h", "views/relaunch_notification/relaunch_notification_controller.cc",
diff --git a/chrome/browser/ui/android/infobars/update_password_infobar.cc b/chrome/browser/ui/android/infobars/update_password_infobar.cc index bc4154e..196c886 100644 --- a/chrome/browser/ui/android/infobars/update_password_infobar.cc +++ b/chrome/browser/ui/android/infobars/update_password_infobar.cc
@@ -12,7 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/android/chrome_jni_headers/UpdatePasswordInfoBar_jni.h" #include "chrome/browser/password_manager/android/update_password_infobar_delegate_android.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "components/password_manager/core/common/credential_manager_types.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view_impl.cc b/chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view_impl.cc index f73c459..49f730489 100644 --- a/chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view_impl.cc +++ b/chrome/browser/ui/android/passwords/all_passwords_bottom_sheet_view_impl.cc
@@ -9,7 +9,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/android/features/keyboard_accessory/jni_headers/AllPasswordsBottomSheetBridge_jni.h" #include "chrome/browser/password_manager/android/all_passwords_bottom_sheet_controller.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h" #include "components/password_manager/core/browser/password_form.h"
diff --git a/chrome/browser/ui/app_list/search/games/game_result.cc b/chrome/browser/ui/app_list/search/games/game_result.cc index f327361..9b955f1 100644 --- a/chrome/browser/ui/app_list/search/games/game_result.cc +++ b/chrome/browser/ui/app_list/search/games/game_result.cc
@@ -6,8 +6,11 @@ #include <string> +#include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_types.h" +#include "ash/public/cpp/app_list/vector_icons/vector_icons.h" +#include "ash/public/cpp/style/color_provider.h" #include "ash/strings/grit/ash_strings.h" #include "base/bind.h" #include "base/metrics/histogram_functions.h" @@ -28,8 +31,10 @@ #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/page_transition_types.h" +#include "ui/chromeos/styles/cros_styles.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/image/image_skia.h" +#include "ui/gfx/paint_vector_icon.h" namespace app_list { namespace { @@ -50,6 +55,23 @@ return u"[game source]"; } +bool IsDarkModeEnabled() { + // TODO(crbug.com/1258415): Simplify this logic once the productivity launcher + // is launched. + + // Launcher search results UI is light by default, so use icons for light + // background if dark/light mode feature is not enabled. Productivity launcher + // has dark background by default, so use icons for dark background in that + // case. + if (ash::features::IsProductivityLauncherEnabled()) + return true; + auto* provider = ash::ColorProvider::Get(); + if (!provider) + return false; + return ash::features::IsDarkLightModeEnabled() && + provider->IsDarkModeEnabled(); +} + } // namespace GameResult::GameResult(Profile* profile, @@ -75,7 +97,7 @@ UpdateText(game, query); - // TODO(crbug.com/1305880): Set a default icon once added. + SetGenericIcon(); // TODO(crbug.com/1305880): Request icon from app disocvery service once API // added. } @@ -126,13 +148,25 @@ SetAccessibleName(base::StrCat(accessible_name)); } +void GameResult::SetGenericIcon() { + const auto color = cros_styles::ResolveColor( + cros_styles::ColorName::kIconColorPrimary, IsDarkModeEnabled(), + /*use_debug_colors=*/false); + const gfx::IconDescription description(ash::kGameGenericIcon, + GetAppIconDimension(), color); + SetIcon(IconInfo(gfx::CreateVectorIcon(description), GetAppIconDimension(), + IconShape::kRectangle)); +} + void GameResult::OnIconLoaded(const SkBitmap* bitmap) { + // TODO(crbug.com/1305880): This is not used yet. Should be passed as the + // callback to the app discovery icon fetching method once available. if (!bitmap || bitmap->isNull()) return; - - IconInfo icon_info(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap), - GetAppIconDimension(), IconShape::kRoundedRectangle); - SetIcon(icon_info); + // TODO(crbug.com/1305880): Possibly change the icon shape to a square with a + // border circle, once UI decision is finalized. + SetIcon(IconInfo(gfx::ImageSkia::CreateFrom1xBitmap(*bitmap), + GetAppIconDimension(), IconShape::kRoundedRectangle)); } } // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/games/game_result.h b/chrome/browser/ui/app_list/search/games/game_result.h index 7a02e6f..773f01d2 100644 --- a/chrome/browser/ui/app_list/search/games/game_result.h +++ b/chrome/browser/ui/app_list/search/games/game_result.h
@@ -35,9 +35,9 @@ void Open(int event_flags) override; private: - void OnIconLoaded(const SkBitmap* bitmap); - void UpdateText(const apps::Result& game, const std::u16string& query); + void SetGenericIcon(); + void OnIconLoaded(const SkBitmap* bitmap); Profile* profile_; AppListControllerDelegate* list_controller_;
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 190bcd1..a4b37aa 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -40,7 +40,7 @@ #include "chrome/browser/ui/autofill/save_update_address_profile_bubble_controller_impl.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/page_info/page_info_dialog.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/browser/web_data_service_factory.h" #include "chrome/common/channel_info.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index e212e66..e5a8ee8 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -44,6 +44,9 @@ class VirtualCardEnrollmentManager; // Chrome implementation of AutofillClient. +// ChromeAutofillClient is instantiated once per WebContents, and usages of +// main frame refer to the primary main frame because WebContents only has a +// primary main frame. class ChromeAutofillClient : public AutofillClient, public content::WebContentsUserData<ChromeAutofillClient>,
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc index 3a14422b..bc35cc8 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
@@ -35,7 +35,6 @@ #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/bookmarks/managed/managed_bookmark_service.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/strings/grit/components_strings.h" #include "components/tab_groups/tab_group_visual_data.h" #include "components/undo/bookmark_undo_service.h" @@ -109,20 +108,6 @@ } } -// Returns true if |command_id| corresponds to a command related to bookmark bar -// management. -bool IsBookmarkBarManagementCommand(int command_id) { - switch (command_id) { - case IDC_BOOKMARK_MANAGER: - case IDC_BOOKMARK_BAR_SHOW_APPS_SHORTCUT: - case IDC_BOOKMARK_BAR_SHOW_READING_LIST: - case IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS: - case IDC_BOOKMARK_BAR_ALWAYS_SHOW: - return true; - } - return false; -} - } // namespace BookmarkContextMenuController::BookmarkContextMenuController( @@ -215,11 +200,6 @@ AddCheckboxItem(IDC_BOOKMARK_BAR_SHOW_APPS_SHORTCUT, IDS_BOOKMARK_BAR_SHOW_APPS_SHORTCUT); } - if (reading_list::switches::IsReadingListEnabled() && - !base::FeatureList::IsEnabled(features::kSidePanel)) { - AddCheckboxItem(IDC_BOOKMARK_BAR_SHOW_READING_LIST, - IDS_BOOKMARK_BAR_SHOW_READING_LIST); - } AddCheckboxItem(IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS, IDS_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS_DEFAULT_NAME); AddCheckboxItem(IDC_BOOKMARK_BAR_ALWAYS_SHOW, IDS_SHOW_BOOKMARK_BAR); @@ -364,14 +344,6 @@ break; } - case IDC_BOOKMARK_BAR_SHOW_READING_LIST: { - PrefService* prefs = profile_->GetPrefs(); - prefs->SetBoolean( - bookmarks::prefs::kShowReadingListInBookmarkBar, - !prefs->GetBoolean(bookmarks::prefs::kShowReadingListInBookmarkBar)); - break; - } - case IDC_BOOKMARK_BAR_SHOW_MANAGED_BOOKMARKS: { PrefService* prefs = profile_->GetPrefs(); prefs->SetBoolean( @@ -460,9 +432,6 @@ return prefs->GetBoolean( bookmarks::prefs::kShowManagedBookmarksInBookmarkBar); } - if (command_id == IDC_BOOKMARK_BAR_SHOW_READING_LIST) { - return prefs->GetBoolean(bookmarks::prefs::kShowReadingListInBookmarkBar); - } DCHECK_EQ(IDC_BOOKMARK_BAR_SHOW_APPS_SHORTCUT, command_id); return prefs->GetBoolean(bookmarks::prefs::kShowAppsShortcutInBookmarkBar); @@ -471,12 +440,6 @@ bool BookmarkContextMenuController::IsCommandIdEnabled(int command_id) const { PrefService* prefs = profile_->GetPrefs(); - // If the context menu is being shown from the reading list button then only - // the bookmark bar management options should be enabled. - if (!parent_ && selection_.empty()) { - return IsBookmarkBarManagementCommand(command_id); - } - bool is_root_node = selection_.size() == 1 && selection_[0]->parent() == model_->root_node(); bool can_edit = prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled) &&
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc index de7c739..8b8d5de6 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
@@ -23,7 +23,6 @@ #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/bookmarks/test/bookmark_test_helpers.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "content/public/browser/page_navigator.h" #include "content/public/test/browser_task_environment.h" @@ -52,9 +51,7 @@ class BookmarkContextMenuControllerTest : public testing::Test { public: - BookmarkContextMenuControllerTest() : model_(nullptr) { - feature_list_.InitAndEnableFeature(reading_list::switches::kReadLater); - } + BookmarkContextMenuControllerTest() : model_(nullptr) {} void SetUp() override { TestingProfile::Builder profile_builder; @@ -104,7 +101,6 @@ } protected: - base::test::ScopedFeatureList feature_list_; content::BrowserTaskEnvironment task_environment_; std::unique_ptr<TestingProfile> profile_; raw_ptr<BookmarkModel> model_; @@ -397,30 +393,3 @@ EXPECT_FALSE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_SHOW_APPS_SHORTCUT)); } - -TEST_F(BookmarkContextMenuControllerTest, ShowReadingListInBookmarksBar) { - BookmarkContextMenuController controller( - nullptr, nullptr, nullptr, profile_.get(), NullNavigatorGetter(), - BOOKMARK_LAUNCH_LOCATION_NONE, model_->bookmark_bar_node(), - std::vector<const BookmarkNode*>()); - - // By default, the command is enabled and checked. - sync_preferences::TestingPrefServiceSyncable* prefs = - profile_->GetTestingPrefService(); - EXPECT_FALSE(prefs->IsManagedPreference( - bookmarks::prefs::kShowReadingListInBookmarkBar)); - EXPECT_TRUE( - controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_SHOW_READING_LIST)); - EXPECT_TRUE( - controller.IsCommandIdChecked(IDC_BOOKMARK_BAR_SHOW_READING_LIST)); - - // Execute the command and verify it is unchecked. - controller.ExecuteCommand(IDC_BOOKMARK_BAR_SHOW_READING_LIST, 0); - EXPECT_FALSE( - controller.IsCommandIdChecked(IDC_BOOKMARK_BAR_SHOW_READING_LIST)); - - // Execute the command and verify it is checked. - controller.ExecuteCommand(IDC_BOOKMARK_BAR_SHOW_READING_LIST, 0); - EXPECT_TRUE( - controller.IsCommandIdChecked(IDC_BOOKMARK_BAR_SHOW_READING_LIST)); -}
diff --git a/chrome/browser/ui/bookmarks/bookmark_utils.cc b/chrome/browser/ui/bookmarks/bookmark_utils.cc index 7c41c782..781e3d8 100644 --- a/chrome/browser/ui/bookmarks/bookmark_utils.cc +++ b/chrome/browser/ui/bookmarks/bookmark_utils.cc
@@ -24,7 +24,6 @@ #include "components/dom_distiller/core/url_constants.h" #include "components/dom_distiller/core/url_utils.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/search/search.h" #include "components/strings/grit/components_strings.h" #include "components/url_formatter/url_formatter.h" @@ -163,12 +162,6 @@ bookmarks::prefs::kShowAppsShortcutInBookmarkBar); } -bool ShouldShowReadingListInBookmarkBar(Profile* profile) { - return base::FeatureList::IsEnabled(reading_list::switches::kReadLater) && - profile->GetPrefs()->GetBoolean( - bookmarks::prefs::kShowReadingListInBookmarkBar); -} - int GetBookmarkDragOperation(content::BrowserContext* browser_context, const BookmarkNode* node) { PrefService* prefs = user_prefs::UserPrefs::Get(browser_context);
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 8194cfc..9a8d5ed 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -1167,7 +1167,6 @@ } model->AddEntry(url, base::UTF16ToUTF8(title), reading_list::EntrySource::ADDED_VIA_CURRENT_APP); - MaybeShowBookmarkBarForReadLater(browser); browser->window()->MaybeShowFeaturePromo( feature_engagement::kIPHReadingListDiscoveryFeature); base::UmaHistogramEnumeration( @@ -1203,26 +1202,6 @@ return entry && !entry->IsRead(); } -void MaybeShowBookmarkBarForReadLater(Browser* browser) { -#if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled(features::kSidePanel)) - return; - PrefService* pref_service = browser->profile()->GetPrefs(); - if (pref_service && - !pref_service->GetBoolean( - reading_list::prefs::kReadingListDesktopFirstUseExperienceShown)) { - pref_service->SetBoolean( - reading_list::prefs::kReadingListDesktopFirstUseExperienceShown, true); - base::UmaHistogramEnumeration( - "ReadingList.BookmarkBarState.OnFirstAddToReadingList", - browser->bookmark_bar_state()); - - if (browser->bookmark_bar_state() == BookmarkBar::HIDDEN) - ToggleBookmarkBar(browser); - } -#endif // BUILDFLAG(IS_ANDROID) -} - void ShowOffersAndRewardsForPage(Browser* browser) { WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ui/browser_commands.h b/chrome/browser/ui/browser_commands.h index f5f7fe7..3464ee4 100644 --- a/chrome/browser/ui/browser_commands.h +++ b/chrome/browser/ui/browser_commands.h
@@ -156,7 +156,6 @@ bool MoveTabToReadLater(Browser* browser, content::WebContents* web_contents); bool MarkCurrentTabAsReadInReadLater(Browser* browser); bool IsCurrentTabUnreadInReadLater(Browser* browser); -void MaybeShowBookmarkBarForReadLater(Browser* browser); void ShowOffersAndRewardsForPage(Browser* browser); void SaveCreditCard(Browser* browser); void MigrateLocalCards(Browser* browser);
diff --git a/chrome/browser/ui/browser_commands_browsertest.cc b/chrome/browser/ui/browser_commands_browsertest.cc index 1b0f49fb..fc9a96b 100644 --- a/chrome/browser/ui/browser_commands_browsertest.cc +++ b/chrome/browser/ui/browser_commands_browsertest.cc
@@ -13,7 +13,6 @@ #include "chrome/browser/ui/ui_features.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/reading_list/features/reading_list_switches.h" #include "content/public/test/browser_test.h" namespace chrome { @@ -203,61 +202,4 @@ url3); } -class ReadLaterBrowserCommandsTest : public BrowserCommandsTest { - public: - ReadLaterBrowserCommandsTest() { - feature_list_.InitWithFeatures( - /*enabled_features=*/{reading_list::switches::kReadLater}, - /*disabled_features=*/{features::kSidePanel}); - } - ~ReadLaterBrowserCommandsTest() override = default; - - void SetUpOnMainThread() override { - // Navigate to a url that can be added to the reading list. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL("https://www.google.com"))); - BrowserCommandsTest::SetUpOnMainThread(); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Verify that the bookmark bar is shown the first time someone saves to read -// later and the metric is properly recorded. -IN_PROC_BROWSER_TEST_F(ReadLaterBrowserCommandsTest, - PRE_ReadLaterOpensBookmarksBarOnFirstUse) { - base::HistogramTester histogram_tester; - constexpr char kFirstAddHistogramName[] = - "ReadingList.BookmarkBarState.OnFirstAddToReadingList"; - constexpr char kEveryAddHistogramName[] = - "ReadingList.BookmarkBarState.OnEveryAddToReadingList"; - - histogram_tester.ExpectTotalCount(kFirstAddHistogramName, 0); - histogram_tester.ExpectTotalCount(kEveryAddHistogramName, 0); - EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); - // Verify the bookmark bar is shown after saving to the reading list. - MoveCurrentTabToReadLater(browser()); - EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state()); - histogram_tester.ExpectTotalCount(kFirstAddHistogramName, 1); - histogram_tester.ExpectTotalCount(kEveryAddHistogramName, 1); - ToggleBookmarkBar(browser()); - EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); - // Verify the bookmark bar isn't reshown on subsequent saves to the reading - // list. - MoveCurrentTabToReadLater(browser()); - EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); - histogram_tester.ExpectTotalCount(kFirstAddHistogramName, 1); - histogram_tester.ExpectTotalCount(kEveryAddHistogramName, 2); -} - -// Verify that the bookmark bar is not reshown after Chrome restarts. -IN_PROC_BROWSER_TEST_F(ReadLaterBrowserCommandsTest, - ReadLaterOpensBookmarksBarOnFirstUse) { - EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); - // Verify the bookmark bar is still hidden after saving to the reading list. - MoveCurrentTabToReadLater(browser()); - EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state()); -} - } // namespace chrome
diff --git a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.mm b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.mm index c2033ab..6085428 100644 --- a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.mm +++ b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_mouse_tracker.mm
@@ -100,7 +100,11 @@ if (!_trackingArea) return; - DCHECK(_contentView); + // TODO(https://crbug.com/1063417, https://crbug.com/1064911): This DCHECK + // is hit when closing a fullscreen window using the traffic lights. This is + // because removeTrackingArea should be removed in response to the window + // closing, but isn't. + // DCHECK(_contentView); [_contentView removeTrackingArea:_trackingArea]; _trackingArea.reset(); _contentView.reset();
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h index f05dc49c..34378924 100644 --- a/chrome/browser/ui/color/chrome_color_id.h +++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -52,6 +52,10 @@ E_CPONLY(kColorDesktopMediaTabListBorder) \ E_CPONLY(kColorDesktopMediaTabListPreviewBackground) \ /* Download shelf colors. */ \ + E_CPONLY(kColorDownloadItemForeground) \ + E_CPONLY(kColorDownloadItemForegroundDangerous) \ + E_CPONLY(kColorDownloadItemForegroundDisabled) \ + E_CPONLY(kColorDownloadItemForegroundSafe) \ E_CPONLY(kColorDownloadItemProgressRingBackground) \ E_CPONLY(kColorDownloadItemProgressRingForeground) \ E(kColorDownloadShelfBackground, ThemeProperties::COLOR_DOWNLOAD_SHELF) \
diff --git a/chrome/browser/ui/color/chrome_color_mixer.cc b/chrome/browser/ui/color/chrome_color_mixer.cc index 141fa3e2..8e88c81f 100644 --- a/chrome/browser/ui/color/chrome_color_mixer.cc +++ b/chrome/browser/ui/color/chrome_color_mixer.cc
@@ -226,6 +226,19 @@ mixer[kColorCapturedTabContentsBorder] = {ui::kColorAccent}; mixer[kColorDesktopMediaTabListBorder] = {ui::kColorMidground}; mixer[kColorDesktopMediaTabListPreviewBackground] = {ui::kColorMidground}; + mixer[kColorDownloadItemForeground] = {kColorDownloadShelfForeground}; + mixer[kColorDownloadItemForegroundDangerous] = ui::PickGoogleColor( + ui::SelectBasedOnDarkInput(kColorToolbar, gfx::kGoogleRed300, + gfx::kGoogleRed600), + kColorToolbar, color_utils::kMinimumReadableContrastRatio); + mixer[kColorDownloadItemForegroundDisabled] = BlendForMinContrast( + ui::AlphaBlend(kColorDownloadItemForeground, kColorToolbar, + gfx::kGoogleGreyAlpha600), + kColorToolbar, kColorDownloadItemForeground); + mixer[kColorDownloadItemForegroundSafe] = ui::PickGoogleColor( + ui::SelectBasedOnDarkInput(kColorToolbar, gfx::kGoogleGreen300, + gfx::kGoogleGreen700), + kColorToolbar, color_utils::kMinimumReadableContrastRatio); mixer[kColorDownloadItemProgressRingBackground] = { ui::kColorThrobberPreconnect}; mixer[kColorDownloadItemProgressRingForeground] = {ui::kColorThrobber};
diff --git a/chrome/browser/ui/passwords/bubble_controllers/items_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/items_bubble_controller.cc index bd62f6e7..2669002 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/items_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/items_bubble_controller.cc
@@ -6,8 +6,8 @@ #include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/password_manager/password_store_utils.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "components/favicon/core/favicon_util.h" #include "components/password_manager/core/browser/password_form.h"
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc index ad4d423f..d330106 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_bubble_controller.cc
@@ -11,8 +11,8 @@ #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/theme_resources.h" #include "components/password_manager/core/browser/password_feature_manager.h"
diff --git a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc index 9d45e73a..a1bc2af 100644 --- a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc +++ b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc
@@ -6,9 +6,9 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/password_dialog_prompts.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/password_manager/core/browser/password_bubble_experiment.h"
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc index 587fcc87..b853c23 100644 --- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc +++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -32,8 +32,8 @@ #include "chrome/browser/ui/passwords/credential_leak_dialog_controller_impl.h" #include "chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.h" #include "chrome/browser/ui/passwords/manage_passwords_icon_view.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/password_dialog_prompts.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/simple_message_box.h" #include "chrome/browser/ui/tab_dialogs.h" #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/ui/passwords/settings/password_manager_presenter.cc b/chrome/browser/ui/passwords/settings/password_manager_presenter.cc index 9c83e47e..6966cf3d 100644 --- a/chrome/browser/ui/passwords/settings/password_manager_presenter.cc +++ b/chrome/browser/ui/passwords/settings/password_manager_presenter.cc
@@ -29,8 +29,8 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/settings/password_ui_view.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc b/chrome/browser/ui/passwords/ui_utils.cc similarity index 96% rename from chrome/browser/ui/passwords/manage_passwords_view_utils.cc rename to chrome/browser/ui/passwords/ui_utils.cc index 1c1324a..4abbac39 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils.cc +++ b/chrome/browser/ui/passwords/ui_utils.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/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include <stddef.h> @@ -11,7 +11,9 @@ #include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "base/strings/utf_string_conversions.h" +#include "build/branding_buildflags.h" #include "build/build_config.h" +#include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/browser_navigator.h" @@ -248,3 +250,11 @@ url_loader_factory.BindNewPipeAndPassReceiver()); return url_loader_factory; } + +const gfx::VectorIcon& GooglePasswordManagerVectorIcon() { +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + return kGooglePasswordManagerIcon; +#else + return kKeyIcon; +#endif +}
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils.h b/chrome/browser/ui/passwords/ui_utils.h similarity index 91% rename from chrome/browser/ui/passwords/manage_passwords_view_utils.h rename to chrome/browser/ui/passwords/ui_utils.h index c23b9d4..0fe2a437 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils.h +++ b/chrome/browser/ui/passwords/ui_utils.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_UI_PASSWORDS_MANAGE_PASSWORDS_VIEW_UTILS_H_ -#define CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_VIEW_UTILS_H_ +#ifndef CHROME_BROWSER_UI_PASSWORDS_UI_UTILS_H_ +#define CHROME_BROWSER_UI_PASSWORDS_UI_UTILS_H_ #include <string> #include <utility> @@ -12,6 +12,7 @@ #include "components/password_manager/core/browser/origin_credential_store.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" +#include "ui/gfx/vector_icon_types.h" namespace content { class WebContents; @@ -114,4 +115,8 @@ mojo::Remote<network::mojom::URLLoaderFactory> GetURLLoaderForMainFrame( content::WebContents* web_contents); -#endif // CHROME_BROWSER_UI_PASSWORDS_MANAGE_PASSWORDS_VIEW_UTILS_H_ +// Returns that vector icon to represent Google Password Manager in Desktop UI. +// Returns different version for branded builds. +const gfx::VectorIcon& GooglePasswordManagerVectorIcon(); + +#endif // CHROME_BROWSER_UI_PASSWORDS_UI_UTILS_H_
diff --git a/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc b/chrome/browser/ui/passwords/ui_utils_unittest.cc similarity index 98% rename from chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc rename to chrome/browser/ui/passwords/ui_utils_unittest.cc index 803bb3f..15a9704 100644 --- a/chrome/browser/ui/passwords/manage_passwords_view_utils_unittest.cc +++ b/chrome/browser/ui/passwords/ui_utils_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/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include <stddef.h>
diff --git a/chrome/browser/ui/profile_picker.cc b/chrome/browser/ui/profile_picker.cc index d8821556..44afa4e 100644 --- a/chrome/browser/ui/profile_picker.cc +++ b/chrome/browser/ui/profile_picker.cc
@@ -51,7 +51,7 @@ if (first_run_exited_callback_) { std::move(first_run_exited_callback_) - .Run(/*finished=*/false, BrowserOpenedCallback()); + .Run(FirstRunExitStatus::kQuitEarly, base::OnceClosure()); } #endif } @@ -104,11 +104,12 @@ std::move(account_selected_callback_).Run(gaia_id); } -void ProfilePicker::Params::NotifyFirstRunFinished( - BrowserOpenedCallback maybe_callback) { +void ProfilePicker::Params::NotifyFirstRunExited( + FirstRunExitStatus exit_status, + base::OnceClosure maybe_callback) { if (first_run_exited_callback_) std::move(first_run_exited_callback_) - .Run(/*finished=*/true, std::move(maybe_callback)); + .Run(exit_status, std::move(maybe_callback)); } #endif
diff --git a/chrome/browser/ui/profile_picker.h b/chrome/browser/ui/profile_picker.h index 3bd7bb2..cd0f8573 100644 --- a/chrome/browser/ui/profile_picker.h +++ b/chrome/browser/ui/profile_picker.h
@@ -33,8 +33,20 @@ public: using BrowserOpenedCallback = base::OnceCallback<void(Browser*)>; #if BUILDFLAG(IS_CHROMEOS_LACROS) + enum class FirstRunExitStatus { + // The user completed the FRE and is continuing to launch the browser. + kCompleted = 0, + + // The user finished the mandatory FRE steps but abandoned their task + // (closed the browser app). + kQuitAtEnd = 1, + + // The user exited the FRE before going through the mandatory steps. + kQuitEarly = 2, + }; using FirstRunExitedCallback = - base::OnceCallback<void(bool finished, BrowserOpenedCallback callback)>; + base::OnceCallback<void(FirstRunExitStatus status, + base::OnceClosure callback)>; #endif // Only work when passed as the argument 'on_select_profile_target_url' to @@ -115,8 +127,9 @@ // Builds parameter with the `kLacrosPrimaryProfileFirstRun` entry point. // // `first_run_exited_callback` is called when the first run experience is - // exited, with `true` if the user actually finished it, or `false` if it - // was exited early. + // exited, with a `FirstRunExitStatus` indicating how the user responded to + // it, and an optional callback that must be run if the user has proceeded + // to the browser after the FRE. static Params ForLacrosPrimaryProfileFirstRun( FirstRunExitedCallback first_run_exited_callback); @@ -124,14 +137,15 @@ // `ForLacrosSelectAvailableAccount()` for more details. void NotifyAccountSelected(const std::string& gaia_id); - // Calls `first_run_exited_callback_`, forwarding `callback`. See - // `ForLacrosPrimaryProfileFirstRun()` for more details. + // Calls `first_run_exited_callback_`, forwarding `exit_status` and + // `maybe_callback`. See `ForLacrosPrimaryProfileFirstRun()` for more + // details. // - // Does not take any argument for `finished` as we assume that calling it - // indicates that the flow is actually finished, not just an early exit. - // The callback is called with `false` through the param's destructor - // instead. - void NotifyFirstRunFinished(BrowserOpenedCallback callback); + // If this method is not called by the time this `Param` is destroyed, an + // intent to quit will be assumed and `first_run_exited_callback_` will be + // called by the destructor with quit-related arguments. + void NotifyFirstRunExited(FirstRunExitStatus exit_status, + base::OnceClosure maybe_callback); #endif // Returns the URL to load as initial content for the profile picker. If an
diff --git a/chrome/browser/ui/profile_picker_unittest.cc b/chrome/browser/ui/profile_picker_unittest.cc index 1b441630..e611107 100644 --- a/chrome/browser/ui/profile_picker_unittest.cc +++ b/chrome/browser/ui/profile_picker_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/profile_picker.h" +#include "base/callback.h" #include "base/files/file_path.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" @@ -176,8 +177,8 @@ } TEST_F(ProfilePickerParamsTest, ForLacrosPrimaryProfileFirstRun_Exit) { - testing::StrictMock< - base::MockOnceCallback<void(bool, ProfilePicker::BrowserOpenedCallback)>> + testing::StrictMock<base::MockOnceCallback<void( + ProfilePicker::FirstRunExitStatus, base::OnceClosure)>> callback; { ProfilePicker::Params params = @@ -185,21 +186,24 @@ EXPECT_EQ(base::FilePath::FromASCII(chrome::kInitialProfile), params.profile_path().BaseName()); // The callback is called at destruction. - EXPECT_CALL(callback, Run(false, ::testing::_)); + EXPECT_CALL(callback, Run(ProfilePicker::FirstRunExitStatus::kQuitEarly, + ::testing::_)); } } TEST_F(ProfilePickerParamsTest, ForLacrosPrimaryProfileFirstRun_Notify) { - testing::StrictMock< - base::MockOnceCallback<void(bool, ProfilePicker::BrowserOpenedCallback)>> + testing::StrictMock<base::MockOnceCallback<void( + ProfilePicker::FirstRunExitStatus, base::OnceClosure)>> callback; { ProfilePicker::Params params = ProfilePicker::Params::ForLacrosPrimaryProfileFirstRun(callback.Get()); EXPECT_EQ(base::FilePath::FromASCII(chrome::kInitialProfile), params.profile_path().BaseName()); - EXPECT_CALL(callback, Run(true, ::testing::_)); - params.NotifyFirstRunFinished(base::DoNothing()); + EXPECT_CALL(callback, Run(ProfilePicker::FirstRunExitStatus::kCompleted, + ::testing::_)); + params.NotifyFirstRunExited(ProfilePicker::FirstRunExitStatus::kCompleted, + base::DoNothing()); } } #endif
diff --git a/chrome/browser/ui/startup/first_run_lacros.cc b/chrome/browser/ui/startup/first_run_lacros.cc new file mode 100644 index 0000000..2e09e87 --- /dev/null +++ b/chrome/browser/ui/startup/first_run_lacros.cc
@@ -0,0 +1,109 @@ +// Copyright 2022 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/startup/first_run_lacros.h" + +#include "base/bind.h" +#include "base/callback.h" +#include "base/callback_forward.h" +#include "base/command_line.h" +#include "base/feature_list.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/lacros/lacros_prefs.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/profiles/profile_window.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/profile_picker.h" +#include "chrome/common/chrome_switches.h" +#include "components/prefs/pref_service.h" +#include "components/signin/public/base/consent_level.h" +#include "components/signin/public/base/signin_switches.h" +#include "components/signin/public/identity_manager/identity_manager.h" + +namespace { + +// Processes the outcome from the FRE and resumes the user's interrupted task. +// `original_intent_callback` should be run to allow the caller to resume what +// they were trying to do before they stopped to show the FRE. If the FRE's +// `status` is not `ProfilePicker::FirstRunExitStatus::kCompleted`, that +// `original_intent_callback` will not be executed. `post_first_run_callback` +// will be executed for completed flows, to perform tasks that the FRE requires +// after the interrupted task is resumed. +void OnFirstRunHasExited(base::OnceClosure original_intent_callback, + ProfilePicker::FirstRunExitStatus status, + base::OnceClosure post_first_run_callback) { + // The user aborted the FRE, we don't proceed with the original intent. + if (status == ProfilePicker::FirstRunExitStatus::kQuitEarly) + return; + + // The user got to the last step, we can mark the FRE as finished, even if we + // know a few lines below that they want to close the browser. + PrefService* local_state = g_browser_process->local_state(); + local_state->SetBoolean(lacros_prefs::kPrimaryProfileFirstRunFinished, true); + + if (status == ProfilePicker::FirstRunExitStatus::kQuitAtEnd) + return; + + std::move(original_intent_callback).Run(); + + if (post_first_run_callback) + std::move(post_first_run_callback).Run(); +} + +void OpenPrimaryProfileFirstRunIfNeededWithProfile( + base::OnceClosure& callback, + Profile* profile, + Profile::CreateStatus create_status) { + if (create_status != Profile::CreateStatus::CREATE_STATUS_INITIALIZED) + return; + + DCHECK(callback); + DCHECK(profile->IsMainProfile()); + + // The FRE is used to get the sync consent so there is no point in showing it + // when the consent is already given. This applies for example to migrated + // profiles. + if (IdentityManagerFactory::GetForProfile(profile)->HasPrimaryAccount( + signin::ConsentLevel::kSync)) { + OnFirstRunHasExited(std::move(callback), + ProfilePicker::FirstRunExitStatus::kCompleted, + base::OnceClosure()); + return; + } + + ProfilePicker::Show(ProfilePicker::Params::ForLacrosPrimaryProfileFirstRun( + base::BindOnce(&OnFirstRunHasExited, std::move(callback)))); +} + +} // namespace + +bool ShouldOpenPrimaryProfileFirstRun() { + if (!base::FeatureList::IsEnabled(switches::kLacrosNonSyncingProfiles)) { + // Sync is already always forced, no point showing the FRE to ask the user + // to sync. + return false; + } + + const base::CommandLine* command_line = + base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kNoFirstRun)) + return false; + + const PrefService* const pref_service = g_browser_process->local_state(); + return !pref_service->GetBoolean( + lacros_prefs::kPrimaryProfileFirstRunFinished); +} + +void OpenPrimaryProfileFirstRunIfNeeded(base::OnceClosure callback) { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + + profile_manager->CreateProfileAsync( + profile_manager->GetPrimaryUserProfilePath(), + base::BindRepeating(&OpenPrimaryProfileFirstRunIfNeededWithProfile, + base::OwnedRef(std::move(callback)))); +}
diff --git a/chrome/browser/ui/startup/first_run_lacros.h b/chrome/browser/ui/startup/first_run_lacros.h new file mode 100644 index 0000000..86bb7697 --- /dev/null +++ b/chrome/browser/ui/startup/first_run_lacros.h
@@ -0,0 +1,38 @@ +// Copyright 2022 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_STARTUP_FIRST_RUN_LACROS_H_ +#define CHROME_BROWSER_UI_STARTUP_FIRST_RUN_LACROS_H_ + +#include "base/callback_forward.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" + +#if !BUILDFLAG(IS_CHROMEOS_LACROS) +#error This file should only be included on lacros. +#endif + +// Returns whether the primary (main) profile first run experience (including +// sync promo) should be opened on startup. +bool ShouldOpenPrimaryProfileFirstRun(); + +// This function takes the user through the browser FRE. +// 1) First, it checks whether the FRE flow can be skipped in the first place. +// This is the case when sync consent is already given (true for existing +// users that migrated to lacros) or when enterprise policies forbid the FRE. +// If so, the call directly 'finishes' the flow (see below). +// 2) Then, it opens the FRE UI (in the profile picker window) and +// asynchronously 'finishes' the flow (sets a flag in the local prefs) once +// the user chooses any action on the sync consent screen. If the user exits +// the FRE UI via the generic 'Close window' affordances, it is interpreted +// as an intent to exit the app and `callback` will not be called. If they +// exit it via the dedicated options in the flow, it will be considered +// 'completed' and `callback` will be run. If the FRE flow is exited before +// the sync consent screen, the flow is considered 'aborted', and can be +// shown again at the next startup. +// When this method is called again while FRE is in progress, it only activates +// the FRE window and drops the new callback. +void OpenPrimaryProfileFirstRunIfNeeded(base::OnceClosure callback); + +#endif // CHROME_BROWSER_UI_STARTUP_FIRST_RUN_LACROS_H_
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 8ccd4eb..3ac635e 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -44,6 +44,7 @@ #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" #include "chrome/browser/extensions/startup_helper.h" #include "chrome/browser/first_run/first_run.h" +#include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/prefs/session_startup_pref.h" #include "chrome/browser/profiles/profile.h" @@ -51,6 +52,7 @@ #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_observer.h" +#include "chrome/browser/profiles/profile_window.h" #include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/sessions/exit_type_service.h" @@ -106,6 +108,7 @@ #endif #if BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chrome/browser/ui/startup/first_run_lacros.h" #include "chromeos/lacros/lacros_service.h" #endif @@ -461,6 +464,9 @@ // checked again. // TODO(https://crbug.com/1293024): Investigate minimizing duplicate checks. + if (command_line.HasSwitch(switches::kNoStartupWindow)) + return true; + if (command_line.HasSwitch(switches::kSilentLaunch)) return true; @@ -563,6 +569,25 @@ : IncognitoForcedStart::kNoSwitchAndNotForced); } } + +#if BUILDFLAG(IS_CHROMEOS_LACROS) +// Launches a browser by using a dedicated `StartupBrowserCreator`, to avoid +// having to rely on the current instance staying alive while this method is +// bound as a callback. +void OpenNewWindowForFirstRun( + const base::CommandLine& command_line, + Profile* profile, + const base::FilePath& cur_dir, + const std::vector<GURL>& first_run_urls, + chrome::startup::IsProcessStartup process_startup, + chrome::startup::IsFirstRun is_first_run, + std::unique_ptr<LaunchModeRecorder> launch_mode_recorder) { + StartupBrowserCreator browser_creator; + browser_creator.AddFirstRunTabs(first_run_urls); + browser_creator.LaunchBrowser(command_line, profile, cur_dir, process_startup, + is_first_run, std::move(launch_mode_recorder)); +} +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) } // namespace StartupBrowserCreator::StartupBrowserCreator() = default; @@ -627,6 +652,19 @@ command_line, {profile, StartupProfileMode::kBrowserWindow}); if (!IsSilentLaunchEnabled(command_line, profile)) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + if (ShouldOpenPrimaryProfileFirstRun()) { + // Show the FRE and let `OpenNewWindowForFirstRun()` handle the browser + // launch. This `StartupBrowserCreator` will get destroyed when the method + // returns so the relevant data is copied over and passed to the callback. + OpenPrimaryProfileFirstRunIfNeeded( + base::BindOnce(&OpenNewWindowForFirstRun, command_line, profile, + cur_dir, first_run_tabs_, process_startup, + is_first_run, std::move(launch_mode_recorder))); + return; + } +#endif + StartupBrowserCreatorImpl lwp(cur_dir, command_line, this, is_first_run); lwp.Launch(profile, in_synchronous_profile_launch_
diff --git a/chrome/browser/ui/tabs/tab_menu_model.cc b/chrome/browser/ui/tabs/tab_menu_model.cc index 08b078d..4733998 100644 --- a/chrome/browser/ui/tabs/tab_menu_model.cc +++ b/chrome/browser/ui/tabs/tab_menu_model.cc
@@ -52,15 +52,12 @@ AddItemWithStringId(TabStripModel::CommandNewTabToRight, base::i18n::IsRTL() ? IDS_TAB_CXMENU_NEWTABTOLEFT : IDS_TAB_CXMENU_NEWTABTORIGHT); - if (reading_list::switches::IsReadingListEnabled() && - !tab_strip->profile()->IsGuestSession()) { + if (!tab_strip->profile()->IsGuestSession()) { AddItem( TabStripModel::CommandAddToReadLater, l10n_util::GetPluralStringFUTF16(IDS_TAB_CXMENU_READ_LATER, num_tabs)); SetEnabledAt(GetItemCount() - 1, tab_strip->IsReadLaterSupportedForAny(indices)); - if (base::FeatureList::IsEnabled(features::kReadLaterNewBadgePromo)) - SetIsNewFeatureAt(GetItemCount() - 1, true); } if (ExistingTabGroupSubMenuModel::ShouldShowSubmenu(tab_strip, index)) { // Create submenu with existing groups
diff --git a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc index 0c0323a..bf3a943 100644 --- a/chrome/browser/ui/tabs/tab_strip_model_unittest.cc +++ b/chrome/browser/ui/tabs/tab_strip_model_unittest.cc
@@ -23,17 +23,12 @@ #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/read_later/read_later_test_utils.h" -#include "chrome/browser/ui/read_later/reading_list_model_factory.h" #include "chrome/browser/ui/tabs/tab_group.h" #include "chrome/browser/ui/tabs/tab_group_model.h" #include "chrome/browser/ui/tabs/test_tab_strip_model_delegate.h" #include "chrome/browser/ui/user_education/mock_feature_promo_controller.h" #include "chrome/test/base/browser_with_test_window_test.h" #include "chrome/test/base/testing_profile.h" -#include "components/reading_list/core/reading_list_model.h" -#include "components/reading_list/core/reading_list_model_observer.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/tab_groups/tab_group_color.h" #include "components/tab_groups/tab_group_id.h" #include "components/web_modal/web_contents_modal_dialog_manager.h" @@ -4200,75 +4195,3 @@ strip.CloseAllTabs(); } - -class TabStripModelTestWithReadLaterEnabled : public BrowserWithTestWindowTest { - public: - TabStripModelTestWithReadLaterEnabled() { - feature_list_.InitAndEnableFeature(reading_list::switches::kReadLater); - } - TabStripModelTestWithReadLaterEnabled( - const TabStripModelTestWithReadLaterEnabled&) = delete; - TabStripModelTestWithReadLaterEnabled& operator=( - const TabStripModelTestWithReadLaterEnabled&) = delete; - ~TabStripModelTestWithReadLaterEnabled() override = default; - - void SetUp() override { - BrowserWithTestWindowTest::SetUp(); - BrowserList::SetLastActive(browser()); - AddTabWithTitle(browser(), GURL("http://foo/1"), "Tab 1"); - AddTabWithTitle(browser(), GURL("http://foo/2"), "Tab 2"); - } - - void TearDown() override { - browser()->tab_strip_model()->CloseAllTabs(); - BrowserWithTestWindowTest::TearDown(); - } - - TestingProfile::TestingFactories GetTestingFactories() override { - return {{ReadingListModelFactory::GetInstance(), - ReadingListModelFactory::GetDefaultFactoryForTesting()}}; - } - - protected: - void AddTabWithTitle(Browser* browser, - const GURL url, - const std::string title) { - AddTab(browser, url); - NavigateAndCommitActiveTabWithTitle(browser, url, - base::ASCIIToUTF16(title)); - } - - std::unique_ptr<BrowserWindow> CreateBrowserWindow() override { - auto test_window = std::make_unique<TestBrowserWindow>(); - - // This test only supports one window. - DCHECK(!mock_promo_controller_); - - mock_promo_controller_ = static_cast<MockFeaturePromoController*>( - test_window->SetFeaturePromoController( - std::make_unique<MockFeaturePromoController>())); - return test_window; - } - - private: - base::test::ScopedFeatureList feature_list_; - - raw_ptr<MockFeaturePromoController> mock_promo_controller_ = nullptr; -}; - -TEST_F(TabStripModelTestWithReadLaterEnabled, AddToReadLater) { - ReadingListModel* reading_list_model = - ReadingListModelFactory::GetForBrowserContext(profile()); - test::ReadingListLoadObserver(reading_list_model).Wait(); - - TabStripModel* tabstrip = browser()->tab_strip_model(); - EXPECT_EQ(tabstrip->count(), 2); - - // Add first tab to Read Later and verify it has been added. - GURL expected_url = tabstrip->GetWebContentsAt(0)->GetURL(); - tabstrip->AddToReadLater({0}); - - EXPECT_EQ(reading_list_model->size(), 1u); - EXPECT_NE(reading_list_model->GetEntryByURL(expected_url), nullptr); - EXPECT_EQ(tabstrip->count(), 2); -}
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index 75a12c3..836d9cd 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -85,14 +85,6 @@ const base::Feature kQuickCommands{"QuickCommands", base::FEATURE_DISABLED_BY_DEFAULT}; -// Enables a 'new' badge on the option to add to the reading list in the tab -// context menu. -const base::Feature kReadLaterNewBadgePromo{"ReadLaterNewBadgePromo", - base::FEATURE_DISABLED_BY_DEFAULT}; - -const base::Feature kReadLaterAddFromDialog{"ReadLaterAddFromDialog", - base::FEATURE_ENABLED_BY_DEFAULT}; - #if BUILDFLAG(ENABLE_SIDE_SEARCH) // Enables the side search feature for Google Search. Presents recent Google // search results in a browser side panel (crbug.com/1242730).
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index e72d5ad4..ecc510c 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -53,10 +53,6 @@ extern const base::Feature kProminentDarkModeActiveTabTitle; -extern const base::Feature kReadLaterNewBadgePromo; - -extern const base::Feature kReadLaterAddFromDialog; - extern const base::Feature kQuickCommands; extern const base::Feature kScrollableTabStrip; @@ -66,7 +62,6 @@ // TODO(pbos): Once kReadLater is cleaned up on Desktop, move definition into // ui_features.cc. This is currently temporarily in reading_list_switches.h. -extern const base::Feature kSidePanel; extern const base::Feature kSidePanelDragAndDrop; extern const base::Feature kSidePanelImprovedClobbering;
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc index 9f646c5..3c250ae 100644 --- a/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc +++ b/chrome/browser/ui/views/autofill/autofill_popup_view_native_views.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/ui/autofill/autofill_popup_controller_utils.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/user_education/feature_promo_controller.h" #include "chrome/browser/ui/views/autofill/autofill_popup_view_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" @@ -216,11 +217,7 @@ } if (icon_str == "googlePasswordManager") { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - return ImageViewFromVectorIcon(kGooglePasswordManagerIcon); -#else - return ImageViewFromVectorIcon(kKeyIcon); -#endif + return ImageViewFromVectorIcon(GooglePasswordManagerVectorIcon()); } #if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 87aca6c4..68c047f 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -15,6 +15,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/feature_list.h" #include "base/i18n/rtl.h" #include "base/memory/raw_ptr.h" #include "base/metrics/user_metrics.h" @@ -49,6 +50,7 @@ #include "chrome/browser/ui/tabs/tab_group_model.h" #include "chrome/browser/ui/tabs/tab_group_theme.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h" #include "chrome/browser/ui/views/bookmarks/bookmark_context_menu.h" @@ -57,7 +59,6 @@ #include "chrome/browser/ui/views/event_utils.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/top_container_background.h" -#include "chrome/browser/ui/views/read_later/read_later_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/common/chrome_switches.h" @@ -75,7 +76,6 @@ #include "components/metrics/metrics_service.h" #include "components/prefs/pref_service.h" #include "components/profile_metrics/browser_profile_type.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/url_formatter/elide_url.h" #include "components/url_formatter/url_formatter.h" #include "extensions/browser/extension_registry.h" @@ -662,8 +662,6 @@ if (state == BookmarkBar::SHOW) { size_animation_.Show(); } else { - if (read_later_button_) - read_later_button_->CloseBubble(); size_animation_.Hide(); } } else { @@ -844,12 +842,6 @@ gfx::Size size = apps_page_shortcut_->GetPreferredSize(); width += size.width() + bookmark_bar_button_padding; } - if (read_later_button_ && read_later_button_->GetVisible()) { - gfx::Size separator_size = read_later_separator_view_->GetPreferredSize(); - gfx::Size size = read_later_button_->GetPreferredSize(); - width += - separator_size.width() + size.width() + bookmark_bar_button_padding; - } return gfx::Size(width, height); } @@ -902,21 +894,8 @@ int max_x = kBookmarkBarHorizontalMargin + width - overflow_pref.width() - bookmarks_separator_pref.width(); - if (other_bookmarks_button_->GetVisible()) { + if (other_bookmarks_button_->GetVisible()) max_x -= other_bookmarks_pref.width(); - // Additional spacing is only needed for this button if it is the last - // button in the bookmark bar. When the read later button exists this is no - // longer the last button. - if (!read_later_button_ || !read_later_button_->GetVisible()) - max_x -= bookmark_bar_button_padding; - } - - if (read_later_button_ && read_later_button_->GetVisible()) { - if (bookmarks_separator_view_->GetVisible()) - max_x -= bookmarks_separator_pref.width(); - max_x -= read_later_button_->GetPreferredSize().width() + - bookmark_bar_button_padding; - } // Start with the apps page shortcut button. if (apps_page_shortcut_->GetVisible()) { @@ -1033,23 +1012,6 @@ other_bookmarks_button_->SetBounds(x, y, other_bookmarks_pref.width(), button_height); x += other_bookmarks_pref.width(); - // Additional spacing is only needed for the last button in the bookmark - // bar. When the read later button exists this is no longer the last button. - if (!read_later_button_ || !read_later_button_->GetVisible()) - x += bookmark_bar_button_padding; - } - - // Read-later button and separator. - if (read_later_button_ && read_later_button_->GetVisible()) { - gfx::Size read_later_separator_pref = - read_later_separator_view_->GetPreferredSize(); - gfx::Size read_later_pref = read_later_button_->GetPreferredSize(); - read_later_separator_view_->SetBounds( - x, center_y(read_later_separator_pref.height()), - read_later_separator_pref.width(), read_later_separator_pref.height()); - x += read_later_separator_pref.width(); - read_later_button_->SetBounds(x, y, read_later_pref.width(), button_height); - x += read_later_pref.width() + bookmark_bar_button_padding; } } @@ -1610,8 +1572,6 @@ } else if (source == managed_bookmarks_button_) { parent = managed_->managed_node(); nodes.push_back(parent); - } else if (source == read_later_button_) { - // Do nothing here for now. } else if (source != this && source != apps_page_shortcut_) { // User clicked on one of the bookmark buttons, find which one they // clicked on, except for the apps page shortcut, which must behave as if @@ -1672,15 +1632,6 @@ // We'll re-enable when the model is loaded. other_bookmarks_button_->SetEnabled(false); - if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater) && - !base::FeatureList::IsEnabled(features::kSidePanel)) { - read_later_separator_view_ = - AddChildView(std::make_unique<ButtonSeparatorView>()); - read_later_button_ = - AddChildView(std::make_unique<ReadLaterButton>(browser_)); - read_later_button_->set_context_menu_controller(this); - } - profile_pref_registrar_.Init(browser_->profile()->GetPrefs()); profile_pref_registrar_.Add( bookmarks::prefs::kShowAppsShortcutInBookmarkBar, @@ -1699,24 +1650,12 @@ InsertTabGroupButtonsFromModel(); } - if (read_later_button_) { - profile_pref_registrar_.Add( - bookmarks::prefs::kShowReadingListInBookmarkBar, - base::BindRepeating( - &BookmarkBarView::OnReadingListVisibilityPrefChanged, - base::Unretained(this))); - } - profile_pref_registrar_.Add( bookmarks::prefs::kShowManagedBookmarksInBookmarkBar, base::BindRepeating(&BookmarkBarView::OnShowManagedBookmarksPrefChanged, base::Unretained(this))); apps_page_shortcut_->SetVisible( chrome::ShouldShowAppsShortcutInBookmarkBar(browser_->profile())); - if (read_later_button_) { - read_later_button_->SetVisible( - chrome::ShouldShowReadingListInBookmarkBar(browser_->profile())); - } bookmarks_separator_view_ = AddChildView(std::make_unique<ButtonSeparatorView>()); @@ -2337,18 +2276,6 @@ LayoutAndPaint(); } -void BookmarkBarView::OnReadingListVisibilityPrefChanged() { - DCHECK(read_later_button_); - bool visible = - chrome::ShouldShowReadingListInBookmarkBar(browser_->profile()); - if (read_later_button_->GetVisible() == visible) - return; - read_later_button_->CloseBubble(); - read_later_button_->SetVisible(visible); - read_later_separator_view_->SetVisible(visible); - LayoutAndPaint(); -} - void BookmarkBarView::OnShowManagedBookmarksPrefChanged() { if (UpdateOtherAndManagedButtonsVisibility()) LayoutAndPaint();
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h index 023452b..dc8c9f4d 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.h
@@ -36,7 +36,6 @@ class Browser; class BrowserView; class Profile; -class ReadLaterButton; class SavedTabGroupModel; namespace bookmarks { @@ -130,8 +129,6 @@ // Returns the button used when not all the items on the bookmark bar fit. views::MenuButton* overflow_button() const { return overflow_button_; } - ReadLaterButton* read_later_button() const { return read_later_button_; } - const gfx::Animation& size_animation() { return size_animation_; } // Returns the active MenuItemView, or NULL if a menu isn't showing. @@ -378,9 +375,6 @@ // Updates the visibility of the apps shortcut based on the pref value. void OnAppsPageShortcutVisibilityPrefChanged(); - // Updates the visibility of the reading list based on the pref value. - void OnReadingListVisibilityPrefChanged(); - void OnShowManagedBookmarksPrefChanged(); void LayoutAndPaint() { @@ -477,9 +471,6 @@ raw_ptr<ButtonSeparatorView> bookmarks_separator_view_ = nullptr; raw_ptr<ButtonSeparatorView> tab_groups_separator_view_ = nullptr; - raw_ptr<ReadLaterButton> read_later_button_ = nullptr; - raw_ptr<ButtonSeparatorView> read_later_separator_view_ = nullptr; - const raw_ptr<Browser> browser_; raw_ptr<BrowserView> browser_view_;
diff --git a/chrome/browser/ui/views/chrome_typography_provider.cc b/chrome/browser/ui/views/chrome_typography_provider.cc index 75841d1b..496a5709 100644 --- a/chrome/browser/ui/views/chrome_typography_provider.cc +++ b/chrome/browser/ui/views/chrome_typography_provider.cc
@@ -127,22 +127,6 @@ context == CONTEXT_DIALOG_BODY_TEXT_SMALL) context = views::style::CONTEXT_LABEL; - const auto* color_provider = view.GetColorProvider(); - if (context == CONTEXT_DOWNLOAD_SHELF || - (context == CONTEXT_DOWNLOAD_SHELF_STATUS && - style == views::style::STYLE_DISABLED)) { - if (!color_provider) - return gfx::kPlaceholderColor; - const SkColor base_color = color_provider->GetColor(kColorToolbarText); - // TODO(pkasting): Should use some way of dimming text that's as analogous - // as possible to e.g. enabled vs. disabled labels. - const SkColor dimmed_color = SkColorSetA(base_color, 0xC7); - if (style == views::style::STYLE_DISABLED) - return dimmed_color; - if (context == CONTEXT_DOWNLOAD_SHELF) - return base_color; - } - // Monospaced styles have the same colors as their normal counterparts. if (style == STYLE_PRIMARY_MONOSPACED) { style = views::style::STYLE_PRIMARY; @@ -150,7 +134,27 @@ style = views::style::STYLE_SECONDARY; } + const auto* color_provider = view.GetColorProvider(); ui::ColorId color_id; + if (context == CONTEXT_DOWNLOAD_SHELF || + context == CONTEXT_DOWNLOAD_SHELF_STATUS) { + switch (style) { + case STYLE_RED: + color_id = kColorDownloadItemForegroundDangerous; + break; + case STYLE_GREEN: + color_id = kColorDownloadItemForegroundSafe; + break; + case views::style::STYLE_DISABLED: + color_id = kColorDownloadItemForegroundDisabled; + break; + default: + color_id = kColorDownloadItemForeground; + break; + } + return color_provider->GetColor(color_id); + } + switch (style) { case STYLE_RED: color_id = ui::kColorAlertHighSeverity;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 599c1e7..5f5e1b5 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -890,7 +890,6 @@ contents_container_ = AddChildView(std::move(contents_container)); set_contents_view(contents_container_); - if (base::FeatureList::IsEnabled(features::kSidePanel)) { right_aligned_side_panel_ = AddChildView(std::make_unique<SidePanel>(this)); right_aligned_side_panel_separator_ = AddChildView(std::make_unique<ContentsSeparator>()); @@ -899,7 +898,6 @@ side_panel_coordinator_ = std::make_unique<SidePanelCoordinator>( this, global_side_panel_registry_.get()); } - } #if BUILDFLAG(GOOGLE_CHROME_BRANDING) if (lens::features::IsLensSidePanelEnabled()) { @@ -2194,8 +2192,7 @@ if (!feature_promo_controller_) return; - if (!base::FeatureList::IsEnabled(features::kSidePanel) || - !(browser_->window()->IsActive() || + if (!(browser_->window()->IsActive() || BrowserFeaturePromoController:: active_window_check_blocked_for_testing())) return;
diff --git a/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc b/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc index 3792122f..6483338 100644 --- a/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc +++ b/chrome/browser/ui/views/lens/lens_side_panel_controller_unittest.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/ui/views/frame/test_with_browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel.h" #include "components/lens/lens_features.h" -#include "components/reading_list/features/reading_list_switches.h" #include "testing/gtest/include/gtest/gtest.h" namespace lens { @@ -30,10 +29,7 @@ void SetUp() override { base::test::ScopedFeatureList features; features.InitWithFeaturesAndParameters( - {{features::kLensStandalone, {{"enable-side-panel", "true"}}}, - {::features::kSidePanel, {}}, - {reading_list::switches::kReadLater, {}}}, - {}); + {{features::kLensStandalone, {{"enable-side-panel", "true"}}}}, {}); TestWithBrowserView::SetUp(); // Create the lens side panel controller in BrowserView. browser_view()->CreateLensSidePanelController();
diff --git a/chrome/browser/ui/views/location_bar/star_menu_model.cc b/chrome/browser/ui/views/location_bar/star_menu_model.cc deleted file mode 100644 index 8a450da2..0000000 --- a/chrome/browser/ui/views/location_bar/star_menu_model.cc +++ /dev/null
@@ -1,43 +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. - -#include "chrome/browser/ui/views/location_bar/star_menu_model.h" - -#include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/grit/generated_resources.h" -#include "components/omnibox/browser/vector_icons.h" -#include "ui/base/models/image_model.h" -#include "ui/color/color_id.h" - -StarMenuModel::StarMenuModel(ui::SimpleMenuModel::Delegate* delegate, - bool bookmarked, - bool can_move_to_read_later, - bool exists_as_unread_in_read_later) - : SimpleMenuModel(delegate) { - Build(bookmarked, can_move_to_read_later, exists_as_unread_in_read_later); -} - -StarMenuModel::~StarMenuModel() = default; - -void StarMenuModel::Build(bool bookmarked, - bool can_move_to_read_later, - bool exists_as_unread_in_read_later) { - AddItemWithStringIdAndIcon( - CommandBookmark, - bookmarked ? IDS_STAR_VIEW_MENU_EDIT_BOOKMARK - : IDS_STAR_VIEW_MENU_ADD_BOOKMARK, - ui::ImageModel::FromVectorIcon(omnibox::kStarIcon, ui::kColorIcon)); - AddItemWithStringIdAndIcon( - exists_as_unread_in_read_later ? CommandMarkAsRead - : CommandMoveToReadLater, - exists_as_unread_in_read_later ? IDS_STAR_VIEW_MENU_MARK_AS_READ - : IDS_STAR_VIEW_MENU_MOVE_TO_READ_LATER, - ui::ImageModel::FromVectorIcon( - exists_as_unread_in_read_later ? kReadLaterIcon : kReadLaterAddIcon, - can_move_to_read_later ? ui::kColorIcon : ui::kColorIconDisabled)); - int index = GetIndexOfCommandId(CommandMoveToReadLater); - if (index != -1) { - SetEnabledAt(index, can_move_to_read_later); - } -}
diff --git a/chrome/browser/ui/views/location_bar/star_menu_model.h b/chrome/browser/ui/views/location_bar/star_menu_model.h deleted file mode 100644 index ffa64279..0000000 --- a/chrome/browser/ui/views/location_bar/star_menu_model.h +++ /dev/null
@@ -1,32 +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. - -#ifndef CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_STAR_MENU_MODEL_H_ -#define CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_STAR_MENU_MODEL_H_ - -#include "ui/base/models/simple_menu_model.h" - -class StarMenuModel : public ui::SimpleMenuModel { - public: - StarMenuModel(ui::SimpleMenuModel::Delegate* delegate, - bool bookmarked, - bool can_move_to_read_later, - bool exists_as_unread_in_read_later); - StarMenuModel(const StarMenuModel&) = delete; - StarMenuModel& operator=(const StarMenuModel&) = delete; - ~StarMenuModel() override; - - enum StarMenuCommand { - CommandBookmark, - CommandMoveToReadLater, - CommandMarkAsRead - }; - - private: - void Build(bool bookmarked, - bool can_move_to_read_later, - bool exists_as_unread_in_read_later); -}; - -#endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_STAR_MENU_MODEL_H_
diff --git a/chrome/browser/ui/views/location_bar/star_view.cc b/chrome/browser/ui/views/location_bar/star_view.cc index 3d3e7dcd..37db2158 100644 --- a/chrome/browser/ui/views/location_bar/star_view.cc +++ b/chrome/browser/ui/views/location_bar/star_view.cc
@@ -25,14 +25,12 @@ #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h" #include "chrome/browser/ui/views/chrome_view_class_properties.h" -#include "chrome/browser/ui/views/location_bar/star_menu_model.h" #include "chrome/grit/generated_resources.h" #include "components/bookmarks/common/bookmark_pref_names.h" #include "components/feature_engagement/public/event_constants.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/feature_engagement/public/tracker.h" #include "components/omnibox/browser/vector_icons.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/strings/grit/components_strings.h" #include "components/variations/variations_associated_data.h" #include "content/public/browser/web_contents.h" @@ -42,28 +40,8 @@ #include "ui/gfx/paint_vector_icon.h" #include "ui/views/animation/ink_drop.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" -#include "ui/views/controls/menu/menu_runner.h" #include "ui/views/view_class_properties.h" -namespace { - -// Enumeration of all actions in the star menu. -// These values are persisted to logs. Entries should not be renumbered and -// numeric values should never be reused. -enum class Action { - kAddBookmarkButton = 0, - kEditBookmarkButton = 1, - kAddToReadingListButton = 2, - kMarkAsReadButton = 3, - kMaxValue = kMarkAsReadButton, -}; - -void RecordClick(Action item) { - base::UmaHistogramEnumeration("Bookmarks.StarEntryPoint.ClickedAction", item); -} - -} // namespace - StarView::StarView(CommandUpdater* command_updater, Browser* browser, IconLabelBubbleView::Delegate* icon_label_bubble_delegate, @@ -123,28 +101,7 @@ void StarView::ExecuteCommand(ExecuteSource source) { OnExecuting(source); - if (reading_list::switches::IsReadingListEnabled() && - !base::FeatureList::IsEnabled(features::kReadLaterAddFromDialog) && - !base::FeatureList::IsEnabled(features::kSidePanel)) { - reading_list_entry_point_promo_handle_ = - browser_->window()->CloseFeaturePromoAndContinue( - feature_engagement::kIPHReadingListEntryPointFeature); - menu_model_ = std::make_unique<StarMenuModel>( - this, GetActive(), chrome::CanMoveActiveTabToReadLater(browser_), - chrome::IsCurrentTabUnreadInReadLater(browser_)); - menu_runner_ = std::make_unique<views::MenuRunner>( - menu_model_.get(), - views::MenuRunner::HAS_MNEMONICS | views::MenuRunner::FIXED_ANCHOR); - menu_runner_->RunMenuAt(GetWidget(), nullptr, GetAnchorBoundsInScreen(), - views::MenuAnchorPosition::kTopRight, - ui::MENU_SOURCE_NONE); - feature_engagement::Tracker* tracker = - feature_engagement::TrackerFactory::GetForBrowserContext( - browser_->profile()); - tracker->NotifyEvent(feature_engagement::events::kBookmarkStarMenuOpened); - } else { - chrome::BookmarkCurrentTab(browser_); - } + chrome::BookmarkCurrentTab(browser_); } views::BubbleDialogDelegate* StarView::GetBubble() const { @@ -164,41 +121,5 @@ Update(); } -void StarView::ExecuteCommand(int command_id, int event_flags) { - switch (command_id) { - case StarMenuModel::CommandBookmark: - RecordClick(GetActive() ? Action::kEditBookmarkButton - : Action::kAddBookmarkButton); - chrome::BookmarkCurrentTab(browser_); - break; - case StarMenuModel::CommandMoveToReadLater: - RecordClick(Action::kAddToReadingListButton); - base::RecordAction(base::UserMetricsAction( - "DesktopReadingList.AddItem.FromBookmarkIcon")); - chrome::MoveCurrentTabToReadLater(browser_); - break; - case StarMenuModel::CommandMarkAsRead: - RecordClick(Action::kMarkAsReadButton); - chrome::MarkCurrentTabAsReadInReadLater(browser_); - break; - default: - NOTREACHED(); - } -} - -void StarView::MenuClosed(ui::SimpleMenuModel* source) { - if (!GetBubble() || !GetBubble()->GetWidget() || - !GetBubble()->GetWidget()->IsVisible()) { - SetHighlighted(false); - } - reading_list_entry_point_promo_handle_.Release(); - menu_runner_.reset(); -} - -bool StarView::IsCommandIdAlerted(int command_id) const { - return command_id == StarMenuModel::CommandMoveToReadLater && - reading_list_entry_point_promo_handle_; -} - BEGIN_METADATA(StarView, PageActionIconView) END_METADATA
diff --git a/chrome/browser/ui/views/location_bar/star_view.h b/chrome/browser/ui/views/location_bar/star_view.h index e0362bc3..ea84eca 100644 --- a/chrome/browser/ui/views/location_bar/star_view.h +++ b/chrome/browser/ui/views/location_bar/star_view.h
@@ -12,19 +12,12 @@ #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" #include "components/prefs/pref_member.h" #include "ui/base/metadata/metadata_header_macros.h" -#include "ui/base/models/simple_menu_model.h" - -namespace views { -class MenuRunner; -} class Browser; class CommandUpdater; -class StarMenuModel; // The star icon to show a bookmark bubble. -class StarView : public PageActionIconView, - public ui::SimpleMenuModel::Delegate { +class StarView : public PageActionIconView { public: METADATA_HEADER(StarView); StarView(CommandUpdater* command_updater, @@ -38,9 +31,6 @@ // ui::PropertyHandler: void AfterPropertyChange(const void* key, int64_t old_value) override; - StarMenuModel* menu_model_for_test() { return menu_model_.get(); } - views::MenuRunner* menu_runner_for_test() { return menu_runner_.get(); } - protected: // PageActionIconView: void UpdateImpl() override; @@ -53,19 +43,9 @@ private: void EditBookmarksPrefUpdated(); - // ui::SimpleMenuModel::Delegate: - void ExecuteCommand(int command_id, int event_flags) override; - void MenuClosed(ui::SimpleMenuModel* source) override; - bool IsCommandIdAlerted(int command_id) const override; - const raw_ptr<Browser> browser_; - std::unique_ptr<views::MenuRunner> menu_runner_; - std::unique_ptr<StarMenuModel> menu_model_; - BooleanPrefMember edit_bookmarks_enabled_; - - FeaturePromoController::PromoHandle reading_list_entry_point_promo_handle_; }; #endif // CHROME_BROWSER_UI_VIEWS_LOCATION_BAR_STAR_VIEW_H_
diff --git a/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc b/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc index 5d9eb1b..eae5d1f 100644 --- a/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/location_bar/star_view_interactive_uitest.cc
@@ -9,13 +9,10 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" -#include "chrome/browser/ui/read_later/read_later_test_utils.h" -#include "chrome/browser/ui/read_later/reading_list_model_factory.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/bookmarks/bookmark_bubble_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/location_bar/star_menu_model.h" #include "chrome/browser/ui/views/page_action/page_action_icon_view.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/common/pref_names.h" @@ -26,9 +23,6 @@ #include "components/bookmarks/browser/bookmark_utils.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/core/reading_list_model.h" -#include "components/reading_list/core/reading_list_model_observer.h" -#include "components/reading_list/features/reading_list_switches.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" @@ -36,7 +30,6 @@ #include "ui/events/event_utils.h" #include "ui/views/animation/ink_drop.h" #include "ui/views/animation/test/ink_drop_host_view_test_api.h" -#include "ui/views/controls/menu/menu_runner.h" #include "ui/views/test/button_test_api.h" namespace { @@ -59,19 +52,6 @@ // Verifies clicking the star bookmarks the page. IN_PROC_BROWSER_TEST_F(StarViewTest, BookmarksUrlOnPress) { - // The url is not bookmarked when the star is pressed when read later is - // enabled and read later add from dialog is disabled. This test is replaced - // by - // StarViewTestWithReadLaterEnabled.AddBookmarkFromStarViewMenuBookmarksUrl. - if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater) && - (!base::FeatureList::IsEnabled(features::kReadLaterAddFromDialog) || - !base::FeatureList::IsEnabled(features::kSidePanel))) { - GTEST_SKIP() << "When read later is enabled and add from dialog disabled, " - "the star view behaves differently on press. Testing in " - "that case is covered by " - "StarViewTestWithReadLaterEnabled." - "AddBookmarkFromStarViewMenuBookmarksUrl"; - } bookmarks::BookmarkModel* bookmark_model = BookmarkModelFactory::GetForBrowserContext(browser()->profile()); bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); @@ -101,16 +81,6 @@ // Verify that clicking the bookmark star a second time hides the bookmark // bubble. IN_PROC_BROWSER_TEST_F(StarViewTest, HideOnSecondClick) { - // The BookmarkBubbleView is not shown when the StarView is first pressed when - // the reading list is enabled. - if (base::FeatureList::IsEnabled(reading_list::switches::kReadLater) && - (!base::FeatureList::IsEnabled(features::kReadLaterAddFromDialog) || - !base::FeatureList::IsEnabled(features::kSidePanel))) { - GTEST_SKIP() << "The BookmarkBubbleView is not shown when the StarView is " - "first pressed when the reading list is enabled and add " - "from dialog is disabled"; - } - views::View* star_icon = GetStarIcon(); ui::MouseEvent pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), @@ -154,114 +124,4 @@ } } -class StarViewTestWithReadLaterEnabled : public InProcessBrowserTest { - public: - StarViewTestWithReadLaterEnabled() { - feature_list_.InitWithFeatures( - /*enabled_features=*/{reading_list::switches::kReadLater}, - /*disabled_features=*/{features::kReadLaterAddFromDialog, - features::kSidePanel}); - } - StarViewTestWithReadLaterEnabled(const StarViewTestWithReadLaterEnabled&) = - delete; - StarViewTestWithReadLaterEnabled& operator=( - const StarViewTestWithReadLaterEnabled&) = delete; - ~StarViewTestWithReadLaterEnabled() override = default; - - StarView* GetStarIcon() { - return static_cast<StarView*>( - BrowserView::GetBrowserViewForBrowser(browser()) - ->toolbar_button_provider() - ->GetPageActionIconView(PageActionIconType::kBookmarkStar)); - } - - void OpenStarViewMenu(StarView* star_icon) { - ui::MouseEvent pressed_event( - ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), ui::EventTimeForNow(), - ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); - ui::MouseEvent released_event(ui::ET_MOUSE_RELEASED, gfx::Point(), - gfx::Point(), ui::EventTimeForNow(), - ui::EF_LEFT_MOUSE_BUTTON, - ui::EF_LEFT_MOUSE_BUTTON); - - views::test::ButtonTestApi(star_icon).NotifyClick(pressed_event); - views::test::ButtonTestApi(star_icon).NotifyClick(released_event); - views::MenuRunner* menu_runner = star_icon->menu_runner_for_test(); - EXPECT_TRUE(menu_runner->IsRunning()); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// Verifies clicking the bookmark button in the StarView's menu bookmarks the -// page. -IN_PROC_BROWSER_TEST_F(StarViewTestWithReadLaterEnabled, - AddBookmarkFromStarViewMenuBookmarksUrl) { - bookmarks::BookmarkModel* bookmark_model = - BookmarkModelFactory::GetForBrowserContext(browser()->profile()); - bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model); - - StarView* star_icon = GetStarIcon(); - const GURL current_url = - browser()->tab_strip_model()->GetActiveWebContents()->GetVisibleURL(); - - // The page should not initially be bookmarked. - EXPECT_FALSE(bookmark_model->IsBookmarked(current_url)); - EXPECT_FALSE(star_icon->GetActive()); - - OpenStarViewMenu(star_icon); - - // The page should not be bookmarked when the menu is opened. - EXPECT_FALSE(bookmark_model->IsBookmarked(current_url)); - EXPECT_FALSE(star_icon->GetActive()); - - StarMenuModel* menu_model = star_icon->menu_model_for_test(); - - // Activate "Add Bookmark" button in the menu and verify the bookmark is - // added. - const int bookmark_command_index = - menu_model->GetIndexOfCommandId(StarMenuModel::CommandBookmark); - menu_model->ActivatedAt(bookmark_command_index); - - EXPECT_TRUE(bookmark_model->IsBookmarked(current_url)); - EXPECT_TRUE(star_icon->GetActive()); -} - -// Verifies clicking the Read Later button in the StarView's menu saves the page -// to the read later model. -IN_PROC_BROWSER_TEST_F(StarViewTestWithReadLaterEnabled, - AddToReadLaterFromStarViewMenuSavesUrlToReadLater) { - ReadingListModel* reading_list_model = - ReadingListModelFactory::GetForBrowserContext(browser()->profile()); - test::ReadingListLoadObserver(reading_list_model).Wait(); - GURL url("http://www.test.com/"); - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url)); - - StarView* star_icon = GetStarIcon(); - const GURL current_url = - browser()->tab_strip_model()->GetActiveWebContents()->GetVisibleURL(); - - // The page should not initially be in model. - EXPECT_EQ(reading_list_model->GetEntryByURL(current_url), nullptr); - EXPECT_FALSE(star_icon->GetActive()); - - OpenStarViewMenu(star_icon); - - // The page should not be bookmarked when the menu is opened. - EXPECT_EQ(reading_list_model->GetEntryByURL(current_url), nullptr); - EXPECT_FALSE(star_icon->GetActive()); - - StarMenuModel* menu_model = star_icon->menu_model_for_test(); - - // // Activate "Add to Read later" button in the menu and verify the entry is - // added. - const int read_later_command_index = - menu_model->GetIndexOfCommandId(StarMenuModel::CommandMoveToReadLater); - menu_model->ActivatedAt(read_later_command_index); - - EXPECT_NE(reading_list_model->GetEntryByURL(current_url), nullptr); - EXPECT_FALSE(star_icon->GetActive()); -} - } // namespace
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc index 45b51c9a..9ce1f36 100644 --- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc +++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -13,7 +13,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/passwords/credential_manager_dialog_controller.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/passwords/credentials_item_view.h"
diff --git a/chrome/browser/ui/views/passwords/credentials_item_view.cc b/chrome/browser/ui/views/passwords/credentials_item_view.cc index 3ca4066..4395ee5 100644 --- a/chrome/browser/ui/views/passwords/credentials_item_view.cc +++ b/chrome/browser/ui/views/passwords/credentials_item_view.cc
@@ -10,7 +10,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/grit/theme_resources.h"
diff --git a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc index 50175e5..84fd9355 100644 --- a/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc +++ b/chrome/browser/ui/views/passwords/password_auto_sign_in_view.cc
@@ -9,9 +9,9 @@ #include "build/build_config.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/password_dialog_prompts.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/frame/browser_view.h"
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc index bbbd81b1..f35cb305 100644 --- a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc +++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
@@ -7,8 +7,8 @@ #include "base/notreached.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/accessibility/theme_tracking_non_accessible_image_view.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h"
diff --git a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc index a835fcf..3dc2009 100644 --- a/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc +++ b/chrome/browser/ui/views/passwords/password_generation_popup_view_views.cc
@@ -11,8 +11,10 @@ #include "base/memory/raw_ptr.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/ui/passwords/password_generation_popup_controller.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" #include "ui/base/metadata/metadata_header_macros.h" @@ -24,6 +26,7 @@ #include "ui/native_theme/native_theme.h" #include "ui/views/background.h" #include "ui/views/border.h" +#include "ui/views/controls/image_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/grid_layout.h" @@ -35,6 +38,9 @@ // field is too long. constexpr int kPasswordGenerationMaxWidth = 480; +// The default icon size used in the password generation drop down. +constexpr int kIconSize = 16; + } // namespace // Class that shows the generated password and associated UI (currently an @@ -85,6 +91,12 @@ DISTANCE_BETWEEN_PRIMARY_AND_SECONDARY_LABELS_HORIZONTAL))); layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); + if (base::FeatureList::IsEnabled( + password_manager::features::kUnifiedPasswordManagerDesktop)) { + AddChildView( + std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon( + GooglePasswordManagerVectorIcon(), ui::kColorIcon, kIconSize))); + } suggestion_label_ = AddChildView(std::make_unique<views::Label>( controller_->SuggestedText(), views::style::CONTEXT_DIALOG_BODY_TEXT,
diff --git a/chrome/browser/ui/views/passwords/password_items_view.cc b/chrome/browser/ui/views/passwords/password_items_view.cc index ea6e1167..e0b017e 100644 --- a/chrome/browser/ui/views/passwords/password_items_view.cc +++ b/chrome/browser/ui/views/passwords/password_items_view.cc
@@ -15,8 +15,8 @@ #include "build/branding_buildflags.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/ui/passwords/bubble_controllers/items_bubble_controller.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/grit/generated_resources.h" #include "components/password_manager/core/browser/password_form.h" @@ -306,12 +306,8 @@ } ui::ImageModel PasswordItemsView::GetWindowIcon() { -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - return ui::ImageModel::FromVectorIcon(kGooglePasswordManagerIcon, + return ui::ImageModel::FromVectorIcon(GooglePasswordManagerVectorIcon(), ui::kColorIcon, kIconHeight); -#else - return ui::ImageModel::FromVectorIcon(kKeyIcon, ui::kColorIcon, kIconHeight); -#endif } void PasswordItemsView::RecreateLayout() {
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc index f6a8a9e..6772eab 100644 --- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
@@ -8,8 +8,8 @@ #include <string> #include <utility> -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/passwords/password_items_view.h"
diff --git a/chrome/browser/ui/views/passwords/password_save_update_view.cc b/chrome/browser/ui/views/passwords/password_save_update_view.cc index 2c705c0..371a4dc 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -20,9 +20,9 @@ #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/hats/hats_service.h" #include "chrome/browser/ui/hats/hats_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" #include "chrome/browser/ui/passwords/password_dialog_prompts.h" #include "chrome/browser/ui/passwords/passwords_model_delegate.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/user_education/feature_promo_specification.h" #include "chrome/browser/ui/user_education/help_bubble_params.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" @@ -519,12 +519,8 @@ password_manager::features::kUnifiedPasswordManagerDesktop)) { return ui::ImageModel(); } -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - return ui::ImageModel::FromVectorIcon(kGooglePasswordManagerIcon, + return ui::ImageModel::FromVectorIcon(GooglePasswordManagerVectorIcon(), ui::kColorIcon, kIconHeight); -#else - return ui::ImageModel::FromVectorIcon(kKeyIcon, ui::kColorIcon, kIconHeight); -#endif } void PasswordSaveUpdateView::AddedToWidget() {
diff --git a/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.cc index 8bd99327..d7b0db1 100644 --- a/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.cc
@@ -8,7 +8,10 @@ #include "base/logging.h" #include "base/notreached.h" #include "base/scoped_observation.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/browser_finder.h" #include "components/signin/public/identity_manager/identity_manager.h" namespace { @@ -38,15 +41,32 @@ identity_manager_observation_{this}; }; -// Helper to run `callback` with `browser`, after hiding the profile picker. +// Helper to run `callback`, after hiding the profile picker. // Unlike other signed in flow controllers, this one completes by staying in // the current profile instead of switching to a new one, which normally would // have handled hiding the picker. -void HideProfilePickerAndRun(ProfilePicker::BrowserOpenedCallback callback, - Browser* browser) { +void HideProfilePickerAndRun(ProfilePicker::BrowserOpenedCallback callback) { ProfilePicker::Hide(); - if (callback) - std::move(callback).Run(browser); + + if (!callback) + return; + + // See if there is already a browser we can use. + ProfileManager* profile_manager = g_browser_process->profile_manager(); + Profile* profile = profile_manager->GetProfileByPath( + profile_manager->GetPrimaryUserProfilePath()); + DCHECK(profile); + Browser* browser = + chrome::FindAnyBrowser(profile, /*match_original_profiles=*/true); + if (!browser) { + // TODO(https://crbug.com/1300109): Create a browser to run `callback`. + DLOG(WARNING) + << "No browser found when finishing Lacros FRE. Expected to find " + << "one for the primary profile."; + return; + } + + std::move(callback).Run(browser); } } // namespace @@ -55,20 +75,25 @@ ProfilePickerWebContentsHost* host, Profile* profile, std::unique_ptr<content::WebContents> contents, - absl::optional<SkColor> profile_color, - OnboardingFinishedCallback onboarding_finished_callback) + ProfilePicker::FirstRunExitedCallback first_run_exited_callback) : ProfilePickerSignedInFlowController(host, profile, std::move(contents), - profile_color), - onboarding_finished_callback_(std::move(onboarding_finished_callback)) {} + absl::optional<SkColor>()), + first_run_exited_callback_(std::move(first_run_exited_callback)) {} LacrosFirstRunSignedInFlowController::~LacrosFirstRunSignedInFlowController() { - // Call the callback if not called yet (unless the flow has been canceled). - if (onboarding_finished_callback_) - std::move(onboarding_finished_callback_) - .Run(base::BindOnce(&HideProfilePickerAndRun, + // Call the callback if not called yet. This can happen in case of early exits + // for example, the registered callback just gets dropped. See + // https://crbug.com/1307754. + if (first_run_exited_callback_) { + std::move(first_run_exited_callback_) + .Run(sync_confirmation_seen_ + ? ProfilePicker::FirstRunExitStatus::kQuitAtEnd + : ProfilePicker::FirstRunExitStatus::kQuitEarly, + base::BindOnce(&HideProfilePickerAndRun, ProfilePicker::BrowserOpenedCallback())); + } } void LacrosFirstRunSignedInFlowController::Init() { @@ -92,22 +117,18 @@ ProfilePickerSignedInFlowController::Init(); } -void LacrosFirstRunSignedInFlowController::Cancel() { - // If the flow gets canceled in the first (welcome) screen, it is not - // considered as finished (and thus the callback should not get called). - onboarding_finished_callback_.Reset(); -} - void LacrosFirstRunSignedInFlowController::FinishAndOpenBrowser( ProfilePicker::BrowserOpenedCallback callback) { - // Do nothing if this has already been called. Note that this can get called - // first time from a special case handling (such as the Settings link) and - // than second time when the `TurnSyncOnHelper` finishes. - if (!onboarding_finished_callback_) + if (!first_run_exited_callback_) return; - // TODO(crbug.com/1300109): Rename the profile here. + std::move(first_run_exited_callback_) + .Run(ProfilePicker::FirstRunExitStatus::kCompleted, + base::BindOnce(&HideProfilePickerAndRun, std::move(callback))); +} - std::move(onboarding_finished_callback_) - .Run(base::BindOnce(&HideProfilePickerAndRun, std::move(callback))); +void LacrosFirstRunSignedInFlowController::SwitchToSyncConfirmation() { + sync_confirmation_seen_ = true; + + ProfilePickerSignedInFlowController::SwitchToSyncConfirmation(); }
diff --git a/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.h b/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.h index bc618f6..bd0819f 100644 --- a/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.h +++ b/chrome/browser/ui/views/profiles/lacros_first_run_signed_in_flow_controller.h
@@ -15,19 +15,16 @@ class LacrosFirstRunSignedInFlowController : public ProfilePickerSignedInFlowController { public: - using OnboardingFinishedCallback = base::OnceCallback<void( - ProfilePicker::BrowserOpenedCallback maybe_callback)>; - - // `onboarding_finished_callback` only gets called if the onboarding finishes - // successfully. It gets a `maybe_callback` as a parameter which is empty in - // most cases but must be called on a newly opened browser window if - // non-empty. + // `first_run_exited_callback` gets called when the user exits the FRE. + // It will receive `exit_status` to indicate the type of exit, for example + // whether the user completed it, or wants to quit. + // It also gets a `maybe_callback` as a parameter which is empty in most cases + // but must be called on a newly opened browser window if non-empty. LacrosFirstRunSignedInFlowController( ProfilePickerWebContentsHost* host, Profile* profile, std::unique_ptr<content::WebContents> contents, - absl::optional<SkColor> profile_color, - OnboardingFinishedCallback onboarding_finished_callback); + ProfilePicker::FirstRunExitedCallback first_run_exited_callback); ~LacrosFirstRunSignedInFlowController() override; LacrosFirstRunSignedInFlowController( const ProfilePickerSignedInFlowController&) = delete; @@ -36,13 +33,16 @@ // ProfilePickerSignedInFlowController: void Init() override; - void Cancel() override; void FinishAndOpenBrowser( ProfilePicker::BrowserOpenedCallback callback) override; + void SwitchToSyncConfirmation() override; private: + // Tracks whether the user got to the last step of the FRE flow. + bool sync_confirmation_seen_ = false; + // Callback that gets called if the onboarding finishes successfully. - OnboardingFinishedCallback onboarding_finished_callback_; + ProfilePicker::FirstRunExitedCallback first_run_exited_callback_; std::unique_ptr<signin::IdentityManager::Observer> can_retry_init_observer_;
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc index 9110cb3..eead1a0 100644 --- a/chrome/browser/ui/views/profiles/profile_menu_view.cc +++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -36,7 +36,7 @@ #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/profile_picker.h" #include "chrome/browser/ui/signin/profile_colors_util.h" #include "chrome/browser/ui/sync/sync_promo_ui.h"
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc index c59e8f2..53212f2 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
@@ -65,6 +65,8 @@ std::move(sync_consent_completed_closure)); } +void ProfilePickerSignedInFlowController::Cancel() {} + void ProfilePickerSignedInFlowController::SwitchToSyncConfirmation() { DCHECK(IsInitialized()); host_->ShowScreen(contents(), GetSyncConfirmationURL(/*loading=*/false),
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h index 33c0b06..c3038be5 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h +++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.h
@@ -45,7 +45,9 @@ virtual void Init(); // Cancels the flow explicitly. - virtual void Cancel() = 0; + // By default does not do anything, in the flow it will be as if the dialog + // was closed. + virtual void Cancel(); // Finishes the creation flow by marking `profile_being_created_` as fully // created, opening a browser window for this profile and calling @@ -55,7 +57,7 @@ ProfilePicker::BrowserOpenedCallback callback) = 0; // Finishes the sign-in process by moving to the sync confirmation screen. - void SwitchToSyncConfirmation(); + virtual void SwitchToSyncConfirmation(); // Finishes the sign-in process by moving to the enterprise profile welcome // screen.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index c4a362d..54b3ee6 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -600,8 +600,7 @@ signed_in_flow_ = std::make_unique<LacrosFirstRunSignedInFlowController>( this, picker_profile, std::move(contents_for_signed_in_flow), - /*profile_color=*/absl::optional<SkColor>(), - base::BindOnce(&ProfilePicker::Params::NotifyFirstRunFinished, + base::BindOnce(&ProfilePicker::Params::NotifyFirstRunExited, base::Unretained(¶ms_))); signed_in_flow_->Init(); #else
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index 3e502f9d..969fd09 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chrome/browser/profiles/profile_test_util.h" #include "chrome/browser/ui/views/profiles/profile_picker_view.h" #include <set> @@ -54,6 +55,7 @@ #include "chrome/browser/ui/webui/signin/profile_picker_ui.h" #include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/browser/ui/webui/signin/signin_utils.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/profile_deletion_observer.h" @@ -66,6 +68,7 @@ #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "components/policy/policy_constants.h" #include "components/prefs/pref_service.h" +#include "components/signin/public/base/signin_switches.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" #include "components/signin/public/identity_manager/identity_manager.h" @@ -81,6 +84,7 @@ #include "extensions/common/extension_id.h" #include "google_apis/gaia/gaia_urls.h" #include "services/network/test/test_url_loader_factory.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/views/widget/widget_delegate.h" #include "url/gurl.h" @@ -90,6 +94,7 @@ #include "components/policy/core/common/management/management_service.h" #include "components/policy/core/common/management/scoped_management_service_override_for_testing.h" #elif BUILDFLAG(IS_CHROMEOS_LACROS) +#include "chrome/browser/ui/startup/first_run_lacros.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h" @@ -125,7 +130,8 @@ return account_info; } -GURL GetSyncConfirmationURL(SkColor profile_color = kProfileColor) { +GURL GetSyncConfirmationURL( + absl::optional<SkColor> profile_color = kProfileColor) { return AppendSyncConfirmationQueryParams( GURL("chrome://sync-confirmation/"), {/*is_modal=*/false, SyncConfirmationUI::DesignVersion::kColored, @@ -348,6 +354,21 @@ observer.Wait(); } +void ExpectEnterpriseScreenTypeAndProceed( + content::WebContents* web_contents, + EnterpriseProfileWelcomeUI::ScreenType expected_type, + signin::SigninChoice choice) { + EnterpriseProfileWelcomeHandler* handler = + web_contents->GetWebUI() + ->GetController() + ->GetAs<EnterpriseProfileWelcomeUI>() + ->GetHandlerForTesting(); + EXPECT_EQ(handler->GetTypeForTesting(), expected_type); + + // Simulate clicking on the next button. + handler->CallProceedCallbackForTesting(choice); +} + } // namespace class ProfilePickerCreationFlowBrowserTest : public ProfilePickerTestBase { @@ -1268,21 +1289,6 @@ context, base::BindRepeating(&FakeUserPolicySigninService::BuildForEnterprise)); } - - void ExpectEnterpriseScreenTypeAndProceed( - EnterpriseProfileWelcomeUI::ScreenType expected_type, - signin::SigninChoice choice) { - EnterpriseProfileWelcomeHandler* handler = - web_contents() - ->GetWebUI() - ->GetController() - ->GetAs<EnterpriseProfileWelcomeUI>() - ->GetHandlerForTesting(); - EXPECT_EQ(handler->GetTypeForTesting(), expected_type); - - // Simulate clicking on the next button. - handler->CallProceedCallbackForTesting(choice); - } }; IN_PROC_BROWSER_TEST_F(ProfilePickerEnterpriseCreationFlowBrowserTest, @@ -1298,8 +1304,9 @@ "joe.enterprise@gmail.com", "Joe", "enterprise.com"); ExpectEnterpriseScreenTypeAndProceed( - /*expected_type=*/EnterpriseProfileWelcomeUI::ScreenType:: - kEntepriseAccountSyncEnabled, + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); WaitForLoadStop(GetSyncConfirmationURL()); @@ -1355,8 +1362,9 @@ WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/")); ExpectEnterpriseScreenTypeAndProceed( - /*expected_type=*/EnterpriseProfileWelcomeUI::ScreenType:: - kConsumerAccountSyncDisabled, + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled, /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); Browser* new_browser = BrowserAddedWaiter(2u).Wait(); @@ -1399,8 +1407,9 @@ WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/")); ExpectEnterpriseScreenTypeAndProceed( - /*expected_type=*/EnterpriseProfileWelcomeUI::ScreenType:: - kEntepriseAccountSyncEnabled, + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); WaitForLoadStop(GetSyncConfirmationURL()); @@ -1453,8 +1462,9 @@ ProfileDeletionObserver observer; ExpectEnterpriseScreenTypeAndProceed( - /*expected_type=*/EnterpriseProfileWelcomeUI::ScreenType:: - kEntepriseAccountSyncEnabled, + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, /*choice=*/signin::SIGNIN_CHOICE_CANCEL); // As the profile creation flow was opened directly, the window is closed now. @@ -1758,3 +1768,181 @@ ForceEphemeralProfilesPolicy::kDisabled, ForceEphemeralProfilesPolicy::kEnabled)); #endif // !BUILDFLAG(IS_CHROMEOS_LACROS) + +#if BUILDFLAG(IS_CHROMEOS_LACROS) + +class ProfilePickerLacrosFirstRunBrowserTest : public ProfilePickerTestBase { + public: + ProfilePickerLacrosFirstRunBrowserTest() { + // This is needed to prevent `TurnSyncOnHelper` for trying to make network + // calls to fetch policy for the current account. As this domain is used at + // a pretty basic level in tests (`user_manager::kStubUserEmail`) it might + // be better to make sure it gets allowlisted by default. + // TODO(https://crbug.com/1311650): Try to get saner defaults. + policy::BrowserPolicyConnector::SetNonEnterpriseDomainForTesting( + "example.com"); + } + + ~ProfilePickerLacrosFirstRunBrowserTest() override { + policy::BrowserPolicyConnector::SetNonEnterpriseDomainForTesting(nullptr); + } + + void SetUpDefaultCommandLine(base::CommandLine* command_line) override { + ProfilePickerTestBase::SetUpDefaultCommandLine(command_line); + + if (GetTestPreCount() <= 1) { + // Show the FRE in these tests. We only disable the FRE for PRE_PRE_ tests + // (with GetTestPreCount() == 2) as we need these to setup the account + // info by calling `PopulateAccountInfo()`, so it is available to the + // subsequent steps of the test. + command_line->RemoveSwitch(switches::kNoFirstRun); + } + } + + protected: + // Fills account info for the current profile. We need this to be done before + // we start the FRE as it expects to have extended info and a refresh token + // available for the account associated with the primary profile. + // + // Can't be called too early during setup, needs a browser to run. + void PopulateAccountInfo() { + ASSERT_TRUE(browser()->profile()); + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(browser()->profile()); + ASSERT_TRUE( + identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync) + .IsEmpty()); + + CoreAccountInfo core_account_info = + identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin); + + AccountInfo account_info = FillAccountInfo(core_account_info, "given_name"); + + signin::UpdateAccountInfoForAccount(identity_manager, account_info); + signin::SetRefreshTokenForAccount(identity_manager, + core_account_info.account_id); + } + + private: + base::test::ScopedFeatureList feature_list_{ + switches::kLacrosNonSyncingProfiles}; +}; + +// Overall sequence for QuitEarly: +// Start browser => Show FRE => Quit on welcome step. +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, + PRE_PRE_QuitEarly) { + PopulateAccountInfo(); +} +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, PRE_QuitEarly) { + EXPECT_TRUE(ShouldOpenPrimaryProfileFirstRun()); + + // The profile picker should be open on start to show the FRE. + ASSERT_EQ(0u, BrowserList::GetInstance()->size()); + ASSERT_TRUE(ProfilePicker::IsOpen()); + WaitForPickerWidgetCreated(); + WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/")); + // If we don't wait for the above and call `Hide()`, a lot of the setup that + // triggers callbacks is missing, we don't get + // `TurnOnSyncHelper::FinishSyncSetupAndDelete()` for example. + + // Close the FRE right away. + ProfilePicker::Hide(); + + // No browser window should open because we closed the FRE UI early. + WaitForPickerClosed(); + EXPECT_EQ(0u, BrowserList::GetInstance()->size()); + EXPECT_TRUE(ShouldOpenPrimaryProfileFirstRun()); +} +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, QuitEarly) { + // On the second run, the FRE is still not marked finished and we should + // reopen it. + EXPECT_TRUE(ShouldOpenPrimaryProfileFirstRun()); + EXPECT_TRUE(ProfilePicker::IsOpen()); +} + +// Overall sequence for QuitAtEnd: +// Start browser => Show FRE => Advance to sync consent step => Quit. +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, + PRE_PRE_QuitAtEnd) { + PopulateAccountInfo(); +} +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, PRE_QuitAtEnd) { + EXPECT_TRUE(ShouldOpenPrimaryProfileFirstRun()); + + // The profile picker should be open on start to show the FRE. + EXPECT_EQ(0u, BrowserList::GetInstance()->size()); + EXPECT_TRUE(ProfilePicker::IsOpen()); + + // A welcome page should be displayed. + WaitForPickerWidgetCreated(); + WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/")); + + // Proceed to the sync confirmation page. + ExpectEnterpriseScreenTypeAndProceed( + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kLacrosConsumerWelcome, + /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); + WaitForLoadStop(GetSyncConfirmationURL(absl::optional<SkColor>())); + + // Exit the FRE. + ProfilePicker::Hide(); + WaitForPickerClosed(); + + // Because we quit, we should also quit chrome, but mark the FRE finished. + EXPECT_FALSE(ShouldOpenPrimaryProfileFirstRun()); + EXPECT_EQ(0u, BrowserList::GetInstance()->size()); +} +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, QuitAtEnd) { + // On the second run, the FRE is marked finished and we should skip it. + EXPECT_FALSE(ShouldOpenPrimaryProfileFirstRun()); + EXPECT_FALSE(ProfilePicker::IsOpen()); + EXPECT_EQ(1u, BrowserList::GetInstance()->size()); +} + +// Overall sequence for OptIn: +// Start browser => Show FRE => Advance to sync consent step => Opt-in. +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, PRE_PRE_OptIn) { + PopulateAccountInfo(); +} +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, PRE_OptIn) { + EXPECT_TRUE(ShouldOpenPrimaryProfileFirstRun()); + + // The profile picker should be open on start to show the FRE. + EXPECT_EQ(0u, BrowserList::GetInstance()->size()); + EXPECT_TRUE(ProfilePicker::IsOpen()); + + // A welcome page should be displayed. On it we proceed to the next step. + WaitForPickerWidgetCreated(); + WaitForLoadStop(GURL("chrome://enterprise-profile-welcome/")); + + // Proceed to the sync confirmation page. + ExpectEnterpriseScreenTypeAndProceed( + web_contents(), + /*expected_type=*/ + EnterpriseProfileWelcomeUI::ScreenType::kLacrosConsumerWelcome, + /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); + WaitForLoadStop(GetSyncConfirmationURL(absl::optional<SkColor>())); + + // Opt-in to sync + ProfileManager* profile_manager = g_browser_process->profile_manager(); + Profile* profile = profiles::testing::CreateProfileSync( + profile_manager, profile_manager->GetPrimaryUserProfilePath()); + LoginUIServiceFactory::GetForProfile(profile)->SyncConfirmationUIClosed( + LoginUIService::SYNC_WITH_DEFAULT_SETTINGS); + + // The FRE should close and a browser should open. + WaitForPickerClosed(); + EXPECT_FALSE(ShouldOpenPrimaryProfileFirstRun()); + EXPECT_EQ(1u, BrowserList::GetInstance()->size()); +} + +IN_PROC_BROWSER_TEST_F(ProfilePickerLacrosFirstRunBrowserTest, OptIn) { + // On the second run, the FRE is marked finished and we should skip it. + EXPECT_FALSE(ShouldOpenPrimaryProfileFirstRun()); + EXPECT_FALSE(ProfilePicker::IsOpen()); + EXPECT_EQ(1u, BrowserList::GetInstance()->size()); +} + +#endif // BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/views/read_later/read_later_button.cc b/chrome/browser/ui/views/read_later/read_later_button.cc deleted file mode 100644 index ad66438c..0000000 --- a/chrome/browser/ui/views/read_later/read_later_button.cc +++ /dev/null
@@ -1,349 +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. - -#include "chrome/browser/ui/views/read_later/read_later_button.h" - -#include <string> - -#include "base/bind.h" -#include "base/metrics/histogram_functions.h" -#include "base/metrics/user_metrics.h" -#include "base/metrics/user_metrics_action.h" -#include "base/time/time.h" -#include "chrome/app/vector_icons/vector_icons.h" -#include "chrome/browser/feature_engagement/tracker_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/themes/theme_properties.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_element_identifiers.h" -#include "chrome/browser/ui/read_later/reading_list_model_factory.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper.h" -#include "chrome/browser/ui/views/chrome_layout_provider.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/toolbar/toolbar_button.h" -#include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h" -#include "chrome/common/webui_url_constants.h" -#include "chrome/grit/generated_resources.h" -#include "components/bookmarks/common/bookmark_pref_names.h" -#include "components/feature_engagement/public/event_constants.h" -#include "components/feature_engagement/public/tracker.h" -#include "content/public/browser/web_contents.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/base/pointer/touch_ui_controller.h" -#include "ui/color/color_id.h" -#include "ui/color/color_provider.h" -#include "ui/gfx/geometry/insets.h" -#include "ui/gfx/paint_vector_icon.h" -#include "ui/views/accessibility/view_accessibility.h" -#include "ui/views/animation/ink_drop.h" -#include "ui/views/animation/ink_drop_highlight.h" -#include "ui/views/animation/ink_drop_impl.h" -#include "ui/views/animation/ink_drop_mask.h" -#include "ui/views/background.h" -#include "ui/views/bubble/bubble_dialog_delegate_view.h" -#include "ui/views/controls/button/button.h" -#include "ui/views/controls/button/button_controller.h" -#include "ui/views/controls/dot_indicator.h" -#include "ui/views/controls/highlight_path_generator.h" -#include "ui/views/view_class_properties.h" -#include "url/gurl.h" - -namespace { - -// Enumeration of all bookmark bar prefs and states when a user can access the -// ReadLaterButton. These values are persisted to logs. Entries should not be -// renumbered and numeric values should never be reused. -enum class BookmarkBarPrefAndState { - kVisibleAndOnNTP = 0, - kHiddenAndOnNTP = 1, - kVisibleAndNotOnNTP = 2, - kMaxValue = kVisibleAndNotOnNTP, -}; - -void RecordBookmarkBarState(Browser* browser) { - content::WebContents* web_contents = - browser->tab_strip_model()->GetActiveWebContents(); - BookmarkBarPrefAndState state = BookmarkBarPrefAndState::kVisibleAndNotOnNTP; - if (web_contents) { - const GURL site_origin = - web_contents->GetLastCommittedURL().DeprecatedGetOriginAsURL(); - // These are also the NTP urls checked for showing the bookmark bar on the - // NTP. - if (site_origin == - GURL(chrome::kChromeUINewTabURL).DeprecatedGetOriginAsURL() || - site_origin == - GURL(chrome::kChromeUINewTabPageURL).DeprecatedGetOriginAsURL() || - site_origin == GURL(chrome::kChromeUINewTabPageThirdPartyURL) - .DeprecatedGetOriginAsURL()) { - if (browser->profile()->GetPrefs()->GetBoolean( - bookmarks::prefs::kShowBookmarkBar)) { - state = BookmarkBarPrefAndState::kVisibleAndOnNTP; - } else { - state = BookmarkBarPrefAndState::kHiddenAndOnNTP; - } - } - } - base::UmaHistogramEnumeration( - "Bookmarks.BookmarksBarStatus.OnReadingListOpened", state); -} - -// Note this matches the background base layer alpha used in ToolbarButton. -constexpr SkAlpha kBackgroundBaseLayerAlpha = 204; -constexpr base::TimeDelta kHighlightShowDuration = base::Milliseconds(150); -constexpr base::TimeDelta kHighlightHideDuration = base::Milliseconds(650); -constexpr base::TimeDelta kHighlightDuration = base::Milliseconds(2250); - -} // namespace - -ReadLaterButton::ReadLaterButton(Browser* browser) - : LabelButton(base::BindRepeating(&ReadLaterButton::ButtonPressed, - base::Unretained(this)), - l10n_util::GetStringUTF16(IDS_READ_LATER_TITLE)), - browser_(browser), - webui_bubble_manager_(std::make_unique<WebUIBubbleManagerT<ReadLaterUI>>( - this, - browser->profile(), - GURL(chrome::kChromeUIReadLaterURL), - IDS_READ_LATER_TITLE)), - widget_open_timer_(base::BindRepeating([](base::TimeDelta time_elapsed) { - base::UmaHistogramMediumTimes("ReadingList.WindowDisplayedDuration", - time_elapsed); - })), - highlight_color_animation_( - std::make_unique<HighlightColorAnimation>(this)) { - ConfigureInkDropForToolbar(this); - // Note: BrowserView may not exist during tests. - if (BrowserView::GetBrowserViewForBrowser(browser_)) - DCHECK(!BrowserView::GetBrowserViewForBrowser(browser_) - ->right_aligned_side_panel()); - - dot_indicator_ = views::DotIndicator::Install(image()); - - reading_list_model_ = - ReadingListModelFactory::GetForBrowserContext(browser_->profile()); - if (reading_list_model_) - reading_list_model_scoped_observation_.Observe(reading_list_model_.get()); - - SetImageLabelSpacing(ChromeLayoutProvider::Get()->GetDistanceMetric( - DISTANCE_RELATED_LABEL_HORIZONTAL_LIST)); - - views::InstallPillHighlightPathGenerator(this); - SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); - SetTooltipText(l10n_util::GetStringUTF16(IDS_READ_LATER_TITLE)); - GetViewAccessibility().OverrideHasPopup(ax::mojom::HasPopup::kMenu); - - button_controller()->set_notify_action( - views::ButtonController::NotifyAction::kOnPress); - SetProperty(views::kElementIdentifierKey, kReadLaterButtonElementId); -} - -ReadLaterButton::~ReadLaterButton() = default; - -void ReadLaterButton::CloseBubble() { - if (webui_bubble_manager_->GetBubbleWidget()) - webui_bubble_manager_->CloseBubble(); -} - -void ReadLaterButton::OnThemeChanged() { - LabelButton::OnThemeChanged(); - - // We don't always have a theme provider (ui tests, for example). - const ui::ThemeProvider* theme_provider = GetThemeProvider(); - if (!theme_provider) - return; - highlight_color_animation_->SetColor(theme_provider->GetColor( - ThemeProperties::COLOR_READ_LATER_BUTTON_HIGHLIGHT)); - - dot_indicator_->SetColor( - /*dot_color=*/GetColorProvider()->GetColor(ui::kColorAlertHighSeverity), - /*border_color=*/theme_provider->GetColor( - ThemeProperties::COLOR_TOOLBAR)); -} - -void ReadLaterButton::Layout() { - LabelButton::Layout(); - - // Set |dot_indicator_| bounds. - constexpr int kDotIndicatorSize = 8; - gfx::Rect bounds = gfx::Rect(0, 0, kDotIndicatorSize, kDotIndicatorSize); - bounds.Offset(-2, -2); - dot_indicator_->SetBoundsRect(bounds); -} - -void ReadLaterButton::OnWidgetDestroying(views::Widget* widget) { - DCHECK_EQ(webui_bubble_manager_->GetBubbleWidget(), widget); - DCHECK(bubble_widget_observation_.IsObservingSource( - webui_bubble_manager_->GetBubbleWidget())); - bubble_widget_observation_.Reset(); -} - -void ReadLaterButton::ReadingListModelLoaded(const ReadingListModel* model) { - if (model->unseen_size()) - dot_indicator_->Show(); -} - -void ReadLaterButton::ReadingListModelBeingDeleted( - const ReadingListModel* model) { - DCHECK(model == reading_list_model_); - DCHECK(reading_list_model_scoped_observation_.IsObservingSource( - reading_list_model_.get())); - reading_list_model_scoped_observation_.Reset(); - reading_list_model_ = nullptr; -} - -void ReadLaterButton::ReadingListDidAddEntry(const ReadingListModel* model, - const GURL& url, - reading_list::EntrySource source) { - if (source == reading_list::EntrySource::ADDED_VIA_CURRENT_APP && - BrowserView::GetBrowserViewForBrowser(browser_)->IsActive()) { - highlight_color_animation_->Show(); - } - dot_indicator_->Show(); -} - -void ReadLaterButton::ButtonPressed() { - highlight_color_animation_->Hide(); - - if (webui_bubble_manager_->GetBubbleWidget()) { - webui_bubble_manager_->CloseBubble(); - } else { - base::RecordAction( - base::UserMetricsAction("DesktopReadingList.OpenReadingList")); - feature_engagement::Tracker* tracker = - feature_engagement::TrackerFactory::GetForBrowserContext( - browser_->profile()); - tracker->NotifyEvent(feature_engagement::events::kReadingListMenuOpened); - RecordBookmarkBarState(browser_); - webui_bubble_manager_->ShowBubble(); - reading_list_model_->MarkAllSeen(); - dot_indicator_->Hide(); - // There should only ever be a single bubble widget active for the - // ReadLaterButton. - DCHECK(!bubble_widget_observation_.IsObserving()); - bubble_widget_observation_.Observe( - webui_bubble_manager_->GetBubbleWidget()); - widget_open_timer_.Reset(webui_bubble_manager_->GetBubbleWidget()); - } -} - -void ReadLaterButton::UpdateColors() { - if (!GetThemeProvider()) - return; - - const int highlight_radius = - ChromeLayoutProvider::Get()->GetCornerRadiusMetric( - views::Emphasis::kMaximum, size()); - SetEnabledTextColors(highlight_color_animation_->GetTextColor()); - SetImageModel( - views::Button::STATE_NORMAL, - ui::ImageModel::FromVectorIcon( - kReadLaterIcon, highlight_color_animation_->GetIconColor())); - absl::optional<SkColor> background_color = - highlight_color_animation_->GetBackgroundColor(); - if (background_color) { - SetBackground(views::CreateBackgroundFromPainter( - views::Painter::CreateSolidRoundRectPainter( - *background_color, highlight_radius, gfx::Insets(0)))); - } else { - SetBackground(nullptr); - } -} - -ReadLaterButton::HighlightColorAnimation::HighlightColorAnimation( - ReadLaterButton* parent) - : parent_(parent), - highlight_color_animation_(std::vector<gfx::MultiAnimation::Part>{ - gfx::MultiAnimation::Part(kHighlightShowDuration, - gfx::Tween::FAST_OUT_SLOW_IN, - 0.0, - 1.0), - gfx::MultiAnimation::Part(kHighlightDuration, - gfx::Tween::Type::LINEAR, - 1.0, - 1.0), - gfx::MultiAnimation::Part(kHighlightHideDuration, - gfx::Tween::FAST_OUT_SLOW_IN, - 1.0, - 0.0)}) { - highlight_color_animation_.set_delegate(this); - highlight_color_animation_.set_continuous(false); -} - -ReadLaterButton::HighlightColorAnimation::~HighlightColorAnimation() = default; - -void ReadLaterButton::HighlightColorAnimation::Show() { - // Do nothing if an animation is already showing. - if (highlight_color_animation_.is_animating()) - return; - - highlight_color_animation_.Start(); - parent_->UpdateColors(); -} - -void ReadLaterButton::HighlightColorAnimation::Hide() { - ClearHighlightColor(); -} - -void ReadLaterButton::HighlightColorAnimation::SetColor(SkColor color) { - highlight_color_ = color; - parent_->UpdateColors(); -} - -SkColor ReadLaterButton::HighlightColorAnimation::GetTextColor() const { - SkColor original_text_color = color_utils::GetColorWithMaxContrast( - parent_->GetThemeProvider()->GetColor(ThemeProperties::COLOR_TOOLBAR)); - return FadeWithAnimation(highlight_color_, original_text_color); -} - -absl::optional<SkColor> -ReadLaterButton::HighlightColorAnimation::GetBackgroundColor() const { - if (!highlight_color_animation_.is_animating()) - return absl::nullopt; - SkColor original_bg_color = - SkColorSetA(parent_->GetThemeProvider()->GetColor( - ThemeProperties::COLOR_TOOLBAR_BUTTON_BACKGROUND), - kBackgroundBaseLayerAlpha); - SkColor highlight_bg_color = color_utils::GetResultingPaintColor( - SkColorSetA(highlight_color_, SkColorGetA(highlight_color_) * - kToolbarInkDropHighlightVisibleOpacity), - original_bg_color); - return FadeWithAnimation(highlight_bg_color, original_bg_color); -} - -SkColor ReadLaterButton::HighlightColorAnimation::GetIconColor() const { - SkColor original_icon_color = parent_->GetThemeProvider()->GetColor( - ThemeProperties::COLOR_TOOLBAR_BUTTON_ICON); - return FadeWithAnimation(highlight_color_, original_icon_color); -} - -void ReadLaterButton::HighlightColorAnimation::AnimationEnded( - const gfx::Animation* animation) { - ClearHighlightColor(); -} - -void ReadLaterButton::HighlightColorAnimation::AnimationProgressed( - const gfx::Animation* animation) { - parent_->UpdateColors(); -} - -SkColor ReadLaterButton::HighlightColorAnimation::FadeWithAnimation( - SkColor target_color, - SkColor original_color) const { - if (!highlight_color_animation_.is_animating()) - return original_color; - - return gfx::Tween::ColorValueBetween( - highlight_color_animation_.GetCurrentValue(), original_color, - target_color); -} - -void ReadLaterButton::HighlightColorAnimation::ClearHighlightColor() { - highlight_color_animation_.Stop(); - parent_->UpdateColors(); -} - -BEGIN_METADATA(ReadLaterButton, views::LabelButton) -END_METADATA
diff --git a/chrome/browser/ui/views/read_later/read_later_button.h b/chrome/browser/ui/views/read_later/read_later_button.h deleted file mode 100644 index ae858f7..0000000 --- a/chrome/browser/ui/views/read_later/read_later_button.h +++ /dev/null
@@ -1,117 +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. - -#ifndef CHROME_BROWSER_UI_VIEWS_READ_LATER_READ_LATER_BUTTON_H_ -#define CHROME_BROWSER_UI_VIEWS_READ_LATER_READ_LATER_BUTTON_H_ - -#include "base/memory/raw_ptr.h" -#include "base/scoped_observation.h" -#include "chrome/browser/ui/views/bubble/webui_bubble_manager.h" -#include "chrome/browser/ui/webui/read_later/read_later_ui.h" -#include "components/reading_list/core/reading_list_model.h" -#include "components/reading_list/core/reading_list_model_observer.h" -#include "third_party/skia/include/core/SkColor.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/gfx/animation/animation_delegate.h" -#include "ui/gfx/animation/multi_animation.h" -#include "ui/views/controls/button/label_button.h" -#include "ui/views/widget/widget_observer.h" -#include "ui/views/widget/widget_utils.h" - -class Browser; - -namespace views { -class DotIndicator; -} - -// Button in the bookmarks bar that provides access to the corresponding -// read later menu. -// TODO(corising): Handle the the async presentation of the UI bubble. -class ReadLaterButton : public views::LabelButton, - public views::WidgetObserver, - public ReadingListModelObserver { - public: - METADATA_HEADER(ReadLaterButton); - explicit ReadLaterButton(Browser* browser); - ReadLaterButton(const ReadLaterButton&) = delete; - ReadLaterButton& operator=(const ReadLaterButton&) = delete; - ~ReadLaterButton() override; - - void CloseBubble(); - - views::DotIndicator* dot_indicator_for_testing() { return dot_indicator_; } - - private: - class HighlightColorAnimation : gfx::AnimationDelegate { - public: - explicit HighlightColorAnimation(ReadLaterButton* parent); - HighlightColorAnimation(const HighlightColorAnimation&) = delete; - HighlightColorAnimation& operator=(const HighlightColorAnimation&) = delete; - ~HighlightColorAnimation() override; - - void Show(); - void Hide(); - void SetColor(SkColor color); - - // Returns current text / background / icon color based on - // |highlight_color_| and on the current animation state (which - // influences the alpha channel). - SkColor GetTextColor() const; - absl::optional<SkColor> GetBackgroundColor() const; - SkColor GetIconColor() const; - - void AnimationEnded(const gfx::Animation* animation) override; - void AnimationProgressed(const gfx::Animation* animation) override; - - private: - SkColor FadeWithAnimation(SkColor target_color, - SkColor original_color) const; - void ClearHighlightColor(); - - const raw_ptr<ReadLaterButton> parent_; - - SkColor highlight_color_ = gfx::kPlaceholderColor; - - // Animation for showing the highlight color (in icon, text, and - // background). - gfx::MultiAnimation highlight_color_animation_; - }; - - // LabelButton: - void OnThemeChanged() override; - void Layout() override; - - // views::WidgetObserver: - void OnWidgetDestroying(views::Widget* widget) override; - - // ReadingListModelObserver: - void ReadingListModelLoaded(const ReadingListModel* model) override; - void ReadingListModelBeingDeleted(const ReadingListModel* model) override; - void ReadingListDidAddEntry(const ReadingListModel* model, - const GURL& url, - reading_list::EntrySource source) override; - - void ButtonPressed(); - - void UpdateColors(); - - const raw_ptr<Browser> browser_; - - raw_ptr<views::DotIndicator> dot_indicator_ = nullptr; - - raw_ptr<ReadingListModel> reading_list_model_ = nullptr; - base::ScopedObservation<ReadingListModel, ReadingListModelObserver> - reading_list_model_scoped_observation_{this}; - - std::unique_ptr<WebUIBubbleManagerT<ReadLaterUI>> webui_bubble_manager_; - - views::WidgetOpenTimer widget_open_timer_; - - base::ScopedObservation<views::Widget, views::WidgetObserver> - bubble_widget_observation_{this}; - - std::unique_ptr<HighlightColorAnimation> highlight_color_animation_; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_READ_LATER_READ_LATER_BUTTON_H_
diff --git a/chrome/browser/ui/views/read_later/read_later_button_browsertest.cc b/chrome/browser/ui/views/read_later/read_later_button_browsertest.cc deleted file mode 100644 index 51addca..0000000 --- a/chrome/browser/ui/views/read_later/read_later_button_browsertest.cc +++ /dev/null
@@ -1,97 +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. - -#include "chrome/browser/ui/views/read_later/read_later_button.h" - -#include <string> - -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "build/build_config.h" -#include "chrome/app/chrome_command_ids.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/browser/ui/read_later/read_later_test_utils.h" -#include "chrome/browser/ui/read_later/reading_list_model_factory.h" -#include "chrome/browser/ui/test/test_browser_dialog.h" -#include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/test/base/ui_test_utils.h" -#include "components/bookmarks/common/bookmark_pref_names.h" -#include "components/reading_list/core/reading_list_model.h" -#include "components/reading_list/features/reading_list_switches.h" -#include "content/public/test/browser_test.h" -#include "ui/views/controls/dot_indicator.h" - -class ReadLaterButtonBrowserTest : public DialogBrowserTest { - public: - ReadLaterButtonBrowserTest() { - feature_list_.InitWithFeatures( - /*enabled_features=*/{reading_list::switches::kReadLater}, - /*disabled_features=*/{features::kSidePanel}); - } - - ReadLaterButtonBrowserTest(const ReadLaterButtonBrowserTest&) = delete; - ReadLaterButtonBrowserTest& operator=(const ReadLaterButtonBrowserTest&) = - delete; - - void SetUpOnMainThread() override { - DialogBrowserTest::SetUpOnMainThread(); - browser()->profile()->GetPrefs()->SetBoolean( - bookmarks::prefs::kShowBookmarkBar, true); - // Navigate to a url that can be added to the reading list. - ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), - GURL("https://www.google.com"))); - } - - ReadLaterButton* GetReadLaterButton(Browser* browser) { - return BrowserView::GetBrowserViewForBrowser(browser) - ->bookmark_bar() - ->read_later_button(); - } - - // DialogBrowserTest: - void ShowUi(const std::string& name) override { - ASSERT_TRUE(browser()->bookmark_bar_state() == BookmarkBar::SHOW); - ClickReadLaterButton(); - } - - void ClickReadLaterButton() { - ui::MouseEvent click_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), - base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON, 0); - GetReadLaterButton(browser())->OnMousePressed(click_event); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -// TODO(1115950): Flaky on Windows. -#if BUILDFLAG(IS_WIN) -#define MAYBE_InvokeUi_default DISABLED_InvokeUi_default -#else -#define MAYBE_InvokeUi_default InvokeUi_default -#endif -IN_PROC_BROWSER_TEST_F(ReadLaterButtonBrowserTest, MAYBE_InvokeUi_default) { - ShowAndVerifyUi(); -} - -IN_PROC_BROWSER_TEST_F(ReadLaterButtonBrowserTest, - DotIndicatorVisibleWithUnreadItems) { - ReadingListModel* model = - ReadingListModelFactory::GetForBrowserContext(browser()->profile()); - test::ReadingListLoadObserver(model).Wait(); - - // Verify the dot indicator is seen when there is an unseen entry. - model->AddEntry(GURL("http://foo/1"), "Tab 1", - reading_list::EntrySource::ADDED_VIA_CURRENT_APP); - ASSERT_TRUE( - GetReadLaterButton(browser())->dot_indicator_for_testing()->GetVisible()); - - // Verify the dot indicator is hidden once the reading list is opened. - ClickReadLaterButton(); - ASSERT_FALSE( - GetReadLaterButton(browser())->dot_indicator_for_testing()->GetVisible()); -}
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc index 8385bad..a2339b7 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator_unittest.cc
@@ -18,8 +18,7 @@ public: void SetUp() override { base::test::ScopedFeatureList features; - features.InitWithFeatures( - {features::kSidePanel, features::kUnifiedSidePanel}, {}); + features.InitWithFeatures({features::kUnifiedSidePanel}, {}); TestWithBrowserView::SetUp(); AddTab(browser_view()->browser(), GURL("http://foo1.com"));
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc index d7e264e..c502189f 100644 --- a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc
@@ -752,7 +752,7 @@ // SideSearchBrowserControllerTest: void SetUp() override { scoped_feature_list_.InitWithFeatures( - {features::kSidePanel, features::kSidePanelImprovedClobbering}, {}); + {features::kSidePanelImprovedClobbering}, {}); SideSearchBrowserControllerTest::SetUp(); } void TearDown() override {
diff --git a/chrome/browser/ui/views/status_icons/status_tray_win.cc b/chrome/browser/ui/views/status_icons/status_tray_win.cc index c13d5a7..27c482fa 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_win.cc +++ b/chrome/browser/ui/views/status_icons/status_tray_win.cc
@@ -14,7 +14,6 @@ #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/win/windows_types.h" #include "base/win/wrapped_window_proc.h" #include "chrome/browser/lifetime/application_lifetime.h"
diff --git a/chrome/browser/ui/views/test/view_event_test_base.h b/chrome/browser/ui/views/test/view_event_test_base.h index ad9e47b35..63dbc12 100644 --- a/chrome/browser/ui/views/test/view_event_test_base.h +++ b/chrome/browser/ui/views/test/view_event_test_base.h
@@ -6,7 +6,6 @@ #define CHROME_BROWSER_UI_VIEWS_TEST_VIEW_EVENT_TEST_BASE_H_ #include "base/memory/raw_ptr.h" -#include "base/time/time.h" // We only want to use ViewEventTestBase in test targets which properly // isolate each test case by running each test in a separate process.
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.cc b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.cc index 0085e4e..240161f43 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_bubble_view_model.cc
@@ -51,13 +51,6 @@ "chrome-labs-tab-search-media-tabs", version_info::Channel::BETA, tab_search_media_tabs_variation_description)); - // Side Panel. - lab_info.emplace_back(LabInfo( - flag_descriptions::kSidePanelFlagId, - l10n_util::GetStringUTF16(IDS_SIDE_PANEL_EXPERIMENT_NAME), - l10n_util::GetStringUTF16(IDS_SIDE_PANEL_EXPERIMENT_DESCRIPTION), - "chrome-labs-side-panel", version_info::Channel::DEV)); - // Tab Scrolling. std::vector<std::u16string> tab_scrolling_variation_descriptions = { l10n_util::GetStringUTF16(IDS_TABS_SHRINK_TO_PINNED_TAB_WIDTH),
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc b/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc index 7683244..9ab240f 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_view_controller.cc
@@ -47,7 +47,7 @@ // kReadLaterSelected = 1, // kTabSearchSelected = 2, kTabScrollingSelected = 3, - kSidePanelSelected = 4, + // kSidePanelSelected = 4, // kLensRegionSearchSelected = 5, kWebUITabStripSelected = 6, kTabSearchMediaTabsSelected = 7, @@ -75,8 +75,6 @@ const auto get_enum = [](const std::string& internal_name) { if (internal_name == flag_descriptions::kScrollableTabStripFlagId) return ChromeLabsSelectedLab::kTabScrollingSelected; - if (internal_name == flag_descriptions::kSidePanelFlagId) - return ChromeLabsSelectedLab::kSidePanelSelected; #if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP) && \ (BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_ASH)) if (internal_name == flag_descriptions::kWebUITabStripFlagId)
diff --git a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc index 6ece7d8..2e34114 100644 --- a/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc +++ b/chrome/browser/ui/views/toolbar/side_panel_toolbar_button_unittest.cc
@@ -19,7 +19,6 @@ class SidePanelToolbarButtonTest : public TestWithBrowserView { public: void SetUp() override { - scoped_feature_list_.InitAndEnableFeature(features::kSidePanel); TestWithBrowserView::SetUp(); model_ = ReadingListModelFactory::GetForBrowserContext(profile()); @@ -42,7 +41,6 @@ ReadingListModel* model() { return model_; } private: - base::test::ScopedFeatureList scoped_feature_list_; raw_ptr<ReadingListModel> model_; };
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc index 968357912..8dceab5 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_view.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -79,7 +79,6 @@ #include "components/autofill/core/common/autofill_payments_features.h" #include "components/omnibox/browser/omnibox_view.h" #include "components/prefs/pref_service.h" -#include "components/reading_list/features/reading_list_switches.h" #include "components/safe_browsing/core/common/features.h" #include "components/send_tab_to_self/features.h" #include "components/signin/public/base/signin_buildflags.h" @@ -303,8 +302,7 @@ } std::unique_ptr<SidePanelToolbarButton> side_panel_button; - if (browser_view_->right_aligned_side_panel() && - reading_list::switches::IsReadingListEnabled()) { + if (browser_view_->right_aligned_side_panel()) { side_panel_button = std::make_unique<SidePanelToolbarButton>(browser_); }
diff --git a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc index ef7bf75f3..6203f0a8 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
@@ -29,7 +29,6 @@ #include "components/feature_engagement/public/feature_list.h" #include "components/feature_engagement/test/mock_tracker.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" -#include "components/reading_list/features/reading_list_switches.h" #include "content/public/test/browser_test.h" #include "media/base/media_switches.h" #include "testing/gmock/include/gmock/gmock.h" @@ -211,38 +210,6 @@ ShowAndVerifyUi(); } -// Need a separate fixture to override the feature flag. -class FeaturePromoDialogReadLaterTest : public FeaturePromoDialogTest { - public: - FeaturePromoDialogReadLaterTest() { - feature_list_.InitAndEnableFeature(reading_list::switches::kReadLater); - } - - void SetUpOnMainThread() override { - FeaturePromoDialogTest::SetUpOnMainThread(); - BookmarkBarView::DisableAnimationsForTesting(true); - browser()->profile()->GetPrefs()->SetBoolean( - bookmarks::prefs::kShowBookmarkBar, true); - } - - ~FeaturePromoDialogReadLaterTest() override = default; - - private: - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(FeaturePromoDialogReadLaterTest, - InvokeUi_IPH_ReadingListDiscovery) { - set_baseline("2723691"); - ShowAndVerifyUi(); -} - -IN_PROC_BROWSER_TEST_F(FeaturePromoDialogReadLaterTest, - InvokeUi_IPH_ReadingListEntryPoint) { - set_baseline("2749474"); - ShowAndVerifyUi(); -} - #if BUILDFLAG(ENABLE_SIDE_SEARCH) // Need a separate fixture to override the feature flag. class FeaturePromoDialogSideSearchTest : public FeaturePromoDialogTest {
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc index aade8b2..9be83ae 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
@@ -39,116 +39,6 @@ helper_.CheckPlatformShortcutNotExists("SiteA"); } -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginModeOnPolicyAppWorks) { - helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); - helper_.CheckAppInListTabbed("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.DisableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginDisabled("SiteA"); - // Clear out installed app - helper_.UninstallPolicyApp("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginModeOnNormalAppWorks) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckPlatformShortcutAndIcon("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.DisableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginDisabled("SiteA"); - // Clear out installed app - helper_.UninstallFromList("SiteA"); - helper_.CheckPlatformShortcutNotExists("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginWorksOnPolicyAppAllowed) { - helper_.InstallPolicyAppWindowedShortcut("SiteA"); - helper_.ApplyRunOnOsLoginPolicyAllowed("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.DisableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginDisabled("SiteA"); - helper_.UninstallPolicyApp("SiteA"); - helper_.CheckPlatformShortcutNotExists("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginWorksOnPolicyAppBlocked) { - helper_.InstallPolicyAppWindowedShortcut("SiteA"); - helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginDisabled("SiteA"); - helper_.UninstallPolicyApp("SiteA"); - helper_.CheckPlatformShortcutNotExists("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginWorksOnPolicyAppRunWindowed) { - helper_.InstallPolicyAppWindowedShortcut("SiteA"); - helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); - helper_.DisableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.UninstallPolicyApp("SiteA"); - helper_.CheckPlatformShortcutNotExists("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckRunOnOsLoginWorksOnBlockedAfterUserTurnOn) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckAppInListWindowed("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); - helper_.EnableRunOnOSLogin("SiteA"); - helper_.CheckRunOnOSLoginDisabled("SiteA"); - helper_.RemoveRunOnOsLoginPolicy("SiteA"); - helper_.CheckRunOnOSLoginEnabled("SiteA"); - helper_.UninstallFromList("SiteA"); - helper_.CheckPlatformShortcutNotExists("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckNavigateToAppSettingsFromChromeAppsWorks) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckAppInListWindowed("SiteA"); - helper_.OpenAppSettingsFromChromeApps("SiteA"); - helper_.CheckBrowserNavigationIsAppSettings("SiteA"); - helper_.UninstallFromMenu("SiteA"); - helper_.CheckAppNotInList("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckNavigateToAppSettingsFromAppMenu) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckAppInListWindowed("SiteA"); - helper_.LaunchFromChromeApps("SiteA"); - helper_.OpenAppSettingsFromAppMenu("SiteA"); - helper_.CheckBrowserNavigationIsAppSettings("SiteA"); - helper_.UninstallFromMenu("SiteA"); - helper_.CheckAppNotInList("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckUninstallFromAppSettingsWorks) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckAppInListWindowed("SiteA"); - helper_.UninstallFromAppSettings("SiteA"); - helper_.CheckAppNotInList("SiteA"); -} - -IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, - CheckAppSettingsAppState) { - helper_.InstallCreateShortcutWindowed("SiteA"); - helper_.CheckAppInListWindowed("SiteA"); - helper_.CheckAppSettingsAppState("SiteA"); - helper_.UninstallFromMenu("SiteA"); - helper_.CheckAppNotInList("SiteA"); -} - // Generated tests: IN_PROC_BROWSER_TEST_F( @@ -909,5 +799,685 @@ helper_.CheckNoToolbar(); } +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption("SiteA"); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_33SiteA_12SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedNoShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_32SiteA_11SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedNoShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut("SiteA"); + helper_.CheckAppInListWindowed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_101SiteA_111SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_104SiteA_106SiteA_101SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.ApplyRunOnOsLoginPolicyBlocked("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_104SiteA_106SiteA_105SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.EnableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.DisableRunOnOsLogin("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_102SiteA_106SiteA_111SiteA_103SiteA_107SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.ApplyRunOnOsLoginPolicyRunWindowed("SiteA"); + helper_.CheckRunOnOsLoginEnabled("SiteA"); + helper_.CheckUserCannotSetRunOnOsLogin("SiteA"); + helper_.RemoveRunOnOsLoginPolicy("SiteA"); + helper_.CheckRunOnOsLoginDisabled("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_96SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromChromeApps("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_97SiteA_109SiteA) { + // Test contents are generated by script. Please do not modify! + // See `chrome/test/webapps/README.md` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed("SiteA"); + helper_.CheckAppInListTabbed("SiteA"); + helper_.CheckPlatformShortcutAndIcon("SiteA"); + helper_.OpenAppSettingsFromAppMenu("SiteA"); + helper_.CheckBrowserNavigationIsAppSettings("SiteA"); +} + } // namespace } // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc index 52509bc..b204ca1 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -586,14 +586,14 @@ AfterStateChangeAction(); } -void WebAppIntegrationTestDriver::DisableRunOnOSLogin( +void WebAppIntegrationTestDriver::DisableRunOnOsLogin( const std::string& site_mode) { BeforeStateChangeAction(__FUNCTION__); SetRunOnOsLoginMode(site_mode, apps::RunOnOsLoginMode::kNotRun); AfterStateChangeAction(); } -void WebAppIntegrationTestDriver::EnableRunOnOSLogin( +void WebAppIntegrationTestDriver::EnableRunOnOsLogin( const std::string& site_mode) { BeforeStateChangeAction(__FUNCTION__); SetRunOnOsLoginMode(site_mode, apps::RunOnOsLoginMode::kWindowed); @@ -946,30 +946,24 @@ } void WebAppIntegrationTestDriver::CheckAppSettingsAppState( - const std::string& site_mode) { + Profile* profile, + const AppState& app_state) { #if !BUILDFLAG(IS_CHROMEOS) - BeforeStateCheckAction(__FUNCTION__); - absl::optional<AppState> app_state = GetAppBySiteMode( - after_state_change_action_state_.get(), profile(), site_mode); - ASSERT_TRUE(app_state.has_value()) - << "No app installed for site: " << site_mode; - - auto app_management_page_handler = CreateAppManagementPageHandler(profile()); + auto app_management_page_handler = CreateAppManagementPageHandler(profile); app_management::mojom::AppPtr app; app_management_page_handler.GetApp( - app_state->id, + app_state.id, base::BindLambdaForTesting([&](app_management::mojom::AppPtr result) { app = std::move(result); })); - EXPECT_EQ(app->id, app_state->id); - EXPECT_EQ(app->title.value(), app_state->name); - EXPECT_EQ(app->window_mode, app_state->window_mode); + EXPECT_EQ(app->id, app_state.id); + EXPECT_EQ(app->title.value(), app_state.name); + EXPECT_EQ(app->window_mode, app_state.window_mode); ASSERT_TRUE(app->run_on_os_login.has_value()); EXPECT_EQ(app->run_on_os_login.value()->login_mode, - app_state->run_on_os_login_mode); - AfterStateCheckAction(); + app_state.run_on_os_login_mode); #else NOTREACHED() << "Not implemented on Chrome OS."; #endif @@ -1658,7 +1652,7 @@ AfterStateCheckAction(); } -void WebAppIntegrationTestDriver::CheckRunOnOSLoginEnabled( +void WebAppIntegrationTestDriver::CheckRunOnOsLoginEnabled( const std::string& site_mode) { BeforeStateCheckAction(__FUNCTION__); absl::optional<AppState> app_state = GetAppBySiteMode( @@ -1688,7 +1682,7 @@ AfterStateCheckAction(); } -void WebAppIntegrationTestDriver::CheckRunOnOSLoginDisabled( +void WebAppIntegrationTestDriver::CheckRunOnOsLoginDisabled( const std::string& site_mode) { BeforeStateCheckAction(__FUNCTION__); absl::optional<AppState> app_state = GetAppBySiteMode( @@ -1718,6 +1712,37 @@ AfterStateCheckAction(); } +void WebAppIntegrationTestDriver::CheckUserCannotSetRunOnOsLogin( + const std::string& site_mode) { +#if !BUILDFLAG(IS_CHROMEOS) + BeforeStateCheckAction(__FUNCTION__); + absl::optional<AppState> app_state = GetAppBySiteMode( + after_state_change_action_state_.get(), profile(), site_mode); + ASSERT_TRUE(app_state); + auto app_management_page_handler = CreateAppManagementPageHandler(profile()); + + app_management::mojom::AppPtr app; + app_management_page_handler.GetApp( + app_state->id, + base::BindLambdaForTesting([&](app_management::mojom::AppPtr result) { + app = std::move(result); + })); + + ASSERT_TRUE(app->run_on_os_login.has_value()); + ASSERT_TRUE(app->run_on_os_login.value()->is_managed); + if (app_state->run_on_os_login_mode == apps::RunOnOsLoginMode::kWindowed) { + DisableRunOnOsLogin(site_mode); + CheckRunOnOsLoginEnabled(site_mode); + } else { + EnableRunOnOsLogin(site_mode); + CheckRunOnOsLoginDisabled(site_mode); + } + AfterStateCheckAction(); +#else + NOTREACHED() << "Not implemented on Chrome OS."; +#endif +} + void WebAppIntegrationTestDriver::CheckUserDisplayModeInternal( DisplayMode display_mode) { BeforeStateCheckAction(__FUNCTION__); @@ -1977,22 +2002,26 @@ manifest_launcher_icon_filename = info.url.ExtractFileName(); } } - - app_state.emplace( - app_id, - AppState(app_id, registrar.GetAppShortName(app_id), - registrar.GetAppScope(app_id), - web_app_publisher_helper.ConvertDisplayModeToWindowMode( - registrar.GetAppUserDisplayMode(app_id)), - web_app_publisher_helper.ConvertOsLoginMode( - registrar.GetAppRunOnOsLoginMode(app_id).value), - registrar.GetAppEffectiveDisplayMode(app_id), - registrar.GetAppUserDisplayMode(app_id), - manifest_launcher_icon_filename, - registrar.IsLocallyInstalled(app_id), - IsShortcutAndIconCreated( - profile, registrar.GetAppShortName(app_id), app_id))); + auto state = AppState( + app_id, registrar.GetAppShortName(app_id), + registrar.GetAppScope(app_id), + web_app_publisher_helper.ConvertDisplayModeToWindowMode( + registrar.GetAppUserDisplayMode(app_id)), + web_app_publisher_helper.ConvertOsLoginMode( + registrar.GetAppRunOnOsLoginMode(app_id).value), + registrar.GetAppEffectiveDisplayMode(app_id), + registrar.GetAppUserDisplayMode(app_id), + manifest_launcher_icon_filename, registrar.IsLocallyInstalled(app_id), + IsShortcutAndIconCreated(profile, registrar.GetAppShortName(app_id), + app_id)); +#if !BUILDFLAG(IS_CHROMEOS) + if (registrar.IsLocallyInstalled(app_id)) { + CheckAppSettingsAppState(profile, state); + } +#endif + app_state.emplace(app_id, state); } + profile_state_map.emplace( profile, ProfileState(std::move(browser_state), std::move(app_state))); }
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h index 187af48e..db862b1c 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -152,8 +152,8 @@ void AcceptAppIdUpdateDialog(); void CloseCustomToolbar(); void ClosePwa(); - void DisableRunOnOSLogin(const std::string& site_mode); - void EnableRunOnOSLogin(const std::string& site_mode); + void DisableRunOnOsLogin(const std::string& site_mode); + void EnableRunOnOsLogin(const std::string& site_mode); void InstallCreateShortcutTabbed(const std::string& site_mode); void InstallCreateShortcutWindowed(const std::string& site_mode); void InstallMenuOption(const std::string& site_mode); @@ -203,7 +203,6 @@ void CheckAppInListTabbed(const std::string& site_mode); void CheckAppNavigationIsStartUrl(); void CheckBrowserNavigationIsAppSettings(const std::string& site_mode); - void CheckAppSettingsAppState(const std::string& site_mode); void CheckAppNotInList(const std::string& site_mode); void CheckAppIconSiteA(const std::string& color); void CheckAppTitleSiteA(const std::string& title); @@ -220,8 +219,9 @@ void CheckNoToolbar(); void CheckPlatformShortcutAndIcon(const std::string& site_mode); void CheckPlatformShortcutNotExists(const std::string& site_mode); - void CheckRunOnOSLoginEnabled(const std::string& site_mode); - void CheckRunOnOSLoginDisabled(const std::string& site_mode); + void CheckRunOnOsLoginEnabled(const std::string& site_mode); + void CheckRunOnOsLoginDisabled(const std::string& site_mode); + void CheckUserCannotSetRunOnOsLogin(const std::string& site_mode); void CheckUserDisplayModeInternal(DisplayMode display_mode); void CheckWindowClosed(); void CheckWindowCreated(); @@ -290,6 +290,8 @@ void LaunchAppStartupBrowserCreator(const AppId& app_id); + void CheckAppSettingsAppState(Profile* profile, const AppState& app_state); + Browser* browser(); const net::EmbeddedTestServer* embedded_test_server(); Profile* profile() {
diff --git a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc index 06157fa..c573783e3 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc
@@ -6,9 +6,11 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/feature_list.h" #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/services/qrcode_generator/public/cpp/qrcode_generator_service.h" #include "chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom.h" +#include "device/fido/features.h" #include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/color/color_provider.h" @@ -49,7 +51,10 @@ qrcode_generator::mojom::GenerateQRCodeRequest::New(); request->data = qr_string; request->should_render = true; - request->render_dino = true; + request->render_dino = + !base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI) && + !base::FeatureList::IsEnabled(device::kWebAuthPasskeysUIExperiment); + request->render_module_style = qrcode_generator::mojom::ModuleStyle::CIRCLES; request->render_locator_style =
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 99cda39..3322aea 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -858,10 +858,8 @@ if (url.host_piece() == chrome::kChromeUIFeedbackHost) return &NewWebUI<FeedbackUI>; } - if (reading_list::switches::IsReadingListEnabled()) { if (url.host_piece() == chrome::kChromeUIReadLaterHost) return &NewWebUI<ReadLaterUI>; - } if (url.host_piece() == chrome::kChromeUIBookmarksSidePanelHost) return &NewWebUI<BookmarksSidePanelUI>; if (features::IsReadAnythingEnabled()) {
diff --git a/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc b/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc index 3c3b4c1f..51264fa 100644 --- a/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc +++ b/chrome/browser/ui/webui/chromeos/bluetooth_shared_load_time_data_provider.cc
@@ -60,6 +60,8 @@ IDS_BLUETOOTH_A11Y_DEVICE_TYPE_GAME_CONTROLLER}, {"bluetoothA11yDeviceTypeKeyboard", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD}, + {"bluetoothA11yDeviceTypeKeyboardMouseCombo", + IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO}, {"bluetoothA11yDeviceTypeMouse", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE}, {"bluetoothA11yDeviceTypeTablet", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_TABLET}, {"bluetoothA11yDeviceName", IDS_BLUETOOTH_A11Y_DEVICE_NAME},
diff --git a/chrome/browser/ui/webui/read_later/read_later_page_handler.cc b/chrome/browser/ui/webui/read_later/read_later_page_handler.cc index 266530e7..3bb6398 100644 --- a/chrome/browser/ui/webui/read_later/read_later_page_handler.cc +++ b/chrome/browser/ui/webui/read_later/read_later_page_handler.cc
@@ -53,24 +53,6 @@ return (time - base::Time::UnixEpoch()).InMicroseconds(); } -bool IsActiveTabNTP(Browser* browser) { - content::WebContents* web_contents = - browser->tab_strip_model()->GetActiveWebContents(); - if (web_contents) { - const GURL site_origin = - web_contents->GetLastCommittedURL().DeprecatedGetOriginAsURL(); - // These are also the NTP urls checked for showing the bookmark bar on the - // NTP. - if (site_origin == - GURL(chrome::kChromeUINewTabURL).DeprecatedGetOriginAsURL() || - site_origin == - GURL(chrome::kChromeUINewTabPageURL).DeprecatedGetOriginAsURL()) { - return true; - } - } - return false; -} - class ReadLaterItemContextMenu : public ui::SimpleMenuModel, public ui::SimpleMenuModel::Delegate { public: @@ -189,19 +171,11 @@ if (!browser) return; - const bool side_panel_enabled = - base::FeatureList::IsEnabled(features::kSidePanel); - // Open in active tab if the user is on the NTP. - WindowOpenDisposition open_location = - IsActiveTabNTP(browser) ? WindowOpenDisposition::CURRENT_TAB - : WindowOpenDisposition::NEW_FOREGROUND_TAB; - if (side_panel_enabled) { - open_location = ui::DispositionFromClick( - click_modifiers->middle_button, click_modifiers->alt_key, - click_modifiers->ctrl_key, click_modifiers->meta_key, - click_modifiers->shift_key); - } + WindowOpenDisposition open_location = ui::DispositionFromClick( + click_modifiers->middle_button, click_modifiers->alt_key, + click_modifiers->ctrl_key, click_modifiers->meta_key, + click_modifiers->shift_key); content::OpenURLParams params(url, content::Referrer(), open_location, ui::PAGE_TRANSITION_AUTO_BOOKMARK, false); @@ -214,15 +188,10 @@ : "DesktopReadingList.Navigation.FromUnreadList")); } - if (mark_as_read && !side_panel_enabled) - reading_list_model_->SetReadStatus(url, true); - - base::RecordAction(base::UserMetricsAction( - side_panel_enabled ? "SidePanel.ReadingList.Navigation" - : "ReadingList.Dialog.Navigation")); + base::RecordAction( + base::UserMetricsAction("SidePanel.ReadingList.Navigation")); RecordBookmarkLaunch( - side_panel_enabled ? BOOKMARK_LAUNCH_LOCATION_SIDE_PANEL_READING_LIST - : BOOKMARK_LAUNCH_LOCATION_READING_LIST_DIALOG, + BOOKMARK_LAUNCH_LOCATION_SIDE_PANEL_READING_LIST, profile_metrics::GetBrowserProfileType(Profile::FromWebUI(web_ui_))); } @@ -242,9 +211,7 @@ reading_list_model_->MarkAllSeen(); base::RecordAction( - base::UserMetricsAction(base::FeatureList::IsEnabled(features::kSidePanel) - ? "SidePanel.ReadingList.AddCurrentPage" - : "ReadingList.Dialog.AddCurrentPage")); + base::UserMetricsAction("SidePanel.ReadingList.AddCurrentPage")); } void ReadLaterPageHandler::RemoveEntry(const GURL& url) { @@ -271,8 +238,6 @@ auto embedder = read_later_ui_->embedder(); if (embedder) { embedder->ShowUI(); - if (!base::FeatureList::IsEnabled(features::kSidePanel)) - UpdateCurrentPageActionButton(); } }
diff --git a/chrome/browser/ui/webui/read_later/read_later_ui.cc b/chrome/browser/ui/webui/read_later/read_later_ui.cc index d314b21f..47343126 100644 --- a/chrome/browser/ui/webui/read_later/read_later_ui.cc +++ b/chrome/browser/ui/webui/read_later/read_later_ui.cc
@@ -63,21 +63,14 @@ for (const auto& str : kLocalizedStrings) webui::AddLocalizedString(source, str.name, str.id); - const bool show_side_panel = - base::FeatureList::IsEnabled(features::kSidePanel); - - source->AddBoolean( - "currentPageActionButtonEnabled", - base::FeatureList::IsEnabled(features::kReadLaterAddFromDialog) || - show_side_panel); source->AddBoolean("useRipples", views::PlatformStyle::kUseRipples); Profile* const profile = Profile::FromWebUI(web_ui); PrefService* prefs = profile->GetPrefs(); source->AddBoolean( "bookmarksDragAndDropEnabled", - show_side_panel && - base::FeatureList::IsEnabled(features::kSidePanelDragAndDrop) && + + base::FeatureList::IsEnabled(features::kSidePanelDragAndDrop) && prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled)); ReadingListModel* const reading_list_model = @@ -93,10 +86,10 @@ content::URLDataSource::Add( profile, std::make_unique<FaviconSource>( profile, chrome::FaviconUrlFormat::kFavicon2)); - const int resource = show_side_panel && !base::FeatureList::IsEnabled( - features::kUnifiedSidePanel) - ? IDR_READ_LATER_SIDE_PANEL_SIDE_PANEL_HTML - : IDR_READ_LATER_READ_LATER_HTML; + const int resource = + !base::FeatureList::IsEnabled(features::kUnifiedSidePanel) + ? IDR_READ_LATER_SIDE_PANEL_SIDE_PANEL_HTML + : IDR_READ_LATER_READ_LATER_HTML; webui::SetupWebUIDataSource( source, base::make_span(kReadLaterResources, kReadLaterResourcesSize), resource);
diff --git a/chrome/browser/ui/webui/read_later/side_panel/bookmarks_side_panel_ui.cc b/chrome/browser/ui/webui/read_later/side_panel/bookmarks_side_panel_ui.cc index cbbb0899..6e952fc 100644 --- a/chrome/browser/ui/webui/read_later/side_panel/bookmarks_side_panel_ui.cc +++ b/chrome/browser/ui/webui/read_later/side_panel/bookmarks_side_panel_ui.cc
@@ -45,22 +45,18 @@ for (const auto& str : kLocalizedStrings) webui::AddLocalizedString(source, str.name, str.id); - const bool show_side_panel = - base::FeatureList::IsEnabled(features::kSidePanel); - source->AddBoolean("useRipples", views::PlatformStyle::kUseRipples); Profile* const profile = Profile::FromWebUI(web_ui); PrefService* prefs = profile->GetPrefs(); source->AddBoolean( "bookmarksDragAndDropEnabled", - show_side_panel && - base::FeatureList::IsEnabled(features::kSidePanelDragAndDrop) && + + base::FeatureList::IsEnabled(features::kSidePanelDragAndDrop) && prefs->GetBoolean(bookmarks::prefs::kEditBookmarksEnabled)); source->AddBoolean("unifiedSidePanel", - show_side_panel && base::FeatureList::IsEnabled( - features::kUnifiedSidePanel)); + base::FeatureList::IsEnabled(features::kUnifiedSidePanel)); content::URLDataSource::Add( profile, std::make_unique<FaviconSource>(
diff --git a/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc b/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc index c108923..2ddb1202 100644 --- a/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/bluetooth_section.cc
@@ -290,6 +290,9 @@ IDS_BLUETOOTH_A11Y_DEVICE_TYPE_GAME_CONTROLLER}, {"bluetoothA11yDeviceTypeKeyboard", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD}, + {"bluetoothA11yDeviceTypeKeyboardMouseCombo", + IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO}, + {"bluetoothA11yDeviceTypeMouse", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE}, {"bluetoothA11yDeviceTypeMouse", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE}, {"bluetoothA11yDeviceTypeTablet", IDS_BLUETOOTH_A11Y_DEVICE_TYPE_TABLET}, {"bluetoothA11yDeviceConnectionStateConnected",
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 36c6c70..5463be2 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -28,7 +28,7 @@ #include "chrome/browser/signin/account_consistency_mode_manager.h" #include "chrome/browser/signin/account_consistency_mode_manager_factory.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/management/management_ui.h" #include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h"
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index 494dce8..b2e24e5 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -24,7 +24,7 @@ #include "chrome/browser/ui/hats/hats_service.h" #include "chrome/browser/ui/hats/hats_service_factory.h" #include "chrome/browser/ui/managed_ui.h" -#include "chrome/browser/ui/passwords/manage_passwords_view_utils.h" +#include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/webui/favicon_source.h" #include "chrome/browser/ui/webui/managed_ui_handler.h"
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index 3d5dc17..4a70725e 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -168,6 +168,7 @@ {ContentSettingsType::FEDERATED_IDENTITY_API, nullptr}, {ContentSettingsType::AUTO_DARK_WEB_CONTENT, nullptr}, {ContentSettingsType::REQUEST_DESKTOP_SITE, nullptr}, + {ContentSettingsType::GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, nullptr}, }; static_assert(std::size(kContentSettingsTypeGroupNames) ==
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc index 5f3763aa..12301c17 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
@@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/check.h" +#include "base/command_line.h" #include "base/location.h" #include "base/logging.h" #include "base/metrics/user_metrics.h"
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn index 988d160..38ac5d65 100644 --- a/chrome/browser/web_applications/BUILD.gn +++ b/chrome/browser/web_applications/BUILD.gn
@@ -223,7 +223,7 @@ ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { sources += [ "os_integration/url_handler_manager_impl.cc", "os_integration/url_handler_manager_impl.h", @@ -533,7 +533,7 @@ ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { sources += [ "os_integration/url_handler_manager_impl_unittest.cc", "policy/web_app_settings_policy_handler_unittest.cc", @@ -593,7 +593,7 @@ ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { deps += [ "//components/services/app_service/public/cpp:app_url_handling" ] } }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 62c8db0..38f8fdee 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -1013,7 +1013,9 @@ base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI); const std::u16string label = - l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_ADD_PHONE); + base::FeatureList::IsEnabled(device::kWebAuthPasskeysUIExperiment) + ? u"Add a new phone" + : l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_ADD_PHONE); mechanisms_.emplace_back( Mechanism::AddPhone(), label, label, &kQrcodeGeneratorIcon, base::BindRepeating(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 049114a..16f563c 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1648813706-de98e117eabc3c54207a47fddadf24b45e7ce306.profdata +chrome-linux-main-1648835696-aae590c1b291563981d205d9a05a20262cadae43.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 9dc6eaf..4fadc26 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1648813706-18d22215498a4a56c912fbbe1c230d7928716c00.profdata +chrome-mac-arm-main-1648835696-e509b155d5b92b8f6b0082a95ff8ac96be69dac9.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 0a0d2567..f6ad05f9 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1648813706-e7034ce4a753fea8664ee09c4c40786545530a7b.profdata +chrome-mac-main-1648835696-0c0c46f575451ae200bc20ee09b84cc5e3439beb.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index f314b6b..63eeb80 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1648813706-a52d3a54b11b06c3b6e8735e17a69394b6300072.profdata +chrome-win32-main-1648825047-764fdcf4253cf4d15467d6a17f4efd3e5fe852f4.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 0e92877..ced080b 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1648813706-ba1308994f15b95eda9431416543ea7287f4896f.profdata +chrome-win64-main-1648825047-999e69d0b5f1ec7960c8191be251801ad7964023.profdata
diff --git a/chrome/chrome_cleaner/components/recovery_component.h b/chrome/chrome_cleaner/components/recovery_component.h index bbdac4549..cb58dee5 100644 --- a/chrome/chrome_cleaner/components/recovery_component.h +++ b/chrome/chrome_cleaner/components/recovery_component.h
@@ -11,7 +11,6 @@ #include "base/files/scoped_temp_dir.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/chrome_cleaner/components/component_api.h" #include "url/gurl.h"
diff --git a/chrome/chrome_cleaner/engines/target/test_engine_delegate.h b/chrome/chrome_cleaner/engines/target/test_engine_delegate.h index e2e6b5df..cc7af61 100644 --- a/chrome/chrome_cleaner/engines/target/test_engine_delegate.h +++ b/chrome/chrome_cleaner/engines/target/test_engine_delegate.h
@@ -9,7 +9,6 @@ #include <vector> #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/chrome_cleaner/engines/target/engine_delegate.h" namespace chrome_cleaner {
diff --git a/chrome/common/cart/commerce_hints.mojom b/chrome/common/cart/commerce_hints.mojom index 67f5bdc..ac51179 100644 --- a/chrome/common/cart/commerce_hints.mojom +++ b/chrome/common/cart/commerce_hints.mojom
@@ -54,4 +54,9 @@ // the commerce heuristics that are applicable in this domain. OnNavigation(url.mojom.Url url, string version_number) => (bool should_skip, Heuristics heuristics); + + // A cart content extraction is about to happen. Return JSON that + // contains product ID extraction heuristics and a JS script for cart + // content extraction. + OnCartExtraction() => (string product_id_json, string cart_extraction_script); };
diff --git a/chrome/common/extensions/command.cc b/chrome/common/extensions/command.cc index f2c9027..89929f29 100644 --- a/chrome/common/extensions/command.cc +++ b/chrome/common/extensions/command.cc
@@ -297,8 +297,12 @@ return values::kKeybindingPlatformChromeOs; #elif BUILDFLAG(IS_LINUX) return values::kKeybindingPlatformLinux; +#elif BUILDFLAG(IS_FUCHSIA) + // TODO(crbug.com/1312215): Change this once we decide what string should be + // used for Fuchsia. + return values::kKeybindingPlatformLinux; #else - return ""; +#error Unsupported platform #endif }
diff --git a/chrome/credential_provider/extension/service_unittests.cc b/chrome/credential_provider/extension/service_unittests.cc index 0a05bf9f..7d1741d1 100644 --- a/chrome/credential_provider/extension/service_unittests.cc +++ b/chrome/credential_provider/extension/service_unittests.cc
@@ -6,7 +6,6 @@ #include "base/files/file_path.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/credential_provider/extension/scoped_handle.h" #include "chrome/credential_provider/extension/service.h" #include "chrome/credential_provider/test/gcp_fakes.h"
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc index 201a01c0..6e6baa3 100644 --- a/chrome/gpu/chrome_content_gpu_client.cc +++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "base/token.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h"
diff --git a/chrome/renderer/cart/commerce_hint_agent.cc b/chrome/renderer/cart/commerce_hint_agent.cc index 286c5069..da21aa5 100644 --- a/chrome/renderer/cart/commerce_hint_agent.cc +++ b/chrome/renderer/cart/commerce_hint_agent.cc
@@ -681,44 +681,59 @@ ""); } -const WebString& GetProductExtractionScript() { - static base::NoDestructor<WebString> script([] { - std::string script_string = - ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( - IDR_CART_PRODUCT_EXTRACTION_JS); - if (IsCartHeuristicsImprovementEnabled()) { - script_string = "var isImprovementEnabled = true;\n" + script_string; - } - const std::string config = - "var kSleeperMinTaskTimeMs = " + - base::NumberToString( - kCartExtractionMinTaskTime.Get().InMillisecondsF()) + - ";\n" + "var kSleeperDutyCycle = " + - base::NumberToString(kCartExtractionDutyCycle.Get()) + ";\n" + - "var kTimeoutMs = " + - base::NumberToString(kCartExtractionTimeout.Get().InMillisecondsF()) + - ";\n"; - DVLOG(2) << config; - script_string = config + script_string; +const WebString& GetProductExtractionScript( + const std::string& product_id_json_component, + const std::string& cart_extraction_script_component) { + static base::NoDestructor<WebString> script( + [product_id_json_component, cart_extraction_script_component] { + std::string script_string; + if (cart_extraction_script_component.empty()) { + script_string = + ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( + IDR_CART_PRODUCT_EXTRACTION_JS); + if (IsCartHeuristicsImprovementEnabled()) { + script_string = + "var isImprovementEnabled = true;\n" + script_string; + } + const std::string config = + "var kSleeperMinTaskTimeMs = " + + base::NumberToString( + kCartExtractionMinTaskTime.Get().InMillisecondsF()) + + ";\n" + "var kSleeperDutyCycle = " + + base::NumberToString(kCartExtractionDutyCycle.Get()) + ";\n" + + "var kTimeoutMs = " + + base::NumberToString( + kCartExtractionTimeout.Get().InMillisecondsF()) + + ";\n"; + DVLOG(2) << config; + script_string = config + script_string; + } else { + script_string = cart_extraction_script_component; + } - const std::string id_extraction_map = - kProductIdPatternMapping.Get().empty() - ? std::string( - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_CART_DOMAIN_PRODUCT_ID_REGEX_JSON)) - : kProductIdPatternMapping.Get(); - script_string = - "var idExtractionMap = " + id_extraction_map + ";\n" + script_string; + if (!product_id_json_component.empty()) { + script_string = "var idExtractionMap = " + product_id_json_component + + ";\n" + script_string; + return WebString::FromUTF8(std::move(script_string)); + } + const std::string id_extraction_map = + kProductIdPatternMapping.Get().empty() + ? std::string(ui::ResourceBundle::GetSharedInstance() + .GetRawDataResource( + IDR_CART_DOMAIN_PRODUCT_ID_REGEX_JSON)) + : kProductIdPatternMapping.Get(); + script_string = "var idExtractionMap = " + id_extraction_map + ";\n" + + script_string; - const std::string coupon_id_extraction_map = - kCouponProductIdPatternMapping.Get(); - if (!coupon_id_extraction_map.empty()) { - script_string = - "var couponIdExtractionMap = " + coupon_id_extraction_map + ";\n" + - script_string; - } - return WebString::FromUTF8(std::move(script_string)); - }()); + const std::string coupon_id_extraction_map = + kCouponProductIdPatternMapping.Get(); + if (!coupon_id_extraction_map.empty()) { + script_string = + "var couponIdExtractionMap = " + coupon_id_extraction_map + + ";\n" + script_string; + } + return WebString::FromUTF8(std::move(script_string)); + }()); return *script; } @@ -837,13 +852,37 @@ kCartExtractionGapTime.Get()); return; } + // Use current script if it has already been initialized; otherwise fetch + // script from browser side. + mojo::Remote<mojom::CommerceHintObserver> observer = + GetObserver(render_frame()); + // Use current script if it has already been initialized or the feature is + // disabled; otherwise fetch script from browser side. + if (extraction_script_initialized_ || + !commerce::kOptimizeRendererSignal.Get()) { + ExtractCartWithUpdatedScript(std::move(observer), + /*product_id_json*/ std::string(), + /*cart_extraction_script*/ std::string()); + return; + } + auto* observer_ptr = observer.get(); + observer_ptr->OnCartExtraction( + base::BindOnce(&CommerceHintAgent::ExtractCartWithUpdatedScript, + weak_factory_.GetWeakPtr(), std::move(observer))); + extraction_script_initialized_ = true; +} + +void CommerceHintAgent::ExtractCartWithUpdatedScript( + mojo::Remote<mojom::CommerceHintObserver> observer, + const std::string& product_id_json, + const std::string& cart_extraction_script) { is_extraction_running_ = true; DVLOG(2) << "is_extraction_running_ = " << is_extraction_running_; blink::WebLocalFrame* main_frame = render_frame()->GetWebFrame(); v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); - blink::WebScriptSource source = - blink::WebScriptSource(GetProductExtractionScript()); + blink::WebScriptSource source = blink::WebScriptSource( + GetProductExtractionScript(product_id_json, cart_extraction_script)); if (!javascript_request_) { // This singleton never gets deleted, and will out-live CommerceHintAgen.
diff --git a/chrome/renderer/cart/commerce_hint_agent.h b/chrome/renderer/cart/commerce_hint_agent.h index 2e401eac..6d467fd 100644 --- a/chrome/renderer/cart/commerce_hint_agent.h +++ b/chrome/renderer/cart/commerce_hint_agent.h
@@ -60,7 +60,10 @@ void MaybeExtractProducts(); void ExtractProducts(); void ExtractCartFromCurrentFrame(); - + void ExtractCartWithUpdatedScript( + mojo::Remote<mojom::CommerceHintObserver> observer, + const std::string& product_id_json, + const std::string& cart_extraction_script); class JavaScriptRequest; JavaScriptRequest* javascript_request_{nullptr}; @@ -70,6 +73,7 @@ bool is_extraction_pending_{false}; bool is_extraction_running_{false}; bool should_skip_{false}; + bool extraction_script_initialized_{false}; base::WeakPtrFactory<CommerceHintAgent> weak_factory_{this}; class JavaScriptRequest : public blink::WebScriptExecutionCallback {
diff --git a/chrome/renderer/cart/commerce_hint_agent_browsertest.cc b/chrome/renderer/cart/commerce_hint_agent_browsertest.cc index 7894d5d..b5636d0f 100644 --- a/chrome/renderer/cart/commerce_hint_agent_browsertest.cc +++ b/chrome/renderer/cart/commerce_hint_agent_browsertest.cc
@@ -542,7 +542,7 @@ WaitForUmaCount("Commerce.Carts.VisitCart", 2); } -IN_PROC_BROWSER_TEST_F(CommerceHintAgentTest, ExtractCart) { +IN_PROC_BROWSER_TEST_F(CommerceHintAgentTest, ExtractCart_ScriptFromResource) { // This page has three products. NavigateToURL("https://www.guitarcenter.com/cart.html"); @@ -564,6 +564,72 @@ WaitForUmaBucketCount("Commerce.Carts.ExtractionTimedOut", 0, 2); } +IN_PROC_BROWSER_TEST_F(CommerceHintAgentTest, ExtractCart_ScriptFromComponent) { + // Initialize component with a dummy script that returns immediately. + std::string extraction_script = R"###( + async function extractAllItems(root) { + return { + "products":[ + { + "imageUrl": "https://foo.com/bar/image", + "price": "$10", + "title": "Foo bar", + "url": "https://foo.com/bar", + } + ] + }; + } + extracted_results_promise = extractAllItems(document); + )###"; + bool is_populated = + commerce_hint_service_->InitializeCommerceHeuristicsForTesting( + base::Version("0.0.0.1"), "{}", "{}", "", + std::move(extraction_script)); + DCHECK(is_populated); + + NavigateToURL("https://www.guitarcenter.com/cart.html"); + + const cart_db::ChromeCartContentProto expected_cart_protos = + BuildProtoWithProducts("guitarcenter.com", + "https://www.guitarcenter.com/cart.html", + {"https://foo.com/bar/image"}); + const ShoppingCarts expected_carts = { + {"guitarcenter.com", expected_cart_protos}}; + WaitForProductCount(expected_carts); +} + +IN_PROC_BROWSER_TEST_F(CommerceHintAgentTest, + ExtractCart_ProductIDFromComponent) { + std::string global_heuristics = R"###( + { + "rule_discount_partner_merchant_regex": "(guitarcenter.com)" + } + )###"; + std::string product_id_json = R"###( + { + "product_element": {"www.guitarcenter.com": "<a href=\"#modal-(\\w+)"} + } + )###"; + bool is_populated = + commerce_hint_service_->InitializeCommerceHeuristicsForTesting( + base::Version("0.0.0.1"), "{}", global_heuristics, + std::move(product_id_json), ""); + DCHECK(is_populated); + + // This page has two products. + NavigateToURL("https://www.guitarcenter.com/shopping-cart.html"); + + const cart_db::ChromeCartContentProto expected_cart_protos = + BuildProtoWithProducts( + "aaa.com", "https://www.guitarcenter.com/shopping-cart.html", + {"https://static.guitarcenter.com/product-image/foo_2-0-medium", + "https://static.guitarcenter.com/product-image/bar_2-0-medium"}, + {"foo_1", "bar_1"}); + const ShoppingCarts expected_carts = { + {"guitarcenter.com", expected_cart_protos}}; + WaitForProductCount(expected_carts); +} + class CommerceHintNoRateControlTest : public CommerceHintAgentTest { public: void SetUpInProcessBrowserTestFixture() override { @@ -980,8 +1046,8 @@ IN_PROC_BROWSER_TEST_F(CommerceHintTimeoutTest, MAYBE_ExtractCart) { NavigateToURL("https://www.guitarcenter.com/cart.html"); - WaitForUmaBucketCount("Commerce.Carts.ExtractionTimedOut", 1, 1); WaitForCartCount(kEmptyExpected); + WaitForUmaBucketCount("Commerce.Carts.ExtractionTimedOut", 1, 1); } class CommerceHintMaxCountTest : public CommerceHintAgentTest { @@ -1004,6 +1070,9 @@ IN_PROC_BROWSER_TEST_F(CommerceHintMaxCountTest, MAYBE_ExtractCart) { NavigateToURL("https://www.guitarcenter.com/cart.html"); + // Wait for trying to fetch extraction script from browser process. + base::PlatformThread::Sleep(TestTimeouts::tiny_timeout() * 30); + WaitForCartCount(kExpectedExampleWithProducts); WaitForUmaBucketCount("Commerce.Carts.ExtractionTimedOut", 0, 1); // This would have triggered another extraction if not limited by max count
diff --git a/chrome/services/media_gallery_util/media_metadata_parser.h b/chrome/services/media_gallery_util/media_metadata_parser.h index ce5924e..b2cd108f 100644 --- a/chrome/services/media_gallery_util/media_metadata_parser.h +++ b/chrome/services/media_gallery_util/media_metadata_parser.h
@@ -10,7 +10,6 @@ #include <vector> #include "base/callback.h" -#include "base/time/time.h" #include "chrome/common/media_galleries/metadata_types.h" #include "chrome/services/media_gallery_util/public/mojom/media_parser.mojom.h"
diff --git a/chrome/services/sharing/nearby/platform/webrtc.h b/chrome/services/sharing/nearby/platform/webrtc.h index a9297c0..8ddbf50 100644 --- a/chrome/services/sharing/nearby/platform/webrtc.h +++ b/chrome/services/sharing/nearby/platform/webrtc.h
@@ -15,7 +15,6 @@ #include "base/synchronization/lock.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/public/cpp/bindings/shared_remote.h" #include "services/network/public/mojom/mdns_responder.mojom.h" #include "services/network/public/mojom/p2p.mojom.h"
diff --git a/chrome/services/speech/BUILD.gn b/chrome/services/speech/BUILD.gn index e292957..a4ad007 100644 --- a/chrome/services/speech/BUILD.gn +++ b/chrome/services/speech/BUILD.gn
@@ -40,7 +40,5 @@ "//mojo/public/cpp/bindings", "//net", "//services/audio/public/cpp", - "//services/network/public/cpp", - "//services/network/public/mojom", ] }
diff --git a/chrome/services/speech/speech_recognition_service_impl.cc b/chrome/services/speech/speech_recognition_service_impl.cc index 4b5c954..ba20291 100644 --- a/chrome/services/speech/speech_recognition_service_impl.cc +++ b/chrome/services/speech/speech_recognition_service_impl.cc
@@ -4,10 +4,14 @@ #include "chrome/services/speech/speech_recognition_service_impl.h" +#include "base/files/file_path.h" #include "base/files/file_util.h" +#include "base/memory/weak_ptr.h" #include "chrome/services/speech/audio_source_fetcher_impl.h" #include "chrome/services/speech/speech_recognition_recognizer_impl.h" -#include "media/base/media_switches.h" +#include "media/mojo/mojom/speech_recognition_service.mojom.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" namespace speech {
diff --git a/chrome/services/speech/speech_recognition_service_impl.h b/chrome/services/speech/speech_recognition_service_impl.h index b31935a8..a3074d7 100644 --- a/chrome/services/speech/speech_recognition_service_impl.h +++ b/chrome/services/speech/speech_recognition_service_impl.h
@@ -50,8 +50,6 @@ BindRecognizerCallback callback) override; protected: - void DisconnectHandler(); - mojo::Receiver<media::mojom::SpeechRecognitionService> receiver_; // The set of receivers used to receive messages from the renderer clients.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 73f97a9..4f933480 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1738,6 +1738,7 @@ "../browser/media/webrtc/capture_handle_browsertest.cc", "../browser/media/webrtc/conditional_focus_browsertest.cc", "../browser/media/webrtc/media_stream_devices_controller_browsertest.cc", + "../browser/media/webrtc/multi_capture_browsertest.cc", "../browser/media/webrtc/region_capture_browsertest.cc", "../browser/media/webrtc/same_origin_observer_browsertest.cc", "../browser/media/webrtc/test_stats_dictionary_unittest.cc", @@ -1827,6 +1828,7 @@ "../browser/new_tab_page/new_tab_page_browsertest.cc", "../browser/no_best_effort_tasks_browsertest.cc", "../browser/no_best_effort_tasks_during_startup_browsertest.cc", + "../browser/notifications/notification_permission_browsertest.cc", "../browser/notifications/scheduler/notification_schedule_service_browsertest.cc", "../browser/ntp_tiles/ntp_tiles_browsertest.cc", "../browser/optimization_guide/browser_test_util.cc", @@ -2374,7 +2376,7 @@ ] } - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { sources += [ "../browser/chrome_main_browsertest.cc", "../browser/process_singleton_browsertest.cc", @@ -3240,7 +3242,6 @@ "../browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc", "../browser/ui/views/profiles/profile_menu_view_browsertest.cc", "../browser/ui/views/qrcode_generator/qrcode_generator_bubble_browsertest.cc", - "../browser/ui/views/read_later/read_later_button_browsertest.cc", "../browser/ui/views/safe_browsing/deep_scanning_failure_modal_dialog_browsertest.cc", "../browser/ui/views/safe_browsing/password_reuse_modal_warning_dialog_browsertest.cc", "../browser/ui/views/safe_browsing/prompt_for_scanning_modal_dialog_browsertest.cc", @@ -4307,7 +4308,7 @@ sources += [ "../browser/ui/views/side_search/default_search_icon_source_browsertest.cc" ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { sources += [ "../browser/ui/views/profiles/profile_picker_view_browsertest.cc", "../browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc", @@ -5271,10 +5272,10 @@ "../browser/ui/login/login_handler_unittest.cc", "../browser/ui/page_info/page_info_unittest.cc", "../browser/ui/passwords/manage_passwords_state_unittest.cc", - "../browser/ui/passwords/manage_passwords_view_utils_unittest.cc", "../browser/ui/passwords/password_generation_popup_controller_impl_unittest.cc", "../browser/ui/passwords/settings/password_manager_porter_unittest.cc", "../browser/ui/passwords/settings/password_manager_presenter_unittest.cc", + "../browser/ui/passwords/ui_utils_unittest.cc", "../browser/ui/search_engines/keyword_editor_controller_unittest.cc", "../browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc", "../browser/ui/webui/fileicon_source_unittest.cc", @@ -9400,7 +9401,7 @@ ] } - if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { + if (is_win || is_mac || is_linux) { sources += [ "../browser/ui/views/profiles/profile_bubble_interactive_uitest.cc", ]
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn index eab8b9f4..b3004cd 100644 --- a/chrome/test/chromedriver/BUILD.gn +++ b/chrome/test/chromedriver/BUILD.gn
@@ -38,6 +38,23 @@ args += rebase_path(js_files, root_build_dir) } +action("embed_mobile_devices_in_cpp") { + script = "embed_mobile_devices_in_cpp.py" + + ts_files = [ "//third_party/devtools-frontend/src/front_end/models/emulation/EmulatedDevices.ts" ] + inputs = [ "cpp_source.py" ] + ts_files + + outputs = [ + "$target_gen_dir/chrome/mobile_device_list.cc", + "$target_gen_dir/chrome/mobile_device_list.h", + ] + args = [ + "--directory", + rebase_path("$target_gen_dir/chrome", root_build_dir), + ] + args += rebase_path(ts_files, root_build_dir) +} + action("embed_user_data_dir_in_cpp") { script = "embed_user_data_dir_in_cpp.py" @@ -113,8 +130,6 @@ "chrome/log.h", "chrome/mobile_device.cc", "chrome/mobile_device.h", - "chrome/mobile_device_list.cc", - "chrome/mobile_device_list.h", "chrome/mobile_emulation_override_manager.cc", "chrome/mobile_emulation_override_manager.h", "chrome/navigation_tracker.cc", @@ -176,10 +191,12 @@ # Also compile the generated files. sources += get_target_outputs(":embed_js_in_cpp") + sources += get_target_outputs(":embed_mobile_devices_in_cpp") sources += get_target_outputs(":embed_user_data_dir_in_cpp") deps = [ ":embed_js_in_cpp", + ":embed_mobile_devices_in_cpp", ":embed_user_data_dir_in_cpp", "//base", "//base/third_party/dynamic_annotations",
diff --git a/chrome/test/chromedriver/chrome/mobile_device_list.cc b/chrome/test/chromedriver/chrome/mobile_device_list.cc deleted file mode 100644 index 19a5991..0000000 --- a/chrome/test/chromedriver/chrome/mobile_device_list.cc +++ /dev/null
@@ -1,180 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file was generated by running: -// ./chrome/test/chromedriver/embed_mobile_devices_in_cpp.py --directory -// chrome/test/chromedriver/chrome/ -// third_party/devtools-frontend/src/front_end/emulated_devices/module.json - -#include "chrome/test/chromedriver/chrome/mobile_device_list.h" - -const char kMobileDevices[] = - "{\"iPad\": {\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 1024, " - "\"width\": 768, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPad; CPU " - "OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) " - "Version/11.0 Mobile/15A5341f Safari/604.1\"}, \"Laptop with touch\": " - "{\"deviceScaleFactor\": 1, \"mobile\": false, \"height\": 1280, " - "\"width\": 950, \"touch\": true, \"userAgent\": \"\"}, \"BlackBerry " - "Z30\": {\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 640, " - "\"width\": 360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (BB10; " - "Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.0.9.2372 Mobile " - "Safari/537.10+\"}, \"Nexus 6\": {\"deviceScaleFactor\": 3.5, \"mobile\": " - "true, \"height\": 732, \"width\": 412, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 Mobile " - "Safari/537.36\"}, \"Nexus 7\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 960, \"width\": 600, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 " - "Safari/537.36\"}, \"Nexus 4\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 640, \"width\": 384, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 Mobile " - "Safari/537.36\"}, \"Nexus 5\": {\"deviceScaleFactor\": 3, \"mobile\": " - "true, \"height\": 640, \"width\": 360, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 Mobile " - "Safari/537.36\"}, \"Blackberry PlayBook\": {\"deviceScaleFactor\": 1, " - "\"mobile\": true, \"height\": 1024, \"width\": 600, \"touch\": true, " - "\"userAgent\": \"Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) " - "AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+\"}, " - "\"Pixel 2\": {\"deviceScaleFactor\": 2.625, \"mobile\": true, \"height\": " - "731, \"width\": 411, \"touch\": true, \"userAgent\": \"Mozilla/5.0 " - "(Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/86.0.4239.0 Mobile Safari/537.36\"}, \"Nexus " - "6P\": {\"deviceScaleFactor\": 3.5, \"mobile\": true, \"height\": 732, " - "\"width\": 412, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; " - "Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, " - "like Gecko) Chrome/86.0.4239.0 Mobile Safari/537.36\"}, \"iPhone 8 " - "Plus\": {\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 736, " - "\"width\": 414, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; " - "CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like " - "Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"iPhone 7 Plus\": " - "{\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 736, \"width\": " - "414, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS " - "13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) " - "Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"Laptop with HiDPI " - "screen\": {\"deviceScaleFactor\": 2, \"mobile\": false, \"height\": 1440, " - "\"width\": 900, \"touch\": false, \"userAgent\": \"\"}, \"Moto G4\": " - "{\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 640, \"width\": " - "360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; Android 6.0.1; " - "Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 " - "Mobile Safari/537.36\"}, \"Nokia N9\": {\"deviceScaleFactor\": 1, " - "\"mobile\": true, \"height\": 854, \"width\": 480, \"touch\": true, " - "\"userAgent\": \"Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, " - "like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13\"}, \"Nokia Lumia " - "520\": {\"deviceScaleFactor\": 1.5, \"mobile\": true, \"height\": 533, " - "\"width\": 320, \"touch\": true, \"userAgent\": \"Mozilla/5.0 " - "(compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; " - "ARM; Touch; NOKIA; Lumia 520)\"}, \"Kindle Fire HDX\": " - "{\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 1280, \"width\": " - "800, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; U; en-us; " - "KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.13 " - "Safari/535.19 Silk-Accelerated=true\"}, \"Galaxy S5\": " - "{\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 640, \"width\": " - "360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; Android 5.0; " - "SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/86.0.4239.0 Mobile Safari/537.36\"}, \"iPhone 7\": " - "{\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 667, \"width\": " - "375, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS " - "13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) " - "Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"LG Optimus L70\": " - "{\"deviceScaleFactor\": 1.25, \"mobile\": true, \"height\": 640, " - "\"width\": 384, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; U; " - "Android 4.4.2; en-us; LGMS323 Build/KOT49I.MS32310c) AppleWebKit/537.36 " - "(KHTML, like Gecko) Version/4.0 Chrome/86.0.4239.0 Mobile " - "Safari/537.36\"}, \"iPhone 5\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 568, \"width\": 320, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) " - "AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 " - "Safari/602.1\"}, \"iPhone 4\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 480, \"width\": 320, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) " - "AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 " - "Safari/9537.53\"}, \"Nexus 10\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 1280, \"width\": 800, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 " - "Safari/537.36\"}, \"iPhone 8\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 667, \"width\": 375, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) " - "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 " - "Safari/604.1\"}, \"iPhone 6\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 667, \"width\": 375, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) " - "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 " - "Safari/604.1\"}, \"Galaxy S III\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 640, \"width\": 360, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) " - "AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile " - "Safari/534.30\"}, \"iPhone 6/7/8\": {\"deviceScaleFactor\": 2, " - "\"mobile\": true, \"height\": 667, \"width\": 375, \"touch\": true, " - "\"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) " - "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 " - "Safari/604.1\"}, \"iPhone SE\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 568, \"width\": 320, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) " - "AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 " - "Safari/602.1\"}, \"Galaxy Fold\": {\"deviceScaleFactor\": 3, \"mobile\": " - "true, \"height\": 653, \"width\": 280, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) " - "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4239.0 Mobile " - "Safari/537.36\"}, \"Microsoft Lumia 550\": {\"deviceScaleFactor\": 2, " - "\"mobile\": true, \"height\": 360, \"width\": 640, \"touch\": true, " - "\"userAgent\": \"Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; " - "Microsoft; Lumia 550) AppleWebKit/537.36 (KHTML, like Gecko) " - "Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263\"}, \"iPad Mini\": " - "{\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 1024, \"width\": " - "768, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPad; CPU OS 11_0 " - "like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 " - "Mobile/15A5341f Safari/604.1\"}, \"iPhone 5/SE\": {\"deviceScaleFactor\": " - "2, \"mobile\": true, \"height\": 568, \"width\": 320, \"touch\": true, " - "\"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) " - "AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 " - "Safari/602.1\"}, \"iPad Pro\": {\"deviceScaleFactor\": 2, \"mobile\": " - "true, \"height\": 1366, \"width\": 1024, \"touch\": true, \"userAgent\": " - "\"Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 " - "(KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1\"}, \"Nexus " - "5X\": {\"deviceScaleFactor\": 2.625, \"mobile\": true, \"height\": 732, " - "\"width\": 412, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; " - "Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, " - "like Gecko) Chrome/86.0.4239.0 Mobile Safari/537.36\"}, \"iPhone 6/7/8 " - "Plus\": {\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 736, " - "\"width\": 414, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; " - "CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like " - "Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"Galaxy Note II\": " - "{\"deviceScaleFactor\": 2, \"mobile\": true, \"height\": 640, \"width\": " - "360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; U; Android " - "4.1; en-us; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) " - "Version/4.0 Mobile Safari/534.30\"}, \"iPhone 6 Plus\": " - "{\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 736, \"width\": " - "414, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS " - "13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) " - "Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"iPhone X\": " - "{\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 812, \"width\": " - "375, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS " - "13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) " - "Version/13.0.3 Mobile/15E148 Safari/604.1\"}, \"Microsoft Lumia 950\": " - "{\"deviceScaleFactor\": 4, \"mobile\": true, \"height\": 640, \"width\": " - "360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Windows Phone 10.0; " - "Android 4.2.1; Microsoft; Lumia 950) AppleWebKit/537.36 (KHTML, like " - "Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/14.14263\"}, \"Pixel " - "2 XL\": {\"deviceScaleFactor\": 3.5, \"mobile\": true, \"height\": 823, " - "\"width\": 411, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; " - "Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 " - "(KHTML, like Gecko) Chrome/86.0.4239.0 Mobile Safari/537.36\"}, \"Galaxy " - "Note 3\": {\"deviceScaleFactor\": 3, \"mobile\": true, \"height\": 640, " - "\"width\": 360, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; U; " - "Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, " - "like Gecko) Version/4.0 Mobile Safari/534.30\"}, \"JioPhone 2\": " - "{\"deviceScaleFactor\": 1, \"mobile\": true, \"height\": 320, \"width\": " - "240, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Mobile; " - "LYF/F300B/LYF-F300B-001-01-15-130718-i;Android; rv:48.0) Gecko/48.0 " - "Firefox/48.0 KAIOS/2.5\"}, \"Laptop with MDPI screen\": " - "{\"deviceScaleFactor\": 1, \"mobile\": false, \"height\": 1280, " - "\"width\": 800, \"touch\": false, \"userAgent\": \"\"}, \"Surface Duo\": " - "{\"deviceScaleFactor\": 2.5, \"mobile\": true, \"height\": 720, " - "\"width\": 540, \"touch\": true, \"userAgent\": \"Mozilla/5.0 (Linux; " - "Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, " - "like Gecko) Chrome/86.0.4239.0 Mobile Safari/537.36\"}}";
diff --git a/chrome/test/chromedriver/chrome/mobile_device_list.h b/chrome/test/chromedriver/chrome/mobile_device_list.h deleted file mode 100644 index e0e3eb97..0000000 --- a/chrome/test/chromedriver/chrome/mobile_device_list.h +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file was generated by running: -// ./chrome/test/chromedriver/embed_mobile_devices_in_cpp.py --directory -// chrome/test/chromedriver/chrome/ -// third_party/devtools-frontend/src/front_end/emulated_devices/module.json - -#ifndef CHROME_TEST_CHROMEDRIVER_CHROME_MOBILE_DEVICE_LIST_H_ -#define CHROME_TEST_CHROMEDRIVER_CHROME_MOBILE_DEVICE_LIST_H_ - -extern const char kMobileDevices[]; - -#endif // CHROME_TEST_CHROMEDRIVER_CHROME_MOBILE_DEVICE_LIST_H_
diff --git a/chrome/test/chromedriver/embed_mobile_devices_in_cpp.py b/chrome/test/chromedriver/embed_mobile_devices_in_cpp.py index 7486b061..65972d8 100755 --- a/chrome/test/chromedriver/embed_mobile_devices_in_cpp.py +++ b/chrome/test/chromedriver/embed_mobile_devices_in_cpp.py
@@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python # 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. @@ -11,16 +11,20 @@ parsed with JSONReader. """ +import ast import json import optparse import os -import re -import subprocess import sys import chrome_paths import cpp_source +_EMULATED_DEVICES_BEGIN = '// DEVICE-LIST-BEGIN' +_EMULATED_DEVICES_END = '// DEVICE-LIST-END' +_EMULATED_DEVICES_IF = '/* DEVICE-LIST-IF-JS */' +_EMULATED_DEVICES_ELSE = '/* DEVICE-LIST-ELSE' +_EMULATED_DEVICES_ENDIF = 'DEVICE-LIST-END-IF */' def main(): parser = optparse.OptionParser() @@ -50,36 +54,62 @@ devices = {} file_name = args[0] - inside_list = False with open(file_name, 'r') as f: - emulated_devices = json.load(f) - extensions = emulated_devices['extensions'] - for extension in extensions: - if extension['type'] == 'emulated-device': - device = extension['device'] - title = device['title'] - titles = [title] - # For 'iPhone 6/7/8', also add ['iPhone 6', 'iPhone 7', 'iPhone 8'] for - # backward compatibility. - if '/' in title: - words = title.split() - for i in range(len(words)): - if '/' in words[i]: - # Only support one word containing '/' - break - tokens = words[i].split('/') - for token in tokens: - words[i] = token - titles.append(' '.join(words)) - for title in titles: - devices[title] = { - 'userAgent': device['user-agent'].replace('%s', version), - 'width': device['screen']['vertical']['width'], - 'height': device['screen']['vertical']['height'], - 'deviceScaleFactor': device['screen']['device-pixel-ratio'], - 'touch': 'touch' in device['capabilities'], - 'mobile': 'mobile' in device['capabilities'], - } + data = f.read() + + # Extract the list from the source file. + begin_position = data.find(_EMULATED_DEVICES_BEGIN) + end_position = data.find(_EMULATED_DEVICES_END) + if begin_position == -1 or end_position == -1: + print('Could not find list of emulatedDevices in %s' % file_name) + return 1 + begin_position += len(_EMULATED_DEVICES_BEGIN) + list_string = '[' + data[begin_position:end_position] + ']' + + # Only used the non-localized strings in the list. + while (if_position := list_string.find(_EMULATED_DEVICES_IF)) != -1: + else_position = list_string.find(_EMULATED_DEVICES_ELSE) + if else_position == -1: + print('Could not find list of emulatedDevices in %s' % file_name) + return 1 + else_position += len(_EMULATED_DEVICES_ELSE) + list_string = list_string[0:if_position] + list_string[else_position::] + + endif_position = list_string.find(_EMULATED_DEVICES_ENDIF) + if endif_position == -1: + print('Could not find list of emulatedDevices in %s' % file_name) + return 1 + list_string = list_string[0:endif_position] + \ + list_string[endif_position + len(_EMULATED_DEVICES_ENDIF)::] + + # Do a bunch of substitutions to get something parseable by Python. + list_string = list_string.replace('true', 'True') + list_string = list_string.replace('false', 'False') + emulated_devices = ast.literal_eval(list_string) + for device in emulated_devices: + title = device['title'] + titles = [title] + # For 'iPhone 6/7/8', also add ['iPhone 6', 'iPhone 7', 'iPhone 8'] for + # backward compatibility. + if '/' in title: + words = title.split() + for i in range(len(words)): + if '/' in words[i]: + # Only support one word containing '/' + break + tokens = words[i].split('/') + for token in tokens: + words[i] = token + titles.append(' '.join(words)) + for title in titles: + devices[title] = { + 'userAgent': device['user-agent'].replace('%s', version), + 'width': device['screen']['vertical']['width'], + 'height': device['screen']['vertical']['height'], + 'deviceScaleFactor': device['screen']['device-pixel-ratio'], + 'touch': 'touch' in device['capabilities'], + 'mobile': 'mobile' in device['capabilities'], + } output_dir = 'chrome/test/chromedriver/chrome' cpp_source.WriteSource('mobile_device_list', @@ -87,10 +117,5 @@ options.directory, {'kMobileDevices': json.dumps(devices)}) - clang_format = ['clang-format', '-i'] - subprocess.Popen(clang_format + ['%s/mobile_device_list.cc' % output_dir]) - subprocess.Popen(clang_format + ['%s/mobile_device_list.h' % output_dir]) - - if __name__ == '__main__': sys.exit(main())
diff --git a/chrome/test/chromedriver/net/net_util_unittest.cc b/chrome/test/chromedriver/net/net_util_unittest.cc index 39689c7d..3eba6d8 100644 --- a/chrome/test/chromedriver/net/net_util_unittest.cc +++ b/chrome/test/chromedriver/net/net_util_unittest.cc
@@ -19,7 +19,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chrome/test/chromedriver/net/url_request_context_getter.h" #include "mojo/core/embedder/embedder.h" #include "net/base/ip_endpoint.h"
diff --git a/chrome/test/chromedriver/net/test_http_server.h b/chrome/test/chromedriver/net/test_http_server.h index d7ad228..bc820553 100644 --- a/chrome/test/chromedriver/net/test_http_server.h +++ b/chrome/test/chromedriver/net/test_http_server.h
@@ -11,7 +11,6 @@ #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/server/http_server.h" #include "url/gurl.h"
diff --git a/chrome/test/chromedriver/session_thread_map.h b/chrome/test/chromedriver/session_thread_map.h index 96b0e354..972b069d 100644 --- a/chrome/test/chromedriver/session_thread_map.h +++ b/chrome/test/chromedriver/session_thread_map.h
@@ -10,7 +10,6 @@ #include <string> #include "base/threading/thread.h" -#include "base/time/time.h" // Info related to session threads, one instance per session. This object should // only be accessed on the main thread.
diff --git a/chrome/test/chromedriver/util.py b/chrome/test/chromedriver/util.py index 9fd70df..1ceeb4a 100644 --- a/chrome/test/chromedriver/util.py +++ b/chrome/test/chromedriver/util.py
@@ -18,7 +18,6 @@ import sys import tempfile import time -import urllib import zipfile import requests @@ -192,30 +191,6 @@ return process.returncode -def DoesUrlExist(url): - """Determines whether a resource exists at the given URL. - - Args: - url: URL to be verified. - - Returns: - True if url exists, otherwise False. - """ - parsed = urllib.parse.urlparse(url) - try: - conn = http.client.HTTPConnection(parsed.netloc) - conn.request('HEAD', parsed.path) - response = conn.getresponse() - except http.client.HTTPException: - return False - finally: - conn.close() - # Follow both permanent (301) and temporary (302) redirects. - if response.status == 302 or response.status == 301: - return DoesUrlExist(response.getheader('location')) - return response.status == 200 - - def MarkBuildStepStart(name): print('@@@BUILD_STEP %s@@@' % name) sys.stdout.flush()
diff --git a/chrome/test/data/notifications/notification_permission_checker.html b/chrome/test/data/notifications/notification_permission_checker.html new file mode 100644 index 0000000..d11336e --- /dev/null +++ b/chrome/test/data/notifications/notification_permission_checker.html
@@ -0,0 +1,86 @@ +<html> +<script src="notification_test_utils.js"></script> +<script> + +function getNotificationPermission() { + sendResultToTest(Notification.permission); +} + +async function getServiceWorkerNotificationPermission() { + sendResultToTest( + await sendMessage('getServiceWorkerNotificationPermission')); +} + +async function queryNotificationPermission() { + let result = await navigator.permissions.query({name: 'notifications'}); + sendResultToTest(result.state); +} + +async function queryServiceWorkerNotificationPermission() { + sendResultToTest( + await sendMessage('queryServiceWorkerNotificationPermission')); +} + +async function getPushPermission() { + let sw = await getServiceWorkerRegistration(); + let result = await sw.pushManager.permissionState({userVisibleOnly:true}); + sendResultToTest(result); +} + +async function getServiceWorkerPushPermission() { + sendResultToTest(await sendMessage('getServiceWorkerPushPermission')); +} + +function requestNotificationPermission() { + Notification.requestPermission() + .then(permission => sendResultToTest(permission)) + .catch(() => sendResultToTest('error')); +} + +async function requestPushPermission() { + let sw = await getServiceWorkerRegistration(); + let options = { + userVisibleOnly: true, + applicationServerKey: btoa('0123456789').replaceAll('=', ''), + }; + sw.pushManager.subscribe(options) + .then(sub => sendResultToTest(sub.toJSON())) + .catch(e => sendResultToTest(e)); +} + +// Sends a message to the service worker and returns a promise that resolves +// to the worker's response. +async function sendMessage(message) { + let sw = await getServiceWorkerRegistration(); + sw.active.postMessage(message); + // Resolves to <result> after receiving response of '<message>:<result>'. + return new Promise(resolve => { + messagePort.addEventListener('message', event => { + if (event.data.startsWith(message + ':')) { + resolve(event.data.substr(message.length + 1)); + } + }); + }); +} + +function getServiceWorkerRegistration() { + return GetActivatedServiceWorker( + 'notification_permission_checker_worker.js', + location.pathname); +} + +// Sends a result back to the main test logic. +function sendResultToTest(result) { + // Convert the result to a string. + var stringResult = "" + result; + window.document.title = stringResult; + if (typeof stringResult != "string") + stringResult = JSON.stringify(result); + window.domAutomationController.send(stringResult); +} +</script> + +<body> +This page tests notification permissions in service workers. +</body> +</html>
diff --git a/chrome/test/data/notifications/notification_permission_checker.html.mock-http-headers b/chrome/test/data/notifications/notification_permission_checker.html.mock-http-headers new file mode 100644 index 0000000..f10f5c26 --- /dev/null +++ b/chrome/test/data/notifications/notification_permission_checker.html.mock-http-headers
@@ -0,0 +1,5 @@ +HTTP/1.1 200 OK +Content-Type: text/html +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +Cross-Origin-Resource-Policy: cross-origin
diff --git a/chrome/test/data/notifications/notification_permission_checker_worker.js b/chrome/test/data/notifications/notification_permission_checker_worker.js new file mode 100644 index 0000000..11ef863 --- /dev/null +++ b/chrome/test/data/notifications/notification_permission_checker_worker.js
@@ -0,0 +1,33 @@ +// Copyright 2022 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. + +// Service Worker to be used with the platform_notification_service.html page. +var messagePort = null; + +addEventListener('message', async event => { + if (event.data instanceof MessagePort) { + messagePort = event.data; + messagePort.postMessage('ready'); + } + + const message = event.data; + switch (message) { + case 'getServiceWorkerNotificationPermission': + messagePort.postMessage(message + ':' + Notification.permission); + break; + + case 'queryServiceWorkerNotificationPermission': { + let result = await navigator.permissions.query({name: 'notifications'}); + messagePort.postMessage(message + ':' + result.state); + break; + } + + case 'getServiceWorkerPushPermission': { + let pushManager = self.registration.pushManager; + let result = await pushManager.permissionState({userVisibleOnly:true}); + messagePort.postMessage(message + ':' + result); + break; + } + } +});
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 929ae915..a2ec833 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5627,6 +5627,32 @@ } ] }, + "GetDisplayMediaSetSelectAllScreensAllowedForUrls": { + "os": [ + "chromeos_ash", + "chromeos_lacros" + ], + "policy_pref_mapping_tests": [ + { + "policies": { + "GetDisplayMediaSetSelectAllScreensAllowedForUrls": [ + "[*.]google.com" + ] + }, + "prefs": { + "profile.managed_get_display_media_set_select_all_screens_allowed_for_urls": {} + } + }, + { + "policies": {}, + "prefs": { + "profile.managed_get_display_media_set_select_all_screens_allowed_for_urls": { + "default_value": [] + } + } + } + ] + }, "WebUsbAskForUrls": { "os": [ "win",
diff --git a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts index e1dccf6..c5bcbfb8 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/ambient_subpage_element_test.ts
@@ -46,7 +46,7 @@ async function displayMainSettings( topicSource: TopicSource|null, temperatureUnit: TemperatureUnit|null, - ambientModeEnabled: boolean, + ambientModeEnabled: boolean|null, animationTheme = AnimationTheme.kSlideshow): Promise<AmbientSubpage> { personalizationStore.data.ambient.albums = ambientProvider.albums; personalizationStore.data.ambient.animationTheme = animationTheme; @@ -63,7 +63,21 @@ test('displays content', async () => { ambientSubpageElement = await displayMainSettings( /*topicSource=*/ null, /*temperatureUnit=*/ null, - /*ambientModeEnabled=*/ false); + /*ambientModeEnabled=*/ null); + // Shows placeholder for ambient mode toggle row while loading ambient mode + // status. + const toggleRowPlaceholder = + ambientSubpageElement.shadowRoot!.querySelector( + '#toggleRowPlaceholder'); + assertTrue(!!toggleRowPlaceholder); + + personalizationStore.data.ambient.ambientModeEnabled = false; + personalizationStore.notifyObservers(); + await waitAfterNextRender(ambientSubpageElement); + + // Ambient mode is loaded, should not show toggle row placeholder. + assertTrue(!!toggleRowPlaceholder); + assertEquals(getComputedStyle(toggleRowPlaceholder).display, 'none'); const toggleRow = ambientSubpageElement.shadowRoot!.querySelector('toggle-row');
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts index 5fe5a0c..6f170dc 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts
@@ -5,7 +5,7 @@ import 'chrome://personalization/strings.m.js'; import 'chrome://webui-test/mojo_webui_test_support.js'; -import {fetchCollections, fetchGooglePhotosAlbum, fetchLocalData, getLocalImages, GooglePhotosAlbum, GooglePhotosEnablementState, GooglePhotosPhoto, initializeBackdropData, initializeGooglePhotosData, selectWallpaper} from 'chrome://personalization/trusted/personalization_app.js'; +import {cancelPreviewWallpaper, fetchCollections, fetchGooglePhotosAlbum, fetchLocalData, getLocalImages, GooglePhotosAlbum, GooglePhotosEnablementState, GooglePhotosPhoto, initializeBackdropData, initializeGooglePhotosData, selectWallpaper} from 'chrome://personalization/trusted/personalization_app.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; @@ -670,6 +670,12 @@ assertEquals(wallpaperProvider.images![0]!.assetId, assetId); await selectWallpaperPromise; + assertEquals( + 0, wallpaperProvider.getCallCount('makeTransparent'), + 'makeTransparent is not called when fullscreen preview is off'); + assertEquals( + 0, wallpaperProvider.getCallCount('makeOpaque'), + 'makeOpaque is not called when fullscreen preview is off'); assertFalse(personalizationStore.data.wallpaper.fullscreen); } @@ -680,6 +686,9 @@ // Now with flag turned on. loadTimeData.overrideValues({[fullscreenPreviewFeature]: true}); + assertEquals(0, wallpaperProvider.getCallCount('makeTransparent')); + assertEquals(0, wallpaperProvider.getCallCount('makeOpaque')); + const selectWallpaperPromise = selectWallpaper( wallpaperProvider.images![0]!, wallpaperProvider, personalizationStore); @@ -690,8 +699,16 @@ assertEquals(wallpaperProvider.images![0]!.assetId, assetId); await selectWallpaperPromise; + assertEquals( + 1, wallpaperProvider.getCallCount('makeTransparent'), + 'makeTransparent is called while calling selectWallpaper'); assertTrue(personalizationStore.data.wallpaper.fullscreen); + + await cancelPreviewWallpaper(wallpaperProvider); + assertEquals( + 1, wallpaperProvider.getCallCount('makeOpaque'), + 'makeOpaque is called while calling cancelPreviewWallpaper'); } }); });
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts index 011cada..0ed4e96 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -14,6 +14,7 @@ constructor() { super([ 'makeTransparent', + 'makeOpaque', 'fetchCollections', 'fetchImagesForCollection', 'fetchGooglePhotosAlbums', @@ -137,6 +138,10 @@ this.methodCalled('makeTransparent'); } + makeOpaque() { + this.methodCalled('makeOpaque'); + } + fetchCollections() { this.methodCalled('fetchCollections'); return Promise.resolve({collections: this.collections_});
diff --git a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts index 39d3253..0fcb049 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/wallpaper_collections_element_test.ts
@@ -5,9 +5,10 @@ import 'chrome://personalization/strings.m.js'; import 'chrome://webui-test/mojo_webui_test_support.js'; -import {emptyState, GooglePhotosPhoto, IFrameApi, kMaximumGooglePhotosPreviews, kMaximumLocalImagePreviews, WallpaperActionName, WallpaperCollections} from 'chrome://personalization/trusted/personalization_app.js'; +import {emptyState, GooglePhotosEnablementState, GooglePhotosPhoto, IFrameApi, kMaximumGooglePhotosPreviews, kMaximumLocalImagePreviews, PersonalizationRouter, WallpaperActionName, WallpaperCollections} from 'chrome://personalization/trusted/personalization_app.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertDeepEquals, assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; import {waitAfterNextRender} from 'chrome://webui-test/test_util.js'; import {baseSetup, initElement, setupTestIFrameApi, teardownElement} from './personalization_app_test_utils.js'; @@ -78,7 +79,7 @@ assertEquals( wallpaperCollectionsElement.$.collectionsGrid, target, - 'google photos count is sent to collections-grid'); + 'Google Photos count is sent to collections-grid'); assertDeepEquals( personalizationStore.data.wallpaper.googlePhotos.count, data); }); @@ -105,7 +106,7 @@ assertEquals( wallpaperCollectionsElement.$.collectionsGrid, target, - 'google photos urls are sent to collections-grid'); + 'Google Photos urls are sent to collections-grid'); assertDeepEquals( personalizationStore.data.wallpaper.googlePhotos.photos .slice(0, kMaximumGooglePhotosPreviews) @@ -113,6 +114,61 @@ data); }); + [GooglePhotosEnablementState.kDisabled, GooglePhotosEnablementState.kEnabled, + GooglePhotosEnablementState.kError] + .forEach( + enabled => test( + 'shows managed UI when Google Photos access is disabled', + async () => { + // Use production |IFrameApi|. + IFrameApi.setInstance(new IFrameApi()); + + // Initialize |wallpaperCollectionsElement|. + wallpaperCollectionsElement = initElement(WallpaperCollections); + await waitAfterNextRender(wallpaperCollectionsElement); + + // Set Google Photos enabled. + personalizationStore.data.wallpaper.googlePhotos.enabled = + enabled; + personalizationStore.notifyObservers(); + + // Set Google Photos count and photos. + personalizationStore.data.wallpaper.googlePhotos.count = null; + personalizationStore.data.wallpaper.googlePhotos.photos = null; + personalizationStore.notifyObservers(); + + // Cache |googlePhotosTile|. + await waitAfterNextRender(wallpaperCollectionsElement); + const googlePhotosTile = + wallpaperCollectionsElement.$.collectionsGrid.shadowRoot! + .querySelector('.google-photos-empty'); + assertNotEquals(googlePhotosTile, null); + + // Verify text expectations. + const text = googlePhotosTile!.querySelectorAll('p'); + assertEquals(text?.[0]?.innerHTML, 'Google Photos'); + assertEquals(text?.[1]?.innerHTML, 'No Images'); + + // Verify icon expectations. + const icon = googlePhotosTile!.querySelector('iron-icon'); + assertEquals(icon?.icon, 'personalization:managed'); + assertEquals( + getComputedStyle(icon!).getPropertyValue('display'), + enabled === GooglePhotosEnablementState.kDisabled ? + 'block' : + 'none'); + + // Mock singleton |PersonalizationRouter|. + const proxy = TestBrowserProxy.fromClass(PersonalizationRouter); + PersonalizationRouter.instance = () => proxy; + + // Verify click expectations. + (googlePhotosTile as HTMLElement).click(); + assertEquals( + proxy.getCallCount('goToRoute'), + enabled === GooglePhotosEnablementState.kDisabled ? 0 : 1); + })); + test('sends image counts when a collection loads', async () => { personalizationStore.data.wallpaper.backdrop = { collections: wallpaperProvider.collections,
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_browsertest.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_browsertest.js index 84370be..4a8306f4 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_browsertest.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_browsertest.js
@@ -30,15 +30,8 @@ ScanningAppBrowserTest.prototype = { __proto__: PolymerTest.prototype, - browsePreload: 'chrome://scanning/test_loader.html?module=chromeos/' + 'scanning/scanning_app_unified_test.js', - - featureList: { - enabled: [ - 'chromeos::features::kScanAppMultiPageScan', - ] - }, }; // List of names of suites in unified test to register for individual debugging.
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js index c5be3be1..5a656f0 100644 --- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js +++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -2446,10 +2446,6 @@ // Verify that the multi-page scanning checkbox is only visible when both // Flatbed and PDF scan settings are selected. test('showMultiPageCheckbox', () => { - if (!loadTimeData.getBoolean('scanAppMultiPageScanEnabled')) { - return; - } - return initializeScanningApp(expectedScanners, capabilities) .then(() => { return getScannerCapabilities();
diff --git a/chrome/test/data/webui/read_later/read_later_browsertest.js b/chrome/test/data/webui/read_later/read_later_browsertest.js index 3d0b58d..8124675 100644 --- a/chrome/test/data/webui/read_later/read_later_browsertest.js +++ b/chrome/test/data/webui/read_later/read_later_browsertest.js
@@ -13,11 +13,6 @@ get browsePreload() { throw new Error('this is abstract and should be overriden by subclasses'); } - - /** @override */ - get featureList() { - return {enabled: ['reading_list::switches::kReadLater']}; - } } // eslint-disable-next-line no-var
diff --git a/chrome/test/data/webui/read_later/side_panel/side_panel_browsertest.js b/chrome/test/data/webui/read_later/side_panel/side_panel_browsertest.js index eefe8d4..b27697ce 100644 --- a/chrome/test/data/webui/read_later/side_panel/side_panel_browsertest.js +++ b/chrome/test/data/webui/read_later/side_panel/side_panel_browsertest.js
@@ -8,7 +8,6 @@ GEN('#include "build/build_config.h"'); GEN('#include "chrome/browser/ui/ui_features.h"'); -GEN('#include "components/reading_list/features/reading_list_switches.h"'); GEN('#include "content/public/test/browser_test.h"'); /* eslint-disable no-var */ @@ -18,16 +17,6 @@ get browsePreload() { throw new Error('this is abstract and should be overriden by subclasses'); } - - /** @override */ - get featureList() { - return { - enabled: [ - 'features::kSidePanel', - 'reading_list::switches::kReadLater', - ] - }; - } } var SidePanelAppTest = class extends SidePanelBrowserTest {
diff --git a/chrome/test/data/webui/read_later/side_panel/side_panel_interactive_ui_tests.js b/chrome/test/data/webui/read_later/side_panel/side_panel_interactive_ui_tests.js index db20c89..7bd1900 100644 --- a/chrome/test/data/webui/read_later/side_panel/side_panel_interactive_ui_tests.js +++ b/chrome/test/data/webui/read_later/side_panel/side_panel_interactive_ui_tests.js
@@ -7,7 +7,6 @@ GEN_INCLUDE(['//chrome/test/data/webui/polymer_interactive_ui_test.js']); GEN('#include "chrome/browser/ui/ui_features.h"'); -GEN('#include "components/reading_list/features/reading_list_switches.h"'); GEN('#include "content/public/test/browser_test.h"'); // eslint-disable-next-line no-var @@ -17,16 +16,6 @@ get browsePreload() { return 'chrome://read-later.top-chrome/test_loader.html?module=read_later/side_panel/bookmarks_list_interactive_ui_test.js&host=webui-test'; } - - /** @override */ - get featureList() { - return { - enabled: [ - 'features::kSidePanel', - 'reading_list::switches::kReadLater', - ] - }; - } }; TEST_F('SidePanelBookmarksListInteractiveUITest', 'All', function() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js index a4ca9024..fab0f81 100644 --- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js
@@ -349,6 +349,13 @@ getChangeKeyboardSettings(), bluetoothDeviceDetailPage.shadowRoot.activeElement); + device1.deviceProperties.deviceType = mojom.DeviceType.kKeyboardMouseCombo; + bluetoothConfig.updatePairedDevice(device1); + + await flushAsync(); + assertTrue(!!getChangeMouseSettings()); + assertTrue(!!getChangeKeyboardSettings()); + // This is needed or other tests will fail. // TODO(gordonseto): Figure out how to remove this. getChangeKeyboardSettings().click();
diff --git a/chrome/test/data/webui/signin/signin_browsertest.js b/chrome/test/data/webui/signin/signin_browsertest.js index 302496d..23eb44fa8a 100644 --- a/chrome/test/data/webui/signin/signin_browsertest.js +++ b/chrome/test/data/webui/signin/signin_browsertest.js
@@ -14,6 +14,16 @@ GEN('#include "components/signin/public/base/signin_buildflags.h"'); GEN('#include "content/public/test/browser_test.h"'); +GEN('#if BUILDFLAG(IS_CHROMEOS_LACROS)'); +GEN('#include "components/signin/public/base/signin_switches.h"'); +GEN('#endif // BUILDFLAG(IS_CHROMEOS_LACROS)'); + +GEN('#if BUILDFLAG(IS_CHROMEOS_LACROS)'); +GEN('#define MAYBE_LACROS_NON_SYNCING_PROFILES switches::kLacrosNonSyncingProfiles'); +GEN('#else'); +GEN('#define MAYBE_LACROS_NON_SYNCING_PROFILES'); +GEN('#endif // BUILDFLAG(IS_CHROMEOS_LACROS)'); + /* eslint-disable no-var */ class SigninBrowserTest extends PolymerTest { @@ -21,6 +31,15 @@ get browsePreload() { throw new Error('this is abstract and should be overriden by subclasses'); } + + /** @override */ + get featureList() { + return { + enabled: [ + 'MAYBE_LACROS_NON_SYNCING_PROFILES', + ] + }; + } } /**
diff --git a/chrome/test/webapps/coverage/coverage_cros.tsv b/chrome/test/webapps/coverage/coverage_cros.tsv index a0abfda7..9f18c22 100644 --- a/chrome/test/webapps/coverage/coverage_cros.tsv +++ b/chrome/test/webapps/coverage/coverage_cros.tsv
@@ -12,59 +12,50 @@ install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_policy_app_windowed_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 check_window_created🌕 @@ -72,30 +63,6 @@ install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_windowed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -167,6 +134,254 @@ install_policy_app_tabbed_shortcut_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_tabbed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 @@ -191,6 +406,72 @@ install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct_SiteA🌑 @@ -251,200 +532,12 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_minimal🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌑 check_window_display_minimal🌑 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌑 close_pwa🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 -navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 -navigate_crashed_url🌑 check_install_icon_not_shown🌑 -navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 -navigate_notfound_url🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_menu_option_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 @@ -457,22 +550,60 @@ install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_platform_shortcut_SiteAFoo🌑 navigate_pwa_site_a_foo_to_SiteABar🌑 check_no_toolbar🌑 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 +switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_install_icon_not_shown🌑 +navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 +navigate_notfound_url🌕 check_install_icon_not_shown🌕 +navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 +navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -482,135 +613,3 @@ install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 check_app_in_list_windowed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_tabbed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_app_in_list_windowed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓
diff --git a/chrome/test/webapps/coverage/coverage_linux.tsv b/chrome/test/webapps/coverage/coverage_linux.tsv index 7654f21..c86e99f0 100644 --- a/chrome/test/webapps/coverage/coverage_linux.tsv +++ b/chrome/test/webapps/coverage/coverage_linux.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 57%, with partial coverage: 79% +# Full coverage: 63%, with partial coverage: 85% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -12,113 +12,121 @@ install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_policy_app_windowed_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_windowed_SiteC🌓 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_windowed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -190,6 +198,357 @@ install_policy_app_tabbed_shortcut_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_tabbed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_windowed_SiteC🌓 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 +sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_omnibox_icon_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_menu_option_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 @@ -214,6 +573,72 @@ install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct_SiteA🌑 @@ -274,220 +699,12 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 -navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 -navigate_crashed_url🌑 check_install_icon_not_shown🌑 -navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 -navigate_notfound_url🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_menu_option_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 @@ -500,22 +717,60 @@ install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_platform_shortcut_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 +switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_install_icon_not_shown🌑 +navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 +navigate_notfound_url🌕 check_install_icon_not_shown🌕 +navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 +navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -525,259 +780,3 @@ install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 check_app_in_list_windowed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_omnibox_icon_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_menu_option_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑
diff --git a/chrome/test/webapps/coverage/coverage_mac.tsv b/chrome/test/webapps/coverage/coverage_mac.tsv index a81e6ff..da06d4a 100644 --- a/chrome/test/webapps/coverage/coverage_mac.tsv +++ b/chrome/test/webapps/coverage/coverage_mac.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 52%, with partial coverage: 70% +# Full coverage: 58%, with partial coverage: 76% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -12,113 +12,121 @@ install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_policy_app_windowed_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_app_in_list_windowed_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 navigate_browser_SiteC🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 navigate_browser_SiteC🌑 check_launch_icon_shown🌑 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_platform_shortcut_and_icon_SiteC🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_windowed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -190,6 +198,357 @@ install_policy_app_tabbed_shortcut_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌕 install_create_shortcut_windowed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌕 install_create_shortcut_tabbed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_app_in_list_windowed_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 navigate_browser_SiteC🌑 check_install_icon_not_shown🌑 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 navigate_browser_SiteC🌑 check_launch_icon_shown🌑 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_platform_shortcut_and_icon_SiteC🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 +sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +sync_turn_off🌕 install_omnibox_icon_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +sync_turn_off🌕 install_menu_option_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 @@ -214,6 +573,72 @@ install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct_SiteA🌑 @@ -274,220 +699,12 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 -navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 -navigate_crashed_url🌑 check_install_icon_not_shown🌑 -navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 -navigate_notfound_url🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_menu_option_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 @@ -500,22 +717,60 @@ install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_platform_shortcut_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 +switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_install_icon_not_shown🌑 +navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 +navigate_notfound_url🌕 check_install_icon_not_shown🌕 +navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 +navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -525,259 +780,3 @@ install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 check_app_in_list_windowed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -sync_turn_off🌕 install_omnibox_icon_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -sync_turn_off🌕 install_menu_option_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌑 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑
diff --git a/chrome/test/webapps/coverage/coverage_win.tsv b/chrome/test/webapps/coverage/coverage_win.tsv index ea2c72f..278b46e 100644 --- a/chrome/test/webapps/coverage/coverage_win.tsv +++ b/chrome/test/webapps/coverage/coverage_win.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 58%, with partial coverage: 80% +# Full coverage: 64%, with partial coverage: 86% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -12,113 +12,121 @@ install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_user_cannot_set_run_on_os_login_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 disable_run_on_os_login_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 +navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_policy_app_windowed_shortcut_SiteA🌓 navigate_pwa_site_a_to_SiteB🌑 close_custom_toolbar🌑 check_app_navigation_is_start_url🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 close_custom_toolbar🌕 check_app_navigation_is_start_url🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 manifest_update_title_SiteA🌑 deny_app_update_dialog🌑 check_app_not_in_list_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 +navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_windowed_SiteC🌓 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_not_exists_SiteA🌑 install_policy_app_windowed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 install_policy_app_tabbed_no_shortcut_SiteC🌓 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -190,6 +198,357 @@ install_policy_app_tabbed_shortcut_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 install_create_shortcut_tabbed_SiteC🌕 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 +install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 +install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 +install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_list_empty🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_profile🌑 check_app_not_in_list_SiteA🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_omnibox_icon_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_menu_option_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_windowed_SiteC🌓 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 +install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 +sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_omnibox_icon_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_menu_option_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 @@ -214,6 +573,72 @@ install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 check_window_created🌕 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 check_window_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 +install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_color_correct_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_colors_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_color_correct_SiteA🌑 @@ -274,220 +699,12 @@ install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_minimal🌕 install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_display_minimal_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_tabbed_no_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_windowed_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_omnibox_icon_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_menu_option_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_launch_icon_SiteA🌕 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 -install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌓 check_window_display_standalone🌕 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_policy_app_windowed_shortcut_SiteA🌓 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_create_shortcut_tabbed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_tab_created🌕 -install_policy_app_tabbed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_omnibox_icon_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_no_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_policy_app_windowed_shortcut_SiteB🌓 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_menu_option_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_launch_icon_SiteB🌕 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_chrome_apps_SiteB🌓 check_window_display_minimal🌕 -install_menu_option_SiteB🌕 launch_from_platform_shortcut_SiteB🌓 check_window_display_minimal🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteC🌕 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_no_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_menu_option_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_launch_icon_SiteC🌕 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_chrome_apps_SiteC🌓 check_window_created🌕 -install_policy_app_windowed_shortcut_SiteC🌓 launch_from_platform_shortcut_SiteC🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_app_in_list_icon_correct_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_omnibox_icon_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 -install_menu_option_SiteA🌕 close_pwa🌕 manifest_update_icon_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_omnibox_icon_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 install_menu_option_SiteAFoo🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 close_pwa🌕 launch_from_platform_shortcut_SiteAFoo🌓 close_pwa🌕 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_windowed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 manifest_update_title_SiteA🌑 check_update_dialog_not_shown🌑 close_pwa🌑 launch_from_platform_shortcut_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteA🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 -navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 -switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 -navigate_browser_SiteC🌕 check_app_not_in_list_SiteA🌓 -navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 -navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 -navigate_browser_SiteC🌕 check_platform_shortcut_not_exists_SiteA🌑 -navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 -navigate_crashed_url🌑 check_install_icon_not_shown🌑 -navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 -navigate_notfound_url🌕 check_install_icon_not_shown🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_menu_option_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 @@ -500,22 +717,60 @@ install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_launch_icon_SiteAFoo🌕 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_chrome_apps_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 launch_from_platform_shortcut_SiteAFoo🌓 navigate_pwa_site_a_foo_to_SiteABar🌕 check_no_toolbar🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_custom_toolbar🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteABar🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteAFoo🌕 close_pwa🌕 manifest_update_scope_site_a_foo_to_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_create_shortcut_not_shown🌑 +switch_incognito_profile🌑 navigate_browser_SiteC🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_create_shortcut_not_shown🌑 +navigate_crashed_url🌑 check_install_icon_not_shown🌑 +navigate_notfound_url🌕 check_create_shortcut_not_shown🌑 +navigate_notfound_url🌕 check_install_icon_not_shown🌕 +navigate_browser_SiteA🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteAFoo🌕 check_install_icon_shown🌕 +navigate_browser_SiteC🌕 check_create_shortcut_shown🌑 +navigate_browser_SiteC🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteAFoo🌓 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteAFoo🌕 navigate_browser_SiteABar🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_install_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_no_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_policy_app_windowed_shortcut_SiteA🌓 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteAFoo🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_install_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_omnibox_icon_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 +install_menu_option_SiteA🌕 navigate_browser_SiteB🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 check_app_title_site_a_is_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_menu_option_SiteA🌕 navigate_pwa_site_a_to_SiteB🌕 open_in_chrome🌕 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 check_app_badge_has_value_SiteA🌑 -navigate_browser_SiteA🌕 set_app_badge_SiteA🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_omnibox_icon_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_menu_option_SiteA🌕 set_open_in_tab_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 @@ -525,259 +780,3 @@ install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 check_app_in_list_windowed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_omnibox_icon_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -install_menu_option_SiteA🌕 switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 -switch_incognito_profile🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_omnibox_icon_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_menu_option_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_menu_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_os_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 uninstall_from_app_settings_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_menu_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_os_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteC🌕 uninstall_from_app_settings_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_tabbed_SiteA🌕 uninstall_from_list_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_tabbed_SiteC🌕 uninstall_from_list_SiteC🌕 check_platform_shortcut_not_exists_SiteC🌑 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_tabbed_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_tabbed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_omnibox_icon_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_menu_option_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_policy_app_windowed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 uninstall_policy_app_SiteA🌕 check_platform_shortcut_not_exists_SiteA🌑 check_app_not_in_list_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_app_in_list_windowed_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_create_shortcut_windowed_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_omnibox_icon_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_policy_app_tabbed_no_shortcut_SiteA🌓 install_menu_option_SiteA🌕 uninstall_policy_app_SiteA🌕 check_platform_shortcut_and_icon_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_omnibox_icon_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_menu_option_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_chrome_apps_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 open_app_settings_from_app_window_SiteA🌑 check_browser_navigation_is_app_settings_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_blocked_SiteA🌑 check_user_cannot_set_run_on_os_login_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 apply_run_on_os_login_policy_blocked_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 apply_run_on_os_login_policy_run_windowed_SiteA🌑 remove_run_on_os_login_policy_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_windowed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌑 disable_run_on_os_login_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑
diff --git a/chrome/test/webapps/data/actions.tsv b/chrome/test/webapps/data/actions.tsv index a997548..daeb944 100644 --- a/chrome/test/webapps/data/actions.tsv +++ b/chrome/test/webapps/data/actions.tsv
@@ -1,110 +1,109 @@ -# Action base name Argument Types Output Actions Unique Identifier (next: 112) Deprecated Deprecated Deprecated Deprecated Status Argument Types Output Actions Description Metadata, implementation bug, etc -check_app_badge_empty Site 2 Awaiting Platform Integration Site Check that the 'badge' on the app icon is empty -check_app_badge_has_value Site 3 Awaiting Platform Integration Site Check that the 'badge' on the app icon has a value -clear_app_badge Site 4 Awaiting Platform Integration Site The WebApp clears the 'badge' value from it's icon -drag_url_to_apps_list 5 Awaiting Platform Integration Open chrome://apps in a separage window, and drag a url (highlight & drag url from the omnibox) to the chrome://apps page -set_app_badge Site 6 Awaiting Platform Integration Site Set the app badge for the given site to a value. -manifest_update_scope_site_a_foo_to Site 8 Awaiting Script Processing Site Update the scope of site a/foo/, to the given scope -navigate_pwa_site_a_foo_to Site 9 Awaiting Script Processing Site Navigates the PWA window of the SiteAFoo pwa to a given site. -accept_app_id_update_dialog 91 Implemented Click Accept in the App Identity Update dialog finnur@ -apply_run_on_os_login_policy_allowed Site 100 Implemented Site Apply WebAppSettings policy for run_on_os_login to be allowed phillis@ -apply_run_on_os_login_policy_blocked Site 101 Implemented Site Apply WebAppSettings policy for run_on_os_login to be blocked phillis@ -apply_run_on_os_login_policy_run_windowed Site 102 Implemented Site Apply WebAppSettings policy for run_on_os_login to be run_windowed phillis@ -check_app_icon_site_a_is Color 110 Implemented Color Check that the app icon color is correct finnur@ -check_app_in_list_tabbed Site 11 Implemented Site Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the app opens in a window by right clicking on it to see if the "open in window" option is checked, and by launching it to see if it opens in a separate window. -check_app_in_list_windowed Site 12 Implemented Site Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the app opens in a tab by right clicking on it to see if the "open in window" option is unchecked, and by launching it to see if it opens in a browser tab (and not a window). -check_app_list_empty 13 Implemented The app list is empty (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). -check_app_navigation_is_start_url 14 Implemented -check_app_not_in_list Site 15 Implemented Site Check that the given app is NOT in the app list. On desktop, this is chrome://apps, and on ChromeOS, this is the app drawer. -check_app_settings_app_state Site 108 Abandoned Site Check the app shown on app settings page matches the current app state. phillis@ -check_app_title_site_a_is Title 79 Implemented Title Check that the app title is correct finnur@ -check_browser_navigation_is_app_settings Site 109 Implemented Site Check the current browser naviagtion is chrome://app-settings/<app-id> phillis@ -check_custom_toolbar 16 Implemented Check that the PWA window has a custom toolbar to show the out-of-scope url. -check_install_icon_not_shown 17 Implemented Check that the "Install" icon in the omnibox is not shown -check_install_icon_shown 18 Implemented Check that the "Install" icon in the omnibox is shown -check_launch_icon_not_shown 19 Implemented -check_launch_icon_shown 20 Implemented -check_no_toolbar 21 Implemented -check_platform_shortcut_and_icon Site 7 Implemented Site The icon of the platform shortcut (on the desktop) is correct cliffordcheng@, doc -check_run_on_os_login_disabled Site 107 Implemented Site Check run on os login is disabled. phillis@ -check_run_on_os_login_enabled Site 106 Implemented Site Check run on os login is enabled. phillis@ -check_tab_created 22 Implemented A tab was created in a chrome browser window -check_tab_not_created 94 Implemented A tab was not created by the last state change action cliffordcheng@, P1 -check_user_cannot_set_run_on_os_login Site 111 Implemented Site Check user can't change the app's run_on_os_login state. -check_window_closed 23 Implemented The window was closed -check_window_created 24 Implemented A window was created. -check_window_display_minimal 25 Implemented Check that the window is a PWA window, and has minimal browser controls. -check_window_display_standalone 26 Implemented Check that the window is a PWA window, and has no browser controls. -close_custom_toolbar 27 Implemented Press the 'x' button on the custom toolbar that is towards the top of the WebApp window. -close_pwa 28 Implemented Close the WebApp window. -disable_run_on_os_login Site 105 Implemented Site Disable run on os login from app settings page phillis@ -enable_run_on_os_login Site 104 Implemented Site Enable run on os login from app settings page phillis@ -install_create_shortcut_tabbed Site 29 Implemented Site Install the given app using the"Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut), and de-selecting the "Open in a window" checkbox. -install_create_shortcut_windowed Site 30 Implemented Site Install the given app using the"Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut), and selecting the "Open in a window" checkbox. -install_locally Site 46 Implemented Site Find the app in the app list (chrome://apps) and install it by right-clicking on the app and selecting the 'install' option. Win/Mac/Linux only. -install_omnibox_icon InstallableSite 31 Implemented InstallableSite -install_policy_app_tabbed_no_shortcut Site 32 Implemented Site Add a force-installed enterprise policy app to the user profile (must be managed profile). tabbed, no platform shortcut -install_policy_app_windowed_no_shortcut Site 33 Implemented Site Add a force-installed enterprise policy app to the user profile (must be managed profile). windowed, no platform shortcut -launch_from_chrome_apps Site 34 Implemented Site Launch the web app by navigating to chrome://apps, and then clicking on the app icon. -launch_from_launch_icon Site 35 Implemented Site Launch the web app by navigating the browser to the web app, and selecting the launch icon in the omnibox (intent picker), -launch_from_menu_option Site 69 Implemented Site Launch the web app by navigating the browser to the web app, and selecting the "Launch _" menu option in the 3-dot menu. cliffordcheng@, P1 -launch_from_platform_shortcut Site 1 Implemented Site Lauch an app from a platform shortcut on the user's desktop or start menu. cliffordcheng@, P0 -manifest_update_display_browser Site 70 Implemented Site Updates the display property of the manifest to 'browser' on the given site's manifest cliffordcheng@, P1 -manifest_update_display_minimal Site 36 Implemented Site Updates the display property of the manifest to 'minimal' on the given site's manifest -manifest_update_icon Site 68 Implemented Site Updates the launcher icon in the manifest of the website. finnur@ -manifest_update_title Site 88 Implemented Site The website updates it's manifest.json to change the 'title' finnur@ -navigate_browser Site 37 Implemented Site Navigate the browser to one of the static sites provided by the testing framework. -navigate_notfound_url 38 Implemented Navigate to a url that returns a 404 server error. -navigate_pwa_site_a_to Site 39 Implemented Site Navigates the PWA window of the SiteA pwa to a given site. -open_app_settings_from_app_window Site 97 Implemented Site phillis@ -open_app_settings_from_chrome_apps Site 96 Implemented Site phillis@ -open_in_chrome 71 Implemented Click on the 'open in chrome' link in the 3-dot menu of the app window cliffordcheng@, P1 -remove_run_on_os_login_policy Site 103 Implemented Site Remove run_on_os_login policy for the app in WebAppSettings policy. phillis@ -set_open_in_tab Site 50 Implemented Site Uncheck the "open in window" checkbox in the right-click menu of the app icon, in the app list page -set_open_in_window Site 51 Implemented Site Check the "open in window" checkbox in the right-click menu of the app icon, in the app list page -switch_profile_clients ProfileClient 40 Implemented ProfileClient Switch to a different instance of chrome signed in to the same profile -sync_turn_off 41 Implemented Turn chrome sync off for "Apps": chrome://settings/syncSetup/advanced -sync_turn_on 42 Implemented Turn chrome sync on for "Apps": chrome://settings/syncSetup/advanced -uninstall_from_app_settings Site 98 Implemented Site uninstall an app from app settings page, the app has to be locally installed. phillis@ -uninstall_from_list Site 10 Implemented Site Uninstall the webapp from wherever apps are listed by chrome. On WML, this is from chrome://apps, and on ChromeOS, this is from the 'launcher' -uninstall_from_menu Site 43 Implemented Site Uninstall the webapp from the 3-dot menu in the webapp window -uninstall_policy_app Site 44 Implemented Site Remove a force-installed policy app to the user profile (must be managed profile) -check_app_in_list_not_locally_installed Site 45 Internal Impl Site Find the app in the app list (chrome://apps) and check that the given app is in the app list and is not installed. This means the icon is grey, and right clicking on it provides an 'install' option. Win/Mac/Linux only. -install_menu_option InstallableSite 47 Internal Impl InstallableSite -install_policy_app_tabbed_shortcut Site 48 Internal Impl Site Add a force-installed enterprise policy app to the user profile (must be managed profile). tabbed, with platform shortcut -install_policy_app_windowed_shortcut Site 49 Internal Impl Site Add a force-installed enterprise policy app to the user profile (must be managed profile). windowed, with platform shortcut -install Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 52 N/A (Parameterized Action) Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) -install_by_user Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) 53 N/A (Parameterized Action) Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) -install_by_user_tabbed Site install_create_shortcut_tabbed($1) 54 N/A (Parameterized Action) Site install_create_shortcut_tabbed($1) Install the web app configured to open in a tab. This is done by the selecting the Tools->"Create Shortcut..." menu option in the 3-dot menu, and deselecting the "open in a window" checkbox -install_by_user_windowed Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) 55 N/A (Parameterized Action) Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) Install the web app configured to open in a window. This is done in 3 different ways: 1) Clicking on the install icon in the omnibox, 2) Selecting the "Install _" menu option in the 3-dot menu, or 3) Selecting the Tools->"Create Shortcut..." menu option in the 3-dot menu and checking the "Open in a window" checkbox -install_no_shortcut Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 56 N/A (Parameterized Action) Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) -install_policy_app Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) 57 N/A (Parameterized Action) Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) -install_policy_app_no_shortcut Site install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_no_shortcut($1) 58 N/A (Parameterized Action) Site install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_no_shortcut($1) -install_policy_app_tabbed Site install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 59 N/A (Parameterized Action) Site install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) -install_policy_app_windowed Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) 60 N/A (Parameterized Action) Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) -install_tabbed Site install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 61 N/A (Parameterized Action) Site install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) All installation methods that result in a tabbed webapp. -install_windowed Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) 62 N/A (Parameterized Action) Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) All installation methods that result in a windowed webapp. -install_with_shortcut Site install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) & install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) 63 N/A (Parameterized Action) Site install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) & install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) -launch Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) 64 N/A (Parameterized Action) Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) -launch_from_browser Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) 65 N/A (Parameterized Action) Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) -launch_from_shortcut_or_list Site launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) 66 N/A (Parameterized Action) Site launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) All ways to launch an app that are still available for 'browser' apps. -open_app_settings Site open_app_settings_from_chrome_apps($1) & open_app_settings_from_app_window($1) 95 N/A (Parameterized Action) Site open_app_settings_from_chrome_apps($1) & open_app_settings_from_app_window($1) Launch chrome://app-settings/<app-id> page phillis@ -uninstall_by_user Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) & uninstall_from_app_settings($1) 67 N/A (Parameterized Action) Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) & uninstall_from_app_settings($1) -uninstall_not_locally_installed Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) 99 N/A (Parameterized Action) Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) Uninstall an app by user, the app can be not locally installed. -check_app_in_list_icon_correct Site 75 Not Yet Implemented Site Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the icon for the given app in the app list is correct. P2 (dmurph modified - should be easy to fetch icon using web request for chrome://app-icon/<app-id>/<dip> I believe) -check_theme_color Site 76 Not Yet Implemented Site Asserts that the theme color of the given app window is correct. P3 -check_window_color_correct Site 77 Not Yet Implemented Site The color of the window is correct. P3 -check_window_icon_correct 78 Not Yet Implemented P3 -create_shortcuts Site 72 Not Yet Implemented Site "create shortcuts" in chrome://apps P2 -delete_platform_shortcut Site 74 Not Yet Implemented Site Delete the shortcut that lives on the operating system P2 -delete_profile 83 Not Yet Implemented Delete the user profile. P4 -manifest_update_colors Site 80 Not Yet Implemented Site The website updates it's manifest.json to change the 'theme' color P3 -navigate_crashed_url 81 Not Yet Implemented Navigate to a page that crashes, or simulates a crashed renderer. chrome://crash P3 -navigate_link_target_blank 82 Not Yet Implemented Click on a href link on the current page, where the target of the link is "_blank" P3 -switch_incognito_profile 73 Not Yet Implemented Switch to using incognito mode P2 -check_create_shortcut_not_shown 85 WIP Check that the "Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut) is greyed out -check_create_shortcut_shown 86 WIP Check that the "Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut) is shown -check_platform_shortcut_not_exists Site 84 WIP Site The desktop platform shortcut has been removed. cliffordcheng@, doc -check_update_dialog_not_shown 92 WIP finnur@ -deny_app_update_dialog 93 WIP finnue@ -uninstall_from_os Site 87 WIP Site Uninstalls the app from OS integration - e.g. Windows Control Panel / Start menu \ No newline at end of file +# Action base name Argument Types Output Actions Unique Identifier (next: 112) Status Description Metadata, implementation bug, etc +check_app_badge_empty Site 2 Awaiting Platform Integration Check that the 'badge' on the app icon is empty +check_app_badge_has_value Site 3 Awaiting Platform Integration Check that the 'badge' on the app icon has a value +clear_app_badge Site 4 Awaiting Platform Integration The WebApp clears the 'badge' value from it's icon +drag_url_to_apps_list 5 Awaiting Platform Integration Open chrome://apps in a separage window, and drag a url (highlight & drag url from the omnibox) to the chrome://apps page +set_app_badge Site 6 Awaiting Platform Integration Set the app badge for the given site to a value. +manifest_update_scope_site_a_foo_to Site 8 Awaiting Script Processing Update the scope of site a/foo/, to the given scope +navigate_pwa_site_a_foo_to Site 9 Awaiting Script Processing Navigates the PWA window of the SiteAFoo pwa to a given site. +accept_app_id_update_dialog 91 Implemented Click Accept in the App Identity Update dialog finnur@ +apply_run_on_os_login_policy_allowed Site 100 Implemented Apply WebAppSettings policy for run_on_os_login to be allowed phillis@ +apply_run_on_os_login_policy_blocked Site 101 Implemented Apply WebAppSettings policy for run_on_os_login to be blocked phillis@ +apply_run_on_os_login_policy_run_windowed Site 102 Implemented Apply WebAppSettings policy for run_on_os_login to be run_windowed phillis@ +check_app_icon_site_a_is Color 110 Implemented Check that the app icon color is correct finnur@ +check_app_in_list_tabbed Site 11 Implemented Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the app opens in a window by right clicking on it to see if the "open in window" option is checked, and by launching it to see if it opens in a separate window. +check_app_in_list_windowed Site 12 Implemented Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the app opens in a tab by right clicking on it to see if the "open in window" option is unchecked, and by launching it to see if it opens in a browser tab (and not a window). +check_app_list_empty 13 Implemented The app list is empty (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). +check_app_navigation_is_start_url 14 Implemented +check_app_not_in_list Site 15 Implemented Check that the given app is NOT in the app list. On desktop, this is chrome://apps, and on ChromeOS, this is the app drawer. +check_app_title_site_a_is Title 79 Implemented Check that the app title is correct finnur@ +check_browser_navigation_is_app_settings Site 109 Implemented Check the current browser naviagtion is chrome://app-settings/<app-id> phillis@ +check_custom_toolbar 16 Implemented Check that the PWA window has a custom toolbar to show the out-of-scope url. +check_install_icon_not_shown 17 Implemented Check that the "Install" icon in the omnibox is not shown +check_install_icon_shown 18 Implemented Check that the "Install" icon in the omnibox is shown +check_launch_icon_not_shown 19 Implemented +check_launch_icon_shown 20 Implemented +check_no_toolbar 21 Implemented +check_platform_shortcut_and_icon Site 7 Implemented The icon of the platform shortcut (on the desktop) is correct cliffordcheng@, doc +check_run_on_os_login_disabled Site 107 Implemented Check run on os login is disabled. phillis@ +check_run_on_os_login_enabled Site 106 Implemented Check run on os login is enabled. phillis@ +check_tab_created 22 Implemented A tab was created in a chrome browser window +check_tab_not_created 94 Implemented A tab was not created by the last state change action cliffordcheng@, P1 +check_user_cannot_set_run_on_os_login Site 111 Implemented Check user can't change the app's run_on_os_login state. +check_window_closed 23 Implemented The window was closed +check_window_created 24 Implemented A window was created. +check_window_display_minimal 25 Implemented Check that the window is a PWA window, and has minimal browser controls. +check_window_display_standalone 26 Implemented Check that the window is a PWA window, and has no browser controls. +close_custom_toolbar 27 Implemented Press the 'x' button on the custom toolbar that is towards the top of the WebApp window. +close_pwa 28 Implemented Close the WebApp window. +disable_run_on_os_login Site 105 Implemented Disable run on os login from app settings page phillis@ +enable_run_on_os_login Site 104 Implemented Enable run on os login from app settings page phillis@ +install_create_shortcut_tabbed Site 29 Implemented Install the given app using the"Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut), and de-selecting the "Open in a window" checkbox. +install_create_shortcut_windowed Site 30 Implemented Install the given app using the"Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut), and selecting the "Open in a window" checkbox. +install_locally Site 46 Implemented Find the app in the app list (chrome://apps) and install it by right-clicking on the app and selecting the 'install' option. Win/Mac/Linux only. +install_omnibox_icon InstallableSite 31 Implemented +install_policy_app_tabbed_no_shortcut Site 32 Implemented Add a force-installed enterprise policy app to the user profile (must be managed profile). tabbed, no platform shortcut +install_policy_app_windowed_no_shortcut Site 33 Implemented Add a force-installed enterprise policy app to the user profile (must be managed profile). windowed, no platform shortcut +launch_from_chrome_apps Site 34 Implemented Launch the web app by navigating to chrome://apps, and then clicking on the app icon. +launch_from_launch_icon Site 35 Implemented Launch the web app by navigating the browser to the web app, and selecting the launch icon in the omnibox (intent picker), +launch_from_menu_option Site 69 Implemented Launch the web app by navigating the browser to the web app, and selecting the "Launch _" menu option in the 3-dot menu. cliffordcheng@, P1 +launch_from_platform_shortcut Site 1 Implemented Lauch an app from a platform shortcut on the user's desktop or start menu. cliffordcheng@, P0 +manifest_update_display_browser Site 70 Implemented Updates the display property of the manifest to 'browser' on the given site's manifest cliffordcheng@, P1 +manifest_update_display_minimal Site 36 Implemented Updates the display property of the manifest to 'minimal' on the given site's manifest +manifest_update_icon Site 68 Implemented Updates the launcher icon in the manifest of the website. finnur@ +manifest_update_title Site 88 Implemented The website updates it's manifest.json to change the 'title' finnur@ +navigate_browser Site 37 Implemented Navigate the browser to one of the static sites provided by the testing framework. +navigate_notfound_url 38 Implemented Navigate to a url that returns a 404 server error. +navigate_pwa_site_a_to Site 39 Implemented Navigates the PWA window of the SiteA pwa to a given site. +open_app_settings_from_app_menu Site 97 Implemented phillis@ +open_app_settings_from_chrome_apps Site 96 Implemented phillis@ +open_in_chrome 71 Implemented Click on the 'open in chrome' link in the 3-dot menu of the app window cliffordcheng@, P1 +remove_run_on_os_login_policy Site 103 Implemented Remove run_on_os_login policy for the app in WebAppSettings policy. phillis@ +set_open_in_tab Site 50 Implemented Uncheck the "open in window" checkbox in the right-click menu of the app icon, in the app list page +set_open_in_window Site 51 Implemented Check the "open in window" checkbox in the right-click menu of the app icon, in the app list page +switch_profile_clients ProfileClient 40 Implemented Switch to a different instance of chrome signed in to the same profile +sync_turn_off 41 Implemented Turn chrome sync off for "Apps": chrome://settings/syncSetup/advanced +sync_turn_on 42 Implemented Turn chrome sync on for "Apps": chrome://settings/syncSetup/advanced +uninstall_from_app_settings Site 98 Implemented uninstall an app from app settings page, the app has to be locally installed. phillis@ +uninstall_from_list Site 10 Implemented Uninstall the webapp from wherever apps are listed by chrome. On WML, this is from chrome://apps, and on ChromeOS, this is from the 'launcher' +uninstall_from_menu Site 43 Implemented Uninstall the webapp from the 3-dot menu in the webapp window +uninstall_policy_app Site 44 Implemented Remove a force-installed policy app to the user profile (must be managed profile) +check_app_in_list_not_locally_installed Site 45 Internal Impl Find the app in the app list (chrome://apps) and check that the given app is in the app list and is not installed. This means the icon is grey, and right clicking on it provides an 'install' option. Win/Mac/Linux only. +install_menu_option InstallableSite 47 Internal Impl +install_policy_app_tabbed_shortcut Site 48 Internal Impl Add a force-installed enterprise policy app to the user profile (must be managed profile). tabbed, with platform shortcut +install_policy_app_windowed_shortcut Site 49 Internal Impl Add a force-installed enterprise policy app to the user profile (must be managed profile). windowed, with platform shortcut +install Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 52 N/A (Parameterized Action) +install_by_user Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) 53 N/A (Parameterized Action) +install_by_user_tabbed Site install_create_shortcut_tabbed($1) 54 N/A (Parameterized Action) Install the web app configured to open in a tab. This is done by the selecting the Tools->"Create Shortcut..." menu option in the 3-dot menu, and deselecting the "open in a window" checkbox +install_by_user_windowed Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) 55 N/A (Parameterized Action) Install the web app configured to open in a window. This is done in 3 different ways: 1) Clicking on the install icon in the omnibox, 2) Selecting the "Install _" menu option in the 3-dot menu, or 3) Selecting the Tools->"Create Shortcut..." menu option in the 3-dot menu and checking the "Open in a window" checkbox +install_no_shortcut Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 56 N/A (Parameterized Action) +install_policy_app Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) 57 N/A (Parameterized Action) +install_policy_app_no_shortcut Site install_policy_app_tabbed_no_shortcut($1) & install_policy_app_windowed_no_shortcut($1) 58 N/A (Parameterized Action) +install_policy_app_tabbed Site install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 59 N/A (Parameterized Action) +install_policy_app_windowed Site install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) 60 N/A (Parameterized Action) +install_tabbed Site install_create_shortcut_tabbed($1) & install_policy_app_tabbed_shortcut($1) & install_policy_app_tabbed_no_shortcut($1) 61 N/A (Parameterized Action) All installation methods that result in a tabbed webapp. +install_windowed Site install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_policy_app_windowed_no_shortcut($1) & install_policy_app_windowed_shortcut($1) & install_menu_option($1) 62 N/A (Parameterized Action) All installation methods that result in a windowed webapp. +install_with_shortcut Site install_policy_app_windowed_shortcut($1) & install_policy_app_tabbed_shortcut($1) & install_create_shortcut_windowed($1) & install_omnibox_icon($1) & install_menu_option($1) & install_create_shortcut_tabbed($1) 63 N/A (Parameterized Action) +launch Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) 64 N/A (Parameterized Action) +launch_from_browser Site launch_from_menu_option($1) & launch_from_launch_icon($1) & launch_from_chrome_apps($1) 65 N/A (Parameterized Action) +launch_from_shortcut_or_list Site launch_from_chrome_apps($1) & launch_from_platform_shortcut($1) 66 N/A (Parameterized Action) All ways to launch an app that are still available for 'browser' apps. +open_app_settings Site open_app_settings_from_chrome_apps($1) & open_app_settings_from_app_menu($1) 95 N/A (Parameterized Action) Launch chrome://app-settings/<app-id> page phillis@ +uninstall_by_user Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) & uninstall_from_app_settings($1) 67 N/A (Parameterized Action) +uninstall_not_locally_installed Site uninstall_from_list($1) & uninstall_from_menu($1) & uninstall_from_os($1) 99 N/A (Parameterized Action) Uninstall an app by user, the app can be not locally installed. +check_app_in_list_icon_correct Site 75 Not Yet Implemented Find the app in the app list (on desktop, this is chrome://apps, and on ChromeOS, this is the app drawer). Check that the icon for the given app in the app list is correct. P2 (dmurph modified - should be easy to fetch icon using web request for chrome://app-icon/<app-id>/<dip> I believe) +check_theme_color Site 76 Not Yet Implemented Asserts that the theme color of the given app window is correct. P3 +check_window_color_correct Site 77 Not Yet Implemented The color of the window is correct. P3 +check_window_icon_correct 78 Not Yet Implemented P3 +create_shortcuts Site 72 Not Yet Implemented "create shortcuts" in chrome://apps P2 +delete_platform_shortcut Site 74 Not Yet Implemented Delete the shortcut that lives on the operating system P2 +delete_profile 83 Not Yet Implemented Delete the user profile. P4 +manifest_update_colors Site 80 Not Yet Implemented The website updates it's manifest.json to change the 'theme' color P3 +navigate_crashed_url 81 Not Yet Implemented Navigate to a page that crashes, or simulates a crashed renderer. chrome://crash P3 +navigate_link_target_blank 82 Not Yet Implemented Click on a href link on the current page, where the target of the link is "_blank" P3 +switch_incognito_profile 73 Not Yet Implemented Switch to using incognito mode P2 +check_create_shortcut_not_shown 85 WIP Check that the "Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut) is greyed out +check_create_shortcut_shown 86 WIP Check that the "Create Shortcut" menu option (3-dot->"More Tools"->"Create Shortcut) is shown +check_platform_shortcut_not_exists Site 84 WIP The desktop platform shortcut has been removed. cliffordcheng@, doc +check_update_dialog_not_shown 92 WIP finnur@ +deny_app_update_dialog 93 WIP finnue@ +uninstall_from_os Site 87 WIP Uninstalls the app from OS integration - e.g. Windows Control Panel / Start menu \ No newline at end of file
diff --git a/chrome/test/webapps/data/coverage_required.tsv b/chrome/test/webapps/data/coverage_required.tsv index 08c2055..6c4c2f4 100644 --- a/chrome/test/webapps/data/coverage_required.tsv +++ b/chrome/test/webapps/data/coverage_required.tsv
@@ -1,37 +1,35 @@ # Platforms Affected-by State Setup (for easy readability / categorization) - not parsed! Affected-by Edge Action/s 1 - not parsed! Affected-by Edge Action 2 - not parsed! Test (actually run by framework) -WMLC install_by_user_windowed accept_app_id_update_dialog check_app_title_site_a_is(SiteAUpdated) install_by_user_windowed(SiteA) manifest_update_title(SiteA) accept_app_id_update_dialog close_pwa launch(SiteA) check_app_title_site_a_is(SiteAUpdated) +# App Identity Updating tests +WMLC install_by_user_windowed, manifest_update_title(SiteA) accept_app_id_update_dialog check_app_title_site_a_is(SiteAUpdated) install_by_user_windowed(SiteA) manifest_update_title(SiteA) accept_app_id_update_dialog close_pwa launch(SiteA) check_app_title_site_a_is(SiteAUpdated) +WMLC install_by_user_windowed, manifest_update_title(SiteA) deny_app_update_dialog check_app_not_in_list install_by_user_windowed(SiteA) manifest_update_title(SiteA) deny_app_update_dialog check_app_not_in_list check_platform_shortcut_not_exists +WMLC install_by_user_windowed manifest_update_icon check_app_in_list_icon_correct install_by_user_windowed close_pwa manifest_update_icon check_app_in_list_icon_correct +WMLC install_by_user_windowed manifest_update_icon check_platform_shortcut_and_icon install_by_user_windowed close_pwa manifest_update_icon check_platform_shortcut_and_icon +WMLC install_policy_app manifest_update_title(SiteA) check_app_title_site_a_is(SiteAUpdated) install_policy_app(SiteA) manifest_update_title(SiteA) check_update_dialog_not_shown close_pwa launch(SiteA) check_app_title_site_a_is(SiteAUpdated) +# Run on OS Login +WML install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login +WML install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login +WML install & enable_run_on_os_login apply_run_on_os_login_policy_blocked check_run_on_os_login_disabled install enable_run_on_os_login apply_run_on_os_login_policy_blocked check_run_on_os_login_disabled +WML install apply_run_on_os_login_policy_run_windowed check_run_on_os_login_enabled install apply_run_on_os_login_policy_run_windowed check_run_on_os_login_enabled +WML install apply_run_on_os_login_policy_run_windowed check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_run_windowed check_user_cannot_set_run_on_os_login +WML install enable_run_on_os_login check_run_on_os_login_enabled install enable_run_on_os_login check_run_on_os_login_enabled +WML install & enable_run_on_os_login disable_run_on_os_login check_run_on_os_login_disabled install enable_run_on_os_login disable_run_on_os_login check_run_on_os_login_disabled +WML install & apply_run_on_os_login_policy_run_windowed remove_run_on_os_login_policy check_run_on_os_login_disabled install apply_run_on_os_login_policy_run_windowed remove_run_on_os_login_policy check_run_on_os_login_disabled +# Badging WMLC set_app_badge clear_app_badge check_app_badge_empty install_by_user_windowed set_app_badge clear_app_badge check_app_badge_empty +WMLC install_by_user_windowed set_app_badge check_app_badge_has_value install_by_user_windowed set_app_badge check_app_badge_has_value +WMLC set_app_badge check_platform_shortcut_not_exists navigate_browser(SiteA) set_app_badge check_platform_shortcut_not_exists +# Toolbar WMLC install_windowed & navigate_pwa_site_a_to(SiteB) close_custom_toolbar check_app_navigation_is_start_url install_windowed navigate_pwa_site_a_to(SiteB) close_custom_toolbar check_app_navigation_is_start_url -WMLC install_no_shortcut create_shortcuts check_platform_shortcut_and_icon install_no_shortcut create_shortcuts check_platform_shortcut_and_icon -WMLC install delete_profile check_app_list_empty install delete_profile check_app_list_empty -WMLC install delete_profile check_app_not_in_list install delete_profile check_app_not_in_list -WMLC install_with_shortcut delete_profile check_platform_shortcut_not_exists install_with_shortcut delete_profile check_platform_shortcut_not_exists -WMLC install_by_user_windowed deny_app_update_dialog check_app_not_in_list install_by_user_windowed(SiteA) manifest_update_title(SiteA) deny_app_update_dialog check_app_not_in_list check_platform_shortcut_not_exists -WMLC install_policy_app_tabbed install_by_user_windowed check_app_in_list_windowed install_policy_app_tabbed install_by_user_windowed check_app_in_list_windowed -WMLC install_policy_app_tabbed install_by_user_windowed check_platform_shortcut_and_icon install_policy_app_tabbed install_by_user_windowed check_platform_shortcut_and_icon -WMLC install_policy_app_tabbed install_by_user_windowed check_window_created install_policy_app_tabbed install_by_user_windowed check_window_created +WMLC install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_custom_toolbar install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_custom_toolbar +# Initial state sanity checks +WMLC navigate_browser(SiteA) check_app_not_in_list navigate_browser(SiteA) check_app_not_in_list +WMLC navigate_browser(SiteA) check_platform_shortcut_not_exists navigate_browser(SiteA) check_platform_shortcut_not_exists +WMLC navigate_browser(SiteC) check_app_not_in_list navigate_browser(SiteC) check_app_not_in_list +WMLC navigate_browser(SiteC) check_platform_shortcut_not_exists navigate_browser(SiteC) check_platform_shortcut_not_exists +# Installation WMLC install_by_user_windowed check_window_created install_by_user_windowed check_window_created -WML install_by_user & switch_profile_clients install_locally check_platform_shortcut_and_icon install_by_user switch_profile_clients install_locally check_platform_shortcut_and_icon -WML install_by_user_tabbed & switch_profile_clients install_locally check_app_in_list_tabbed install_by_user_tabbed switch_profile_clients install_locally check_app_in_list_tabbed -WML install_by_user_tabbed & switch_profile_clients install_locally check_install_icon_shown install_by_user_tabbed switch_profile_clients install_locally navigate_browser(SiteA) check_install_icon_shown -WML install_by_user_tabbed & switch_profile_clients install_locally check_launch_icon_not_shown install_by_user_tabbed switch_profile_clients install_locally navigate_browser(SiteA) check_launch_icon_not_shown -WML install_by_user_windowed & switch_profile_clients install_locally check_app_in_list_windowed install_by_user_windowed switch_profile_clients install_locally check_app_in_list_windowed -WML install_by_user_windowed & switch_profile_clients install_locally check_install_icon_not_shown install_by_user_windowed switch_profile_clients install_locally navigate_browser(SiteA) check_install_icon_not_shown -WML install_by_user_windowed & switch_profile_clients install_locally check_launch_icon_shown install_by_user_windowed switch_profile_clients install_locally navigate_browser(SiteA) check_launch_icon_shown -WML install_by_user_tabbed(SiteC) & switch_profile_clients install_locally(SiteC) check_app_in_list_tabbed(SiteC) install_by_user_tabbed(SiteC) switch_profile_clients install_locally(SiteC) check_app_in_list_tabbed(SiteC) -WML install_by_user_tabbed(SiteC) & switch_profile_clients install_locally(SiteC) check_launch_icon_not_shown install_by_user_tabbed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_launch_icon_not_shown -WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_app_in_list_windowed(SiteC) install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) check_app_in_list_windowed(SiteC) -WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_install_icon_not_shown install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_install_icon_not_shown -WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_launch_icon_shown install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_launch_icon_shown -WML install_by_user(SiteC) & switch_profile_clients install_locally(SiteC) check_platform_shortcut_and_icon(SiteC) install_by_user(SiteC) switch_profile_clients install_locally(SiteC) check_platform_shortcut_and_icon(SiteC) WMLC install_no_shortcut check_platform_shortcut_not_exists install_no_shortcut check_platform_shortcut_not_exists WMLC install_no_shortcut(SiteC) check_platform_shortcut_not_exists(SiteC) install_no_shortcut(SiteC) check_platform_shortcut_not_exists(SiteC) -WMLC install_by_user_tabbed install_policy_app_no_shortcut check_platform_shortcut_and_icon install_by_user_tabbed install_policy_app_windowed check_platform_shortcut_and_icon -WMLC install_by_user_windowed install_policy_app_no_shortcut check_platform_shortcut_and_icon install_by_user_windowed install_policy_app_no_shortcut check_platform_shortcut_and_icon -WMLC install_by_user_windowed install_policy_app_tabbed check_app_in_list_windowed install_by_user_windowed install_policy_app_tabbed check_app_in_list_windowed -WMLC install_by_user_windowed install_policy_app_tabbed check_launch_icon_shown install_by_user_windowed install_policy_app_tabbed navigate_browser(SiteA) check_launch_icon_shown -WMLC install_by_user_tabbed install_policy_app_windowed check_app_in_list_tabbed install_by_user_tabbed install_policy_app_windowed check_app_in_list_tabbed -WMLC install_by_user_tabbed install_policy_app_windowed check_install_icon_shown install_by_user_tabbed install_policy_app_windowed navigate_browser(SiteA) check_install_icon_shown WMLC install_tabbed check_app_in_list_tabbed install_tabbed check_app_in_list_tabbed WMLC install_tabbed check_create_shortcut_shown install_tabbed navigate_browser(SiteA) check_create_shortcut_shown WMLC install_tabbed check_install_icon_shown install_tabbed navigate_browser(SiteA) check_install_icon_shown @@ -51,69 +49,67 @@ WMLC install_windowed(SiteC) check_launch_icon_shown install_windowed(SiteC) navigate_browser(SiteC) check_launch_icon_shown WMLC install_with_shortcut check_platform_shortcut_and_icon install_with_shortcut check_platform_shortcut_and_icon WMLC install_with_shortcut(SiteC) check_platform_shortcut_and_icon(SiteC) install_with_shortcut(SiteC) check_platform_shortcut_and_icon(SiteC) -WMLC install_by_user_windowed & install_policy_app_tabbed launch check_window_created install_by_user_windowed install_policy_app_tabbed launch check_window_created -WMLC install_by_user_windowed & manifest_update_colors launch check_window_color_correct install_by_user_windowed close_pwa manifest_update_colors launch check_window_color_correct -WMLC install_by_user_windowed & manifest_update_display_browser launch check_tab_not_created install_by_user_windowed close_pwa manifest_update_display_browser launch check_tab_not_created -WMLC install_by_user_windowed & manifest_update_display_browser launch check_window_created install_by_user_windowed close_pwa manifest_update_display_browser launch check_window_created -WMLC install_by_user_windowed & manifest_update_display_browser launch check_window_display_minimal install_by_user_windowed close_pwa manifest_update_display_browser launch check_window_display_minimal -WMLC install_by_user_windowed & manifest_update_display_minimal launch check_window_display_minimal install_by_user_windowed close_pwa manifest_update_display_minimal launch check_window_display_minimal -WML install_by_user_windowed & switch_profile_clients & install_locally launch check_window_created install_by_user_windowed switch_profile_clients install_locally launch check_window_created -WMLC install_tabbed & set_open_in_window launch check_window_created install_tabbed set_open_in_window launch check_window_created +# Uninstallation +WML install_by_user_windowed uninstall_by_user check_app_not_in_list install_by_user_windowed uninstall_by_user check_app_not_in_list +WML install_by_user_windowed uninstall_by_user check_install_icon_shown install_by_user_windowed uninstall_by_user navigate_browser(SiteA) check_install_icon_shown +WML install_by_user_windowed uninstall_by_user check_launch_icon_not_shown install_by_user_windowed uninstall_by_user navigate_browser(SiteA) check_launch_icon_not_shown +WML install_by_user_windowed uninstall_by_user check_platform_shortcut_not_exists install_by_user_windowed uninstall_by_user check_platform_shortcut_not_exists +WML install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_app_not_in_list(SiteC) install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_app_not_in_list +WML install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_platform_shortcut_not_exists(SiteC) +WMLC install_by_user_tabbed uninstall_from_list check_app_not_in_list install_by_user_tabbed uninstall_from_list check_app_not_in_list +WMLC install_by_user_tabbed uninstall_from_list check_install_icon_shown install_by_user_tabbed uninstall_from_list navigate_browser(SiteA) check_install_icon_shown +WMLC install_by_user_tabbed uninstall_from_list check_launch_icon_not_shown install_by_user_tabbed uninstall_from_list navigate_browser(SiteA) check_launch_icon_not_shown +WMLC install_by_user_tabbed uninstall_from_list check_platform_shortcut_not_exists install_by_user_tabbed uninstall_from_list check_platform_shortcut_not_exists +C install_by_user_windowed uninstall_from_list check_app_not_in_list install_by_user_windowed uninstall_from_list check_app_not_in_list +C install_by_user_windowed uninstall_from_list check_install_icon_shown install_by_user_windowed uninstall_from_list navigate_browser(SiteA) check_install_icon_shown +C install_by_user_windowed uninstall_from_list check_launch_icon_not_shown install_by_user_windowed uninstall_from_list navigate_browser(SiteA) check_launch_icon_not_shown +C install_by_user_windowed uninstall_from_list check_platform_shortcut_not_exists install_by_user_windowed uninstall_from_list check_platform_shortcut_not_exists +WMLC install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list(SiteC) install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list +WMLC install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) +C install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list(SiteC) install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list +C install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) +WMLC install_policy_app uninstall_policy_app check_app_not_in_list install_policy_app uninstall_policy_app check_app_not_in_list +WMLC install_policy_app uninstall_policy_app check_install_icon_shown install_policy_app_tabbed_shortcut uninstall_policy_app navigate_browser(SiteA) check_install_icon_shown +WMLC install_policy_app uninstall_policy_app check_launch_icon_not_shown install_policy_app_tabbed_shortcut uninstall_policy_app navigate_browser(SiteA) check_launch_icon_not_shown +WMLC install_policy_app uninstall_policy_app check_platform_shortcut_not_exists install_policy_app uninstall_policy_app check_platform_shortcut_not_exists check_app_not_in_list +# Launch behavior tests WMLC install_windowed launch check_window_created install_windowed launch check_window_created WMLC install_windowed launch check_window_display_standalone install_windowed launch check_window_display_standalone -WMLC install_tabbed & delete_platform_shortcut & create_shortcuts launch_from_platform_shortcut check_tab_created install_tabbed delete_platform_shortcut create_shortcuts launch_from_platform_shortcut check_tab_created -WMLC install_windowed & delete_platform_shortcut & create_shortcuts launch_from_platform_shortcut check_window_created install_windowed delete_platform_shortcut create_shortcuts launch_from_platform_shortcut check_window_created -WMLC install_by_user_tabbed & install_policy_app_windowed launch_from_shortcut_or_list check_tab_created install_by_user_tabbed install_policy_app_windowed launch_from_shortcut_or_list check_tab_created -WMLC install_by_user_tabbed & switch_profile_clients launch_from_shortcut_or_list check_tab_created install_by_user_tabbed switch_profile_clients launch_from_shortcut_or_list check_tab_created -WML install_by_user_tabbed & switch_profile_clients & install_locally launch_from_shortcut_or_list check_tab_created install_by_user_tabbed switch_profile_clients install_locally launch_from_shortcut_or_list check_tab_created -WML install_by_user_windowed & switch_profile_clients launch_from_shortcut_or_list check_tab_created install_by_user_windowed switch_profile_clients launch_from_shortcut_or_list check_tab_created +WMLC install_tabbed & set_open_in_window launch check_window_created install_tabbed set_open_in_window launch check_window_created WMLC install_windowed & set_open_in_tab launch_from_shortcut_or_list check_tab_created install_windowed set_open_in_tab launch_from_shortcut_or_list check_tab_created WMLC install_tabbed(SiteC) launch_from_shortcut_or_list(SiteC) check_tab_created install_tabbed(SiteC) launch_from_shortcut_or_list(SiteC) check_tab_created WMLC install_windowed(SiteB) launch(SiteB) check_window_display_minimal install_windowed(SiteB) launch(SiteB) check_window_display_minimal WMLC install_windowed(SiteC) launch(SiteC) check_window_created install_windowed(SiteC) launch(SiteC) check_window_created -WMLC install_by_user_windowed manifest_update_icon check_app_in_list_icon_correct install_by_user_windowed close_pwa manifest_update_icon check_app_in_list_icon_correct -WMLC install_by_user_windowed manifest_update_icon check_platform_shortcut_and_icon install_by_user_windowed close_pwa manifest_update_icon check_platform_shortcut_and_icon -WMLC install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) close_pwa launch_from_platform_shortcut(SiteAFoo) close_pwa navigate_browser(SiteA) check_install_icon_not_shown -WMLC install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) check_launch_icon_shown install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) close_pwa launch_from_platform_shortcut(SiteAFoo) close_pwa navigate_browser(SiteA) check_launch_icon_shown -WMLC install_policy_app manifest_update_title(SiteA) check_app_title_site_a_is(SiteAUpdated) install_policy_app(SiteA) manifest_update_title(SiteA) check_update_dialog_not_shown close_pwa launch(SiteA) check_app_title_site_a_is(SiteAUpdated) -WMLC switch_incognito_profile navigate_browser(SiteA) check_create_shortcut_not_shown switch_incognito_profile navigate_browser(SiteA) check_create_shortcut_not_shown -WMLC navigate_browser(SiteA) check_app_not_in_list navigate_browser(SiteA) check_app_not_in_list -WMLC navigate_browser(SiteA) check_create_shortcut_shown navigate_browser(SiteA) check_create_shortcut_shown -WMLC navigate_browser(SiteA) check_platform_shortcut_not_exists navigate_browser(SiteA) check_platform_shortcut_not_exists -WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_install_icon_not_shown -WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_launch_icon_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_launch_icon_shown -WMLC install_windowed(SiteAFoo) navigate_browser(SiteABar) check_install_icon_shown install_windowed(SiteAFoo) navigate_browser(SiteABar) check_install_icon_shown -WMLC install_windowed(SiteAFoo) navigate_browser(SiteABar) check_launch_icon_not_shown install_windowed(SiteAFoo) navigate_browser(SiteABar) check_launch_icon_not_shown -WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_install_icon_not_shown -WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_launch_icon_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_launch_icon_shown -WMLC install_windowed navigate_browser(SiteAFoo) check_install_icon_not_shown install_windowed navigate_browser(SiteAFoo) check_install_icon_not_shown -WMLC install_windowed navigate_browser(SiteAFoo) check_launch_icon_shown install_windowed navigate_browser(SiteAFoo) check_launch_icon_shown -WMLC navigate_browser(SiteAFoo) check_install_icon_shown navigate_browser(SiteAFoo) check_install_icon_shown -WMLC install_by_user_windowed navigate_browser(SiteB) check_install_icon_shown install_by_user_windowed navigate_browser(SiteB) check_install_icon_shown -WMLC install_by_user_windowed navigate_browser(SiteB) check_launch_icon_not_shown install_by_user_windowed navigate_browser(SiteB) check_launch_icon_not_shown -WMLC switch_incognito_profile navigate_browser(SiteC) check_create_shortcut_not_shown switch_incognito_profile navigate_browser(SiteC) check_create_shortcut_not_shown -WMLC navigate_browser(SiteC) check_app_not_in_list navigate_browser(SiteC) check_app_not_in_list -WMLC navigate_browser(SiteC) check_create_shortcut_shown navigate_browser(SiteC) check_create_shortcut_shown -WMLC navigate_browser(SiteC) check_install_icon_not_shown navigate_browser(SiteC) check_install_icon_not_shown -WMLC navigate_browser(SiteC) check_platform_shortcut_not_exists navigate_browser(SiteC) check_platform_shortcut_not_exists -WMLC navigate_crashed_url check_create_shortcut_not_shown navigate_crashed_url check_create_shortcut_not_shown -WMLC navigate_crashed_url check_install_icon_not_shown navigate_crashed_url check_install_icon_not_shown -WMLC navigate_notfound_url check_create_shortcut_not_shown navigate_notfound_url check_create_shortcut_not_shown -WMLC navigate_notfound_url check_install_icon_not_shown navigate_notfound_url check_install_icon_not_shown -WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_pwa_site_a_foo_to(SiteABar) check_no_toolbar install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) launch(SiteAFoo) navigate_pwa_site_a_foo_to(SiteABar) check_no_toolbar -WMLC install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_custom_toolbar install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_custom_toolbar -WMLC install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_app_title_site_a_is(SiteA) install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_app_title_site_a_is(SiteA) +# Misc UX Flows +WMLC install_no_shortcut create_shortcuts check_platform_shortcut_and_icon install_no_shortcut create_shortcuts check_platform_shortcut_and_icon +WMLC install delete_profile check_app_list_empty install delete_profile check_app_list_empty +WMLC install delete_profile check_app_not_in_list install delete_profile check_app_not_in_list +WMLC install_with_shortcut delete_profile check_platform_shortcut_not_exists install_with_shortcut delete_profile check_platform_shortcut_not_exists +WMLC install_tabbed & delete_platform_shortcut & create_shortcuts launch_from_platform_shortcut check_tab_created install_tabbed delete_platform_shortcut create_shortcuts launch_from_platform_shortcut check_tab_created +WMLC install_windowed & delete_platform_shortcut & create_shortcuts launch_from_platform_shortcut check_window_created install_windowed delete_platform_shortcut create_shortcuts launch_from_platform_shortcut check_window_created WMLC install_by_user_windowed open_in_chrome check_tab_created install_by_user_windowed open_in_chrome check_tab_created WMLC install_by_user_windowed & navigate_pwa_site_a_to(SiteB) open_in_chrome check_tab_created install_by_user_windowed navigate_pwa_site_a_to(SiteB) open_in_chrome check_tab_created -WMLC install_by_user_windowed set_app_badge check_app_badge_has_value install_by_user_windowed set_app_badge check_app_badge_has_value -WMLC set_app_badge check_platform_shortcut_not_exists navigate_browser(SiteA) set_app_badge check_platform_shortcut_not_exists -WMLC install_by_user_windowed set_open_in_tab check_app_in_list_tabbed install_by_user_windowed set_open_in_tab check_app_in_list_tabbed -WMLC install_by_user_windowed set_open_in_tab check_install_icon_shown install_by_user_windowed set_open_in_tab navigate_browser(SiteA) check_install_icon_shown -WMLC install_by_user_tabbed set_open_in_window check_app_in_list_windowed install_by_user_tabbed set_open_in_window check_app_in_list_windowed -WMLC install_by_user_tabbed set_open_in_window check_install_icon_not_shown install_by_user_tabbed set_open_in_window navigate_browser(SiteA) check_install_icon_not_shown -WMLC install_by_user_tabbed set_open_in_window check_launch_icon_shown install_by_user_tabbed set_open_in_window navigate_browser(SiteA) check_launch_icon_shown -WMLC install_by_user_windowed switch_incognito_profile check_launch_icon_not_shown install_by_user_windowed switch_incognito_profile navigate_browser(SiteA) check_launch_icon_not_shown -WMLC switch_incognito_profile check_install_icon_not_shown switch_incognito_profile navigate_browser(SiteA) check_install_icon_not_shown +WML install open_app_settings check_browser_navigation_is_app_settings install open_app_settings check_browser_navigation_is_app_settings +# Sync-initiated install tests +WML install_by_user & switch_profile_clients install_locally check_platform_shortcut_and_icon install_by_user switch_profile_clients install_locally check_platform_shortcut_and_icon +WML install_by_user_tabbed & switch_profile_clients install_locally check_app_in_list_tabbed install_by_user_tabbed switch_profile_clients install_locally check_app_in_list_tabbed +WML install_by_user_tabbed & switch_profile_clients install_locally check_install_icon_shown install_by_user_tabbed switch_profile_clients install_locally navigate_browser(SiteA) check_install_icon_shown +WML install_by_user_tabbed & switch_profile_clients install_locally check_launch_icon_not_shown install_by_user_tabbed switch_profile_clients install_locally navigate_browser(SiteA) check_launch_icon_not_shown +WML install_by_user_windowed & switch_profile_clients install_locally check_app_in_list_windowed install_by_user_windowed switch_profile_clients install_locally check_app_in_list_windowed +WML install_by_user_windowed & switch_profile_clients install_locally check_install_icon_not_shown install_by_user_windowed switch_profile_clients install_locally navigate_browser(SiteA) check_install_icon_not_shown +WML install_by_user_windowed & switch_profile_clients install_locally check_launch_icon_shown install_by_user_windowed switch_profile_clients install_locally navigate_browser(SiteA) check_launch_icon_shown +WML install_by_user_tabbed(SiteC) & switch_profile_clients install_locally(SiteC) check_app_in_list_tabbed(SiteC) install_by_user_tabbed(SiteC) switch_profile_clients install_locally(SiteC) check_app_in_list_tabbed(SiteC) +WML install_by_user_tabbed(SiteC) & switch_profile_clients install_locally(SiteC) check_launch_icon_not_shown install_by_user_tabbed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_launch_icon_not_shown +WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_app_in_list_windowed(SiteC) install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) check_app_in_list_windowed(SiteC) +WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_install_icon_not_shown install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_install_icon_not_shown +WML install_by_user_windowed(SiteC) & switch_profile_clients install_locally(SiteC) check_launch_icon_shown install_by_user_windowed(SiteC) switch_profile_clients install_locally(SiteC) navigate_browser(SiteC) check_launch_icon_shown +WML install_by_user(SiteC) & switch_profile_clients install_locally(SiteC) check_platform_shortcut_and_icon(SiteC) install_by_user(SiteC) switch_profile_clients install_locally(SiteC) check_platform_shortcut_and_icon(SiteC) +WML install_by_user_windowed & switch_profile_clients & install_locally launch check_window_created install_by_user_windowed switch_profile_clients install_locally launch check_window_created +WMLC install_by_user_tabbed & switch_profile_clients launch_from_shortcut_or_list check_tab_created install_by_user_tabbed switch_profile_clients launch_from_shortcut_or_list check_tab_created +WML install_by_user_tabbed & switch_profile_clients & install_locally launch_from_shortcut_or_list check_tab_created install_by_user_tabbed switch_profile_clients install_locally launch_from_shortcut_or_list check_tab_created +WML install_by_user_windowed & switch_profile_clients launch_from_shortcut_or_list check_tab_created install_by_user_windowed switch_profile_clients launch_from_shortcut_or_list check_tab_created +WMLC install_by_user & switch_profile_clients uninstall_from_list check_app_not_in_list install_by_user switch_profile_clients uninstall_from_list check_app_not_in_list +WMLC install_by_user & switch_profile_clients & uninstall_from_list & switch_profile_clients(Client1) uninstall_from_list check_app_not_in_list install_by_user switch_profile_clients uninstall_from_list switch_profile_clients(Client1) check_app_not_in_list WML install_by_user switch_profile_clients check_app_in_list_not_locally_installed install_by_user switch_profile_clients check_app_in_list_not_locally_installed C install_by_user switch_profile_clients check_platform_shortcut_and_icon(SiteA) install_by_user switch_profile_clients check_platform_shortcut_and_icon(SiteA) WML install_by_user switch_profile_clients check_platform_shortcut_not_exists(SiteA) install_by_user switch_profile_clients check_platform_shortcut_not_exists @@ -133,42 +129,60 @@ C install_by_user_tabbed & switch_profile_clients & sync_turn_off & uninstall_by_user sync_turn_on check_platform_shortcut_and_icon install_by_user_tabbed switch_profile_clients(Client2) sync_turn_off uninstall_by_user sync_turn_on check_platform_shortcut_and_icon C install_by_user_windowed & switch_profile_clients & sync_turn_off & uninstall_by_user sync_turn_on check_app_in_list_windowed install_by_user_windowed switch_profile_clients(Client2) sync_turn_off uninstall_by_user sync_turn_on check_app_in_list_windowed C install_by_user_windowed & switch_profile_clients & sync_turn_off & uninstall_by_user sync_turn_on check_platform_shortcut_and_icon install_by_user_windowed switch_profile_clients(Client2) sync_turn_off uninstall_by_user sync_turn_on check_platform_shortcut_and_icon -WML install_by_user_windowed uninstall_by_user check_app_not_in_list install_by_user_windowed uninstall_by_user check_app_not_in_list -WML install_by_user_windowed uninstall_by_user check_install_icon_shown install_by_user_windowed uninstall_by_user navigate_browser(SiteA) check_install_icon_shown -WML install_by_user_windowed uninstall_by_user check_launch_icon_not_shown install_by_user_windowed uninstall_by_user navigate_browser(SiteA) check_launch_icon_not_shown -WML install_by_user_windowed uninstall_by_user check_platform_shortcut_not_exists install_by_user_windowed uninstall_by_user check_platform_shortcut_not_exists -WML install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_app_not_in_list(SiteC) install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_app_not_in_list -WML install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_windowed(SiteC) uninstall_by_user(SiteC) check_platform_shortcut_not_exists(SiteC) -WMLC install_by_user & switch_profile_clients uninstall_from_list check_app_not_in_list install_by_user switch_profile_clients uninstall_from_list check_app_not_in_list -WMLC install_by_user & switch_profile_clients & uninstall_from_list & switch_profile_clients(Client1) uninstall_from_list check_app_not_in_list install_by_user switch_profile_clients uninstall_from_list switch_profile_clients(Client1) check_app_not_in_list -WMLC install_by_user_tabbed uninstall_from_list check_app_not_in_list install_by_user_tabbed uninstall_from_list check_app_not_in_list -WMLC install_by_user_tabbed uninstall_from_list check_install_icon_shown install_by_user_tabbed uninstall_from_list navigate_browser(SiteA) check_install_icon_shown -WMLC install_by_user_tabbed uninstall_from_list check_launch_icon_not_shown install_by_user_tabbed uninstall_from_list navigate_browser(SiteA) check_launch_icon_not_shown -WMLC install_by_user_tabbed uninstall_from_list check_platform_shortcut_not_exists install_by_user_tabbed uninstall_from_list check_platform_shortcut_not_exists -C install_by_user_windowed uninstall_from_list check_app_not_in_list install_by_user_windowed uninstall_from_list check_app_not_in_list -C install_by_user_windowed uninstall_from_list check_install_icon_shown install_by_user_windowed uninstall_from_list navigate_browser(SiteA) check_install_icon_shown -C install_by_user_windowed uninstall_from_list check_launch_icon_not_shown install_by_user_windowed uninstall_from_list navigate_browser(SiteA) check_launch_icon_not_shown -C install_by_user_windowed uninstall_from_list check_platform_shortcut_not_exists install_by_user_windowed uninstall_from_list check_platform_shortcut_not_exists -WMLC install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list(SiteC) install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list -WMLC install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_tabbed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) -C install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list(SiteC) install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_app_not_in_list -C install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) install_by_user_windowed(SiteC) uninstall_from_list(SiteC) check_platform_shortcut_not_exists(SiteC) +# Policy installation and user installation interactions +WMLC install_by_user_tabbed install_policy_app_no_shortcut check_platform_shortcut_and_icon install_by_user_tabbed install_policy_app_windowed check_platform_shortcut_and_icon +WMLC install_by_user_windowed install_policy_app_no_shortcut check_platform_shortcut_and_icon install_by_user_windowed install_policy_app_no_shortcut check_platform_shortcut_and_icon +WMLC install_by_user_windowed install_policy_app_tabbed check_app_in_list_windowed install_by_user_windowed install_policy_app_tabbed check_app_in_list_windowed +WMLC install_by_user_windowed install_policy_app_tabbed check_launch_icon_shown install_by_user_windowed install_policy_app_tabbed navigate_browser(SiteA) check_launch_icon_shown +WMLC install_by_user_tabbed install_policy_app_windowed check_app_in_list_tabbed install_by_user_tabbed install_policy_app_windowed check_app_in_list_tabbed +WMLC install_by_user_tabbed install_policy_app_windowed check_install_icon_shown install_by_user_tabbed install_policy_app_windowed navigate_browser(SiteA) check_install_icon_shown +WMLC install_by_user_windowed & install_policy_app_tabbed launch check_window_created install_by_user_windowed install_policy_app_tabbed launch check_window_created +WMLC install_policy_app_tabbed install_by_user_windowed check_app_in_list_windowed install_policy_app_tabbed install_by_user_windowed check_app_in_list_windowed +WMLC install_policy_app_tabbed install_by_user_windowed check_platform_shortcut_and_icon install_policy_app_tabbed install_by_user_windowed check_platform_shortcut_and_icon +WMLC install_policy_app_tabbed install_by_user_windowed check_window_created install_policy_app_tabbed install_by_user_windowed check_window_created +WMLC install_by_user_tabbed & install_policy_app_windowed launch_from_shortcut_or_list check_tab_created install_by_user_tabbed install_policy_app_windowed launch_from_shortcut_or_list check_tab_created WMLC install_by_user_tabbed & install_policy_app uninstall_policy_app check_app_in_list_tabbed install_by_user_tabbed install_policy_app uninstall_policy_app check_app_in_list_tabbed WMLC install_by_user_tabbed & install_policy_app uninstall_policy_app check_platform_shortcut_and_icon install_by_user_tabbed install_policy_app uninstall_policy_app check_platform_shortcut_and_icon WMLC install_by_user_windowed & install_policy_app uninstall_policy_app check_app_in_list_windowed install_by_user_windowed install_policy_app uninstall_policy_app check_app_in_list_windowed WMLC install_by_user_windowed & install_policy_app uninstall_policy_app check_platform_shortcut_and_icon install_by_user_windowed install_policy_app uninstall_policy_app check_platform_shortcut_and_icon -WMLC install_policy_app uninstall_policy_app check_app_not_in_list install_policy_app uninstall_policy_app check_app_not_in_list -WMLC install_policy_app uninstall_policy_app check_install_icon_shown install_policy_app_tabbed_shortcut uninstall_policy_app navigate_browser(SiteA) check_install_icon_shown -WMLC install_policy_app uninstall_policy_app check_launch_icon_not_shown install_policy_app_tabbed_shortcut uninstall_policy_app navigate_browser(SiteA) check_launch_icon_not_shown -WMLC install_policy_app uninstall_policy_app check_platform_shortcut_not_exists install_policy_app uninstall_policy_app check_platform_shortcut_not_exists check_app_not_in_list WMLC install_policy_app_tabbed & install_by_user_windowed uninstall_policy_app check_app_in_list_windowed install_policy_app_tabbed install_by_user_windowed uninstall_policy_app check_app_in_list_windowed WMLC install_policy_app_tabbed & install_by_user_windowed uninstall_policy_app check_platform_shortcut_and_icon install_policy_app_tabbed install_by_user_windowed uninstall_policy_app check_platform_shortcut_and_icon -WML install open_app_settings check_browser_navigation_is_app_settings install open_app_settings check_browser_navigation_is_app_settings -WML install enable_run_on_os_login check_run_on_os_login_enabled install enable_run_on_os_login check_run_on_os_login_enabled -WML install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login -WML install apply_run_on_os_login_policy_run_windowed check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_run_windowed check_user_cannot_set_run_on_os_login -WML install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login install apply_run_on_os_login_policy_blocked check_user_cannot_set_run_on_os_login -WML install apply_run_on_os_login_policy_run_windowed check_run_on_os_login_enabled install apply_run_on_os_login_policy_run_windowed check_run_on_os_login_enabled -WML install & enable_run_on_os_login apply_run_on_os_login_policy_blocked check_run_on_os_login_disabled install enable_run_on_os_login apply_run_on_os_login_policy_blocked check_run_on_os_login_disabled -WML install & apply_run_on_os_login_policy_run_windowed remove_run_on_os_login_policy check_run_on_os_login_disabled install apply_run_on_os_login_policy_run_windowed remove_run_on_os_login_policy check_run_on_os_login_disabled -WML install & enable_run_on_os_login disable_run_on_os_login check_run_on_os_login_disabled install enable_run_on_os_login disable_run_on_os_login check_run_on_os_login_disabled \ No newline at end of file +# Manifest update tests +WMLC install_by_user_windowed & manifest_update_colors launch check_window_color_correct install_by_user_windowed close_pwa manifest_update_colors launch check_window_color_correct +WMLC install_by_user_windowed & manifest_update_display_browser launch check_tab_not_created install_by_user_windowed close_pwa manifest_update_display_browser launch check_tab_not_created +WMLC install_by_user_windowed & manifest_update_display_browser launch check_window_created install_by_user_windowed close_pwa manifest_update_display_browser launch check_window_created +WMLC install_by_user_windowed & manifest_update_display_browser launch check_window_display_minimal install_by_user_windowed close_pwa manifest_update_display_browser launch check_window_display_minimal +WMLC install_by_user_windowed & manifest_update_display_minimal launch check_window_display_minimal install_by_user_windowed close_pwa manifest_update_display_minimal launch check_window_display_minimal +WMLC install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) close_pwa launch_from_platform_shortcut(SiteAFoo) close_pwa navigate_browser(SiteA) check_install_icon_not_shown +WMLC install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) check_launch_icon_shown install_by_user_windowed(SiteAFoo) manifest_update_scope_site_a_foo_to(SiteA) close_pwa launch_from_platform_shortcut(SiteAFoo) close_pwa navigate_browser(SiteA) check_launch_icon_shown +WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_pwa_site_a_foo_to(SiteABar) check_no_toolbar install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) launch(SiteAFoo) navigate_pwa_site_a_foo_to(SiteABar) check_no_toolbar +WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_install_icon_not_shown +WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_launch_icon_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteABar) check_launch_icon_shown +WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_install_icon_not_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_install_icon_not_shown +WMLC install_by_user_windowed(SiteAFoo) & manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_launch_icon_shown install_by_user_windowed(SiteAFoo) close_pwa manifest_update_scope_site_a_foo_to(SiteA) navigate_browser(SiteAFoo) check_launch_icon_shown +# Browser UX with edge cases +WMLC switch_incognito_profile navigate_browser(SiteA) check_create_shortcut_not_shown switch_incognito_profile navigate_browser(SiteA) check_create_shortcut_not_shown +WMLC switch_incognito_profile navigate_browser(SiteC) check_create_shortcut_not_shown switch_incognito_profile navigate_browser(SiteC) check_create_shortcut_not_shown +WMLC navigate_crashed_url check_create_shortcut_not_shown navigate_crashed_url check_create_shortcut_not_shown +WMLC navigate_crashed_url check_install_icon_not_shown navigate_crashed_url check_install_icon_not_shown +WMLC navigate_notfound_url check_create_shortcut_not_shown navigate_notfound_url check_create_shortcut_not_shown +WMLC navigate_notfound_url check_install_icon_not_shown navigate_notfound_url check_install_icon_not_shown +# Site promotability checking +WMLC navigate_browser(SiteA) check_create_shortcut_shown navigate_browser(SiteA) check_create_shortcut_shown +WMLC navigate_browser(SiteAFoo) check_install_icon_shown navigate_browser(SiteAFoo) check_install_icon_shown +WMLC navigate_browser(SiteC) check_create_shortcut_shown navigate_browser(SiteC) check_create_shortcut_shown +WMLC navigate_browser(SiteC) check_install_icon_not_shown navigate_browser(SiteC) check_install_icon_not_shown +# In-Browser UX (install icon, launch icon, etc) +WMLC install_windowed(SiteAFoo) navigate_browser(SiteABar) check_install_icon_shown install_windowed(SiteAFoo) navigate_browser(SiteABar) check_install_icon_shown +WMLC install_windowed(SiteAFoo) navigate_browser(SiteABar) check_launch_icon_not_shown install_windowed(SiteAFoo) navigate_browser(SiteABar) check_launch_icon_not_shown +WMLC install_windowed navigate_browser(SiteAFoo) check_install_icon_not_shown install_windowed navigate_browser(SiteAFoo) check_install_icon_not_shown +WMLC install_windowed navigate_browser(SiteAFoo) check_launch_icon_shown install_windowed navigate_browser(SiteAFoo) check_launch_icon_shown +WMLC install_by_user_windowed navigate_browser(SiteB) check_install_icon_shown install_by_user_windowed navigate_browser(SiteB) check_install_icon_shown +WMLC install_by_user_windowed navigate_browser(SiteB) check_launch_icon_not_shown install_by_user_windowed navigate_browser(SiteB) check_launch_icon_not_shown +WMLC install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_app_title_site_a_is(SiteA) install_by_user_windowed navigate_pwa_site_a_to(SiteB) check_app_title_site_a_is(SiteA) +WMLC install_by_user_windowed switch_incognito_profile check_launch_icon_not_shown install_by_user_windowed switch_incognito_profile navigate_browser(SiteA) check_launch_icon_not_shown +WMLC install_by_user_windowed set_open_in_tab check_app_in_list_tabbed install_by_user_windowed set_open_in_tab check_app_in_list_tabbed +WMLC install_by_user_windowed set_open_in_tab check_install_icon_shown install_by_user_windowed set_open_in_tab navigate_browser(SiteA) check_install_icon_shown +WMLC install_by_user_tabbed set_open_in_window check_app_in_list_windowed install_by_user_tabbed set_open_in_window check_app_in_list_windowed +WMLC install_by_user_tabbed set_open_in_window check_install_icon_not_shown install_by_user_tabbed set_open_in_window navigate_browser(SiteA) check_install_icon_not_shown +WMLC install_by_user_tabbed set_open_in_window check_launch_icon_shown install_by_user_tabbed set_open_in_window navigate_browser(SiteA) check_launch_icon_shown \ No newline at end of file
diff --git a/chrome/test/webapps/data/enums.tsv b/chrome/test/webapps/data/enums.tsv index 532b4e99..ea8f239 100644 --- a/chrome/test/webapps/data/enums.tsv +++ b/chrome/test/webapps/data/enums.tsv
@@ -1,4 +1,5 @@ #Enum Name Values (* = default) +# These refer to sites that are hosted in the codebase. Site SiteA* SiteB SiteC SiteAFoo SiteABar InstallableSite SiteA* SiteB SiteAFoo SiteABar Title SiteA SiteAUpdated
diff --git a/chrome/test/webapps/data/framework_supported_actions.csv b/chrome/test/webapps/data/framework_supported_actions.csv index bf999746..be4813e1 100644 --- a/chrome/test/webapps/data/framework_supported_actions.csv +++ b/chrome/test/webapps/data/framework_supported_actions.csv
@@ -51,3 +51,15 @@ uninstall_from_os, 🌑, 🌕, 🌑, 🌑, uninstall_policy_app, 🌕, 🌕, 🌕, 🌕, uninstall_from_app_settings, 🌕, 🌕, 🌕, 🌑, +check_user_cannot_set_run_on_os_login, 🌕, 🌕, 🌕, 🌑, +apply_run_on_os_login_policy_allowed, 🌕, 🌕, 🌕, 🌑, +apply_run_on_os_login_policy_blocked, 🌕, 🌕, 🌕, 🌑, +apply_run_on_os_login_policy_run_windowed, 🌕, 🌕, 🌕, 🌑, +remove_run_on_os_login_policy, 🌕, 🌕, 🌕, 🌑, +enable_run_on_os_login, 🌕, 🌕, 🌕, 🌑, +disable_run_on_os_login, 🌕, 🌕, 🌕, 🌑, +check_run_on_os_login_enabled, 🌕, 🌕, 🌕, 🌑, +check_run_on_os_login_disabled, 🌕, 🌕, 🌕, 🌑, +open_app_settings_from_chrome_apps, 🌕, 🌕, 🌕, 🌑, +open_app_settings_from_app_menu, 🌕, 🌕, 🌕, 🌑, +check_browser_navigation_is_app_settings, 🌕, 🌕, 🌕, 🌑,
diff --git a/chrome/test/webapps/file_reading.py b/chrome/test/webapps/file_reading.py index 6bfe7b43..75896258 100755 --- a/chrome/test/webapps/file_reading.py +++ b/chrome/test/webapps/file_reading.py
@@ -293,7 +293,7 @@ # Convert the `cpp_method` to Pascal-case cpp_method = ''.join(word.title() for word in action_base_name.split('_')) - cpp_method += "(\"" + joined_cpp_arguments + "\")" + cpp_method += "(" + joined_cpp_arguments + ")" # Resolve bash-replacement for any output actions. Resolving to # canonical names is not done here because the defaults map is not
diff --git a/chrome/test/webapps/graph_analysis_unittest.py b/chrome/test/webapps/graph_analysis_unittest.py index 6e0134d..3cad04a0 100755 --- a/chrome/test/webapps/graph_analysis_unittest.py +++ b/chrome/test/webapps/graph_analysis_unittest.py
@@ -85,6 +85,7 @@ expected_filename += ".txt" with open(expected_filename, "r", encoding="utf-8") as expected_tests_file: + print(expected_filename) expected_tests_str = expected_tests_file.read() actual_tests_str = "\n".join([ test.generate_browsertest(test_partition)
diff --git a/chrome/test/webapps/test_data/expected_test_txt/tests_default.txt b/chrome/test/webapps/test_data/expected_test_txt/tests_default.txt index 60549ad..8326c1a 100644 --- a/chrome/test/webapps/test_data/expected_test_txt/tests_default.txt +++ b/chrome/test/webapps/test_data/expected_test_txt/tests_default.txt
@@ -2,7 +2,7 @@ // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. - helper_.StateChangeA(""Chicken""); - helper_.CheckA(""Chicken""); - helper_.CheckB(""Chicken", "Green""); + helper_.StateChangeA("Chicken"); + helper_.CheckA("Chicken"); + helper_.CheckB("Chicken", "Green"); } \ No newline at end of file
diff --git a/chrome/test/webapps/test_data/expected_test_txt/tests_default_cros.txt b/chrome/test/webapps/test_data/expected_test_txt/tests_default_cros.txt index 4ef024c..b5571ba6 100644 --- a/chrome/test/webapps/test_data/expected_test_txt/tests_default_cros.txt +++ b/chrome/test/webapps/test_data/expected_test_txt/tests_default_cros.txt
@@ -2,8 +2,8 @@ // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. - helper_.StateChangeA(""Dog""); - helper_.CheckB(""Dog", "Red""); - helper_.StateChangeA(""Chicken""); - helper_.CheckB(""Chicken", "Green""); + helper_.StateChangeA("Dog"); + helper_.CheckB("Dog", "Red"); + helper_.StateChangeA("Chicken"); + helper_.CheckB("Chicken", "Green"); } \ No newline at end of file
diff --git a/chrome/test/webapps/test_data/expected_test_txt/tests_default_mac_win_linux.txt b/chrome/test/webapps/test_data/expected_test_txt/tests_default_mac_win_linux.txt index 316325c..97b4cf4 100644 --- a/chrome/test/webapps/test_data/expected_test_txt/tests_default_mac_win_linux.txt +++ b/chrome/test/webapps/test_data/expected_test_txt/tests_default_mac_win_linux.txt
@@ -2,14 +2,14 @@ // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. - helper_.StateChangeB(""Chicken", "Green""); - helper_.CheckA(""Chicken""); - helper_.CheckB(""Chicken", "Green""); + helper_.StateChangeB("Chicken", "Green"); + helper_.CheckA("Chicken"); + helper_.CheckB("Chicken", "Green"); } IN_PROC_BROWSER_TEST_F(TestNameMacWinLinux, WebAppIntegration_3Dog_2DogRed) { // Test contents are generated by script. Please do not modify! // See `chrome/test/webapps/README.md` for more info. // Sheriffs: Disabling this test is supported. - helper_.StateChangeA(""Dog""); - helper_.CheckB(""Dog", "Red""); + helper_.StateChangeA("Dog"); + helper_.CheckB("Dog", "Red"); } \ No newline at end of file
diff --git a/chrome/updater/README.md b/chrome/updater/README.md index 4058afcb..23c7a3752 100644 --- a/chrome/updater/README.md +++ b/chrome/updater/README.md
@@ -1,23 +1,16 @@ An updater for desktop client software using Chromium code and tools. -* The code lives in //chrome/updater. -* Design Doc: https://bit.ly/chromium-updater -* Please join chrome-updates-dev@chromium.org or +* The code lives in //chrome/updater. +* The documentation lives in //docs/updater. + * Commentable Design Doc: https://bit.ly/chromium-updater +* Please join chrome-updates-dev@chromium.org or https://chromium.slack.com#updater for topics related to the project. -The updater will be built from a common, platform neutral code base, as part of -the Chrome build. The updater is going to be a drop-in replacement for Google -Update/Omaha/Keystone and could be customized by 3rd party embedders to for -updating non-Google client software, such as Edge. +The mission of the updater is to keep Chrome (and other software) up to date. + +The updater is built from a common, platform neutral code base, as part of +the Chrome build. The updater is a drop-in replacement for Google +Update/Omaha/Keystone and can be customized by 3rd party embedders to +update non-Google client software, such as Edge. The desktop platforms include Windows, macOS, Linux. - -There are many reasons to start a new code base for this: - -* Reducing the development cost and the code duplication among platforms. -* Implementing update algorithms consistently and correctly: checking for -updates, applying updates, gathering metrics, and load shedding. -* Use world-class developer tool chains for build, security, and stability. - -The existing Omaha/Keystone design, implementation, and production issues apply -to this project as well.
diff --git a/chrome/updater/mac/keystone/ksinstall.mm b/chrome/updater/mac/keystone/ksinstall.mm index 1790a60..53c9d2a 100644 --- a/chrome/updater/mac/keystone/ksinstall.mm +++ b/chrome/updater/mac/keystone/ksinstall.mm
@@ -21,7 +21,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/task/single_thread_task_executor.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "chrome/updater/app/app.h" #include "chrome/updater/updater_scope.h" #include "chrome/updater/util.h"
diff --git a/chrome/updater/mac/signing/parts.py b/chrome/updater/mac/signing/parts.py index 34aeab6..2551773 100644 --- a/chrome/updater/mac/signing/parts.py +++ b/chrome/updater/mac/signing/parts.py
@@ -53,6 +53,11 @@ config.keystone_app_name, options=CodeSignOptions.FULL_HARDENED_RUNTIME_OPTIONS, verify_options=VerifyOptions.DEEP | VerifyOptions.STRICT), + CodeSignedProduct( # Metainstaller + 'UpdaterSetup', + 'UpdaterSetup', + options=CodeSignOptions.FULL_HARDENED_RUNTIME_OPTIONS, + verify_options=VerifyOptions.DEEP | VerifyOptions.STRICT), CodeSignedProduct( # Updater bundle '{.app_product}.app'.format(config), config.base_bundle_id, @@ -77,4 +82,5 @@ for part in parts: signing.sign_part(paths, config, part) signing.verify_part(paths, part) + signing.validate_app(paths, config, parts[-2]) signing.validate_app(paths, config, parts[-1])
diff --git a/chrome/updater/mac/signing/pipeline.py b/chrome/updater/mac/signing/pipeline.py index 3c0b5d7..9b5e1a5 100644 --- a/chrome/updater/mac/signing/pipeline.py +++ b/chrome/updater/mac/signing/pipeline.py
@@ -23,10 +23,13 @@ the operations are completed. """ commands.copy_files(os.path.join(paths.input, config.app_dir), paths.work) + commands.copy_files(os.path.join(paths.input, "UpdaterSetup"), paths.work) parts.sign_all(paths, config) commands.make_dir(dest_dir) commands.move_file(os.path.join(paths.work, config.app_dir), os.path.join(dest_dir, config.app_dir)) + commands.move_file(os.path.join(paths.work, "UpdaterSetup"), + os.path.dirname(dest_dir)) def _package_and_sign_dmg(paths, config): @@ -137,6 +140,8 @@ config.packaging_basename))) # Package. + commands.move_file(os.path.join(notary_paths.work, "UpdaterSetup"), + orig_paths.output) dmg_path = _package_and_sign_dmg( orig_paths.replace_work( os.path.join(notary_paths.work, config.packaging_basename)),
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc index f68fbd69..5e49a7b3 100644 --- a/chrome/updater/updater.cc +++ b/chrome/updater/updater.cc
@@ -186,7 +186,6 @@ const char* commands[] = { kWindowsServiceSwitch, kCrashHandlerSwitch, - kHealthCheckSwitch, kInstallSwitch, kRecoverSwitch, kServerSwitch,
diff --git a/chrome/utility/image_writer/disk_unmounter_mac.h b/chrome/utility/image_writer/disk_unmounter_mac.h index 87bbe08e..0a90985 100644 --- a/chrome/utility/image_writer/disk_unmounter_mac.h +++ b/chrome/utility/image_writer/disk_unmounter_mac.h
@@ -16,7 +16,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace image_writer {
diff --git a/chrome/utility/importer/profile_import_impl.h b/chrome/utility/importer/profile_import_impl.h index 636cced..9e29cd2 100644 --- a/chrome/utility/importer/profile_import_impl.h +++ b/chrome/utility/importer/profile_import_impl.h
@@ -11,7 +11,6 @@ #include <string> #include "base/memory/ref_counted.h" -#include "base/time/time.h" #include "chrome/common/importer/profile_import.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/chromecast/base/observer_unittest.cc b/chromecast/base/observer_unittest.cc index 6003bce..b92dc21 100644 --- a/chromecast/base/observer_unittest.cc +++ b/chromecast/base/observer_unittest.cc
@@ -12,7 +12,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/base/observer.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromecast/browser/audio_socket_broker_unittest.cc b/chromecast/browser/audio_socket_broker_unittest.cc index b1797e0..20a10b0 100644 --- a/chromecast/browser/audio_socket_broker_unittest.cc +++ b/chromecast/browser/audio_socket_broker_unittest.cc
@@ -20,7 +20,6 @@ #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/net/socket_util.h" #include "content/public/test/test_content_client_initializer.h" #include "content/public/test/test_renderer_host.h"
diff --git a/chromecast/browser/cast_content_browser_client.h b/chromecast/browser/cast_content_browser_client.h index e3a83b0..ab33ec9 100644 --- a/chromecast/browser/cast_content_browser_client.h +++ b/chromecast/browser/cast_content_browser_client.h
@@ -12,7 +12,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/buildflag.h" #include "chromecast/chromecast_buildflags.h"
diff --git a/chromecast/browser/cast_permission_manager.cc b/chromecast/browser/cast_permission_manager.cc index fa7b6a0..36c7e54 100644 --- a/chromecast/browser/cast_permission_manager.cc +++ b/chromecast/browser/cast_permission_manager.cc
@@ -177,9 +177,18 @@ render_frame_host->GetLastCommittedOrigin().GetURL()); } +blink::mojom::PermissionStatus +CastPermissionManager::GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + return GetPermissionStatusInternal(permission, worker_origin); +} + CastPermissionManager::SubscriptionId CastPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
diff --git a/chromecast/browser/cast_permission_manager.h b/chromecast/browser/cast_permission_manager.h index 55dd82fc..9eaa5487 100644 --- a/chromecast/browser/cast_permission_manager.h +++ b/chromecast/browser/cast_permission_manager.h
@@ -51,8 +51,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/chromecast/external_mojo/broker_service/broker_service.h b/chromecast/external_mojo/broker_service/broker_service.h index b0306d40..05ae42d0 100644 --- a/chromecast/external_mojo/broker_service/broker_service.h +++ b/chromecast/external_mojo/broker_service/broker_service.h
@@ -10,7 +10,6 @@ #include "base/memory/ref_counted.h" #include "base/threading/sequence_bound.h" -#include "base/time/time.h" #include "chromecast/external_mojo/public/mojom/connector.mojom.h" #include "chromecast/mojo/interface_bundle.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chromecast/media/audio/audio_io_thread.h b/chromecast/media/audio/audio_io_thread.h index 5112afd2..c09262a 100644 --- a/chromecast/media/audio/audio_io_thread.h +++ b/chromecast/media/audio/audio_io_thread.h
@@ -7,7 +7,6 @@ #include "base/memory/ref_counted.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace base { class SequencedTaskRunner;
diff --git a/chromecast/media/audio/cast_audio_manager_alsa_unittest.cc b/chromecast/media/audio/cast_audio_manager_alsa_unittest.cc index 9f8be416..ce162da 100644 --- a/chromecast/media/audio/cast_audio_manager_alsa_unittest.cc +++ b/chromecast/media/audio/cast_audio_manager_alsa_unittest.cc
@@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/test/test_message_loop.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chromecast/common/mojom/service_connector.mojom.h" #include "chromecast/external_mojo/external_service_support/fake_external_connector.h" #include "chromecast/media/audio/mock_cast_audio_manager_helper_delegate.h"
diff --git a/chromecast/media/audio/net/audio_socket_service_uds_unittest.cc b/chromecast/media/audio/net/audio_socket_service_uds_unittest.cc index a5701d6..a1860c0 100644 --- a/chromecast/media/audio/net/audio_socket_service_uds_unittest.cc +++ b/chromecast/media/audio/net/audio_socket_service_uds_unittest.cc
@@ -16,7 +16,6 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/net/socket_util.h" #include "net/base/net_errors.h" #include "net/socket/stream_socket.h"
diff --git a/chromecast/media/cma/backend/android/volume_control_android.h b/chromecast/media/cma/backend/android/volume_control_android.h index 233bd0ee..252a5d8 100644 --- a/chromecast/media/cma/backend/android/volume_control_android.h +++ b/chromecast/media/cma/backend/android/volume_control_android.h
@@ -12,7 +12,6 @@ #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/media/cma/backend/android/audio_sink_manager.h" #include "chromecast/media/cma/backend/android/volume_cache.h"
diff --git a/chromecast/media/cma/backend/desktop/volume_control_desktop.cc b/chromecast/media/cma/backend/desktop/volume_control_desktop.cc index dc2866a..a94ed58 100644 --- a/chromecast/media/cma/backend/desktop/volume_control_desktop.cc +++ b/chromecast/media/cma/backend/desktop/volume_control_desktop.cc
@@ -19,7 +19,6 @@ #include "base/notreached.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace chromecast { namespace media {
diff --git a/chromecast/media/gpu/cast_gpu_factory_impl.h b/chromecast/media/gpu/cast_gpu_factory_impl.h index 89e8a17..1311af1 100644 --- a/chromecast/media/gpu/cast_gpu_factory_impl.h +++ b/chromecast/media/gpu/cast_gpu_factory_impl.h
@@ -8,7 +8,6 @@ #include "base/memory/scoped_refptr.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/media/gpu/cast_gpu_factory.h" #include "media/mojo/clients/mojo_video_decoder.h" #include "media/mojo/mojom/interface_factory.mojom.h"
diff --git a/chromecast/system/reboot/reboot_fuchsia_test.cc b/chromecast/system/reboot/reboot_fuchsia_test.cc index c7a24613..f7f92cf 100644 --- a/chromecast/system/reboot/reboot_fuchsia_test.cc +++ b/chromecast/system/reboot/reboot_fuchsia_test.cc
@@ -28,7 +28,6 @@ #include "base/test/task_environment.h" #include "base/threading/sequence_bound.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromecast/public/reboot_shlib.h" #include "chromecast/system/reboot/reboot_fuchsia.h" #include "chromecast/system/reboot/reboot_util.h"
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index b432319..004b985 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -2272,6 +2272,9 @@ <message name="IDS_PERSONALIZATION_APP_AMBIENT_MODE_TURN_ON_LABEL" desc="Label of button to turn on ambient mode."> Turn on </message> + <message name="IDS_PERSONALIZATION_APP_MANAGED_SETTING" desc="Message to show in the personalization hub for a setting which is enterprise managed by administrators."> + This setting is managed by your administrators + </message> <!-- Traffic Counters UI --> <message name="IDS_TRAFFIC_COUNTERS_UNKNOWN" desc="Traffic counters related to an unknown source"> @@ -2388,6 +2391,9 @@ <message name="IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD" desc="Accessibility text for the type of a device that is a keyboard."> Device is a keyboard. </message> + <message name="IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO" desc="Accessibility text for the type of a device that is a keyboard and mouse combo."> + Device is a keyboard and mouse combo. + </message> <message name="IDS_BLUETOOTH_A11Y_DEVICE_TYPE_MOUSE" desc="Accessibility text for the type of a device that is a mouse."> Device is a mouse. </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO.png.sha1 b/chromeos/chromeos_strings_grd/IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO.png.sha1 new file mode 100644 index 0000000..b7f91510 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_BLUETOOTH_A11Y_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO.png.sha1
@@ -0,0 +1 @@ +7f3a6a153a426cc44c2663f954f18dfabf5523de \ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_MANAGED_SETTING.png.sha1 b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_MANAGED_SETTING.png.sha1 new file mode 100644 index 0000000..3d26216 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_PERSONALIZATION_APP_MANAGED_SETTING.png.sha1
@@ -0,0 +1 @@ +c9cdbdfe6a5aec8898adfb1f8f17e617abb681ce \ No newline at end of file
diff --git a/chromeos/dbus/init/dbus_thread_manager_base.h b/chromeos/dbus/init/dbus_thread_manager_base.h index 7653aac..7819aa2 100644 --- a/chromeos/dbus/init/dbus_thread_manager_base.h +++ b/chromeos/dbus/init/dbus_thread_manager_base.h
@@ -9,7 +9,6 @@ #include "base/component_export.h" #include "base/memory/ref_counted.h" -#include "base/time/time.h" namespace base { class Thread;
diff --git a/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc b/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc index 4d9509ab..a0d58f5e 100644 --- a/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc +++ b/chromeos/dbus/lorgnette_manager/lorgnette_manager_client.cc
@@ -19,7 +19,6 @@ #include "base/sequence_checker.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "chromeos/dbus/common/pipe_reader.h" #include "chromeos/dbus/lorgnette/lorgnette_service.pb.h" #include "dbus/bus.h"
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc index dc5ab7a..9b2eb08 100644 --- a/chromeos/network/network_connection_handler_impl.cc +++ b/chromeos/network/network_connection_handler_impl.cc
@@ -12,6 +12,7 @@ #include "base/containers/contains.h" #include "base/json/json_reader.h" #include "base/location.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" @@ -52,6 +53,9 @@ // Timeout after which a pending cellular connect request is considered failed. constexpr base::TimeDelta kCellularConnectTimeout = base::Seconds(150); +const char kCellularConfigurationFailureHistogramName[] = + "Network.Ash.Cellular.ConfigurationFailure.Type"; + bool IsAuthenticationError(const std::string& error) { return (error == shill::kErrorBadWEPKey || error == shill::kErrorPppAuthFailed || @@ -603,7 +607,9 @@ const std::string& service_path, absl::optional<base::Value> properties) { if (!properties) { - HandleConfigurationFailure(service_path, "GetShillProperties failed"); + HandleConfigurationFailure( + service_path, "GetShillProperties failed", + CellularConfigurationFailureType::kFailureGetShillProperties); return; } NET_LOG(EVENT) << "VerifyConfiguredAndConnect: " @@ -622,7 +628,9 @@ const std::string* type = properties->FindStringKey(shill::kTypeProperty); if (!type) { - HandleConfigurationFailure(service_path, "Properties with no type"); + HandleConfigurationFailure( + service_path, "Properties with no type", + CellularConfigurationFailureType::kFailurePropertiesWithNoType); return; } bool connectable = @@ -791,7 +799,7 @@ base::BindOnce(&NetworkConnectionHandlerImpl::CallShillConnect, AsWeakPtr(), service_path), base::BindOnce( - &NetworkConnectionHandlerImpl::HandleConfigurationFailure, + &NetworkConnectionHandlerImpl::OnSetShillPropertiesFailed, AsWeakPtr(), service_path)); return; } @@ -897,9 +905,18 @@ AsWeakPtr(), service_path)); } -void NetworkConnectionHandlerImpl::HandleConfigurationFailure( +void NetworkConnectionHandlerImpl::OnSetShillPropertiesFailed( const std::string& service_path, const std::string& error_name) { + HandleConfigurationFailure( + service_path, error_name, + CellularConfigurationFailureType::kFailureSetShillProperties); +} + +void NetworkConnectionHandlerImpl::HandleConfigurationFailure( + const std::string& service_path, + const std::string& error_name, + CellularConfigurationFailureType failure_type) { NET_LOG(ERROR) << "Connect configuration failure: " << error_name << " for: " << NetworkPathId(service_path); ConnectRequest* request = GetPendingRequest(service_path); @@ -909,6 +926,9 @@ << NetworkPathId(service_path); return; } + + LogConfigurationFailureTypeIfCellular(service_path, failure_type); + network_handler::ErrorCallback error_callback = std::move(request->error_callback); ClearPendingRequest(service_path); @@ -916,6 +936,23 @@ kErrorConfigureFailed); } +void NetworkConnectionHandlerImpl::LogConfigurationFailureTypeIfCellular( + const std::string& service_path, + CellularConfigurationFailureType failure_type) { + if (!network_state_handler_) + return; + + const NetworkState* network_state = + network_state_handler_->GetNetworkState(service_path); + if (!network_state || network_state->GetNetworkTechnologyType() != + NetworkState::NetworkTechnologyType::kCellular) { + return; + } + + base::UmaHistogramEnumeration(kCellularConfigurationFailureHistogramName, + failure_type); +} + void NetworkConnectionHandlerImpl::HandleShillConnectSuccess( const std::string& service_path) { ConnectRequest* request = GetPendingRequest(service_path);
diff --git a/chromeos/network/network_connection_handler_impl.h b/chromeos/network/network_connection_handler_impl.h index e645d27..abefc0a 100644 --- a/chromeos/network/network_connection_handler_impl.h +++ b/chromeos/network/network_connection_handler_impl.h
@@ -58,6 +58,16 @@ CellularConnectionHandler* cellular_connection_handler) override; private: + // Cellular configuration failure type. These values are persisted to logs. + // Entries should not be renumbered and numeric values should + // never be reused. + enum class CellularConfigurationFailureType { + kFailureGetShillProperties = 0, + kFailurePropertiesWithNoType = 1, + kFailureSetShillProperties = 2, + kMaxValue = kFailureSetShillProperties + }; + struct ConnectRequest { ConnectRequest(ConnectCallbackMode mode, const std::string& service_path, @@ -118,10 +128,16 @@ // Calls Shill.Manager.Connect asynchronously. void CallShillConnect(const std::string& service_path); - // Handles failure from ConfigurationHandler calls. - void HandleConfigurationFailure(const std::string& service_path, + // Called when setting shill properties fails. + void OnSetShillPropertiesFailed(const std::string& service_path, const std::string& error_name); + // Handles failure from ConfigurationHandler calls. + void HandleConfigurationFailure( + const std::string& service_path, + const std::string& error_name, + CellularConfigurationFailureType failure_type); + // Handles success or failure from Shill.Service.Connect. void HandleShillConnectSuccess(const std::string& service_path); void HandleShillConnectFailure(const std::string& service_path, @@ -153,6 +169,11 @@ void HandleShillDisconnectSuccess(const std::string& service_path, base::OnceClosure success_callback); + // Logs the cellular configuration failure type to UMA. + void LogConfigurationFailureTypeIfCellular( + const std::string& service_path, + CellularConfigurationFailureType failure_type); + // Local references to the associated handler instances. NetworkCertLoader* network_cert_loader_ = nullptr; NetworkStateHandler* network_state_handler_ = nullptr;
diff --git a/chromeos/process_proxy/process_output_watcher.cc b/chromeos/process_proxy/process_output_watcher.cc index 06be11d..5b9a0f3 100644 --- a/chromeos/process_proxy/process_output_watcher.cc +++ b/chromeos/process_proxy/process_output_watcher.cc
@@ -18,7 +18,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/third_party/icu/icu_utf.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" namespace {
diff --git a/chromeos/process_proxy/process_output_watcher_unittest.cc b/chromeos/process_proxy/process_output_watcher_unittest.cc index 2bcab2f..cb6c5f8 100644 --- a/chromeos/process_proxy/process_output_watcher_unittest.cc +++ b/chromeos/process_proxy/process_output_watcher_unittest.cc
@@ -23,7 +23,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace chromeos {
diff --git a/chromeos/process_proxy/process_proxy_registry.h b/chromeos/process_proxy/process_proxy_registry.h index aa645b4..1982794 100644 --- a/chromeos/process_proxy/process_proxy_registry.h +++ b/chromeos/process_proxy/process_proxy_registry.h
@@ -17,7 +17,6 @@ #include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromeos/process_proxy/process_proxy.h" namespace chromeos {
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt index 28f69f6d..63e0260 100644 --- a/chromeos/profiles/orderfile.newest.txt +++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@ -chromeos-chrome-orderfile-field-101-4951.6-1648463443-benchmark-101.0.4951.15-r1.orderfile.xz +chromeos-chrome-orderfile-field-101-4951.6-1648463443-benchmark-101.0.4951.16-r1.orderfile.xz
diff --git a/chromeos/services/assistant/audio_decoder/assistant_audio_decoder.h b/chromeos/services/assistant/audio_decoder/assistant_audio_decoder.h index 2c81f24..b16533c 100644 --- a/chromeos/services/assistant/audio_decoder/assistant_audio_decoder.h +++ b/chromeos/services/assistant/audio_decoder/assistant_audio_decoder.h
@@ -9,7 +9,6 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromeos/services/assistant/public/mojom/assistant_audio_decoder.mojom.h" #include "media/filters/blocking_url_protocol.h" #include "mojo/public/cpp/bindings/pending_remote.h"
diff --git a/chromeos/services/bluetooth_config/device_conversion_util.cc b/chromeos/services/bluetooth_config/device_conversion_util.cc index 383d475..7a4062ec 100644 --- a/chromeos/services/bluetooth_config/device_conversion_util.cc +++ b/chromeos/services/bluetooth_config/device_conversion_util.cc
@@ -52,10 +52,11 @@ return mojom::DeviceType::kGameController; case device::BluetoothDeviceType::KEYBOARD: - [[fallthrough]]; - case device::BluetoothDeviceType::KEYBOARD_MOUSE_COMBO: return mojom::DeviceType::kKeyboard; + case device::BluetoothDeviceType::KEYBOARD_MOUSE_COMBO: + return mojom::DeviceType::kKeyboardMouseCombo; + case device::BluetoothDeviceType::MOUSE: return mojom::DeviceType::kMouse;
diff --git a/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom b/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom index 2c063ad8..e5f1335 100644 --- a/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom +++ b/chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom
@@ -49,6 +49,7 @@ kVideoCamera, kGameController, kKeyboard, + kKeyboardMouseCombo, kMouse, kTablet };
diff --git a/chromeos/services/libassistant/grpc/grpc_client_thread.h b/chromeos/services/libassistant/grpc/grpc_client_thread.h index 2f7b4469..53c4d5b 100644 --- a/chromeos/services/libassistant/grpc/grpc_client_thread.h +++ b/chromeos/services/libassistant/grpc/grpc_client_thread.h
@@ -11,7 +11,6 @@ #include "base/synchronization/lock.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "third_party/grpc/src/include/grpcpp/completion_queue.h" namespace chromeos {
diff --git a/chromeos/services/libassistant/grpc/services_initializer_base.h b/chromeos/services/libassistant/grpc/services_initializer_base.h index 38503e0..3b47e96 100644 --- a/chromeos/services/libassistant/grpc/services_initializer_base.h +++ b/chromeos/services/libassistant/grpc/services_initializer_base.h
@@ -10,7 +10,6 @@ #include <vector> #include "base/threading/thread.h" -#include "base/time/time.h" #include "chromeos/services/libassistant/grpc/async_service_driver.h" #include "third_party/grpc/src/include/grpcpp/completion_queue.h" #include "third_party/grpc/src/include/grpcpp/server_builder.h"
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index 07e14a9..a54c0c3a 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -447,11 +447,7 @@ : true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); registry->RegisterBooleanPref( - prefs::kShowReadingListInBookmarkBar, true, - user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); - registry->RegisterBooleanPref( - prefs::kShowManagedBookmarksInBookmarkBar, - true, + prefs::kShowManagedBookmarksInBookmarkBar, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); RegisterManagedBookmarksPrefs(registry); }
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index 183b461..ade292f 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -13,7 +13,6 @@ #include "base/synchronization/waitable_event.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "components/bookmarks/browser/bookmark_codec.h" #include "components/bookmarks/browser/bookmark_load_details.h" #include "components/bookmarks/browser/titled_url_index.h"
diff --git a/components/bookmarks/common/bookmark_pref_names.cc b/components/bookmarks/common/bookmark_pref_names.cc index a3202d1..1989d89 100644 --- a/components/bookmarks/common/bookmark_pref_names.cc +++ b/components/bookmarks/common/bookmark_pref_names.cc
@@ -27,10 +27,6 @@ // bar. const char kShowAppsShortcutInBookmarkBar[] = "bookmark_bar.show_apps_shortcut"; -// Boolean which specifies whether the reading list is visible on the bookmark -// bar. -const char kShowReadingListInBookmarkBar[] = "bookmark_bar.show_reading_list"; - // Boolean which specifies whether the Managed Bookmarks folder is visible on // the bookmark bar. const char kShowManagedBookmarksInBookmarkBar[] =
diff --git a/components/bookmarks/common/bookmark_pref_names.h b/components/bookmarks/common/bookmark_pref_names.h index d3e610c..de8181a 100644 --- a/components/bookmarks/common/bookmark_pref_names.h +++ b/components/bookmarks/common/bookmark_pref_names.h
@@ -15,7 +15,6 @@ extern const char kManagedBookmarks[]; extern const char kManagedBookmarksFolderName[]; extern const char kShowAppsShortcutInBookmarkBar[]; -extern const char kShowReadingListInBookmarkBar[]; extern const char kShowManagedBookmarksInBookmarkBar[]; extern const char kShowBookmarkBar[];
diff --git a/components/browser_watcher/exit_code_watcher_win.h b/components/browser_watcher/exit_code_watcher_win.h index e5093cf..83b967b 100644 --- a/components/browser_watcher/exit_code_watcher_win.h +++ b/components/browser_watcher/exit_code_watcher_win.h
@@ -6,7 +6,6 @@ #include "base/process/process.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/win/scoped_handle.h" namespace browser_watcher {
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index bcadeb125..0b59e5ee 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "7.19", - "log_list_timestamp": "2022-03-31T02:53:12Z", + "version": "7.20", + "log_list_timestamp": "2022-04-01T02:54:38Z", "operators": [ { "name": "Google",
diff --git a/components/chromeos_camera/fake_mjpeg_decode_accelerator.h b/components/chromeos_camera/fake_mjpeg_decode_accelerator.h index c55958d..25f155f1 100644 --- a/components/chromeos_camera/fake_mjpeg_decode_accelerator.h +++ b/components/chromeos_camera/fake_mjpeg_decode_accelerator.h
@@ -11,7 +11,6 @@ #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/chromeos_camera/mjpeg_decode_accelerator.h" #include "media/base/bitstream_buffer.h"
diff --git a/components/commerce/core/commerce_heuristics_data.cc b/components/commerce/core/commerce_heuristics_data.cc index 170170e..f884ac98 100644 --- a/components/commerce/core/commerce_heuristics_data.cc +++ b/components/commerce/core/commerce_heuristics_data.cc
@@ -80,6 +80,8 @@ ConstructGlobalRegex(kPurchaseButtonTextPatternType); add_to_cart_request_pattern_ = ConstructGlobalRegex(kAddToCartRequestPatternType); + product_id_json_ = product_id_json_data; + cart_extraction_script_ = cart_extraction_script; domain_cart_url_pattern_mapping_.clear(); domain_checkout_url_pattern_mapping_.clear(); domain_purchase_url_pattern_mapping_.clear(); @@ -165,6 +167,14 @@ kMerchantPurchaseURLRegexType, domain); } +std::string CommerceHeuristicsData::GetProductIDExtractionJSON() { + return product_id_json_; +} + +std::string CommerceHeuristicsData::GetCartProductExtractionScript() { + return cart_extraction_script_; +} + absl::optional<std::string> CommerceHeuristicsData::GetCommerceHintHeuristics( const std::string& type, const std::string& domain) {
diff --git a/components/commerce/core/commerce_heuristics_data.h b/components/commerce/core/commerce_heuristics_data.h index 3975de3..faabfeb 100644 --- a/components/commerce/core/commerce_heuristics_data.h +++ b/components/commerce/core/commerce_heuristics_data.h
@@ -82,6 +82,12 @@ // `domain`. const re2::RE2* GetPurchasePageURLPatternForDomain(const std::string& domain); + // Get the JSON data with product ID extraction heuristics. + std::string GetProductIDExtractionJSON(); + + // Get the cart extraction script. + std::string GetCartProductExtractionScript(); + private: friend class CommerceHeuristicsDataTest; @@ -116,6 +122,8 @@ domain_checkout_url_pattern_mapping_; std::map<std::string, std::unique_ptr<re2::RE2>> domain_purchase_url_pattern_mapping_; + std::string product_id_json_; + std::string cart_extraction_script_; }; } // namespace commerce_heuristics
diff --git a/components/commerce/core/commerce_heuristics_data_unittest.cc b/components/commerce/core/commerce_heuristics_data_unittest.cc index 7dd04bd0..883316a 100644 --- a/components/commerce/core/commerce_heuristics_data_unittest.cc +++ b/components/commerce/core/commerce_heuristics_data_unittest.cc
@@ -332,4 +332,30 @@ EXPECT_TRUE(global_heuristics_optional.has_value()); EXPECT_EQ(*global_heuristics_optional, global_heuristics_string); } + +TEST_F(CommerceHeuristicsDataTest, TestGetProductIDExtractionJSON) { + auto& data = commerce_heuristics::CommerceHeuristicsData::GetInstance(); + + ASSERT_TRUE(data.PopulateDataFromComponent("{}", "{}", "", "")); + EXPECT_TRUE(commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetProductIDExtractionJSON() + .empty()); + + ASSERT_TRUE(data.PopulateDataFromComponent("{}", "{}", "foo", "bar")); + EXPECT_EQ("foo", commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetProductIDExtractionJSON()); +} + +TEST_F(CommerceHeuristicsDataTest, TestGetCartProductExtractionScript) { + auto& data = commerce_heuristics::CommerceHeuristicsData::GetInstance(); + + ASSERT_TRUE(data.PopulateDataFromComponent("{}", "{}", "", "")); + EXPECT_TRUE(commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetCartProductExtractionScript() + .empty()); + + ASSERT_TRUE(data.PopulateDataFromComponent("{}", "{}", "foo", "bar")); + EXPECT_EQ("bar", commerce_heuristics::CommerceHeuristicsData::GetInstance() + .GetCartProductExtractionScript()); +} } // namespace commerce_heuristics
diff --git a/components/content_creation/notes/core/templates/template_store.cc b/components/content_creation/notes/core/templates/template_store.cc index 53ba792..8978196 100644 --- a/components/content_creation/notes/core/templates/template_store.cc +++ b/components/content_creation/notes/core/templates/template_store.cc
@@ -5,7 +5,10 @@ #include "components/content_creation/notes/core/templates/template_store.h" #include "base/bind.h" +#include "base/command_line.h" #include "base/containers/flat_map.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/rand_util.h" #include "base/task/task_runner_util.h" #include "base/task/task_traits.h" @@ -39,6 +42,16 @@ return base::Time::FromLocalExploded(exploded_date, &time_date); } +std::string FetchTemplatesFromFile(base::FilePath local_path) { + std::string data; + + if (!base::ReadFileToString(local_path, &data)) { + return ""; + } + + return data; +} + } // namespace TemplateStore::TemplateStore( @@ -60,6 +73,16 @@ } void TemplateStore::GetTemplates(GetTemplatesCallback callback) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + kLocalDynamicTemplatesForTesting)) { + OnFetchTemplateComplete( + std::move(callback), + FetchTemplatesFromFile( + base::CommandLine::ForCurrentProcess()->GetSwitchValuePath( + kLocalDynamicTemplatesForTesting))); + return; + } + if (IsDynamicTemplatesEnabled()) { FetchTemplates(std::move(callback)); } else {
diff --git a/components/content_creation/notes/core/templates/template_store.h b/components/content_creation/notes/core/templates/template_store.h index f575325..b886b54 100644 --- a/components/content_creation/notes/core/templates/template_store.h +++ b/components/content_creation/notes/core/templates/template_store.h
@@ -28,6 +28,12 @@ using GetTemplatesCallback = base::OnceCallback<void(std::vector<NoteTemplate>)>; +// If set, it will use data from a local file rather than gstatic to serve +// templates to the user. Used to test updated template files before committing +// to gstatic. +constexpr char kLocalDynamicTemplatesForTesting[] = + "local-dynamic-templates-for-testing"; + // Instance in charge of generating the ordered list of note templates to be // offered to the user. class TemplateStore {
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc index eee07a94..53c8c184d 100644 --- a/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -40,6 +40,9 @@ CONTENT_SETTING_BLOCK}, {prefs::kManagedCookiesSessionOnlyForUrls, ContentSettingsType::COOKIES, CONTENT_SETTING_SESSION_ONLY}, + {prefs::kManagedGetDisplayMediaSetSelectAllScreensAllowedForUrls, + ContentSettingsType::GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, + CONTENT_SETTING_ALLOW}, {prefs::kManagedImagesAllowedForUrls, ContentSettingsType::IMAGES, CONTENT_SETTING_ALLOW}, {prefs::kManagedImagesBlockedForUrls, ContentSettingsType::IMAGES, @@ -107,6 +110,7 @@ prefs::kManagedFileSystemReadBlockedForUrls, prefs::kManagedFileSystemWriteAskForUrls, prefs::kManagedFileSystemWriteBlockedForUrls, + prefs::kManagedGetDisplayMediaSetSelectAllScreensAllowedForUrls, prefs::kManagedImagesAllowedForUrls, prefs::kManagedImagesBlockedForUrls, prefs::kManagedInsecureContentAllowedForUrls, @@ -114,6 +118,8 @@ prefs::kManagedInsecurePrivateNetworkAllowedForUrls, prefs::kManagedJavaScriptAllowedForUrls, prefs::kManagedJavaScriptBlockedForUrls, + prefs::kManagedJavaScriptJitAllowedForSites, + prefs::kManagedJavaScriptJitBlockedForSites, prefs::kManagedLegacyCookieAccessAllowedForDomains, prefs::kManagedNotificationsAllowedForUrls, prefs::kManagedNotificationsBlockedForUrls, @@ -123,13 +129,11 @@ prefs::kManagedSensorsBlockedForUrls, prefs::kManagedSerialAskForUrls, prefs::kManagedSerialBlockedForUrls, + prefs::kManagedWebHidAskForUrls, + prefs::kManagedWebHidBlockedForUrls, prefs::kManagedWebUsbAllowDevicesForUrls, prefs::kManagedWebUsbAskForUrls, prefs::kManagedWebUsbBlockedForUrls, - prefs::kManagedJavaScriptJitAllowedForSites, - prefs::kManagedJavaScriptJitBlockedForSites, - prefs::kManagedWebHidAskForUrls, - prefs::kManagedWebHidBlockedForUrls, prefs::kManagedWindowPlacementAllowedForUrls, prefs::kManagedWindowPlacementBlockedForUrls, };
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index b5e821f..8c509c94 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -165,6 +165,16 @@ ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS); + Register(ContentSettingsType::GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, + "get-display-media-set-select-all-screens", CONTENT_SETTING_BLOCK, + WebsiteSettingsInfo::SYNCABLE, AllowlistedSchemes(), + ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK), + WebsiteSettingsInfo::SINGLE_ORIGIN_ONLY_SCOPE, + WebsiteSettingsRegistry::ALL_PLATFORMS, + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, + ContentSettingsInfo::PERSISTENT, + ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS); + Register(ContentSettingsType::POPUPS, "popups", CONTENT_SETTING_BLOCK, WebsiteSettingsInfo::SYNCABLE, AllowlistedSchemes(kChromeUIScheme, kChromeDevToolsScheme,
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h index c110a033..9ef5f49c2 100644 --- a/components/content_settings/core/common/content_settings_types.h +++ b/components/content_settings/core/common/content_settings_types.h
@@ -111,6 +111,9 @@ // Used to store whether to allow a website to detect user active/idle state. IDLE_DETECTION, + // Setting for enabling auto-select of all screens for getDisplayMediaSet. + GET_DISPLAY_MEDIA_SET_SELECT_ALL_SCREENS, + // Content settings for access to serial ports. The "guard" content setting // stores whether to allow sites to ask for permission to access a port. The // permissions granted to access particular ports are stored in the "chooser
diff --git a/components/content_settings/core/common/pref_names.cc b/components/content_settings/core/common/pref_names.cc index bff87b0..9be6dd4d 100644 --- a/components/content_settings/core/common/pref_names.cc +++ b/components/content_settings/core/common/pref_names.cc
@@ -72,6 +72,8 @@ "profile.managed_cookies_blocked_for_urls"; const char kManagedCookiesSessionOnlyForUrls[] = "profile.managed_cookies_sessiononly_for_urls"; +const char kManagedGetDisplayMediaSetSelectAllScreensAllowedForUrls[] = + "profile.managed_get_display_media_set_select_all_screens_allowed_for_urls"; const char kManagedImagesAllowedForUrls[] = "profile.managed_images_allowed_for_urls"; const char kManagedImagesBlockedForUrls[] = @@ -101,6 +103,10 @@ const char kManagedWebUsbAskForUrls[] = "profile.managed_web_usb_ask_for_urls"; const char kManagedWebUsbBlockedForUrls[] = "profile.managed_web_usb_blocked_for_urls"; +const char kManagedFileHandlingAllowedForUrls[] = + "profile.managed_file_handling_allowed_for_urls"; +const char kManagedFileHandlingBlockedForUrls[] = + "profile.managed_file_handling_blocked_for_urls"; const char kManagedFileSystemReadAskForUrls[] = "profile.managed_file_system_read_ask_for_urls"; const char kManagedFileSystemReadBlockedForUrls[] =
diff --git a/components/content_settings/core/common/pref_names.h b/components/content_settings/core/common/pref_names.h index 38f15f3..507eddb1 100644 --- a/components/content_settings/core/common/pref_names.h +++ b/components/content_settings/core/common/pref_names.h
@@ -41,6 +41,7 @@ extern const char kManagedCookiesAllowedForUrls[]; extern const char kManagedCookiesBlockedForUrls[]; extern const char kManagedCookiesSessionOnlyForUrls[]; +extern const char kManagedGetDisplayMediaSetSelectAllScreensAllowedForUrls[]; extern const char kManagedImagesAllowedForUrls[]; extern const char kManagedImagesBlockedForUrls[]; extern const char kManagedInsecureContentAllowedForUrls[]; @@ -57,6 +58,8 @@ extern const char kManagedWebUsbAllowDevicesForUrls[]; extern const char kManagedWebUsbAskForUrls[]; extern const char kManagedWebUsbBlockedForUrls[]; +extern const char kManagedFileHandlingAllowedForUrls[]; +extern const char kManagedFileHandlingBlockedForUrls[]; extern const char kManagedFileSystemReadAskForUrls[]; extern const char kManagedFileSystemReadBlockedForUrls[]; extern const char kManagedFileSystemWriteAskForUrls[];
diff --git a/components/crash/content/browser/crash_handler_host_linux.h b/components/crash/content/browser/crash_handler_host_linux.h index ba9a20a9..7490a47e 100644 --- a/components/crash/content/browser/crash_handler_host_linux.h +++ b/components/crash/content/browser/crash_handler_host_linux.h
@@ -18,7 +18,6 @@ #include "base/synchronization/atomic_flag.h" #include "base/synchronization/lock.h" #include "base/task/current_thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h"
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc index 94c1d5ef..f7c28a78 100644 --- a/components/desks_storage/core/desk_sync_bridge.cc +++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -165,63 +165,6 @@ } } -// Convert sync proto WindowOpenDisposition to base's WindowOpenDisposition. -// This value is cast to int32_t by the caller to be assigned to the -// `disposition` field in AppRestoreData. -WindowOpenDisposition ToBaseWindowOpenDisposition( - SyncWindowOpenDisposition disposition) { - switch (disposition) { - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_UNKNOWN: - return WindowOpenDisposition::UNKNOWN; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_CURRENT_TAB: - return WindowOpenDisposition::CURRENT_TAB; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SINGLETON_TAB: - return WindowOpenDisposition::SINGLETON_TAB; - case sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_FOREGROUND_TAB: - return WindowOpenDisposition::NEW_FOREGROUND_TAB; - case sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_BACKGROUND_TAB: - return WindowOpenDisposition::NEW_BACKGROUND_TAB; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_POPUP: - return WindowOpenDisposition::NEW_POPUP; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_WINDOW: - return WindowOpenDisposition::NEW_WINDOW; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SAVE_TO_DISK: - return WindowOpenDisposition::SAVE_TO_DISK; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_OFF_THE_RECORD: - return WindowOpenDisposition::OFF_THE_RECORD; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_IGNORE_ACTION: - return WindowOpenDisposition::IGNORE_ACTION; - case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SWITCH_TO_TAB: - return WindowOpenDisposition::SWITCH_TO_TAB; - case sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_PICTURE_IN_PICTURE: - return WindowOpenDisposition::NEW_PICTURE_IN_PICTURE; - } -} - -// Convert sync proto LaunchContainer to apps::Mojom::LaunchContainer -// used in the AppRestoreData `container` field. This value is cast to -// int32_t by the caller to be assigned to the field in AppRestoreData. -apps::mojom::LaunchContainer ToMojomLaunchContainer(LaunchContainer container) { - switch (container) { - case sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_UNSPECIFIED: - return apps::mojom::LaunchContainer::kLaunchContainerWindow; - case sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_WINDOW: - return apps::mojom::LaunchContainer::kLaunchContainerWindow; - case sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_PANEL_DEPRECATED: - return apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated; - case sync_pb::WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_TAB: - return apps::mojom::LaunchContainer::kLaunchContainerTab; - case sync_pb::WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_NONE: - return apps::mojom::LaunchContainer::kLaunchContainerNone; - } -} - // Convert App proto to |app_restore::AppLaunchInfo|. std::unique_ptr<app_restore::AppLaunchInfo> ConvertToAppLaunchInfo( const sync_pb::WorkspaceDeskSpecifics_App& app) { @@ -238,13 +181,14 @@ app_launch_info->display_id = app.display_id(); if (app.has_container()) { - app_launch_info->container = - static_cast<int32_t>(ToMojomLaunchContainer(app.container())); + app_launch_info->container = static_cast<int32_t>( + desk_template_conversion::ToMojomLaunchContainer(app.container())); } if (app.has_disposition()) { - app_launch_info->disposition = - static_cast<int32_t>(ToBaseWindowOpenDisposition(app.disposition())); + app_launch_info->disposition = static_cast<int32_t>( + desk_template_conversion::ToBaseWindowOpenDisposition( + app.disposition())); } if (app.has_app_name()) @@ -255,6 +199,8 @@ // so always default to 0 which is no action. // https://source.chromium.org/chromium/chromium/src/ // +/main:ui/base/window_open_disposition.cc;l=34 + // + // TODO(crbug.com/1311801): Add support for actual event_flag values. app_launch_info->event_flag = 0; switch (app.app().app_case()) { @@ -334,67 +280,6 @@ } } -// Convert from apps::mojom::LaunchContainer to sunc proto LaunchContainer. -// Assumes caller has cast `container` from int32_t to -// apps::mojom::LaunchContainer. -LaunchContainer FromMojomLaunchContainer( - apps::mojom::LaunchContainer container) { - switch (container) { - case apps::mojom::LaunchContainer::kLaunchContainerWindow: - return sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_WINDOW; - case apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated: - return sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_PANEL_DEPRECATED; - case apps::mojom::LaunchContainer::kLaunchContainerTab: - return sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_TAB; - case apps::mojom::LaunchContainer::kLaunchContainerNone: - return sync_pb:: - WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_NONE; - } -} - -// Convert sync proto WindowOpenDisposition to base's WindowOpenDisposition. -// This value is cast to int32_t by the caller to be assigned to the -// `disposition` field in AppRestoreData. -SyncWindowOpenDisposition FromBaseWindowOpenDisposition( - WindowOpenDisposition disposition) { - switch (disposition) { - case WindowOpenDisposition::UNKNOWN: - return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_UNKNOWN; - case WindowOpenDisposition::CURRENT_TAB: - return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_CURRENT_TAB; - case WindowOpenDisposition::SINGLETON_TAB: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_SINGLETON_TAB; - case WindowOpenDisposition::NEW_FOREGROUND_TAB: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_FOREGROUND_TAB; - case WindowOpenDisposition::NEW_BACKGROUND_TAB: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_BACKGROUND_TAB; - case WindowOpenDisposition::NEW_POPUP: - return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_POPUP; - case WindowOpenDisposition::NEW_WINDOW: - return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_WINDOW; - case WindowOpenDisposition::SAVE_TO_DISK: - return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SAVE_TO_DISK; - case WindowOpenDisposition::OFF_THE_RECORD: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_OFF_THE_RECORD; - case WindowOpenDisposition::IGNORE_ACTION: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_IGNORE_ACTION; - case WindowOpenDisposition::SWITCH_TO_TAB: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_SWITCH_TO_TAB; - case WindowOpenDisposition::NEW_PICTURE_IN_PICTURE: - return sync_pb:: - WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_PICTURE_IN_PICTURE; - } -} - // Convert chromeos::WindowStateType to Sync proto WindowState. WindowState FromChromeOsWindowState(chromeos::WindowStateType state) { switch (state) { @@ -516,8 +401,8 @@ const app_restore::AppRestoreData* app_restore_data, WorkspaceDeskSpecifics_App* out_app) { if (app_restore_data->container.has_value()) { - out_app->set_container( - FromMojomLaunchContainer(static_cast<apps::mojom::LaunchContainer>( + out_app->set_container(desk_template_conversion::FromMojomLaunchContainer( + static_cast<apps::mojom::LaunchContainer>( app_restore_data->container.value()))); } } @@ -528,8 +413,9 @@ WorkspaceDeskSpecifics_App* out_app) { if (app_restore_data->disposition.has_value()) { out_app->set_disposition( - FromBaseWindowOpenDisposition(static_cast<WindowOpenDisposition>( - app_restore_data->disposition.value()))); + desk_template_conversion::FromBaseWindowOpenDisposition( + static_cast<WindowOpenDisposition>( + app_restore_data->disposition.value()))); } }
diff --git a/components/desks_storage/core/desk_sync_bridge_unittest.cc b/components/desks_storage/core/desk_sync_bridge_unittest.cc index f82bbbdf7..ad459900 100644 --- a/components/desks_storage/core/desk_sync_bridge_unittest.cc +++ b/components/desks_storage/core/desk_sync_bridge_unittest.cc
@@ -78,6 +78,7 @@ constexpr char kTestPwaAppId[] = "test_pwa_app_id"; constexpr char kTestChromeAppId[] = "test_chrome_app_id"; constexpr char kTestArcAppId[] = "test_arc_app_id"; +constexpr char kTestArcAppTitle[] = "test_arc_app_title"; constexpr char kUuidFormat[] = "9e186d5a-502e-49ce-9ee1-00000000000%d"; constexpr char kAdminTemplateUuidFormat[] = "59dbe2b8-671f-4fd0-92ec-11111111100%d"; @@ -228,6 +229,8 @@ app->set_display_id(99887766l); app->set_z_index(233); app->set_window_id(2555); + + app_window->set_title(kTestArcAppTitle); } WorkspaceDeskSpecifics ExampleWorkspaceDeskSpecifics( @@ -598,6 +601,31 @@ EXPECT_THAT(converted_desk_proto, EqualsSpecifics(desk_proto)); } +TEST_F(DeskSyncBridgeTest, DeskTemplateJsonConversionShouldBeLossless) { + CreateBridge(); + + WorkspaceDeskSpecifics desk_proto = ExampleWorkspaceDeskSpecifics( + kTestUuid1.AsLowercaseString(), "template 1"); + + std::unique_ptr<DeskTemplate> desk_template = + DeskSyncBridge::FromSyncProto(desk_proto); + + base::Value template_value = + desk_template_conversion::SerializeDeskTemplateAsPolicy( + desk_template.get(), app_cache()); + + std::unique_ptr<ash::DeskTemplate> converted_desk_template = + desk_template_conversion::ParseDeskTemplateFromPolicy(template_value); + + EXPECT_EQ(desk_template->desk_restore_data()->ConvertToValue(), + converted_desk_template->desk_restore_data()->ConvertToValue()); + + WorkspaceDeskSpecifics converted_desk_proto = + bridge()->ToSyncProto(converted_desk_template.get()); + + EXPECT_THAT(converted_desk_proto, EqualsSpecifics(desk_proto)); +} + TEST_F(DeskSyncBridgeTest, AppNameConversionShouldBeLossless) { CreateBridge();
diff --git a/components/desks_storage/core/desk_template_conversion.cc b/components/desks_storage/core/desk_template_conversion.cc index fbd29ac..176c035 100644 --- a/components/desks_storage/core/desk_template_conversion.cc +++ b/components/desks_storage/core/desk_template_conversion.cc
@@ -9,6 +9,7 @@ #include "base/json/json_reader.h" #include "base/json/values_util.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "components/app_constants/constants.h" #include "components/app_restore/app_launch_info.h" @@ -16,11 +17,16 @@ #include "components/app_restore/window_info.h" #include "components/services/app_service/public/cpp/app_registry_cache.h" #include "components/services/app_service/public/cpp/app_types.h" +#include "components/sync/protocol/proto_enum_conversions.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/rect.h" namespace { +using SyncWindowOpenDisposition = + sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition; +using SyncLaunchContainer = sync_pb::WorkspaceDeskSpecifics_LaunchContainer; + // JSON value keys. constexpr char kActiveTabIndex[] = "active_tab_index"; constexpr char kAppId[] = "app_id"; @@ -30,13 +36,27 @@ constexpr char kAppTypeBrowser[] = "BROWSER"; constexpr char kAppTypeChrome[] = "CHROME_APP"; constexpr char kAppTypeProgressiveWeb[] = "PWA"; +constexpr char kAppTypeArc[] = "ARC"; +constexpr char kBoundsInRoot[] = "bounds_in_root"; constexpr char kCreatedTime[] = "created_time_usec"; constexpr char kDesk[] = "desk"; constexpr char kDisplayId[] = "display_id"; +constexpr char kEventFlag[] = "event_flag"; +constexpr char kLaunchContainer[] = "launch_container"; +constexpr char kLaunchContainerWindow[] = "LAUNCH_CONTAINER_WINDOW"; +constexpr char kLaunchContainerUnspecified[] = "LAUNCH_CONTAINER_UNSPECIFIED"; +constexpr char kLaunchContainerPanelDeprecated[] = "LAUNCH_CONTAINER_PANEL"; +constexpr char kLaunchContainerTab[] = "LAUNCH_CONTAINER_TAB"; +constexpr char kLaunchContainerNone[] = "LAUNCH_CONTAINER_NONE"; +constexpr char kMaximumSize[] = "maximum_size"; +constexpr char kMinimumSize[] = "minimum_size"; constexpr char kName[] = "name"; constexpr char kPreMinimizedWindowState[] = "pre_minimized_window_state"; +constexpr char kSizeHeight[] = "height"; +constexpr char kSizeWidth[] = "width"; constexpr char kTabs[] = "tabs"; constexpr char kTabUrl[] = "url"; +constexpr char kTitle[] = "title"; constexpr char kUpdatedTime[] = "updated_time_usec"; constexpr char kUuid[] = "uuid"; constexpr char kVersion[] = "version"; @@ -46,6 +66,20 @@ constexpr char kWindowBoundLeft[] = "left"; constexpr char kWindowBoundTop[] = "top"; constexpr char kWindowBoundWidth[] = "width"; +constexpr char kWindowOpenDisposition[] = "window_open_disposition"; +constexpr char kWindowOpenDispositionUnknown[] = "UNKOWN"; +constexpr char kWindowOpenDispositionCurrentTab[] = "CURRENT_TAB"; +constexpr char kWindowOpenDispositionSingletonTab[] = "SINGLETON_TAB"; +constexpr char kWindowOpenDispositionNewForegroundTab[] = "NEW_FOREGROUND_TAB"; +constexpr char kWindowOpenDispositionNewBackgroundTab[] = "NEW_BACKGROUND_TAB"; +constexpr char kWindowOpenDispositionNewPopup[] = "NEW_POPUP"; +constexpr char kWindowOpenDispositionNewWindow[] = "NEW_WINDOW"; +constexpr char kWindowOpenDispositionSaveToDisk[] = "SAVE_TO_DISK"; +constexpr char kWindowOpenDispositionOffTheRecord[] = "OFF_THE_RECORD"; +constexpr char kWindowOpenDispositionIgnoreAction[] = "IGNORE_ACTION"; +constexpr char kWindowOpenDispositionSwitchToTab[] = "SWITCH_TO_TAB"; +constexpr char kWindowOpenDispositionNewPictureInPicture[] = + "NEW_PICTURE_IN_PICTURE"; constexpr char kWindowState[] = "window_state"; constexpr char kWindowStateNormal[] = "NORMAL"; constexpr char kWindowStateMinimized[] = "MINIMIZED"; @@ -97,7 +131,8 @@ if (app_type == kAppTypeBrowser) { // Browser app has a known app ID. return std::string(app_constants::kChromeAppId); - } else if (app_type == kAppTypeChrome || app_type == kAppTypeProgressiveWeb) { + } else if (app_type == kAppTypeChrome || app_type == kAppTypeProgressiveWeb || + app_type == kAppTypeArc) { // Read the provided app ID std::string app_id; if (GetString(app, kAppId, &app_id)) { @@ -109,6 +144,90 @@ return std::string(); } +// Returns true if launch container string value is valid. +bool IsValidLaunchContainer(const std::string& launch_container) { + return launch_container == kLaunchContainerWindow || + launch_container == kLaunchContainerPanelDeprecated || + launch_container == kLaunchContainerTab || + launch_container == kLaunchContainerNone || + launch_container == kLaunchContainerUnspecified; +} + +// Returns a casted apps::mojom::LaunchContainer to be set as an app restore +// data's container field. +int32_t StringToLaunchContainer(const std::string& launch_container) { + if (launch_container == kLaunchContainerWindow) { + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerWindow); + } else if (launch_container == kLaunchContainerPanelDeprecated) { + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated); + } else if (launch_container == kLaunchContainerTab) { + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerTab); + } else if (launch_container == kLaunchContainerNone) { + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerNone); + } else if (launch_container == kLaunchContainerUnspecified) { + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerWindow); + // Dcheck if our container isn't valid. We should not reach here. + } else { + DCHECK(IsValidLaunchContainer(launch_container)); + return static_cast<int32_t>( + apps::mojom::LaunchContainer::kLaunchContainerWindow); + } +} + +// Returns true if the disposition is a valid value. +bool IsValidWindowOpenDisposition(const std::string& disposition) { + return disposition == kWindowOpenDispositionUnknown || + disposition == kWindowOpenDispositionCurrentTab || + disposition == kWindowOpenDispositionSingletonTab || + disposition == kWindowOpenDispositionNewForegroundTab || + disposition == kWindowOpenDispositionNewBackgroundTab || + disposition == kWindowOpenDispositionNewPopup || + disposition == kWindowOpenDispositionNewWindow || + disposition == kWindowOpenDispositionSaveToDisk || + disposition == kWindowOpenDispositionOffTheRecord || + disposition == kWindowOpenDispositionIgnoreAction || + disposition == kWindowOpenDispositionSwitchToTab || + disposition == kWindowOpenDispositionNewPictureInPicture; +} + +// Returns a casted WindowOpenDisposition to be set in the app restore data. +int32_t StringToWindowOpenDisposition(const std::string& disposition) { + if (disposition == kWindowOpenDispositionUnknown) { + return static_cast<int32_t>(WindowOpenDisposition::UNKNOWN); + } else if (disposition == kWindowOpenDispositionCurrentTab) { + return static_cast<int32_t>(WindowOpenDisposition::CURRENT_TAB); + } else if (disposition == kWindowOpenDispositionSingletonTab) { + return static_cast<int32_t>(WindowOpenDisposition::SINGLETON_TAB); + } else if (disposition == kWindowOpenDispositionNewForegroundTab) { + return static_cast<int32_t>(WindowOpenDisposition::NEW_FOREGROUND_TAB); + } else if (disposition == kWindowOpenDispositionNewBackgroundTab) { + return static_cast<int32_t>(WindowOpenDisposition::NEW_BACKGROUND_TAB); + } else if (disposition == kWindowOpenDispositionNewPopup) { + return static_cast<int32_t>(WindowOpenDisposition::NEW_POPUP); + } else if (disposition == kWindowOpenDispositionNewWindow) { + return static_cast<int32_t>(WindowOpenDisposition::NEW_WINDOW); + } else if (disposition == kWindowOpenDispositionSaveToDisk) { + return static_cast<int32_t>(WindowOpenDisposition::SAVE_TO_DISK); + } else if (disposition == kWindowOpenDispositionOffTheRecord) { + return static_cast<int32_t>(WindowOpenDisposition::OFF_THE_RECORD); + } else if (disposition == kWindowOpenDispositionIgnoreAction) { + return static_cast<int32_t>(WindowOpenDisposition::IGNORE_ACTION); + } else if (disposition == kWindowOpenDispositionNewPictureInPicture) { + return static_cast<int32_t>(WindowOpenDisposition::NEW_PICTURE_IN_PICTURE); + + // Dcheck that the disposition is valid, we should never get here unless + // the disposition is invalid. + } else { + DCHECK(IsValidWindowOpenDisposition(disposition)); + return static_cast<int32_t>(WindowOpenDisposition::UNKNOWN); + } +} + // Convert App JSON to |app_restore::AppLaunchInfo|. std::unique_ptr<app_restore::AppLaunchInfo> ConvertJsonToAppLaunchInfo( const base::Value& app) { @@ -139,10 +258,25 @@ return nullptr; } + std::string launch_container; + if (GetString(app, kLaunchContainer, &launch_container) && + IsValidLaunchContainer(launch_container)) { + app_launch_info->container = StringToLaunchContainer(launch_container); + } + + std::string disposition; + if (GetString(app, kWindowOpenDisposition, &disposition) && + IsValidWindowOpenDisposition(disposition)) { + app_launch_info->disposition = StringToWindowOpenDisposition(disposition); + } + std::string app_name; if (GetString(app, kAppName, &app_name)) app_launch_info->app_name = app_name; + // TODO(crbug.com/1311801): Add support for actual event_flag values. + app_launch_info->event_flag = 0; + if (app_type == kAppTypeBrowser) { int active_tab_index; if (GetInt(app, kActiveTabIndex, &active_tab_index)) @@ -218,6 +352,40 @@ return chromeos::WindowStateType::kNormal; } +void FillArcExtraWindowInfoFromJson( + const base::Value& app, + app_restore::WindowInfo::ArcExtraInfo* out_window_info) { + const base::Value* bounds_in_root = app.FindDictKey(kBoundsInRoot); + int top; + int left; + int bounds_width; + int bounds_height; + if (bounds_in_root && GetInt(bounds_in_root, kWindowBoundTop, &top) && + GetInt(bounds_in_root, kWindowBoundLeft, &left) && + GetInt(bounds_in_root, kWindowBoundWidth, &bounds_width) && + GetInt(bounds_in_root, kWindowBoundHeight, &bounds_height)) + out_window_info->bounds_in_root.emplace(left, top, bounds_width, + bounds_height); + + const base::Value* maximum_size = app.FindDictKey(kMaximumSize); + int max_width; + int max_height; + if (maximum_size && GetInt(maximum_size, kSizeWidth, &max_width) && + GetInt(maximum_size, kSizeHeight, &max_height)) + out_window_info->maximum_size.emplace(max_width, max_height); + + const base::Value* minimum_size = app.FindDictKey(kMinimumSize); + int min_width; + int min_height; + if (minimum_size && GetInt(minimum_size, kSizeWidth, &min_width) && + GetInt(minimum_size, kSizeHeight, &min_height)) + out_window_info->minimum_size.emplace(min_width, min_height); + + std::string title; + if (GetString(app, kTitle, &title)) + out_window_info->title.emplace(base::UTF8ToUTF16(title)); +} + // Fill |out_window_info| with information from JSON |app|. void FillWindowInfoFromJson(const base::Value& app, app_restore::WindowInfo* out_window_info) { @@ -228,6 +396,12 @@ ToChromeOsWindowState(window_state)); } + std::string app_type; + if (GetString(app, kAppType, &app_type) && app_type == kAppTypeArc) { + FillArcExtraWindowInfoFromJson(app, + &out_window_info->arc_extra_info.emplace()); + } + const base::Value* window_bound = app.FindDictKey(kWindowBound); int top; int left; @@ -303,6 +477,15 @@ return rectangle_value; } +base::Value ConvertSizeToValue(const gfx::Size& size) { + base::Value size_value(base::Value::Type::DICTIONARY); + + size_value.SetKey(kSizeWidth, base::Value(size.width())); + size_value.SetKey(kSizeHeight, base::Value(size.height())); + + return size_value; +} + // Convert ui::WindowStateType |window_state| to std::string used by the // base::Value representation. std::string ChromeOsWindowStateToString( @@ -348,6 +531,52 @@ } } +// Returns a string WindowOpenDisposition when given a value of the +// WindowOpenDisposition passed into this function. Assumes the caller +// casts the disposition from a int32_t. +std::string WindowOpenDispositionToString(WindowOpenDisposition disposition) { + switch (disposition) { + case WindowOpenDisposition::UNKNOWN: + return kWindowOpenDispositionUnknown; + case WindowOpenDisposition::CURRENT_TAB: + return kWindowOpenDispositionCurrentTab; + case WindowOpenDisposition::SINGLETON_TAB: + return kWindowOpenDispositionSingletonTab; + case WindowOpenDisposition::NEW_FOREGROUND_TAB: + return kWindowOpenDispositionNewForegroundTab; + case WindowOpenDisposition::NEW_BACKGROUND_TAB: + return kWindowOpenDispositionNewBackgroundTab; + case WindowOpenDisposition::NEW_POPUP: + return kWindowOpenDispositionNewPopup; + case WindowOpenDisposition::NEW_WINDOW: + return kWindowOpenDispositionNewWindow; + case WindowOpenDisposition::SAVE_TO_DISK: + return kWindowOpenDispositionSaveToDisk; + case WindowOpenDisposition::SWITCH_TO_TAB: + return kWindowOpenDispositionSwitchToTab; + case WindowOpenDisposition::OFF_THE_RECORD: + return kWindowOpenDispositionOffTheRecord; + case WindowOpenDisposition::IGNORE_ACTION: + return kWindowOpenDispositionIgnoreAction; + case WindowOpenDisposition::NEW_PICTURE_IN_PICTURE: + return kWindowOpenDispositionNewPictureInPicture; + } +} + +std::string LaunchContainerToString( + apps::mojom::LaunchContainer launch_container) { + switch (launch_container) { + case apps::mojom::LaunchContainer::kLaunchContainerWindow: + return kLaunchContainerWindow; + case apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated: + return kLaunchContainerPanelDeprecated; + case apps::mojom::LaunchContainer::kLaunchContainerTab: + return kLaunchContainerTab; + case apps::mojom::LaunchContainer::kLaunchContainerNone: + return kLaunchContainerNone; + } +} + base::Value ConvertURLsToBrowserAppTabValues(const std::vector<GURL>& urls) { base::Value tab_list = base::Value(base::Value::Type::LIST); @@ -372,6 +601,8 @@ : kAppTypeProgressiveWeb; case apps::AppType::kChromeApp: return kAppTypeChrome; + case apps::AppType::kArc: + return kAppTypeArc; default: // Default to browser if unsupported, this shouldn't be captured and // there is no error type in the proto definition. @@ -390,11 +621,33 @@ ConvertWindowBoundToValue(app->current_bounds.value())); } + if (app->bounds_in_root.has_value()) { + app_data.SetKey(kBoundsInRoot, + ConvertWindowBoundToValue(app->bounds_in_root.value())); + } + + if (app->minimum_size.has_value()) { + app_data.SetKey(kMinimumSize, + ConvertSizeToValue(app->minimum_size.value())); + } + + if (app->maximum_size.has_value()) { + app_data.SetKey(kMaximumSize, + ConvertSizeToValue(app->maximum_size.value())); + } + + if (app->title.has_value()) { + app_data.SetKey(kTitle, base::Value(base::UTF16ToUTF8(app->title.value()))); + } + if (app->window_state_type.has_value()) { app_data.SetKey(kWindowState, base::Value(ChromeOsWindowStateToString( app->window_state_type.value()))); } + // TODO(crbug.com/1311801): Add support for actual event_flag values. + app_data.SetKey(kEventFlag, base::Value(0)); + if (app->activation_index.has_value()) app_data.SetKey(kZIndex, base::Value(app->activation_index.value())); @@ -429,6 +682,20 @@ if (app->app_name.has_value()) app_data.SetKey(kAppName, base::Value(app->app_name.value())); + if (app->disposition.has_value()) { + WindowOpenDisposition disposition = + static_cast<WindowOpenDisposition>(app->disposition.value()); + app_data.SetKey(kWindowOpenDisposition, + base::Value(WindowOpenDispositionToString(disposition))); + } + + if (app->container.has_value()) { + apps::mojom::LaunchContainer container = + static_cast<apps::mojom::LaunchContainer>(app->container.value()); + app_data.SetKey(kLaunchContainer, + base::Value(LaunchContainerToString(container))); + } + return app_data; } @@ -520,6 +787,113 @@ return desk_dict; } +WindowOpenDisposition ToBaseWindowOpenDisposition( + SyncWindowOpenDisposition disposition) { + switch (disposition) { + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_UNKNOWN: + return WindowOpenDisposition::UNKNOWN; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_CURRENT_TAB: + return WindowOpenDisposition::CURRENT_TAB; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SINGLETON_TAB: + return WindowOpenDisposition::SINGLETON_TAB; + case sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_FOREGROUND_TAB: + return WindowOpenDisposition::NEW_FOREGROUND_TAB; + case sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_BACKGROUND_TAB: + return WindowOpenDisposition::NEW_BACKGROUND_TAB; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_POPUP: + return WindowOpenDisposition::NEW_POPUP; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_WINDOW: + return WindowOpenDisposition::NEW_WINDOW; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SAVE_TO_DISK: + return WindowOpenDisposition::SAVE_TO_DISK; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_OFF_THE_RECORD: + return WindowOpenDisposition::OFF_THE_RECORD; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_IGNORE_ACTION: + return WindowOpenDisposition::IGNORE_ACTION; + case sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SWITCH_TO_TAB: + return WindowOpenDisposition::SWITCH_TO_TAB; + case sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_PICTURE_IN_PICTURE: + return WindowOpenDisposition::NEW_PICTURE_IN_PICTURE; + } +} + +SyncWindowOpenDisposition FromBaseWindowOpenDisposition( + WindowOpenDisposition disposition) { + switch (disposition) { + case WindowOpenDisposition::UNKNOWN: + return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_UNKNOWN; + case WindowOpenDisposition::CURRENT_TAB: + return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_CURRENT_TAB; + case WindowOpenDisposition::SINGLETON_TAB: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_SINGLETON_TAB; + case WindowOpenDisposition::NEW_FOREGROUND_TAB: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_FOREGROUND_TAB; + case WindowOpenDisposition::NEW_BACKGROUND_TAB: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_BACKGROUND_TAB; + case WindowOpenDisposition::NEW_POPUP: + return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_POPUP; + case WindowOpenDisposition::NEW_WINDOW: + return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_WINDOW; + case WindowOpenDisposition::SAVE_TO_DISK: + return sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition_SAVE_TO_DISK; + case WindowOpenDisposition::OFF_THE_RECORD: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_OFF_THE_RECORD; + case WindowOpenDisposition::IGNORE_ACTION: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_IGNORE_ACTION; + case WindowOpenDisposition::SWITCH_TO_TAB: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_SWITCH_TO_TAB; + case WindowOpenDisposition::NEW_PICTURE_IN_PICTURE: + return sync_pb:: + WorkspaceDeskSpecifics_WindowOpenDisposition_NEW_PICTURE_IN_PICTURE; + } +} + +SyncLaunchContainer FromMojomLaunchContainer( + apps::mojom::LaunchContainer container) { + switch (container) { + case apps::mojom::LaunchContainer::kLaunchContainerWindow: + return sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_WINDOW; + case apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated: + return sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_PANEL_DEPRECATED; + case apps::mojom::LaunchContainer::kLaunchContainerTab: + return sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_TAB; + case apps::mojom::LaunchContainer::kLaunchContainerNone: + return sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_NONE; + } +} + +apps::mojom::LaunchContainer ToMojomLaunchContainer( + SyncLaunchContainer container) { + switch (container) { + case sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_UNSPECIFIED: + return apps::mojom::LaunchContainer::kLaunchContainerWindow; + case sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_WINDOW: + return apps::mojom::LaunchContainer::kLaunchContainerWindow; + case sync_pb:: + WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_PANEL_DEPRECATED: + return apps::mojom::LaunchContainer::kLaunchContainerPanelDeprecated; + case sync_pb::WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_TAB: + return apps::mojom::LaunchContainer::kLaunchContainerTab; + case sync_pb::WorkspaceDeskSpecifics_LaunchContainer_LAUNCH_CONTAINER_NONE: + return apps::mojom::LaunchContainer::kLaunchContainerNone; + } +} + } // namespace desk_template_conversion } // namespace desks_storage
diff --git a/components/desks_storage/core/desk_template_conversion.h b/components/desks_storage/core/desk_template_conversion.h index c9d5e4ec0..8ea3c2c 100644 --- a/components/desks_storage/core/desk_template_conversion.h +++ b/components/desks_storage/core/desk_template_conversion.h
@@ -7,6 +7,9 @@ #include "base/time/time.h" #include "base/values.h" +#include "components/services/app_service/public/cpp/app_types.h" +#include "components/sync/protocol/workspace_desk_specifics.pb.h" +#include "ui/base/window_open_disposition.h" namespace ash { class DeskTemplate; @@ -24,6 +27,10 @@ namespace desk_template_conversion { +using SyncWindowOpenDisposition = + sync_pb::WorkspaceDeskSpecifics_WindowOpenDisposition; +using SyncLaunchContainer = sync_pb::WorkspaceDeskSpecifics_LaunchContainer; + // Converts a time field from sync protobufs to a time object. base::Time ProtoTimeToTime(int64_t proto_time); @@ -41,6 +48,30 @@ const ash::DeskTemplate* desk_template, apps::AppRegistryCache* app_cache); +// Convert sync proto WindowOpenDisposition to base's WindowOpenDisposition. +// This value is cast to int32_t by the caller to be assigned to the +// `disposition` field in AppRestoreData. +WindowOpenDisposition ToBaseWindowOpenDisposition( + SyncWindowOpenDisposition disposition); + +// Convert sync proto WindowOpenDisposition to base's WindowOpenDisposition. +// This value is cast to int32_t by the caller to be assigned to the +// `disposition` field in AppRestoreData. +SyncWindowOpenDisposition FromBaseWindowOpenDisposition( + WindowOpenDisposition disposition); + +// Convert from apps::mojom::LaunchContainer to sunc proto LaunchContainer. +// Assumes caller has cast `container` from int32_t to +// apps::mojom::LaunchContainer. +SyncLaunchContainer FromMojomLaunchContainer( + apps::mojom::LaunchContainer container); + +// Convert sync proto LaunchContainer to apps::Mojom::LaunchContainer +// used in the AppRestoreData `container` field. This value is cast to +// int32_t by the caller to be assigned to the field in AppRestoreData. +apps::mojom::LaunchContainer ToMojomLaunchContainer( + SyncLaunchContainer container); + } // namespace desk_template_conversion } // namespace desks_storage
diff --git a/components/desks_storage/core/desk_template_conversion_unittests.cc b/components/desks_storage/core/desk_template_conversion_unittests.cc index 84a8dd3..03e6d53 100644 --- a/components/desks_storage/core/desk_template_conversion_unittests.cc +++ b/components/desks_storage/core/desk_template_conversion_unittests.cc
@@ -46,7 +46,8 @@ "\"url\":\"https://example.com/\"},{\"url\":\"https://" "example.com/" "2\"}],\"active_tab_index\":1,\"window_id\":0," - "\"display_id\":\"100\",\"pre_minimized_window_state\":\"NORMAL\"}]}}"; + "\"display_id\":\"100\",\"event_flag\":0,\"pre_minimized_window_state\":" + "\"NORMAL\"}]}}"; const std::string kValidTemplateChromeAndProgressive = "{\"version\":1,\"uuid\":\"" + kTestUuidChromeAndProgressive + "\",\"name\":\"" + kChromePwaTemplateName + @@ -56,13 +57,13 @@ "\"left\":200,\"top\":200,\"height\":1000,\"width\":1000},\"window_state\":" "\"NORMAL\",\"z_index\":2,\"app_type\":\"CHROME_APP\",\"app_id\":\"" + kChromeAppId + - "\",\"window_id\":0,\"display_id\":\"100\",\"pre_" + "\",\"window_id\":0,\"display_id\":\"100\",\"event_flag\":0,\"pre_" "minimized_window_state\":\"NORMAL\"},{\"window_" "bound\":{\"left\":0,\"top\":0,\"height\":120,\"width\":120},\"window_" "state\":\"NORMAL\",\"z_index\":1,\"app_type\":\"PWA\",\"app_id\":\"" + kProgressiveAppid + "\",\"window_id\":1,\"display_id\":" - "\"100\",\"pre_minimized_window_state\":\"NORMAL\"}]}}"; + "\"100\",\"event_flag\":0,\"pre_minimized_window_state\":\"NORMAL\"}]}}"; apps::AppPtr MakeApp(const char* app_id, const char* name,
diff --git a/components/download/internal/background_service/in_memory_download_unittest.cc b/components/download/internal/background_service/in_memory_download_unittest.cc index d52abab..607e8eb7 100644 --- a/components/download/internal/background_service/in_memory_download_unittest.cc +++ b/components/download/internal/background_service/in_memory_download_unittest.cc
@@ -13,7 +13,6 @@ #include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/base/io_buffer.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "services/network/public/mojom/url_response_head.mojom.h"
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc index ca9de38..7af5de1 100644 --- a/components/embedder_support/user_agent_utils.cc +++ b/components/embedder_support/user_agent_utils.cc
@@ -222,8 +222,9 @@ bool enable_updated_grease_by_policy, const std::string& full_version, blink::UserAgentBrandVersionType output_version_type) { - int major_version_number = 0; - DCHECK(base::StringToInt(major_version, &major_version_number)); + int major_version_number; + bool parse_result = base::StringToInt(major_version, &major_version_number); + DCHECK(parse_result); absl::optional<std::string> brand; #if !BUILDFLAG(CHROMIUM_BRANDING) brand = version_info::GetProductName();
diff --git a/components/enterprise/browser/reporting/cloud_reporting_frequency_policy_handler.cc b/components/enterprise/browser/reporting/cloud_reporting_frequency_policy_handler.cc index 6a349cb..c6766b6 100644 --- a/components/enterprise/browser/reporting/cloud_reporting_frequency_policy_handler.cc +++ b/components/enterprise/browser/reporting/cloud_reporting_frequency_policy_handler.cc
@@ -50,9 +50,8 @@ void CloudReportingFrequencyPolicyHandler::ApplyPolicySettings( const policy::PolicyMap& policies, PrefValueMap* prefs) { - // |GetValueUnsafe(...)| is used in order to differentiate between the policy - // value being unset vs being set with an incorrect type. - const base::Value* value = policies.GetValueUnsafe(policy_name()); + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::INTEGER); int value_in_range; if (value && EnsureInRange(value, &value_in_range, nullptr)) prefs->SetValue(kCloudReportingUploadFrequency,
diff --git a/components/enterprise/browser/reporting/cloud_reporting_policy_handler.cc b/components/enterprise/browser/reporting/cloud_reporting_policy_handler.cc index 1f891eb..948a14c 100644 --- a/components/enterprise/browser/reporting/cloud_reporting_policy_handler.cc +++ b/components/enterprise/browser/reporting/cloud_reporting_policy_handler.cc
@@ -29,9 +29,7 @@ bool CloudReportingPolicyHandler::CheckPolicySettings( const policy::PolicyMap& policies, policy::PolicyErrorMap* errors) { - // |GetValueUnsafe(...)| is used in order to differentiate between the policy - // value being unset vs being set with an incorrect type. - if (!policies.GetValueUnsafe(policy_name())) + if (!policies.IsPolicySet(policy_name())) return true; if (!TypeCheckingPolicyHandler::CheckPolicySettings(policies, errors)) return false;
diff --git a/components/enterprise/content/copy_prevention_settings_policy_handler.cc b/components/enterprise/content/copy_prevention_settings_policy_handler.cc index 45d62766..ff184f0 100644 --- a/components/enterprise/content/copy_prevention_settings_policy_handler.cc +++ b/components/enterprise/content/copy_prevention_settings_policy_handler.cc
@@ -31,10 +31,7 @@ bool CopyPreventionSettingsPolicyHandler::CheckPolicySettings( const policy::PolicyMap& policies, policy::PolicyErrorMap* errors) { - // |GetValueUnsafe(...)| is used in order to differentiate between the policy - // value being unset vs being set with an incorrect type. - const base::Value* value = policies.GetValueUnsafe(policy_name()); - if (!value) + if (!policies.IsPolicySet(policy_name())) return true; if (!SchemaValidatingPolicyHandler::CheckPolicySettings(policies, errors)) @@ -47,6 +44,8 @@ return false; } + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::DICT); const base::Value* enable = value->FindListKey( enterprise::content::kCopyPreventionSettingsEnableFieldName); const base::Value* disable = value->FindListKey(
diff --git a/components/exo/wayland/fuzzer/server_environment.h b/components/exo/wayland/fuzzer/server_environment.h index d3f009cf..1197e537 100644 --- a/components/exo/wayland/fuzzer/server_environment.h +++ b/components/exo/wayland/fuzzer/server_environment.h
@@ -7,7 +7,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/exo/wayland/clients/test/wayland_client_test_helper.h" #include "ui/aura/env.h"
diff --git a/components/gcm_driver/gcm_driver_unittest.cc b/components/gcm_driver/gcm_driver_unittest.cc index 2e4d438..bcb5aa5 100644 --- a/components/gcm_driver/gcm_driver_unittest.cc +++ b/components/gcm_driver/gcm_driver_unittest.cc
@@ -15,7 +15,6 @@ #include "base/test/test_simple_task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/gcm_driver/crypto/gcm_decryption_result.h" #include "components/gcm_driver/crypto/gcm_encryption_provider.h" #include "components/gcm_driver/crypto/gcm_encryption_result.h"
diff --git a/components/infobars/core/infobar_delegate.h b/components/infobars/core/infobar_delegate.h index 75c3fc5f..04d1ea0 100644 --- a/components/infobars/core/infobar_delegate.h +++ b/components/infobars/core/infobar_delegate.h
@@ -138,7 +138,7 @@ ADS_BLOCKED_INFOBAR_DELEGATE_ANDROID = 66, INSTANT_APPS_INFOBAR_DELEGATE_ANDROID = 67, // Removed: DATA_REDUCTION_PROXY_PREVIEW_INFOBAR_DELEGATE = 68, - SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID = 69, + // Removed: SCREEN_CAPTURE_INFOBAR_DELEGATE_ANDROID = 69, GROUPED_PERMISSION_INFOBAR_DELEGATE_ANDROID = 70, OFFLINE_PAGE_INFOBAR_DELEGATE_ANDROID = 71, SEARCH_GEOLOCATION_DISCLOSURE_INFOBAR_DELEGATE_ANDROID = 72,
diff --git a/components/metrics/drive_metrics_provider.cc b/components/metrics/drive_metrics_provider.cc index b3e1db5..17e2110 100644 --- a/components/metrics/drive_metrics_provider.cc +++ b/components/metrics/drive_metrics_provider.cc
@@ -14,7 +14,6 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" -#include "base/time/time.h" namespace metrics {
diff --git a/components/metrics/single_sample_metrics_factory_impl_unittest.cc b/components/metrics/single_sample_metrics_factory_impl_unittest.cc index e767b99..0895421 100644 --- a/components/metrics/single_sample_metrics_factory_impl_unittest.cc +++ b/components/metrics/single_sample_metrics_factory_impl_unittest.cc
@@ -12,7 +12,6 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/metrics/single_sample_metrics.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/nacl/loader/nacl_listener.h b/components/nacl/loader/nacl_listener.h index e657f08e..46489e3 100644 --- a/components/nacl/loader/nacl_listener.h +++ b/components/nacl/loader/nacl_listener.h
@@ -16,7 +16,6 @@ #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/nacl/common/nacl_types.h" #include "components/nacl/loader/nacl_ipc_adapter.h"
diff --git a/components/optimization_guide/core/page_topics_model_executor.cc b/components/optimization_guide/core/page_topics_model_executor.cc index 290f47cc..387c62b 100644 --- a/components/optimization_guide/core/page_topics_model_executor.cc +++ b/components/optimization_guide/core/page_topics_model_executor.cc
@@ -135,6 +135,11 @@ if (override_list_) { DCHECK(override_list_file_path_); auto iter = override_list_->find(input); + + base::UmaHistogramBoolean( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", + iter != override_list_->end()); + if (iter != override_list_->end()) { std::move(callback).Run( BatchAnnotationResult::CreatePageTopicsResult(input, iter->second));
diff --git a/components/optimization_guide/core/page_topics_model_executor_unittest.cc b/components/optimization_guide/core/page_topics_model_executor_unittest.cc index 5e2b53d..096d173 100644 --- a/components/optimization_guide/core/page_topics_model_executor_unittest.cc +++ b/components/optimization_guide/core/page_topics_model_executor_unittest.cc
@@ -435,6 +435,8 @@ /*OverrideListFileLoadResult::kCouldNotReadFile=*/2, 1); histogram_tester.ExpectUniqueSample( "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 1); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", 0); } TEST_F(PageTopicsModelExecutorOverrideListTest, BadGzip) { @@ -457,6 +459,8 @@ /*OverrideListFileLoadResult::kCouldNotUncompressFile=*/3, 1); histogram_tester.ExpectUniqueSample( "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 1); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", 0); } TEST_F(PageTopicsModelExecutorOverrideListTest, BadProto) { @@ -479,6 +483,8 @@ /*OverrideListFileLoadResult::kCouldNotUnmarshalProtobuf=*/4, 1); histogram_tester.ExpectUniqueSample( "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 1); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", 0); } TEST_F(PageTopicsModelExecutorOverrideListTest, SuccessCase) { @@ -517,6 +523,47 @@ /*OverrideListFileLoadResult::kSuccess=*/1, 1); histogram_tester.ExpectUniqueSample( "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 1); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", true, 1); +} + +TEST_F(PageTopicsModelExecutorOverrideListTest, InputNotInOverride) { + base::HistogramTester histogram_tester; + + proto::PageTopicsOverrideList override_list; + proto::PageTopicsOverrideEntry* entry = override_list.add_entries(); + entry->set_domain("other"); + entry->mutable_topics()->add_topic_ids(1337); + + std::string enc_pb; + ASSERT_TRUE(override_list.SerializeToString(&enc_pb)); + + base::FilePath add_file = + WriteToTempFile("override_list.pb.gz", Compress(enc_pb)); + SendModelWithAdditionalFilesToExecutor({add_file}); + + base::RunLoop run_loop; + model_executor()->ExecuteJob( + run_loop.QuitClosure(), + std::make_unique<PageContentAnnotationJob>( + base::BindOnce([](const std::vector<BatchAnnotationResult>& results) { + ASSERT_EQ(results.size(), 1U); + EXPECT_EQ(results[0].input(), "input"); + EXPECT_EQ(results[0].type(), AnnotationType::kPageTopics); + // The passed model file isn't valid so we don't expect an output + // here. + EXPECT_FALSE(results[0].topics()); + }), + std::vector<std::string>{"input"}, AnnotationType::kPageTopics)); + run_loop.Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.FileLoadResult", + /*OverrideListFileLoadResult::kSuccess=*/1, 1); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 1); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", false, 1); } TEST_F(PageTopicsModelExecutorOverrideListTest, ModelUnloadsOverrideList) { @@ -542,6 +589,9 @@ base::DoNothing(), std::vector<std::string>{"input"}, AnnotationType::kPageTopics)); run_loop.Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", true, 1); } // Request the model to be unloaded, which should also unload the override @@ -558,6 +608,9 @@ base::DoNothing(), std::vector<std::string>{"input"}, AnnotationType::kPageTopics)); run_loop.Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", true, 2); } histogram_tester.ExpectUniqueSample( @@ -600,6 +653,9 @@ }), std::vector<std::string>{"input"}, AnnotationType::kPageTopics)); run_loop.Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", true, 1); } // Retry an execution and check that the UMA reports the override list being @@ -641,6 +697,8 @@ /*OverrideListFileLoadResult::kSuccess=*/1, 2); histogram_tester.ExpectUniqueSample( "OptimizationGuide.PageTopicsOverrideList.GotFile", true, 2); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.PageTopicsOverrideList.UsedOverride", true, 2); } } // namespace optimization_guide
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc index 8050618..b885308 100644 --- a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc +++ b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -1113,7 +1113,7 @@ NavigationSimulator::CreateRendererInitiated(GURL(kAdUrl), subframe_ad); // The sub-frame renavigates before it commits. navigation_simulator->Start(); - SetIsAdSubframe(subframe_ad, /*is_ad_subframe=*/true); + SetIsAdFrame(subframe_ad, /*is_ad_frame=*/true); navigation_simulator->Fail(net::ERR_ABORTED); // Load resources for the aborted frame (e.g., simulate the navigation @@ -1142,7 +1142,7 @@ NavigationSimulator::CreateRendererInitiated(GURL(kAdUrl), sub_frame); // The sub-frame renavigates before it commits. navigation_simulator->Start(); - SetIsAdSubframe(sub_frame, /*is_ad_subframe=*/true); + SetIsAdFrame(sub_frame, /*is_ad_frame=*/true); navigation_simulator->Fail(net::ERR_ABORTED); // Load resources for the aborted frame (e.g., simulate the navigation @@ -1173,7 +1173,7 @@ // The sub-frame renavigates before it commits. navigation_simulator->Start(); - SetIsAdSubframe(subframe_ad, /*is_ad_subframe=*/true); + SetIsAdFrame(subframe_ad, /*is_ad_frame=*/true); navigation_simulator->Fail(net::ERR_ABORTED); // Renavigate the subframe to a successful commit. But again, the resource @@ -1198,7 +1198,7 @@ // Renavigate and untag the ad frame. auto navigation_simulator = NavigationSimulator::CreateRendererInitiated(GURL(kNonAdUrl), ad_frame); - SetIsAdSubframe(ad_frame, /*is_ad_subframe=*/false); + SetIsAdFrame(ad_frame, /*is_ad_frame=*/false); navigation_simulator->Commit(); ResourceDataUpdate(navigation_simulator->GetFinalRenderFrameHost(), @@ -1408,7 +1408,7 @@ RenderFrameHostTester::For(main_frame)->AppendChild("frame_name"); auto navigation_simulator = NavigationSimulator::CreateRendererInitiated( GURL("https://foo.com"), subframe); - SetIsAdSubframe(subframe, /*is_ad_subframe=*/true); + SetIsAdFrame(subframe, /*is_ad_frame=*/true); navigation_simulator->Commit(); subframe = navigation_simulator->GetFinalRenderFrameHost();
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index bd1bb74..adc26ad 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -189,6 +189,8 @@ "password_store.cc", "password_store.h", "password_store_backend.h", + "password_store_backend_metrics_recorder.cc", + "password_store_backend_metrics_recorder.h", "password_store_built_in_backend.cc", "password_store_built_in_backend.h", "password_store_change.cc", @@ -736,6 +738,7 @@ "built_in_backend_to_android_backend_migrator_unittest.cc", "capabilities_service_impl_unittest.cc", "password_scripts_fetcher_impl_unittests.cc", + "password_store_backend_metrics_recorder_unittest.cc", "password_store_backend_migration_decorator_unittest.cc", "password_store_proxy_backend_unittest.cc", "saved_passwords_capabilities_fetcher_unittest.cc",
diff --git a/components/password_manager/core/browser/login_database_async_helper.cc b/components/password_manager/core/browser/login_database_async_helper.cc index e19293e3..a8b7fa5 100644 --- a/components/password_manager/core/browser/login_database_async_helper.cc +++ b/components/password_manager/core/browser/login_database_async_helper.cc
@@ -74,22 +74,34 @@ return success; } -LoginsResult LoginDatabaseAsyncHelper::GetAllLogins() { +LoginsResult LoginDatabaseAsyncHelper::GetAllLogins( + PasswordStoreBackendMetricsRecorder metrics_recorder) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); PrimaryKeyToFormMap key_to_form_map; - if (!login_db_) + if (!login_db_) { + metrics_recorder.RecordMetrics( + /*success=*/false, + /*error=*/absl::optional<ErrorFromPasswordStoreOrAndroidBackend>( + PasswordStoreBackendError::kUnrecoverable)); return {}; + } FormRetrievalResult result = login_db_->GetAllLogins(&key_to_form_map); if (result != FormRetrievalResult::kSuccess && - result != FormRetrievalResult::kEncryptionServiceFailureWithPartialData) + result != FormRetrievalResult::kEncryptionServiceFailureWithPartialData) { + metrics_recorder.RecordMetrics( + /*success=*/false, + /*error=*/absl::optional<ErrorFromPasswordStoreOrAndroidBackend>( + PasswordStoreBackendError::kUnrecoverable)); return {}; + } std::vector<std::unique_ptr<PasswordForm>> obtained_forms; obtained_forms.reserve(key_to_form_map.size()); for (auto& pair : key_to_form_map) { obtained_forms.push_back(std::move(pair.second)); } + metrics_recorder.RecordMetrics(/*success=*/true, /*error=*/absl::nullopt); return obtained_forms; }
diff --git a/components/password_manager/core/browser/login_database_async_helper.h b/components/password_manager/core/browser/login_database_async_helper.h index 9843e57..796b526 100644 --- a/components/password_manager/core/browser/login_database_async_helper.h +++ b/components/password_manager/core/browser/login_database_async_helper.h
@@ -9,6 +9,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "components/password_manager/core/browser/password_store_backend.h" +#include "components/password_manager/core/browser/password_store_backend_metrics_recorder.h" #include "components/password_manager/core/browser/password_store_sync.h" namespace syncer { @@ -41,7 +42,8 @@ base::RepeatingClosure sync_enabled_or_disabled_cb); // Synchronous implementation of PasswordStoreBackend interface. - LoginsResult GetAllLogins(); + LoginsResult GetAllLogins( + PasswordStoreBackendMetricsRecorder metrics_recorder); LoginsResult GetAutofillableLogins(); LoginsResult FillMatchingLogins(const std::vector<PasswordFormDigest>& forms, bool include_psl);
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h index 291ad17c..26ec156 100644 --- a/components/password_manager/core/browser/password_manager_client.h +++ b/components/password_manager/core/browser/password_manager_client.h
@@ -99,7 +99,9 @@ }; // An abstraction of operations that depend on the embedders (e.g. Chrome) -// environment. +// environment. PasswordManagerClient is instantiated once per WebContents. +// Main frame w.r.t WebContents refers to the primary main frame so usages of +// main frame here are also referring to the primary main frame. class PasswordManagerClient { public: using CredentialsCallback = base::OnceCallback<void(const PasswordForm*)>; @@ -297,6 +299,8 @@ virtual bool WasLastNavigationHTTPError() const; // Obtains the cert status for the main frame. + // The WebContents only has a primary main frame, so MainFrame here refers to + // the primary main frame. virtual net::CertStatus GetMainFrameCertStatus() const; // Shows the dialog where the user can accept or decline the global autosignin @@ -326,6 +330,8 @@ virtual autofill::AutofillDownloadManager* GetAutofillDownloadManager(); // Returns true if the main frame URL has a secure origin. + // The WebContents only has a primary main frame, so MainFrame here refers to + // the primary main frame. virtual bool IsCommittedMainFrameSecure() const; // Returns the committed main frame URL.
diff --git a/components/password_manager/core/browser/password_store_backend_metrics_recorder.cc b/components/password_manager/core/browser/password_store_backend_metrics_recorder.cc new file mode 100644 index 0000000..3d70ba6 --- /dev/null +++ b/components/password_manager/core/browser/password_store_backend_metrics_recorder.cc
@@ -0,0 +1,66 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/password_store_backend_metrics_recorder.h" + +namespace password_manager { + +PasswordStoreBackendMetricsRecorder::PasswordStoreBackendMetricsRecorder() = + default; + +PasswordStoreBackendMetricsRecorder::PasswordStoreBackendMetricsRecorder( + ClassInfix class_infix, + MetricInfix metric_infix) + : class_infix_(std::move(class_infix)), + metric_infix_(std::move(metric_infix)) {} + +PasswordStoreBackendMetricsRecorder::PasswordStoreBackendMetricsRecorder( + PasswordStoreBackendMetricsRecorder&&) = default; + +PasswordStoreBackendMetricsRecorder& PasswordStoreBackendMetricsRecorder:: + PasswordStoreBackendMetricsRecorder::operator=( + PasswordStoreBackendMetricsRecorder&&) = default; + +PasswordStoreBackendMetricsRecorder::~PasswordStoreBackendMetricsRecorder() = + default; + +void PasswordStoreBackendMetricsRecorder::RecordMetrics( + bool success, + absl::optional<ErrorFromPasswordStoreOrAndroidBackend> error) const { + auto BuildMetricName = [this](base::StringPiece suffix) { + return base::StrCat( + {"PasswordManager.", *class_infix_, ".", *metric_infix_, ".", suffix}); + }; + base::TimeDelta duration = base::Time::Now() - start_; + base::UmaHistogramMediumTimes(BuildMetricName("Latency"), duration); + base::UmaHistogramBoolean(BuildMetricName("Success"), success); + if (!error.has_value()) + return; + + DCHECK(!success); + ErrorFromPasswordStoreOrAndroidBackend error_variant = + std::move(error.value()); + // In case of AndroidBackend error, we report additional metrics. + if (absl::holds_alternative<AndroidBackendError>(error_variant)) { + AndroidBackendError backend_error = std::move(absl::get<1>(error_variant)); + base::UmaHistogramEnumeration( + "PasswordManager.PasswordStoreAndroidBackend.ErrorCode", + backend_error.type); + base::UmaHistogramEnumeration(BuildMetricName("ErrorCode"), + backend_error.type); + if (backend_error.type == AndroidBackendErrorType::kExternalError) { + DCHECK(backend_error.api_error_code.has_value()); + base::HistogramBase* histogram = base::SparseHistogram::FactoryGet( + "PasswordManager.PasswordStoreAndroidBackend.APIError", + base::HistogramBase::kUmaTargetedHistogramFlag); + histogram->Add(backend_error.api_error_code.value()); + histogram = base::SparseHistogram::FactoryGet( + BuildMetricName("APIError"), + base::HistogramBase::kUmaTargetedHistogramFlag); + histogram->Add(backend_error.api_error_code.value()); + } + } +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_backend_metrics_recorder.h b/components/password_manager/core/browser/password_store_backend_metrics_recorder.h new file mode 100644 index 0000000..f7def32 --- /dev/null +++ b/components/password_manager/core/browser/password_store_backend_metrics_recorder.h
@@ -0,0 +1,57 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_BACKEND_METRICS_RECORDER_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_BACKEND_METRICS_RECORDER_H_ + +#include "base/metrics/histogram_functions.h" +#include "base/metrics/sparse_histogram.h" +#include "base/strings/strcat.h" +#include "components/password_manager/core/browser/android_backend_error.h" +#include "components/password_manager/core/browser/password_store_util.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace password_manager { + +using ErrorFromPasswordStoreOrAndroidBackend = + absl::variant<PasswordStoreBackendError, AndroidBackendError>; + +using MetricInfix = base::StrongAlias<struct MetricNameTag, std::string>; +using ClassInfix = base::StrongAlias<struct ClassNameTag, std::string>; + +// Records metrics for an asynchronous job or a series of jobs. The job is +// expected to have started when the PasswordStoreBackendMetricsRecorder +// instance is created. Latency is reported in RecordMetrics() under that +// assumption. +class PasswordStoreBackendMetricsRecorder { + public: + PasswordStoreBackendMetricsRecorder(); + explicit PasswordStoreBackendMetricsRecorder(ClassInfix class_name, + MetricInfix metric_name); + PasswordStoreBackendMetricsRecorder(PasswordStoreBackendMetricsRecorder&&); + PasswordStoreBackendMetricsRecorder& operator=( + PasswordStoreBackendMetricsRecorder&&); + ~PasswordStoreBackendMetricsRecorder(); + + // Records the following metrics: + // - "PasswordManager.<class_infix_>.<metric_infix_>.Latency" + // - "PasswordManager.<class_infix_>.<metric_infix_>.Success" + // When |error| is specified, the following metrcis are recorded in + // addition: + // - "PasswordManager.<class_infix_>.APIError" + // - "PasswordManager.<class_infix_>.ErrorCode" + // - "PasswordManager.<class_infix_>.<metric_infix_>.APIError" + // - "PasswordManager.<class_infix_>.<metric_infix_>.ErrorCode" + void RecordMetrics( + bool success, + absl::optional<ErrorFromPasswordStoreOrAndroidBackend> error) const; + + private: + ClassInfix class_infix_; + MetricInfix metric_infix_; + base::Time start_ = base::Time::Now(); +}; +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_PASSWORD_STORE_BACKEND_METRICS_RECORDER_H_ \ No newline at end of file
diff --git a/components/password_manager/core/browser/password_store_backend_metrics_recorder_unittest.cc b/components/password_manager/core/browser/password_store_backend_metrics_recorder_unittest.cc new file mode 100644 index 0000000..7372c45 --- /dev/null +++ b/components/password_manager/core/browser/password_store_backend_metrics_recorder_unittest.cc
@@ -0,0 +1,55 @@ +// Copyright (c) 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/password_store_backend_metrics_recorder.h" + +#include "base/test/metrics/histogram_tester.h" +#include "base/test/task_environment.h" +#include "components/password_manager/core/browser/password_manager_test_utils.h" +#include "components/password_manager/core/browser/password_store_backend_metrics_recorder.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace password_manager { + +namespace { +constexpr auto kLatencyDelta = base::Milliseconds(123u); +} // anonymous namespace + +class PasswordStoreBackendMetricsRecorderTest : public testing::Test { + public: + void AdvanceClock(base::TimeDelta millis) { + // AdvanceClock is used here because FastForwardBy doesn't work for the + // intended purpose. FastForwardBy performs the queued actions first and + // then makes the clock tick and for the tests that follow we want to + // advance the clock before certain async tasks happen. + task_environment_.AdvanceClock(millis); + } + + private: + base::test::TaskEnvironment task_environment_{ + base::test::TaskEnvironment::MainThreadType::UI, + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; +}; + +TEST_F(PasswordStoreBackendMetricsRecorderTest, RecordMetrics) { + const char kDurationMetric[] = "PasswordManager.SomeClass.MethodName.Latency"; + const char kSuccessMetric[] = "PasswordManager.SomeClass.MethodName.Success"; + base::HistogramTester histogram_tester; + + PasswordStoreBackendMetricsRecorder metrics_recorder = + PasswordStoreBackendMetricsRecorder(ClassInfix("SomeClass"), + MetricInfix("MethodName")); + + AdvanceClock(kLatencyDelta); + + metrics_recorder.RecordMetrics(/*success=*/true, /*error=*/absl::nullopt); + + histogram_tester.ExpectTotalCount(kDurationMetric, 1); + histogram_tester.ExpectTimeBucketCount(kDurationMetric, kLatencyDelta, 1); + histogram_tester.ExpectTotalCount(kSuccessMetric, 1); + histogram_tester.ExpectBucketCount(kSuccessMetric, true, 1); +} + +} // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_built_in_backend.cc b/components/password_manager/core/browser/password_store_built_in_backend.cc index e8d05d7c..136ad54a 100644 --- a/components/password_manager/core/browser/password_store_built_in_backend.cc +++ b/components/password_manager/core/browser/password_store_built_in_backend.cc
@@ -59,11 +59,15 @@ LoginsOrErrorReply callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(helper_); + PasswordStoreBackendMetricsRecorder metrics_recorder = + PasswordStoreBackendMetricsRecorder( + ClassInfix("PasswordStoreBuiltInBackend"), + MetricInfix("GetAllLoginsAsync")); background_task_runner_->PostTaskAndReplyWithResult( FROM_HERE, - base::BindOnce( - &LoginDatabaseAsyncHelper::GetAllLogins, - base::Unretained(helper_.get())), // Safe until `Shutdown()`. + base::BindOnce(&LoginDatabaseAsyncHelper::GetAllLogins, + base::Unretained(helper_.get()), + std::move(metrics_recorder)), // Safe until `Shutdown()`. std::move(callback)); }
diff --git a/components/password_manager/core/browser/password_store_built_in_backend_unittest.cc b/components/password_manager/core/browser/password_store_built_in_backend_unittest.cc index e54e95fb..a75b04d 100644 --- a/components/password_manager/core/browser/password_store_built_in_backend_unittest.cc +++ b/components/password_manager/core/browser/password_store_built_in_backend_unittest.cc
@@ -15,6 +15,7 @@ #include "base/run_loop.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/task_environment.h" #include "base/time/time.h" @@ -49,6 +50,22 @@ constexpr const char kTestAndroidRealm3[] = "android://hash@com.example.three.android/"; constexpr const time_t kTestLastUsageTime = 1546300800; // 00:00 Jan 1 2019 UTC +constexpr PasswordFormData kTestCredentials[] = { + {PasswordForm::Scheme::kHtml, kTestAndroidRealm1, "", "", u"", u"", u"", + u"username_value_1", u"", kTestLastUsageTime, 1}, + {PasswordForm::Scheme::kHtml, kTestAndroidRealm2, "", "", u"", u"", u"", + u"username_value_2", u"", kTestLastUsageTime, 1}, + {PasswordForm::Scheme::kHtml, kTestAndroidRealm3, "", "", u"", u"", u"", + u"username_value_3", u"", kTestLastUsageTime, 1}, + {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebOrigin1, "", u"", u"", + u"", u"username_value_4", u"", kTestLastUsageTime, 1}, + // A PasswordFormData with nullptr as the username_value will be converted + // in a blocklisted PasswordForm in FillPasswordFormWithData(). + {PasswordForm::Scheme::kHtml, kTestWebRealm2, kTestWebOrigin2, "", u"", u"", + u"", nullptr, u"", kTestLastUsageTime, 1}, + {PasswordForm::Scheme::kHtml, kTestWebRealm3, kTestWebOrigin3, "", u"", u"", + u"", nullptr, u"", kTestLastUsageTime, 1}}; +constexpr auto kLatencyDelta = base::Milliseconds(123u); class MockPasswordStoreConsumer : public PasswordStoreConsumer { MOCK_METHOD(void, @@ -145,6 +162,14 @@ void RunUntilIdle() { task_environment_.RunUntilIdle(); } + void AdvanceClock(base::TimeDelta millis) { + // AdvanceClock is used here because FastForwardBy doesn't work for the + // intended purpose. FastForwardBy performs the queued actions first and + // then makes the clock tick and for the tests that follow we want to + // advance the clock before certain async tasks happen. + task_environment_.AdvanceClock(millis); + } + private: void SetupTempDir(); @@ -155,7 +180,9 @@ } base::test::TaskEnvironment task_environment_{ - base::test::TaskEnvironment::MainThreadType::UI}; + base::test::TaskEnvironment::MainThreadType::UI, + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + base::ScopedTempDir temp_dir_; std::unique_ptr<PasswordStoreBuiltInBackend> store_; }; @@ -313,21 +340,6 @@ } TEST_F(PasswordStoreBuiltInBackendTest, GetAllLoginsAsync) { - static constexpr PasswordFormData kTestCredentials[] = { - {PasswordForm::Scheme::kHtml, kTestAndroidRealm1, "", "", u"", u"", u"", - u"username_value_1", u"", kTestLastUsageTime, 1}, - {PasswordForm::Scheme::kHtml, kTestAndroidRealm2, "", "", u"", u"", u"", - u"username_value_2", u"", kTestLastUsageTime, 1}, - {PasswordForm::Scheme::kHtml, kTestAndroidRealm3, "", "", u"", u"", u"", - u"username_value_3", u"", kTestLastUsageTime, 1}, - {PasswordForm::Scheme::kHtml, kTestWebRealm1, kTestWebOrigin1, "", u"", - u"", u"", u"username_value_4", u"", kTestLastUsageTime, 1}, - // A PasswordFormData with nullptr as the username_value will be converted - // in a blocklisted PasswordForm in FillPasswordFormWithData(). - {PasswordForm::Scheme::kHtml, kTestWebRealm2, kTestWebOrigin2, "", u"", - u"", u"", nullptr, u"", kTestLastUsageTime, 1}, - {PasswordForm::Scheme::kHtml, kTestWebRealm3, kTestWebOrigin3, "", u"", - u"", u"", nullptr, u"", kTestLastUsageTime, 1}}; PasswordStoreBackend* backend = Initialize(); // Populate store with test credentials. @@ -354,4 +366,60 @@ RunUntilIdle(); } -} // namespace password_manager +TEST_F(PasswordStoreBuiltInBackendTest, GetAllLoginsAsyncMetrics) { + const char kDurationMetric[] = + "PasswordManager.PasswordStoreBuiltInBackend.GetAllLoginsAsync.Latency"; + const char kSuccessMetric[] = + "PasswordManager.PasswordStoreBuiltInBackend.GetAllLoginsAsync.Success"; + base::HistogramTester histogram_tester; + + PasswordStoreBackend* backend = Initialize(); + + // Fill the store + PasswordForm form = *FillPasswordFormWithData(CreateTestPasswordFormData()); + + const PasswordStoreChange add_change = + PasswordStoreChange(PasswordStoreChange::ADD, form); + + testing::StrictMock<MockPasswordStoreBackendTester> tester; + EXPECT_CALL(tester, HandleChanges(Optional(ElementsAre(add_change)))); + backend->AddLoginAsync( + form, base::BindOnce(&MockPasswordStoreBackendTester::HandleChanges, + base::Unretained(&tester))); + + // Get the logins + base::MockCallback<LoginsOrErrorReply> mock_reply; + backend->GetAllLoginsAsync(mock_reply.Get()); + + AdvanceClock(kLatencyDelta); + RunUntilIdle(); + + histogram_tester.ExpectTotalCount(kDurationMetric, 1); + histogram_tester.ExpectTimeBucketCount(kDurationMetric, kLatencyDelta, 1); + histogram_tester.ExpectTotalCount(kSuccessMetric, 1); + histogram_tester.ExpectBucketCount(kSuccessMetric, true, 1); +} + +TEST_F(PasswordStoreBuiltInBackendTest, GetAllLoginsAsyncFailsMetrics) { + const char kDurationMetric[] = + "PasswordManager.PasswordStoreBuiltInBackend.GetAllLoginsAsync.Latency"; + const char kSuccessMetric[] = + "PasswordManager.PasswordStoreBuiltInBackend.GetAllLoginsAsync.Success"; + base::HistogramTester histogram_tester; + + PasswordStoreBackend* bad_backend = + InitializeWithDatabase(std::make_unique<BadLoginDatabase>()); + + base::MockCallback<LoginsOrErrorReply> mock_reply; + bad_backend->GetAllLoginsAsync(mock_reply.Get()); + + AdvanceClock(kLatencyDelta); + RunUntilIdle(); + + histogram_tester.ExpectTotalCount(kDurationMetric, 1); + histogram_tester.ExpectTimeBucketCount(kDurationMetric, kLatencyDelta, 1); + histogram_tester.ExpectTotalCount(kSuccessMetric, 1); + histogram_tester.ExpectBucketCount(kSuccessMetric, false, 1); +} + +} // namespace password_manager \ No newline at end of file
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc index c327b13..0027413 100644 --- a/components/password_manager/core/common/password_manager_features.cc +++ b/components/password_manager/core/common/password_manager_features.cc
@@ -228,12 +228,6 @@ "UsernameFirstFlowFallbackCrowdsourcing", base::FEATURE_DISABLED_BY_DEFAULT}; -// Returns true if the client is part of the live_experiment group for -// |kPasswordDomainCapabilitiesFetching|, otherwise, the client is assumed to be -// in the regular launch group. -extern const base::FeatureParam<bool> kPasswordChangeLiveExperimentParam = { - &kPasswordDomainCapabilitiesFetching, "live_experiment", false}; - #if BUILDFLAG(IS_ANDROID) // Current migration version to Google Mobile Services. If version saved in pref // is lower than 'kMigrationVersion' passwords will be re-uploaded.
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h index 20270ab..a8665ae 100644 --- a/components/password_manager/core/common/password_manager_features.h +++ b/components/password_manager/core/common/password_manager_features.h
@@ -73,7 +73,13 @@ extern const base::Feature kUsernameFirstFlowFallbackCrowdsourcing; // All features parameters are in alphabetical order. -extern const base::FeatureParam<bool> kPasswordChangeLiveExperimentParam; + +// True if the client is part of the live_experiment group for +// |kPasswordDomainCapabilitiesFetching|, otherwise, the client is assumed to be +// in the regular launch group. +constexpr base::FeatureParam<bool> kPasswordChangeLiveExperimentParam = { + &kPasswordDomainCapabilitiesFetching, "live_experiment", false}; + #if BUILDFLAG(IS_ANDROID) extern const base::FeatureParam<int> kMigrationVersion; constexpr base::FeatureParam<UpmExperimentVariation>::Option
diff --git a/components/payments/core/sizes.h b/components/payments/core/sizes.h index b48953e..e07d63c 100644 --- a/components/payments/core/sizes.h +++ b/components/payments/core/sizes.h
@@ -7,9 +7,9 @@ namespace payments { -// The default width of the instrument icon for SPC. Based on the aspect ratio -// of the default instrument icon. -constexpr int kSecurePaymentConfirmationInstrumentIconDefaultWidthPx = 26; +// The default width of the instrument icon for SPC. Based on the size of the +// default instrument icon. +constexpr int kSecurePaymentConfirmationInstrumentIconDefaultWidthPx = 20; // The maximum width of the instrument icon for SPC. Used as the preferred size // of downloaded instrument icons.
diff --git a/components/permissions/android/BUILD.gn b/components/permissions/android/BUILD.gn index 40b48d59..d2f9d01 100644 --- a/components/permissions/android/BUILD.gn +++ b/components/permissions/android/BUILD.gn
@@ -145,6 +145,7 @@ "//components/content_settings/android:content_settings_enums_java", "//third_party/androidx:androidx_annotation_annotation_java", "//third_party/androidx:androidx_core_core_java", + "//ui/android:ui_no_recycler_view_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] }
diff --git a/components/permissions/android/android_permission_util.cc b/components/permissions/android/android_permission_util.cc index 135c87b..303936e 100644 --- a/components/permissions/android/android_permission_util.cc +++ b/components/permissions/android/android_permission_util.cc
@@ -68,9 +68,9 @@ return PermissionRepromptState::kNoNeed; } -bool AreAppLevelNotificationsEnabled() { +bool DoesAppLevelSettingsAllowSiteNotifications() { JNIEnv* env = base::android::AttachCurrentThread(); - return Java_PermissionUtil_areAppLevelNotificationsEnabled(env); + return Java_PermissionUtil_doesAppLevelSettingsAllowSiteNotifications(env); } } // namespace permissions
diff --git a/components/permissions/android/android_permission_util.h b/components/permissions/android/android_permission_util.h index b965862..9fdae6d 100644 --- a/components/permissions/android/android_permission_util.h +++ b/components/permissions/android/android_permission_util.h
@@ -54,8 +54,9 @@ content::WebContents* web_contents, const std::vector<ContentSettingsType>& content_settings_types); -// Called to check whether chrome has app level permission for notifications. -bool AreAppLevelNotificationsEnabled(); +// Called to check whether chrome settings and permissions allow requesting site +// level notification permission. +bool DoesAppLevelSettingsAllowSiteNotifications(); } // namespace permissions
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java index cf8e454c..e76e6f11 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/AndroidPermissionRequester.java
@@ -171,6 +171,12 @@ deniedStringId = R.string.infobar_missing_camera_permission_text; } else if (deniedContentSettings.contains(ContentSettingsType.AR)) { deniedStringId = R.string.infobar_missing_ar_camera_permission_text; + } else if (deniedContentSettings.contains( + ContentSettingsType.NOTIFICATIONS)) { + // We don't want to request the notification prompt again, since user + // declined it already. + delegate.onAndroidPermissionCanceled(); + return; } }
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionUtil.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionUtil.java index 3d5c596..ec7623f 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionUtil.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionUtil.java
@@ -6,11 +6,10 @@ import android.os.Build; -import androidx.core.app.NotificationManagerCompat; - -import org.chromium.base.ContextUtils; +import org.chromium.base.BuildInfo; import org.chromium.base.annotations.CalledByNative; import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.ui.permissions.ContextualNotificationPermissionRequester; import java.util.Arrays; @@ -34,6 +33,10 @@ /** The android permissions associated with requesting access to the microphone. */ private static final String[] MICROPHONE_PERMISSIONS = { android.Manifest.permission.RECORD_AUDIO}; + /** The required android permissions associated with posting notifications post-Android T. */ + private static final String[] NOTIFICATION_PERMISSIONS_POST_T = { + "android.permission.POST_NOTIFICATIONS"}; + /** Signifies there are no permissions associated. */ private static final String[] EMPTY_PERMISSIONS = {}; @@ -75,6 +78,12 @@ case ContentSettingsType.MEDIASTREAM_CAMERA: case ContentSettingsType.AR: return Arrays.copyOf(CAMERA_PERMISSIONS, CAMERA_PERMISSIONS.length); + case ContentSettingsType.NOTIFICATIONS: + if (BuildInfo.isAtLeastT()) { + return Arrays.copyOf(NOTIFICATION_PERMISSIONS_POST_T, + NOTIFICATION_PERMISSIONS_POST_T.length); + } + return EMPTY_PERMISSIONS; default: return EMPTY_PERMISSIONS; } @@ -104,9 +113,10 @@ } @CalledByNative - private static boolean areAppLevelNotificationsEnabled() { - NotificationManagerCompat manager = - NotificationManagerCompat.from(ContextUtils.getApplicationContext()); - return manager.areNotificationsEnabled(); + private static boolean doesAppLevelSettingsAllowSiteNotifications() { + ContextualNotificationPermissionRequester contextualPermissionRequester = + ContextualNotificationPermissionRequester.getInstance(); + return contextualPermissionRequester != null + && contextualPermissionRequester.doesAppLevelSettingsAllowSiteNotifications(); } }
diff --git a/components/permissions/permission_context_base_unittest.cc b/components/permissions/permission_context_base_unittest.cc index 07a61d1..4b08004f 100644 --- a/components/permissions/permission_context_base_unittest.cc +++ b/components/permissions/permission_context_base_unittest.cc
@@ -731,6 +731,7 @@ PermissionRequestManager::CreateForWebContents(web_contents()); PermissionRequestManager* manager = PermissionRequestManager::FromWebContents(web_contents()); + manager->set_enabled_app_level_notification_permission_for_testing(true); prompt_factory_ = std::make_unique<MockPermissionPromptFactory>(manager); }
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc index fdc69391..c2394bc 100644 --- a/components/permissions/permission_manager.cc +++ b/components/permissions/permission_manager.cc
@@ -19,7 +19,9 @@ #include "components/permissions/permission_request_id.h" #include "components/permissions/permission_result.h" #include "components/permissions/permission_uma_util.h" +#include "components/permissions/permission_util.h" #include "components/permissions/permissions_client.h" +#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" @@ -33,6 +35,24 @@ namespace permissions { namespace { +// Represents the possible methods of delegating permissions from main frames +// to child frames. +enum class PermissionDelegationMode { + // Permissions from the main frame are delegated to child frames. + // This is the default delegation mode for permissions. If a main frame was + // granted a permission that is delegated, its child frames will inherit that + // permission if allowed by the permissions policy. + kDelegated, + // Permissions from the main frame are not delegated to child frames. + // An undelegated permission will only be granted to a child frame if the + // child frame's origin was previously granted access to the permission when + // in a main frame. + kUndelegated, + // Permission access is a function of both the requesting and embedding + // origins. + kDoubleKeyed, +}; + // Helper methods to convert ContentSetting to PermissionStatus and vice versa. PermissionStatus ContentSettingToPermissionStatus(ContentSetting setting) { switch (setting) { @@ -139,6 +159,18 @@ return ContentSettingsType::DEFAULT; } +PermissionDelegationMode GetPermissionDelegationMode( + ContentSettingsType permission) { + // TODO(crbug.com/987654): Generalize this to other "background permissions", + // that is, permissions that can be used by a service worker. This includes + // durable storage, background sync, etc. + if (permission == ContentSettingsType::NOTIFICATIONS) + return PermissionDelegationMode::kUndelegated; + if (permission == ContentSettingsType::STORAGE_ACCESS) + return PermissionDelegationMode::kDoubleKeyed; + return PermissionDelegationMode::kDelegated; +} + void SubscriptionCallbackWrapper( base::OnceCallback<void(PermissionStatus)> callback, ContentSetting content_setting) { @@ -189,6 +221,35 @@ } } +// If an iframed document/worker inherits a different StoragePartition from its +// embedder than it would use if it were a main frame, we should block +// undelegated permissions. Because permissions are scoped to BrowserContext +// instead of StoragePartition, without this check the aforementioned iframe +// would be given undelegated permissions if the user had granted its origin +// access when it was loaded as a main frame. +bool IsPermissionBlockedInPartition( + ContentSettingsType permission, + const GURL& requesting_origin, + content::RenderProcessHost* render_process_host) { + DCHECK(render_process_host); + switch (GetPermissionDelegationMode(permission)) { + case PermissionDelegationMode::kDelegated: + return false; + case PermissionDelegationMode::kDoubleKeyed: + return false; + case PermissionDelegationMode::kUndelegated: + // TODO(crbug.com/1312218): This will create |requesting_origin|'s home + // StoragePartition if it doesn't already exist. Given how + // StoragePartitions are used today, this shouldn't actually be a + // problem, but ideally we'd compare StoragePartitionConfigs. + content::StoragePartition* requesting_home_partition = + render_process_host->GetBrowserContext()->GetStoragePartitionForUrl( + requesting_origin); + return requesting_home_partition != + render_process_host->GetStoragePartition(); + } +} + } // anonymous namespace class PermissionManager::PendingRequest { @@ -334,19 +395,14 @@ if (override_origin) return override_origin.value(); - // TODO(crbug.com/987654): Generalize this to other "background permissions", - // that is, permissions that can be used by a service worker. This includes - // durable storage, background sync, etc. - if (permission == ContentSettingsType::NOTIFICATIONS) - return requesting_origin; - - // Storage access grants from the storage access API are paired between the - // origin of the frame making the request and the top level origin so we need - // to ensure we return the proper origin here. - if (permission == ContentSettingsType::STORAGE_ACCESS) - return requesting_origin; - - return embedding_origin; + switch (GetPermissionDelegationMode(permission)) { + case PermissionDelegationMode::kDelegated: + return embedding_origin; + case PermissionDelegationMode::kDoubleKeyed: + return requesting_origin; + case PermissionDelegationMode::kUndelegated: + return requesting_origin; + } } void PermissionManager::RequestPermission( @@ -390,6 +446,13 @@ auto response_callback = std::make_unique<PermissionResponseCallback>(this, request_local_id, i); + if (IsPermissionBlockedInPartition(permission, requesting_origin, + render_frame_host->GetProcess())) { + response_callback->OnPermissionsRequestResponseStatus( + CONTENT_SETTING_BLOCK); + continue; + } + auto status = GetPermissionOverrideForDevTools( url::Origin::Create(canonical_requesting_origin), permission); if (status != CONTENT_SETTING_DEFAULT) { @@ -442,15 +505,19 @@ // for an embedded frame. DCHECK_EQ(requesting_origin, embedding_origin); - return GetPermissionStatusHelper(permission, /*render_frame_host=*/nullptr, + return GetPermissionStatusHelper(permission, + /*render_process_host=*/nullptr, + /*render_frame_host=*/nullptr, requesting_origin, embedding_origin); } PermissionResult PermissionManager::GetPermissionStatusForDisplayOnSettingsUI( ContentSettingsType permission, const GURL& origin) { - return GetPermissionStatusHelper(permission, /*render_frame_host=*/nullptr, - origin, origin); + return GetPermissionStatusHelper(permission, + /*render_process_host=*/nullptr, + /*render_frame_host=*/nullptr, origin, + origin); } PermissionResult PermissionManager::GetPermissionStatusForFrame( @@ -460,8 +527,10 @@ const GURL embedding_origin = GetEmbeddingOrigin(render_frame_host, requesting_origin); - return GetPermissionStatusHelper(permission, render_frame_host, - requesting_origin, embedding_origin); + return GetPermissionStatusHelper(permission, + /*render_process_host=*/nullptr, + render_frame_host, requesting_origin, + embedding_origin); } PermissionResult PermissionManager::GetPermissionStatusForCurrentDocument( @@ -472,8 +541,20 @@ const GURL embedding_origin = GetEmbeddingOrigin(render_frame_host, requesting_origin); - return GetPermissionStatusHelper(permission, render_frame_host, - requesting_origin, embedding_origin); + return GetPermissionStatusHelper(permission, + /*render_process_host=*/nullptr, + render_frame_host, requesting_origin, + embedding_origin); +} + +PermissionResult PermissionManager::GetPermissionStatusForWorker( + ContentSettingsType permission, + content::RenderProcessHost* render_process_host, + const url::Origin& worker_origin) { + GURL worker_url = worker_origin.GetURL(); + return GetPermissionStatusHelper(permission, render_process_host, + /*render_frame_host=*/nullptr, worker_url, + worker_url); } void PermissionManager::RequestPermission( @@ -546,20 +627,12 @@ PermissionType permission, const GURL& requesting_origin, const GURL& embedding_origin) { + // TODO(benwells): split this into two functions, GetPermissionStatus and + // GetPermissionStatusForPermissionsAPI. DCHECK_CURRENTLY_ON(content::BrowserThread::UI); PermissionResult result = GetPermissionStatus(PermissionTypeToContentSetting(permission), requesting_origin, embedding_origin); - ContentSettingsType type = PermissionTypeToContentSetting(permission); - // TODO(benwells): split this into two functions, GetPermissionStatus and - // GetPermissionStatusForPermissionsAPI. - PermissionContextBase* context = GetPermissionContext(type); - if (context) { - result = context->UpdatePermissionStatusWithDeviceStatus( - result, GetCanonicalOrigin(type, requesting_origin, embedding_origin), - embedding_origin); - } - return ContentSettingToPermissionStatus(result.content_setting); } @@ -567,22 +640,23 @@ PermissionType permission, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin) { + // TODO(benwells): split this into two functions, GetPermissionStatus and + // GetPermissionStatusForPermissionsAPI. DCHECK_CURRENTLY_ON(content::BrowserThread::UI); ContentSettingsType type = PermissionTypeToContentSetting(permission); PermissionResult result = GetPermissionStatusForFrame(type, render_frame_host, requesting_origin); + return ContentSettingToPermissionStatus(result.content_setting); +} - // TODO(benwells): split this into two functions, GetPermissionStatus and - // GetPermissionStatusForPermissionsAPI. - PermissionContextBase* context = - GetPermissionContext(PermissionTypeToContentSetting(permission)); - if (context) { - const GURL embedding_origin = - GetEmbeddingOrigin(render_frame_host, requesting_origin); - result = context->UpdatePermissionStatusWithDeviceStatus( - result, GetCanonicalOrigin(type, requesting_origin, embedding_origin), - embedding_origin); - } +PermissionStatus PermissionManager::GetPermissionStatusForWorker( + PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + ContentSettingsType type = PermissionTypeToContentSetting(permission); + PermissionResult result = GetPermissionStatusForWorker( + type, render_process_host, url::Origin::Create(worker_origin)); return ContentSettingToPermissionStatus(result.content_setting); } @@ -611,10 +685,12 @@ PermissionManager::SubscriptionId PermissionManager::SubscribePermissionStatusChange( PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(PermissionStatus)> callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + DCHECK(!render_frame_host || !render_process_host); if (is_shutting_down_) return SubscriptionId(); @@ -644,9 +720,11 @@ } else { embedding_origin = requesting_origin; subscription->render_frame_id = -1; - subscription->render_process_id = -1; + subscription->render_process_id = + render_process_host ? render_process_host->GetID() : -1; subscription->current_value = - GetPermissionStatus(content_type, requesting_origin, requesting_origin) + GetPermissionStatusForWorker(content_type, render_process_host, + url::Origin::Create(requesting_origin)) .content_setting; } @@ -721,11 +799,19 @@ continue; } + content::RenderProcessHost* rph = + content::RenderProcessHost::FromID(subscription->render_process_id); + ContentSetting new_value; if (rfh) { new_value = GetPermissionStatusForFrame(subscription->permission, rfh, subscription->requesting_origin) .content_setting; + } else if (rph) { + new_value = GetPermissionStatusForWorker( + subscription->permission, rph, + url::Origin::Create(subscription->requesting_origin)) + .content_setting; } else { new_value = GetPermissionStatus(subscription->permission, subscription->requesting_origin, @@ -749,9 +835,21 @@ PermissionResult PermissionManager::GetPermissionStatusHelper( ContentSettingsType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, const GURL& embedding_origin) { + DCHECK(!render_process_host || !render_frame_host); + + // TODO(crbug.com/1307044): Move this to PermissionContextBase. + content::RenderProcessHost* rph = + render_frame_host ? render_frame_host->GetProcess() : render_process_host; + if (rph && + IsPermissionBlockedInPartition(permission, requesting_origin, rph)) { + return PermissionResult(CONTENT_SETTING_BLOCK, + PermissionStatusSource::UNSPECIFIED); + } + GURL canonical_requesting_origin = GetCanonicalOrigin(permission, requesting_origin, embedding_origin); auto status = GetPermissionOverrideForDevTools( @@ -762,6 +860,8 @@ PermissionResult result = context->GetPermissionStatus( render_frame_host, canonical_requesting_origin.DeprecatedGetOriginAsURL(), embedding_origin.DeprecatedGetOriginAsURL()); + result = context->UpdatePermissionStatusWithDeviceStatus( + result, requesting_origin, embedding_origin); DCHECK(result.content_setting == CONTENT_SETTING_ALLOW || result.content_setting == CONTENT_SETTING_ASK || result.content_setting == CONTENT_SETTING_BLOCK);
diff --git a/components/permissions/permission_manager.h b/components/permissions/permission_manager.h index 57fa329..478e6ee 100644 --- a/components/permissions/permission_manager.h +++ b/components/permissions/permission_manager.h
@@ -24,6 +24,8 @@ namespace content { class BrowserContext; +class RenderFrameHost; +class RenderProcessHost; } namespace permissions { @@ -123,6 +125,13 @@ ContentSettingsType permission, content::RenderFrameHost* render_frame_host); + // Returns the status of the given `permission` for a worker on `origin` + // running in the renderer corresponding to `render_process_host`. + PermissionResult GetPermissionStatusForWorker( + ContentSettingsType permission, + content::RenderProcessHost* render_process_host, + const url::Origin& worker_origin); + // content::PermissionControllerDelegate implementation. void RequestPermission( content::PermissionType permission, @@ -153,11 +162,16 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; bool IsPermissionOverridableByDevTools( content::PermissionType permission, const absl::optional<url::Origin>& origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) @@ -224,8 +238,11 @@ const ContentSettingsPattern& secondary_pattern, ContentSettingsTypeSet content_type_set) override; + // Only one of |render_process_host| and |render_frame_host| should be set, + // or neither. RenderProcessHost will be inferred from |render_frame_host|. PermissionResult GetPermissionStatusHelper( ContentSettingsType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, const GURL& embedding_origin);
diff --git a/components/permissions/permission_manager_unittest.cc b/components/permissions/permission_manager_unittest.cc index 7fe04975..6dc3b645 100644 --- a/components/permissions/permission_manager_unittest.cc +++ b/components/permissions/permission_manager_unittest.cc
@@ -19,8 +19,11 @@ #include "components/permissions/test/mock_permission_prompt_factory.h" #include "components/permissions/test/permission_test_util.h" #include "components/permissions/test/test_permissions_client.h" +#include "content/public/browser/content_browser_client.h" #include "content/public/browser/permission_type.h" +#include "content/public/common/content_client.h" #include "content/public/test/browser_task_environment.h" +#include "content/public/test/mock_render_process_host.h" #include "content/public/test/navigation_simulator.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_renderer_host.h" @@ -36,6 +39,34 @@ namespace permissions { namespace { +class ScopedPartitionedOriginBrowserClient + : public content::ContentBrowserClient { + public: + explicit ScopedPartitionedOriginBrowserClient(const GURL& app_origin) + : app_origin_(url::Origin::Create(app_origin)) { + old_client_ = content::SetBrowserClientForTesting(this); + } + + ~ScopedPartitionedOriginBrowserClient() override { + content::SetBrowserClientForTesting(old_client_); + } + + content::StoragePartitionConfig GetStoragePartitionConfigForSite( + content::BrowserContext* browser_context, + const GURL& site) override { + if (url::Origin::Create(site) == app_origin_) { + return content::StoragePartitionConfig::Create( + browser_context, "test_partition", /*partition_name=*/std::string(), + /*in_memory=*/false); + } + return content::StoragePartitionConfig::CreateDefault(browser_context); + } + + private: + url::Origin app_origin_; + content::ContentBrowserClient* old_client_; +}; + #if BUILDFLAG(IS_ANDROID) // See https://crbug.com/904883. auto GetDefaultProtectedMediaIdentifierPermissionStatus() { @@ -94,8 +125,14 @@ } void SetPermission(ContentSettingsType type, ContentSetting value) { - GetHostContentSettingsMap()->SetContentSettingDefaultScope(url_, url_, type, - value); + SetPermission(url_, type, value); + } + + void SetPermission(const GURL& origin, + ContentSettingsType type, + ContentSetting value) { + GetHostContentSettingsMap()->SetContentSettingDefaultScope(origin, origin, + type, value); } void RequestPermission(PermissionType type, @@ -150,13 +187,13 @@ content::RenderFrameHost* AddChildRFH( content::RenderFrameHost* parent, - const char* origin, + const GURL& origin, blink::mojom::PermissionsPolicyFeature feature = blink::mojom::PermissionsPolicyFeature::kNotFound) { blink::ParsedPermissionsPolicy frame_policy = {}; if (feature != blink::mojom::PermissionsPolicyFeature::kNotFound) { frame_policy.push_back( - {feature, std::vector<url::Origin>{url::Origin::Create(GURL(origin))}, + {feature, std::vector<url::Origin>{url::Origin::Create(origin)}, false, false}); } content::RenderFrameHost* result = @@ -164,7 +201,7 @@ "", frame_policy); content::RenderFrameHostTester::For(result) ->InitializeRenderFrameIfNeeded(); - SimulateNavigation(&result, GURL(origin)); + SimulateNavigation(&result, origin); return result; } @@ -270,7 +307,8 @@ // Test that the PermissionManager shuts down cleanly with subscriptions that // haven't been removed, crbug.com/720071. GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, main_rfh(), + url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); } @@ -278,7 +316,8 @@ TEST_F(PermissionManagerTest, SubscribeUnsubscribeAfterShutdown) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -292,7 +331,8 @@ // Check that subscribe/unsubscribe after shutdown don't crash. content::PermissionControllerDelegate::SubscriptionId subscription2_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -302,7 +342,8 @@ TEST_F(PermissionManagerTest, SameTypeChangeNotifies) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -318,7 +359,8 @@ TEST_F(PermissionManagerTest, DifferentTypeChangeDoesNotNotify) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -333,7 +375,8 @@ TEST_F(PermissionManagerTest, ChangeAfterUnsubscribeDoesNotNotify) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -349,12 +392,14 @@ ChangeAfterUnsubscribeOnlyNotifiesActiveSubscribers) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, main_rfh(), + url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -369,7 +414,8 @@ TEST_F(PermissionManagerTest, DifferentPrimaryUrlDoesNotNotify) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -385,7 +431,8 @@ TEST_F(PermissionManagerTest, DifferentSecondaryUrlDoesNotNotify) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::STORAGE_ACCESS_GRANT, main_rfh(), url(), + PermissionType::STORAGE_ACCESS_GRANT, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -401,7 +448,8 @@ TEST_F(PermissionManagerTest, WildCardPatternNotifies) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -420,7 +468,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -436,7 +485,8 @@ TEST_F(PermissionManagerTest, NewValueCorrectlyPassed) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -455,7 +505,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -473,7 +524,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), url(), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -500,7 +552,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, nullptr, url(), + PermissionType::GEOLOCATION, process(), /*render_frame_host=*/nullptr, + url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -524,7 +577,8 @@ TEST_F(PermissionManagerTest, SubscribeMIDIPermission) { content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::MIDI, main_rfh(), url(), + PermissionType::MIDI, /*render_process_host=*/nullptr, main_rfh(), + url(), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); @@ -634,7 +688,7 @@ NavigateAndCommit(GURL(kOrigin1)); content::RenderFrameHost* parent = main_rfh(); - content::RenderFrameHost* child = AddChildRFH(parent, kOrigin2); + content::RenderFrameHost* child = AddChildRFH(parent, GURL(kOrigin2)); // By default the parent should be able to request access, but not the child. EXPECT_EQ(CONTENT_SETTING_ASK, @@ -649,7 +703,7 @@ .content_setting); // Enabling geolocation by FP should allow the child to request access also. - child = AddChildRFH(parent, kOrigin2, + child = AddChildRFH(parent, GURL(kOrigin2), blink::mojom::PermissionsPolicyFeature::kGeolocation); EXPECT_EQ(CONTENT_SETTING_ASK, @@ -702,7 +756,7 @@ RefreshPageAndSetHeaderPolicy( &parent, blink::mojom::PermissionsPolicyFeature::kGeolocation, {kOrigin1}); - child = AddChildRFH(parent, kOrigin2); + child = AddChildRFH(parent, GURL(kOrigin2)); EXPECT_EQ(CONTENT_SETTING_ASK, GetPermissionManager() @@ -724,11 +778,12 @@ NavigateAndCommit(GURL(kOrigin1)); content::RenderFrameHost* parent = main_rfh(); - content::RenderFrameHost* child = AddChildRFH(parent, kOrigin2); + content::RenderFrameHost* child = AddChildRFH(parent, GURL(kOrigin2)); content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, child, GURL(kOrigin2), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, child, + GURL(kOrigin2), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); EXPECT_FALSE(callback_called()); @@ -754,7 +809,7 @@ EXPECT_FALSE(callback_called()); // Enabling geolocation by FP should allow the child to request access also. - child = AddChildRFH(parent, kOrigin2, + child = AddChildRFH(parent, GURL(kOrigin2), blink::mojom::PermissionsPolicyFeature::kGeolocation); EXPECT_EQ(CONTENT_SETTING_ALLOW, @@ -764,7 +819,8 @@ .content_setting); subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, child, GURL(kOrigin2), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, child, + GURL(kOrigin2), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); EXPECT_FALSE(callback_called()); @@ -792,7 +848,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), GURL(kOrigin1), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), GURL(kOrigin1), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); EXPECT_EQ(callback_count(), 0); @@ -815,7 +872,8 @@ content::PermissionControllerDelegate::SubscriptionId subscription_id_2 = GetPermissionManager()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, main_rfh(), GURL(kOrigin1), + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + main_rfh(), GURL(kOrigin1), base::BindRepeating(&PermissionManagerTest::OnPermissionChange, base::Unretained(this))); EXPECT_EQ(callback_count(), 1); @@ -829,4 +887,114 @@ GetPermissionManager()->UnsubscribePermissionStatusChange(subscription_id_2); } +TEST_F(PermissionManagerTest, GetCanonicalOrigin) { + GURL requesting("https://requesting.example.com"); + GURL embedding("https://embedding.example.com"); + + EXPECT_EQ(embedding, + GetPermissionManager()->GetCanonicalOrigin( + ContentSettingsType::COOKIES, requesting, embedding)); + EXPECT_EQ(requesting, + GetPermissionManager()->GetCanonicalOrigin( + ContentSettingsType::NOTIFICATIONS, requesting, embedding)); + EXPECT_EQ(requesting, + GetPermissionManager()->GetCanonicalOrigin( + ContentSettingsType::STORAGE_ACCESS, requesting, embedding)); +} + +TEST_F(PermissionManagerTest, RequestPermissionInDifferentStoragePartition) { + const GURL kOrigin("https://example.com"); + const GURL kOrigin2("https://example2.com"); + const GURL kPartitionedOrigin("https://partitioned.com"); + ScopedPartitionedOriginBrowserClient browser_client(kPartitionedOrigin); + + SetPermission(kOrigin, ContentSettingsType::GEOLOCATION, + ContentSetting::CONTENT_SETTING_ALLOW); + + SetPermission(kOrigin2, ContentSettingsType::GEOLOCATION, + ContentSetting::CONTENT_SETTING_BLOCK); + SetPermission(kOrigin2, ContentSettingsType::NOTIFICATIONS, + ContentSetting::CONTENT_SETTING_ALLOW); + + SetPermission(kPartitionedOrigin, ContentSettingsType::GEOLOCATION, + ContentSetting::CONTENT_SETTING_BLOCK); + SetPermission(kPartitionedOrigin, ContentSettingsType::NOTIFICATIONS, + ContentSetting::CONTENT_SETTING_ALLOW); + + NavigateAndCommit(kOrigin); + content::RenderFrameHost* parent = main_rfh(); + + content::RenderFrameHost* child = AddChildRFH( + parent, kOrigin2, blink::mojom::PermissionsPolicyFeature::kGeolocation); + content::RenderFrameHost* partitioned_child = + AddChildRFH(parent, kPartitionedOrigin, + blink::mojom::PermissionsPolicyFeature::kGeolocation); + + // The parent should have geolocation access which is delegated to child and + // partitioned_child. + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::GEOLOCATION, parent, + parent->GetLastCommittedOrigin().GetURL()) + .content_setting); + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::GEOLOCATION, child, + child->GetLastCommittedOrigin().GetURL()) + .content_setting); + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::GEOLOCATION, partitioned_child, + partitioned_child->GetLastCommittedOrigin().GetURL()) + .content_setting); + + // The parent should not have notification permission. + EXPECT_EQ(CONTENT_SETTING_ASK, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::NOTIFICATIONS, parent, + parent->GetLastCommittedOrigin().GetURL()) + .content_setting); + EXPECT_EQ(CONTENT_SETTING_ASK, + GetPermissionManager() + ->GetPermissionStatusForWorker( + ContentSettingsType::NOTIFICATIONS, parent->GetProcess(), + parent->GetLastCommittedOrigin()) + .content_setting); + + // The non-partitioned child should have notification permission. + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::NOTIFICATIONS, child, + child->GetLastCommittedOrigin().GetURL()) + .content_setting); + EXPECT_EQ(CONTENT_SETTING_ALLOW, + GetPermissionManager() + ->GetPermissionStatusForWorker( + ContentSettingsType::NOTIFICATIONS, child->GetProcess(), + child->GetLastCommittedOrigin()) + .content_setting); + + // The partitioned child should not have notification permission because it + // belongs to a different StoragePartition, even though its origin would have + // permission if loaded in a main frame. + EXPECT_EQ(CONTENT_SETTING_BLOCK, + GetPermissionManager() + ->GetPermissionStatusForFrame( + ContentSettingsType::NOTIFICATIONS, partitioned_child, + partitioned_child->GetLastCommittedOrigin().GetURL()) + .content_setting); + EXPECT_EQ(CONTENT_SETTING_BLOCK, + GetPermissionManager() + ->GetPermissionStatusForWorker( + ContentSettingsType::NOTIFICATIONS, + partitioned_child->GetProcess(), + partitioned_child->GetLastCommittedOrigin()) + .content_setting); +} + } // namespace permissions
diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc index 8bb3e6b12..64d62106 100644 --- a/components/permissions/permission_request_manager.cc +++ b/components/permissions/permission_request_manager.cc
@@ -182,11 +182,15 @@ #if BUILDFLAG(IS_ANDROID) if (request->GetContentSettingsType() == ContentSettingsType::NOTIFICATIONS) { - bool enabled_app_level = AreAppLevelNotificationsEnabled(); + bool app_level_settings_allow_site_notifications = + enabled_app_level_notification_permission_for_testing_.has_value() + ? enabled_app_level_notification_permission_for_testing_.value() + : DoesAppLevelSettingsAllowSiteNotifications(); base::UmaHistogramBoolean( - "Permissions.Prompt.Notifications.EnabledAppLevel", enabled_app_level); + "Permissions.Prompt.Notifications.EnabledAppLevel", + app_level_settings_allow_site_notifications); - if (!enabled_app_level && + if (!app_level_settings_allow_site_notifications && base::FeatureList::IsEnabled( features::kBlockNotificationPromptsIfDisabledOnAppLevel)) { // Automatically cancel site Notification requests when Chrome is not able
diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h index ecff13f..4937288d 100644 --- a/components/permissions/permission_request_manager.h +++ b/components/permissions/permission_request_manager.h
@@ -204,6 +204,10 @@ time_to_decision_for_test_ = time_to_decision; } + void set_enabled_app_level_notification_permission_for_testing(bool enabled) { + enabled_app_level_notification_permission_for_testing_ = enabled; + } + private: friend class test::PermissionRequestManagerTestApi; friend class content::WebContentsUserData<PermissionRequestManager>; @@ -406,6 +410,8 @@ absl::optional<base::TimeDelta> time_to_decision_for_test_; + absl::optional<bool> enabled_app_level_notification_permission_for_testing_; + base::WeakPtrFactory<PermissionRequestManager> weak_factory_{this}; WEB_CONTENTS_USER_DATA_KEY_DECL(); };
diff --git a/components/permissions/permission_request_manager_unittest.cc b/components/permissions/permission_request_manager_unittest.cc index 217ce22..f9bb25b1 100644 --- a/components/permissions/permission_request_manager_unittest.cc +++ b/components/permissions/permission_request_manager_unittest.cc
@@ -69,6 +69,7 @@ PermissionRequestManager::CreateForWebContents(web_contents()); manager_ = PermissionRequestManager::FromWebContents(web_contents()); + manager_->set_enabled_app_level_notification_permission_for_testing(true); prompt_factory_ = std::make_unique<MockPermissionPromptFactory>(manager_); }
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc index 7f58e5e9..c58f855 100644 --- a/components/policy/core/browser/configuration_policy_handler.cc +++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -78,6 +78,7 @@ bool TypeCheckingPolicyHandler::CheckAndGetValue(const PolicyMap& policies, PolicyErrorMap* errors, const base::Value** value) { + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. *value = policies.GetValueUnsafe(policy_name()); if (*value && (*value)->type() != value_type_) { errors->AddError(policy_name(), IDS_POLICY_TYPE_ERROR, @@ -177,11 +178,7 @@ if (!input) return true; - if (!input->is_int()) { - NOTREACHED(); - return false; - } - + DCHECK(input->is_int()); int value = input->GetInt(); if (value < min_ || value > max_) { @@ -233,7 +230,8 @@ PrefValueMap* prefs) { if (!pref_path_) return; - const base::Value* value = policies.GetValueUnsafe(policy_name()); + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::LIST); base::ListValue list; if (value && Convert(value, &list, nullptr)) prefs->SetValue(pref_path_, std::move(list)); @@ -245,11 +243,7 @@ if (!input) return true; - if (!input->is_list()) { - NOTREACHED(); - return false; - } - + DCHECK(input->is_list()); int index = -1; for (const auto& entry : input->GetListDeprecated()) { ++index; @@ -304,7 +298,8 @@ PrefValueMap* prefs) { if (!pref_path_) return; - const base::Value* value = policies.GetValueUnsafe(policy_name()); + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::INTEGER); int value_in_range; if (value && EnsureInRange(value, &value_in_range, nullptr)) prefs->SetInteger(pref_path_, value_in_range); @@ -328,7 +323,8 @@ PrefValueMap* prefs) { if (!pref_path_) return; - const base::Value* value = policies.GetValueUnsafe(policy_name()); + const base::Value* value = + policies.GetValue(policy_name(), base::Value::Type::INTEGER); int percentage; if (value && EnsureInRange(value, &percentage, nullptr)) prefs->SetDouble(pref_path_, static_cast<double>(percentage) / 100.); @@ -348,6 +344,7 @@ PrefValueMap* prefs) { if (!pref_path_) return; + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* value = policies.GetValueUnsafe(policy_name()); if (value) prefs->SetValue(pref_path_, value->Clone()); @@ -368,6 +365,7 @@ bool SchemaValidatingPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* value = policies.GetValueUnsafe(policy_name()); if (!value) return true; @@ -389,6 +387,7 @@ const PolicyMap& policies, PolicyErrorMap* errors, std::unique_ptr<base::Value>* output) { + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* value = policies.GetValueUnsafe(policy_name()); if (!value) return true; @@ -449,6 +448,7 @@ PrefValueMap* prefs) { if (!pref_path_) return; + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* value = policies.GetValueUnsafe(policy_name()); if (value) prefs->SetValue(pref_path_, value->Clone()); @@ -481,6 +481,7 @@ bool SimpleJsonStringSchemaValidatingPolicyHandler::CheckPolicySettings( const PolicyMap& policies, PolicyErrorMap* errors) { + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* root_value = policies.GetValueUnsafe(policy_name()); if (!root_value) return true; @@ -612,6 +613,7 @@ PrefValueMap* prefs) { if (!pref_path_) return; + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* value = policies.GetValueUnsafe(policy_name()); if (value) prefs->SetValue(pref_path_, value->Clone());
diff --git a/components/policy/core/browser/configuration_policy_handler_list_unittest.cc b/components/policy/core/browser/configuration_policy_handler_list_unittest.cc index 80de0b71..aaf0602 100644 --- a/components/policy/core/browser/configuration_policy_handler_list_unittest.cc +++ b/components/policy/core/browser/configuration_policy_handler_list_unittest.cc
@@ -35,6 +35,7 @@ bool CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) override { + // It's safe to use `GetValueUnsafe()` as multiple policy types are handled. return policies.GetValueUnsafe(policy_name_); }
diff --git a/components/policy/core/browser/url_allowlist_policy_handler.cc b/components/policy/core/browser/url_allowlist_policy_handler.cc index 2408777..3ff2ac2f 100644 --- a/components/policy/core/browser/url_allowlist_policy_handler.cc +++ b/components/policy/core/browser/url_allowlist_policy_handler.cc
@@ -29,14 +29,14 @@ bool URLAllowlistPolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { - const base::Value* url_allowlist = policies.GetValueUnsafe(policy_name()); - if (!url_allowlist) + if (!policies.IsPolicySet(policy_name())) return true; - if (!url_allowlist->is_list()) { + const base::Value* url_allowlist = + policies.GetValue(policy_name(), base::Value::Type::LIST); + if (!url_allowlist) { errors->AddError(policy_name(), IDS_POLICY_TYPE_ERROR, base::Value::GetTypeName(base::Value::Type::LIST)); - return true; }
diff --git a/components/policy/core/browser/url_blocklist_policy_handler.cc b/components/policy/core/browser/url_blocklist_policy_handler.cc index cdec91d..d701df8 100644 --- a/components/policy/core/browser/url_blocklist_policy_handler.cc +++ b/components/policy/core/browser/url_blocklist_policy_handler.cc
@@ -32,6 +32,8 @@ bool URLBlocklistPolicyHandler::CheckPolicySettings(const PolicyMap& policies, PolicyErrorMap* errors) { size_t disabled_schemes_entries = 0; + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. // This policy is deprecated but still supported so check it first. const base::Value* disabled_schemes = policies.GetValueUnsafe(key::kDisabledSchemes); @@ -44,11 +46,12 @@ } } - const base::Value* url_blocklist = policies.GetValueUnsafe(policy_name()); - if (!url_blocklist) + if (!policies.IsPolicySet(policy_name())) return true; + const base::Value* url_blocklist = + policies.GetValue(policy_name(), base::Value::Type::LIST); - if (!url_blocklist->is_list()) { + if (!url_blocklist) { errors->AddError(policy_name(), IDS_POLICY_TYPE_ERROR, base::Value::GetTypeName(base::Value::Type::LIST)); @@ -94,15 +97,15 @@ void URLBlocklistPolicyHandler::ApplyPolicySettings(const PolicyMap& policies, PrefValueMap* prefs) { const base::Value* url_blocklist_policy = - policies.GetValueUnsafe(policy_name()); + policies.GetValue(policy_name(), base::Value::Type::LIST); const base::Value* disabled_schemes_policy = - policies.GetValueUnsafe(key::kDisabledSchemes); + policies.GetValue(key::kDisabledSchemes, base::Value::Type::LIST); absl::optional<std::vector<base::Value>> merged_url_blocklist; // We start with the DisabledSchemes because we have size limit when // handling URLBlocklists. - if (disabled_schemes_policy && disabled_schemes_policy->is_list()) { + if (disabled_schemes_policy) { merged_url_blocklist = std::vector<base::Value>(); for (const auto& entry : disabled_schemes_policy->GetListDeprecated()) { if (entry.is_string()) { @@ -112,7 +115,7 @@ } } - if (url_blocklist_policy && url_blocklist_policy->is_list()) { + if (url_blocklist_policy) { if (!merged_url_blocklist) merged_url_blocklist = std::vector<base::Value>();
diff --git a/components/policy/core/common/android/policy_map_android.cc b/components/policy/core/common/android/policy_map_android.cc index 037c9e4..a88cbf4 100644 --- a/components/policy/core/common/android/policy_map_android.cc +++ b/components/policy/core/common/android/policy_map_android.cc
@@ -108,6 +108,7 @@ const base::Value* PolicyMapAndroid::GetValue( JNIEnv* env, const base::android::JavaRef<jstring>& policy) const { + // It is safe to use `GetValueUnsafe()` as multiple policy types are handled. return policy_map_.GetValueUnsafe( base::android::ConvertJavaStringToUTF8(env, policy)); }
diff --git a/components/policy/core/common/default_chrome_apps_migrator.cc b/components/policy/core/common/default_chrome_apps_migrator.cc index f90995a..ecee5085 100644 --- a/components/policy/core/common/default_chrome_apps_migrator.cc +++ b/components/policy/core/common/default_chrome_apps_migrator.cc
@@ -96,6 +96,8 @@ void DefaultChromeAppsMigrator::EnsurePolicyValueIsList( PolicyMap* policies, const std::string& policy_name) const { + // It is safe to use `GetValueUnsafe()` because type checking is performed + // before the value is used. const base::Value* policy_value = policies->GetValueUnsafe(policy_name); if (!policy_value || !policy_value->is_list()) { const PolicyMap::Entry* forcelist_entry =
diff --git a/components/policy/core/common/policy_map.cc b/components/policy/core/common/policy_map.cc index 3035df5..df79bf0f 100644 --- a/components/policy/core/common/policy_map.cc +++ b/components/policy/core/common/policy_map.cc
@@ -352,6 +352,10 @@ return entry != map_.end() ? &entry->second : nullptr; } +bool PolicyMap::IsPolicySet(const std::string& policy) const { + return GetValueUnsafe(policy) != nullptr; +} + void PolicyMap::Set( const std::string& policy, PolicyLevel level,
diff --git a/components/policy/core/common/policy_map.h b/components/policy/core/common/policy_map.h index 073cd1e..e11b2ba5 100644 --- a/components/policy/core/common/policy_map.h +++ b/components/policy/core/common/policy_map.h
@@ -203,6 +203,9 @@ const base::Value* GetValueUnsafe(const std::string& policy) const; base::Value* GetMutableValueUnsafe(const std::string& policy); + // Returns true if the policy has a non-null value set. + bool IsPolicySet(const std::string& policy) const; + // Overwrites any existing information stored in the map for the key |policy|. // Resets the error for that policy to the empty string. void Set(const std::string& policy,
diff --git a/components/policy/core/common/policy_map_unittest.cc b/components/policy/core/common/policy_map_unittest.cc index 84223eb3..6501adf 100644 --- a/components/policy/core/common/policy_map_unittest.cc +++ b/components/policy/core/common/policy_map_unittest.cc
@@ -78,7 +78,9 @@ TEST_F(PolicyMapTest, SetAndGet) { PolicyMap map; + EXPECT_FALSE(map.IsPolicySet(kTestPolicyName1)); SetPolicy(&map, kTestPolicyName1, base::Value("aaa")); + EXPECT_TRUE(map.IsPolicySet(kTestPolicyName1)); const base::Value kExpectedStringA("aaa"); EXPECT_EQ(kExpectedStringA, *map.GetValueUnsafe(kTestPolicyName1)); EXPECT_EQ(kExpectedStringA, @@ -87,6 +89,7 @@ map.GetValue(kTestPolicyName1, base::Value::Type::BOOLEAN)); SetPolicy(&map, kTestPolicyName1, base::Value("bbb")); + EXPECT_TRUE(map.IsPolicySet(kTestPolicyName1)); const base::Value kExpectedStringB("bbb"); EXPECT_EQ(kExpectedStringB, *map.GetValueUnsafe(kTestPolicyName1)); EXPECT_EQ(kExpectedStringB, @@ -95,6 +98,7 @@ map.GetValue(kTestPolicyName1, base::Value::Type::BOOLEAN)); SetPolicy(&map, kTestPolicyName1, base::Value(true)); + EXPECT_TRUE(map.IsPolicySet(kTestPolicyName1)); const base::Value kExpectedBool(true); EXPECT_EQ(kExpectedBool, *map.GetValueUnsafe(kTestPolicyName1)); EXPECT_EQ(nullptr, map.GetValue(kTestPolicyName1, base::Value::Type::STRING)); @@ -102,6 +106,7 @@ *map.GetValue(kTestPolicyName1, base::Value::Type::BOOLEAN)); SetPolicy(&map, kTestPolicyName1, CreateExternalDataFetcher("dummy")); + EXPECT_FALSE(map.IsPolicySet(kTestPolicyName1)); map.AddMessage(kTestPolicyName1, PolicyMap::MessageType::kError, IDS_POLICY_STORE_STATUS_VALIDATION_ERROR, {kTestError}); EXPECT_EQ(nullptr, map.GetValueUnsafe(kTestPolicyName1)); @@ -121,6 +126,7 @@ CreateExternalDataFetcher("dummy").get())); map.Set(kTestPolicyName1, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, POLICY_SOURCE_ENTERPRISE_DEFAULT, absl::nullopt, nullptr); + EXPECT_FALSE(map.IsPolicySet(kTestPolicyName1)); EXPECT_EQ(nullptr, map.GetValueUnsafe(kTestPolicyName1)); entry = map.Get(kTestPolicyName1); ASSERT_NE(nullptr, entry);
diff --git a/components/policy/core/common/policy_service.cc b/components/policy/core/common/policy_service.cc index 678579e..5a74dd98 100644 --- a/components/policy/core/common/policy_service.cc +++ b/components/policy/core/common/policy_service.cc
@@ -31,6 +31,7 @@ if (ns != ns_) return; for (auto it : callback_map_) { + // It's safe to use `GetValueUnsafe()` as multiple policy types are handled. const base::Value* prev = previous.GetValueUnsafe(it.first); const base::Value* cur = current.GetValueUnsafe(it.first);
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 3fef781..81f108d 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -1773,6 +1773,28 @@ 'label': '''List of disabled protocol schemes''', }, { + 'name': 'GetDisplayMediaSetSelectAllScreensAllowedForUrls', + 'owners': ['file://chrome/browser/media/webrtc/OWNERS', 'simonha@chromium.org'], + 'type': 'list', + 'schema': { + 'type': 'array', + 'items': { 'type': 'string' }, + }, + 'supported_on': ['chrome_os:102-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': ['https://www.example.com', '[*.]example.edu'], + 'id': 972, + 'caption': '''Enables auto-select for multi screen captures''', + 'tags': [], + 'desc': '''The <ph name="GET_DISPLAY_MEDIA_SET_NAME">getDisplayMediaSet</ph> API allows web applications to capture multiple surfaces at once. + This policy unlocks the <ph name="AUTO_SELECT_ALL_SCREENS_NAME">autoSelectAllScreens</ph> property for web applications at defined origins. + If the <ph name="AUTO_SELECT_ALL_SCREENS_NAME">autoSelectAllScreens</ph> property is defined in a <ph name="GET_DISPLAY_MEDIA_SET_NAME">getDisplayMediaSet</ph> request, all screen surfaces are automatically captured without requiring explicit user permission. + If the policy is not set, <ph name="AUTO_SELECT_ALL_SCREENS_NAME">autoSelectAllScreens</ph> is not available for any web application.''', + }, + { 'name': 'GloballyScopeHTTPAuthCacheEnabled', 'owners': ['file://net/OWNERS', 'mmenke@chromium.org'], 'type': 'main', @@ -31592,6 +31614,6 @@ 'placeholders': [], 'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872], 'deleted_atomic_policy_group_ids': [19], - 'highest_id_currently_used': 971, + 'highest_id_currently_used': 972, 'highest_atomic_group_id_currently_used': 42 }
diff --git a/components/reading_list/features/reading_list_switches.cc b/components/reading_list/features/reading_list_switches.cc index 7b0b63cd..19d2093 100644 --- a/components/reading_list/features/reading_list_switches.cc +++ b/components/reading_list/features/reading_list_switches.cc
@@ -9,13 +9,6 @@ #include "build/build_config.h" #include "components/reading_list/features/reading_list_buildflags.h" -#if !BUILDFLAG(IS_IOS) -namespace features { -// Hosts some content in a side panel. https://crbug.com/1149995 -const base::Feature kSidePanel{"SidePanel", base::FEATURE_ENABLED_BY_DEFAULT}; -} // namespace features -#endif // !BUILDFLAG(IS_IOS) - namespace reading_list { namespace switches { @@ -29,11 +22,8 @@ bool IsReadingListEnabled() { #if BUILDFLAG(IS_IOS) return BUILDFLAG(ENABLE_READING_LIST); -#elif BUILDFLAG(IS_ANDROID) - return base::FeatureList::IsEnabled(kReadLater); #else - return base::FeatureList::IsEnabled(kReadLater) || - base::FeatureList::IsEnabled(features::kSidePanel); + return base::FeatureList::IsEnabled(kReadLater); #endif }
diff --git a/components/reading_list/features/reading_list_switches.h b/components/reading_list/features/reading_list_switches.h index bd8dcf9d..e3125987 100644 --- a/components/reading_list/features/reading_list_switches.h +++ b/components/reading_list/features/reading_list_switches.h
@@ -8,17 +8,6 @@ #include "base/feature_list.h" #include "build/build_config.h" -#if !BUILDFLAG(IS_IOS) -// Feature flag used for enabling side panel on desktop. -// TODO(crbug.com/1225279): Move this back to chrome/browser/ui/ui_features.h -// after kReadLater is cleaned up (and IsReadingListEnabled() returns true on -// Desktop). This is currently here so that kSidePanel (which doesn't work -// without read later) can imply that the reading list should be enabled. -namespace features { -extern const base::Feature kSidePanel; -} // namespace features -#endif // !BUILDFLAG(IS_IOS) - namespace reading_list { namespace switches {
diff --git a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc index 275095e..153438d 100644 --- a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc +++ b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc
@@ -189,7 +189,8 @@ nullptr), cache_manager_( std::make_unique<VerdictCacheManager>(nullptr, - content_setting_map.get())) { + content_setting_map.get(), + pref_service)) { cache_manager_->StopCleanUpTimerForTesting(); } TestPasswordProtectionService(const TestPasswordProtectionService&) = delete;
diff --git a/components/safe_browsing/core/browser/BUILD.gn b/components/safe_browsing/core/browser/BUILD.gn index 88064ff9..7b72ffb5 100644 --- a/components/safe_browsing/core/browser/BUILD.gn +++ b/components/safe_browsing/core/browser/BUILD.gn
@@ -90,6 +90,7 @@ "//components/history/core/browser", "//components/keyed_service/core:core", "//components/password_manager/core/browser:browser", + "//components/prefs", "//components/safe_browsing/core/browser/db:v4_protocol_manager_util", "//components/safe_browsing/core/common", "//components/safe_browsing/core/common/proto:csd_proto", @@ -107,6 +108,7 @@ "//base", "//base/test:test_support", "//components/content_settings/core/browser", + "//components/safe_browsing/core/common:safe_browsing_prefs", "//components/safe_browsing/core/common/proto:csd_proto", "//components/safe_browsing/core/common/proto:realtimeapi_proto", "//components/sync_preferences:test_support",
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service_unittest.cc b/components/safe_browsing/core/browser/realtime/url_lookup_service_unittest.cc index 4a84d60..ec6ea3b3 100644 --- a/components/safe_browsing/core/browser/realtime/url_lookup_service_unittest.cc +++ b/components/safe_browsing/core/browser/realtime/url_lookup_service_unittest.cc
@@ -104,7 +104,7 @@ &test_pref_service_, false /* is_off_the_record */, false /* store_last_modified */, false /* restore_session */); cache_manager_ = std::make_unique<VerdictCacheManager>( - nullptr, content_setting_map_.get()); + nullptr, content_setting_map_.get(), &test_pref_service_); referrer_chain_provider_ = std::make_unique<MockReferrerChainProvider>(); auto token_fetcher = std::make_unique<TestSafeBrowsingTokenFetcher>();
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager.cc b/components/safe_browsing/core/browser/verdict_cache_manager.cc index f430d69..dec564a29 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager.cc
@@ -386,7 +386,8 @@ VerdictCacheManager::VerdictCacheManager( history::HistoryService* history_service, - scoped_refptr<HostContentSettingsMap> content_settings) + scoped_refptr<HostContentSettingsMap> content_settings, + PrefService* pref_service) : stored_verdict_count_password_on_focus_(absl::nullopt), stored_verdict_count_password_entry_(absl::nullopt), stored_verdict_count_real_time_url_check_(absl::nullopt), @@ -396,6 +397,20 @@ if (!content_settings->IsOffTheRecord()) { ScheduleNextCleanUpAfterInterval(base::Seconds(kCleanUpIntervalInitSecond)); } + // pref_service can be null in tests. + if (pref_service) { + pref_change_registrar_.Init(pref_service); + pref_change_registrar_.Add( + prefs::kSafeBrowsingEnhanced, + base::BindRepeating(&VerdictCacheManager::CleanUpAllPageLoadTokens, + weak_factory_.GetWeakPtr(), + ClearReason::kSafeBrowsingStateChanged)); + pref_change_registrar_.Add( + prefs::kSafeBrowsingEnabled, + base::BindRepeating(&VerdictCacheManager::CleanUpAllPageLoadTokens, + weak_factory_.GetWeakPtr(), + ClearReason::kSafeBrowsingStateChanged)); + } CacheArtificialRealTimeUrlVerdict(); CacheArtificialPhishGuardVerdict(); } @@ -403,6 +418,7 @@ void VerdictCacheManager::Shutdown() { CleanUpExpiredVerdicts(); history_service_observation_.Reset(); + pref_change_registrar_.RemoveAll(); weak_factory_.InvalidateWeakPtrs(); } @@ -726,6 +742,12 @@ page_load_token_map_.size()); } +void VerdictCacheManager::CleanUpAllPageLoadTokens(ClearReason reason) { + base::UmaHistogramEnumeration("SafeBrowsing.PageLoadToken.ClearReason", + reason); + page_load_token_map_.clear(); +} + // Overridden from history::HistoryServiceObserver. void VerdictCacheManager::OnURLsDeleted( history::HistoryService* history_service,
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager.h b/components/safe_browsing/core/browser/verdict_cache_manager.h index 2e2684f..b0a4d6b 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager.h +++ b/components/safe_browsing/core/browser/verdict_cache_manager.h
@@ -16,6 +16,8 @@ #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_service_observer.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/prefs/pref_change_registrar.h" +#include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/proto/csd.pb.h" #include "components/safe_browsing/core/common/proto/realtimeapi.pb.h" #include "url/gurl.h" @@ -31,9 +33,9 @@ class VerdictCacheManager : public history::HistoryServiceObserver, public KeyedService { public: - explicit VerdictCacheManager( - history::HistoryService* history_service, - scoped_refptr<HostContentSettingsMap> content_settings); + VerdictCacheManager(history::HistoryService* history_service, + scoped_refptr<HostContentSettingsMap> content_settings, + PrefService* pref_service); VerdictCacheManager(const VerdictCacheManager&) = delete; VerdictCacheManager& operator=(const VerdictCacheManager&) = delete; VerdictCacheManager(VerdictCacheManager&&) = delete; @@ -123,6 +125,14 @@ FRIEND_TEST_ALL_PREFIXES(VerdictCacheManagerTest, TestCleanUpVerdictOlderThanUpperBound); + // Enum representing the reason why page load tokens are cleared. Used to log + // histograms. Entries must not be removed or reordered. + enum class ClearReason { + kSafeBrowsingStateChanged = 0, + + kMaxValue = kSafeBrowsingStateChanged + }; + void ScheduleNextCleanUpAfterInterval(base::TimeDelta interval); // Removes all the expired verdicts from cache. @@ -130,6 +140,7 @@ void CleanUpExpiredPhishGuardVerdicts(); void CleanUpExpiredRealTimeUrlCheckVerdicts(); void CleanUpExpiredPageLoadTokens(); + void CleanUpAllPageLoadTokens(ClearReason reason); // Helper method to remove content settings when URLs are deleted. If // |all_history| is true, removes all cached verdicts. Otherwise it removes @@ -181,6 +192,8 @@ base::OneShotTimer cleanup_timer_; + PrefChangeRegistrar pref_change_registrar_; + base::WeakPtrFactory<VerdictCacheManager> weak_factory_{this}; static bool has_artificial_unsafe_url_;
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc index 67feadb..1601da81 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc
@@ -12,6 +12,7 @@ #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/safe_browsing/core/common/proto/csd.pb.h" #include "components/safe_browsing/core/common/proto/realtimeapi.pb.h" +#include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" @@ -22,15 +23,20 @@ VerdictCacheManagerTest() {} void SetUp() override { + test_pref_service_.registry()->RegisterBooleanPref( + prefs::kSafeBrowsingEnabled, true); + test_pref_service_.registry()->RegisterBooleanPref( + prefs::kSafeBrowsingEnhanced, false); HostContentSettingsMap::RegisterProfilePrefs(test_pref_service_.registry()); content_setting_map_ = new HostContentSettingsMap( &test_pref_service_, false /* is_off_the_record */, false /* store_last_modified */, false /* restore_session */); cache_manager_ = std::make_unique<VerdictCacheManager>( - nullptr, content_setting_map_.get()); + nullptr, content_setting_map_.get(), &test_pref_service_); } void TearDown() override { + cache_manager_->Shutdown(); cache_manager_.reset(); content_setting_map_->ShutdownOnUIThread(); } @@ -84,8 +90,6 @@ scoped_refptr<HostContentSettingsMap> content_setting_map_; base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - - private: sync_preferences::TestingPrefServiceSyncable test_pref_service_; }; @@ -801,4 +805,20 @@ ASSERT_FALSE(token.has_token_value()); } +TEST_F(VerdictCacheManagerTest, TestClearTokenOnSafeBrowsingStateChanged) { + SetSafeBrowsingState(&test_pref_service_, + SafeBrowsingState::STANDARD_PROTECTION); + GURL url("https://www.example.com/path"); + cache_manager_->CreatePageLoadToken(url); + ChromeUserPopulation::PageLoadToken token = + cache_manager_->GetPageLoadToken(url); + ASSERT_TRUE(token.has_token_value()); + + SetSafeBrowsingState(&test_pref_service_, + SafeBrowsingState::NO_SAFE_BROWSING); + token = cache_manager_->GetPageLoadToken(url); + // Token is not found because the Safe Browsing state has changed. + ASSERT_FALSE(token.has_token_value()); +} + } // namespace safe_browsing
diff --git a/components/services/storage/public/mojom/indexed_db_control.mojom b/components/services/storage/public/mojom/indexed_db_control.mojom index 0090f50..16542dc 100644 --- a/components/services/storage/public/mojom/indexed_db_control.mojom +++ b/components/services/storage/public/mojom/indexed_db_control.mojom
@@ -75,7 +75,7 @@ // Called by chrome://indexeddb-internals to populate its page details. GetAllStorageKeysDetails() => (bool incognito, - mojo_base.mojom.DeprecatedListValue details); + mojo_base.mojom.ListValue details); // Disables the exit-time deletion of session-only data, so that internal // restarts can preserve that data.
diff --git a/components/services/storage/shared_storage/shared_storage_manager_unittest.cc b/components/services/storage/shared_storage/shared_storage_manager_unittest.cc index 024e4cb..cf004f764 100644 --- a/components/services/storage/shared_storage/shared_storage_manager_unittest.cc +++ b/components/services/storage/shared_storage/shared_storage_manager_unittest.cc
@@ -1006,8 +1006,9 @@ "Storage.SharedStorage.OnShutdown.RecoveryOnDiskAttempted", false, 1); } +// TODO(crbug.com/1312273): Test is flaky. TEST_P(SharedStorageManagerErrorParamTest, - InitFailure_DestroyAndRecreateDatabase) { + DISABLED_InitFailure_DestroyAndRecreateDatabase) { ASSERT_TRUE(GetManager()); ASSERT_TRUE(GetManager()->database()); SetDestroyCallback();
diff --git a/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.cc b/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.cc index ba1668d..fb7520ea 100644 --- a/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.cc +++ b/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.cc
@@ -6,10 +6,12 @@ #include <string> +#include "base/strings/strcat.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/fenced_frame_test_util.h" #include "content/public/test/test_navigation_observer.h" #include "testing/gtest/include/gtest/gtest.h" @@ -17,17 +19,24 @@ namespace { -content::RenderFrameHost* CreateFrameImpl( - const content::ToRenderFrameHost& adapter, - const GURL& url, - bool ad_script) { - content::RenderFrameHost* rfh = adapter.render_frame_host(); +using content::RenderFrameHost; +using content::test::FencedFrameTestHelper; + +RenderFrameHost* CreateFrameImpl(const content::ToRenderFrameHost& adapter, + const GURL& url, + bool ad_script, + bool is_fenced_frame) { + RenderFrameHost* rfh = adapter.render_frame_host(); content::WebContents* web_contents = content::WebContents::FromRenderFrameHost(rfh); - const bool is_prerender = - rfh->GetLifecycleState() == - content::RenderFrameHost::LifecycleState::kPrerendering; + const bool is_prerender = rfh->GetLifecycleState() == + RenderFrameHost::LifecycleState::kPrerendering; std::string name = GetUniqueFrameName(); + std::string frame_type = is_fenced_frame ? "FencedFrame" : "Frame"; + std::string ad_type = ad_script ? "Ad" : ""; + + RenderFrameHost* previous_most_recent_fenced_frame = + FencedFrameTestHelper::GetMostRecentlyAddedFencedFrame(rfh); if (is_prerender) { // TODO(bokan): We must avoid using a TestNavigationObserver if executing @@ -36,18 +45,23 @@ // Instead we use a promise based version of the script and wait on that. // Once load events in prerender are clarified this can be resolved. // https://crbug.com/1199682. + + // TODO(bokan): Fenced frames don't expose a load event so this approach + // won't work inside a prerender. + DCHECK(!is_fenced_frame); + std::string script = base::StringPrintf( R"JS( (async () => { await %s('%s', '%s'); })() )JS", - ad_script ? "createAdFramePromise" : "createFramePromise", + base::StrCat({"create", ad_type, frame_type, "Promise"}).c_str(), url.spec().c_str(), name.c_str()); EXPECT_TRUE(content::ExecJs(rfh, script)); } else { std::string script = base::StringPrintf( - "%s('%s','%s');", ad_script ? "createAdFrame" : "createFrame", + "%s('%s','%s');", base::StrCat({"create", ad_type, frame_type}).c_str(), url.spec().c_str(), name.c_str()); content::TestNavigationObserver navigation_observer(web_contents, 1); EXPECT_TRUE(content::ExecJs(rfh, script)); @@ -56,6 +70,17 @@ << navigation_observer.last_net_error_code(); } + if (is_fenced_frame) { + // For fenced frames, we can't use FrameMatchingPredicate because we want + // to return the fenced_frame_root RFH which isn't in the same + // Page/FrameTree as `rfh`. + RenderFrameHost* fenced_frame = + FencedFrameTestHelper::GetMostRecentlyAddedFencedFrame(rfh); + EXPECT_TRUE(fenced_frame); + EXPECT_NE(fenced_frame, previous_most_recent_fenced_frame); + return fenced_frame; + } + return content::FrameMatchingPredicate( rfh->GetPage(), base::BindRepeating(&content::FrameMatchesName, name)); } @@ -67,20 +92,34 @@ return base::StringPrintf("frame_%d", frame_count++); } -content::RenderFrameHost* CreateSrcFrameFromAdScript( +RenderFrameHost* CreateSrcFrameFromAdScript( const content::ToRenderFrameHost& adapter, const GURL& url) { - return CreateFrameImpl(adapter, url, true /* ad_script */); + return CreateFrameImpl(adapter, url, true /* ad_script */, + false /* is_fenced_frame */); } -content::RenderFrameHost* CreateSrcFrame( +RenderFrameHost* CreateFencedFrameFromAdScript( const content::ToRenderFrameHost& adapter, const GURL& url) { - return CreateFrameImpl(adapter, url, false /* ad_script */); + return CreateFrameImpl(adapter, url, true /* ad_script */, + true /* is_fenced_frame */); +} + +RenderFrameHost* CreateFencedFrame(const content::ToRenderFrameHost& adapter, + const GURL& url) { + return CreateFrameImpl(adapter, url, false /* ad_script */, + true /* is_fenced_frame */); +} + +RenderFrameHost* CreateSrcFrame(const content::ToRenderFrameHost& adapter, + const GURL& url) { + return CreateFrameImpl(adapter, url, false /* ad_script */, + false /* is_fenced_frame */); } testing::AssertionResult EvidenceForFrameComprises( - content::RenderFrameHost* frame_host, + RenderFrameHost* frame_host, bool parent_is_ad, blink::mojom::FilterListResult filter_list_result, blink::mojom::FrameCreationStackEvidence created_by_ad_script) { @@ -89,7 +128,7 @@ } testing::AssertionResult EvidenceForFrameComprises( - content::RenderFrameHost* frame_host, + RenderFrameHost* frame_host, bool parent_is_ad, blink::mojom::FilterListResult latest_filter_list_result, blink::mojom::FilterListResult most_restrictive_filter_list_result,
diff --git a/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.h b/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.h index 70cedb3..0f968f0 100644 --- a/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.h +++ b/components/subresource_filter/content/browser/ad_tagging_browser_test_utils.h
@@ -31,12 +31,24 @@ const content::ToRenderFrameHost& adapter, const GURL& url); +// Create a fencedframe that navigates via the src attribute. It's created by ad +// script. Returns after navigation has completed. +content::RenderFrameHost* CreateFencedFrameFromAdScript( + const content::ToRenderFrameHost& adapter, + const GURL& url); + // Create a frame that navigates via the src attribute. Returns after // navigation has completed. content::RenderFrameHost* CreateSrcFrame( const content::ToRenderFrameHost& adapter, const GURL& url); +// Create a fencedframe that navigates via the src attribute. Returns after +// navigation has completed. +content::RenderFrameHost* CreateFencedFrame( + const content::ToRenderFrameHost& adapter, + const GURL& url); + // Returns whether the ad evidence associated with the frame is composed of the // provided values. The first signature assumes that the most restrictive and // latest filter list results are the same.
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 a6c9e93..09cc4d51a 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
@@ -38,6 +38,8 @@ #include "net/base/net_errors.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom.h" namespace subresource_filter { @@ -184,17 +186,18 @@ // Update the ad status of a frame given the new navigation. This may tag or // untag a frame as an ad. - // TODO(crbug.com/1263541): This should also be done for fenced frames. - if (!navigation_handle->IsInMainFrame()) { + if (!IsInSubresourceFilterRoot(navigation_handle)) { blink::FrameAdEvidence& ad_evidence = EnsureFrameAdEvidence(navigation_handle); - DCHECK_EQ(ad_evidence.parent_is_ad(), - base::Contains(ad_frames_, - frame_host->GetParent()->GetFrameTreeNodeId())); + DCHECK_EQ( + ad_evidence.parent_is_ad(), + base::Contains( + ad_frames_, + frame_host->GetParentOrOuterDocument()->GetFrameTreeNodeId())); ad_evidence.set_is_complete(); ad_evidence_for_navigation = ad_evidence; - SetIsAdSubframe(frame_host, ad_evidence.IndicatesAdSubframe()); + SetIsAdFrame(frame_host, ad_evidence.IndicatesAdSubframe()); } mojom::ActivationState activation_state = @@ -548,8 +551,7 @@ content::NavigationHandle* navigation_handle, LoadPolicy load_policy) { DCHECK(!IsInSubresourceFilterRoot(navigation_handle)); - // TODO(crbug.com/1263541): We should tag fenced frames as ads. - if (!navigation_handle->GetParentFrame()) + if (!navigation_handle->GetParentFrameOrOuterDocument()) return; int frame_tree_node_id = navigation_handle->GetFrameTreeNodeId(); @@ -558,9 +560,9 @@ blink::FrameAdEvidence& ad_evidence = EnsureFrameAdEvidence(navigation_handle); DCHECK_EQ(ad_evidence.parent_is_ad(), - base::Contains( - ad_frames_, - navigation_handle->GetParentFrame()->GetFrameTreeNodeId())); + base::Contains(ad_frames_, + navigation_handle->GetParentFrameOrOuterDocument() + ->GetFrameTreeNodeId())); ad_evidence.UpdateFilterListResult( InterpretLoadPolicyAsEvidence(load_policy)); @@ -582,7 +584,7 @@ if (!dealer_handle_) return; if (auto filtering_throttle = - MaybeCreateSubframeNavigationFilteringThrottle(navigation_handle)) { + MaybeCreateChildFrameNavigationFilteringThrottle(navigation_handle)) { throttles->push_back(std::move(filtering_throttle)); } @@ -639,7 +641,7 @@ std::unique_ptr<SubframeNavigationFilteringThrottle> ContentSubresourceFilterThrottleManager:: - MaybeCreateSubframeNavigationFilteringThrottle( + MaybeCreateChildFrameNavigationFilteringThrottle( content::NavigationHandle* navigation_handle) { if (IsInSubresourceFilterRoot(navigation_handle)) return nullptr; @@ -752,50 +754,57 @@ // `FrameIsAdSubframe()` can only be called for an initial empty document. As // it won't pass through `ReadyToCommitNavigation()` (and has not yet passed // through `DidFinishNavigation()`), we know it won't be updated further. + // + // The fenced frame root will not report this for the initial empty document + // as the fenced frame is isolated from the embedder cannot be scripted. In + // that case we do can rely on passing through ReadyToCommitNavigation and we + // do so since fenced frame ad tagging varies significantly from regular + // iframes, see `AdScriptDidCreateFencedFrame`. + DCHECK(!render_frame_host->IsFencedFrameRoot()); EnsureFrameAdEvidence(render_frame_host).set_is_complete(); // The renderer has indicated that the frame is an ad. - SetIsAdSubframe(render_frame_host, /*is_ad_subframe=*/true); + SetIsAdFrame(render_frame_host, /*is_ad_frame=*/true); } -void ContentSubresourceFilterThrottleManager::SetIsAdSubframe( +void ContentSubresourceFilterThrottleManager::SetIsAdFrame( content::RenderFrameHost* render_frame_host, - bool is_ad_subframe) { + bool is_ad_frame) { int frame_tree_node_id = render_frame_host->GetFrameTreeNodeId(); DCHECK(base::Contains(tracked_ad_evidence_, frame_tree_node_id)); DCHECK_EQ(tracked_ad_evidence_.at(frame_tree_node_id).IndicatesAdSubframe(), - is_ad_subframe); - DCHECK(render_frame_host->GetParent()); + is_ad_frame); + DCHECK(render_frame_host->GetParentOrOuterDocument()); // `ad_frames_` does not need updating. - if (is_ad_subframe == base::Contains(ad_frames_, frame_tree_node_id)) + if (is_ad_frame == base::Contains(ad_frames_, frame_tree_node_id)) return; - if (is_ad_subframe) { + if (is_ad_frame) { ad_frames_.insert(frame_tree_node_id); } else { ad_frames_.erase(frame_tree_node_id); } - // Replicate `is_ad_subframe` to this frame's proxies, so that it can be + // Replicate `is_ad_frame` to this frame's proxies, so that it can be // looked up in any process involved in rendering the current page. - render_frame_host->UpdateIsAdSubframe(is_ad_subframe); + render_frame_host->UpdateIsAdSubframe(is_ad_frame); SubresourceFilterObserverManager::FromWebContents( content::WebContents::FromRenderFrameHost(render_frame_host)) - ->NotifyIsAdSubframeChanged(render_frame_host, is_ad_subframe); + ->NotifyIsAdSubframeChanged(render_frame_host, is_ad_frame); } -void ContentSubresourceFilterThrottleManager::SetIsAdSubframeForTesting( +void ContentSubresourceFilterThrottleManager::SetIsAdFrameForTesting( content::RenderFrameHost* render_frame_host, - bool is_ad_subframe) { + bool is_ad_frame) { DCHECK(render_frame_host->GetParentOrOuterDocument()); - if (is_ad_subframe == + if (is_ad_frame == base::Contains(ad_frames_, render_frame_host->GetFrameTreeNodeId())) { return; } - if (is_ad_subframe) { + if (is_ad_frame) { // We mark the frame as matching a blocking rule so that the ad evidence // indicates an ad subframe. EnsureFrameAdEvidence(render_frame_host) @@ -846,19 +855,70 @@ } void ContentSubresourceFilterThrottleManager::SubframeWasCreatedByAdScript() { - OnSubframeWasCreatedByAdScript(receiver_.GetCurrentTargetFrame()); + OnChildFrameWasCreatedByAdScript(receiver_.GetCurrentTargetFrame()); } -// TODO(crbug.com/1263541): This isn't called from fenced frame roots yet, but -// we should figure out how to replicate this for them and update code below. -void ContentSubresourceFilterThrottleManager::OnSubframeWasCreatedByAdScript( - content::RenderFrameHost* frame_host) { - DCHECK(frame_host); - - if (!frame_host->GetParent()) { +void ContentSubresourceFilterThrottleManager::AdScriptDidCreateFencedFrame( + const blink::RemoteFrameToken& placeholder_token) { + if (!blink::features::IsFencedFramesEnabled()) { + mojo::ReportBadMessage( + "AdScriptDidCreateFencedFrame can only be called when fenced frames " + "are enabled."); return; } + if (blink::features::kFencedFramesImplementationTypeParam.Get() != + blink::features::FencedFramesImplementationType::kMPArch) { + mojo::ReportBadMessage( + "AdScriptDidCreateFencedFrame can only be called in MPArch-based " + "fenced frames."); + return; + } + + // This method is called from the renderer when it creates a new MPArch-based + // fenced frame while an ad script was on the v8 stack. + // + // Normal frames compute this when the new RenderFrame initializes since that + // happens synchronously during the CreateFrame call. At that time, + // SubresourceFilterAgent calls SubframeWasCreatedByAdScript if needed. + // However, creating an MPArch-based FencedFrame doesn't create a RenderFrame + // in the calling process; it creates a RenderFrame in another renderer via + // IPC at which point we cannot inspect the v8 stack so we use this special + // path for fenced frames. + + content::RenderFrameHost* owner_frame = receiver_.GetCurrentTargetFrame(); + DCHECK(owner_frame); + + auto* fenced_frame_root = content::RenderFrameHost::FromPlaceholderToken( + owner_frame->GetProcess()->GetID(), placeholder_token); + + if (!fenced_frame_root) + return; + + if (!fenced_frame_root->IsFencedFrameRoot()) { + mojo::ReportBadMessage( + "AdScriptDidCreateFencedFrame received token for frame that isn't a " + "fenced frame root."); + return; + } + + if (fenced_frame_root->GetParentOrOuterDocument() != owner_frame) { + mojo::ReportBadMessage( + "AdScriptDidCreateFencedFrame called from non-embedder of fenced " + "frame."); + return; + } + + DCHECK(!base::Contains(tracked_ad_evidence_, + fenced_frame_root->GetFrameTreeNodeId())); + OnChildFrameWasCreatedByAdScript(fenced_frame_root); +} + +void ContentSubresourceFilterThrottleManager::OnChildFrameWasCreatedByAdScript( + content::RenderFrameHost* frame_host) { + DCHECK(frame_host); + DCHECK(!IsSubresourceFilterRoot(frame_host)); + EnsureFrameAdEvidence(frame_host) .set_created_by_ad_script( blink::mojom::FrameCreationStackEvidence::kCreatedByAdScript); @@ -867,22 +927,20 @@ blink::FrameAdEvidence& ContentSubresourceFilterThrottleManager::EnsureFrameAdEvidence( content::NavigationHandle* navigation_handle) { - // TODO(crbug.com/1263541): This should eventually be called for fenced frame - // roots as well. - DCHECK(!navigation_handle->IsInMainFrame()); + DCHECK(!IsInSubresourceFilterRoot(navigation_handle)); auto frame_tree_node_id = navigation_handle->GetFrameTreeNodeId(); auto parent_frame_tree_node_id = - navigation_handle->GetParentFrame()->GetFrameTreeNodeId(); + navigation_handle->GetParentFrameOrOuterDocument()->GetFrameTreeNodeId(); return EnsureFrameAdEvidence(frame_tree_node_id, parent_frame_tree_node_id); } blink::FrameAdEvidence& ContentSubresourceFilterThrottleManager::EnsureFrameAdEvidence( content::RenderFrameHost* render_frame_host) { - DCHECK(render_frame_host->GetParent()); + DCHECK(!IsSubresourceFilterRoot(render_frame_host)); auto frame_tree_node_id = render_frame_host->GetFrameTreeNodeId(); auto parent_frame_tree_node_id = - render_frame_host->GetParent()->GetFrameTreeNodeId(); + render_frame_host->GetParentOrOuterDocument()->GetFrameTreeNodeId(); return EnsureFrameAdEvidence(frame_tree_node_id, parent_frame_tree_node_id); }
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h index cd3ae718..61a3472 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
@@ -212,8 +212,8 @@ static void LogAction(SubresourceFilterAction action); - void SetIsAdSubframeForTesting(content::RenderFrameHost* render_frame_host, - bool is_ad_subframe); + void SetIsAdFrameForTesting(content::RenderFrameHost* render_frame_host, + bool is_ad_frame); // Returns the matching FrameAdEvidence for the frame indicated by // `render_frame_host` or `absl::nullopt` if there is none (i.e. the frame is @@ -266,7 +266,7 @@ FRIEND_TEST_ALL_PREFIXES(ContentSubresourceFilterThrottleManagerTest, FirstDisallowedLoadCalledOutOfOrder); std::unique_ptr<SubframeNavigationFilteringThrottle> - MaybeCreateSubframeNavigationFilteringThrottle( + MaybeCreateChildFrameNavigationFilteringThrottle( content::NavigationHandle* navigation_handle); std::unique_ptr<ActivationStateComputingNavigationThrottle> MaybeCreateActivationStateComputingThrottle( @@ -314,12 +314,14 @@ // Registers `frame_host` as a frame that was created by ad script. // TODO(crbug.com/1145634): Propagate this bit for a frame that navigates // cross-origin. - void OnSubframeWasCreatedByAdScript(content::RenderFrameHost* frame_host); + void OnChildFrameWasCreatedByAdScript(content::RenderFrameHost* frame_host); // mojom::SubresourceFilterHost: void DidDisallowFirstSubresource() override; void FrameIsAdSubframe() override; void SubframeWasCreatedByAdScript() override; + void AdScriptDidCreateFencedFrame( + const blink::RemoteFrameToken& placeholder_token) override; void SetDocumentLoadStatistics( mojom::DocumentLoadStatisticsPtr statistics) override; void OnAdsViolationTriggered(mojom::AdsViolation violation) override; @@ -347,8 +349,8 @@ // Sets whether the frame is considered an ad subframe. If the value has // changed, we also update the replication state and inform observers. - void SetIsAdSubframe(content::RenderFrameHost* render_frame_host, - bool is_ad_subframe); + void SetIsAdFrame(content::RenderFrameHost* render_frame_host, + bool is_ad_frame); // For each RenderFrameHost where the last committed load (or the initial load // if no committed load has occurred) has subresource filtering activated,
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc index c2f5f39..54345af 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -1092,7 +1092,7 @@ GURL("https://www.example.com/allowed.html"), main_rfh()); EXPECT_FALSE(throttle_manager()->IsRenderFrameHostTaggedAsAd(subframe)); - throttle_manager()->OnSubframeWasCreatedByAdScript(subframe); + throttle_manager()->OnChildFrameWasCreatedByAdScript(subframe); throttle_manager()->OnFrameIsAdSubframe(subframe); EXPECT_EQ(content::NavigationThrottle::PROCEED, @@ -1134,7 +1134,7 @@ // Simulate the render process telling the manager that the frame is an ad due // to creation by ad script. - throttle_manager()->OnSubframeWasCreatedByAdScript(initial_subframe); + throttle_manager()->OnChildFrameWasCreatedByAdScript(initial_subframe); throttle_manager()->OnFrameIsAdSubframe(initial_subframe); EXPECT_EQ(content::NavigationThrottle::PROCEED, @@ -1165,7 +1165,7 @@ // Simulate the render process telling the manager that the frame is an ad due // to creation by ad script. - throttle_manager()->OnSubframeWasCreatedByAdScript(subframe); + throttle_manager()->OnChildFrameWasCreatedByAdScript(subframe); throttle_manager()->OnFrameIsAdSubframe(subframe); EXPECT_EQ(content::NavigationThrottle::PROCEED,
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.cc b/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.cc index 53093fd..7c354c9 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.cc +++ b/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.cc
@@ -548,6 +548,10 @@ } } +bool IsSubresourceFilterRoot(content::RenderFrameHost* rfh) { + return !rfh->GetParent() && !rfh->IsFencedFrameRoot(); +} + content::Page& GetSubresourceFilterRootPage(content::RenderFrameHost* rfh) { bool mparch_fenced_frames_enabled = blink::features::IsFencedFramesEnabled() &&
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.h b/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.h index efd6edb..5ac0f35a 100644 --- a/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.h +++ b/components/subresource_filter/content/browser/content_subresource_filter_web_contents_helper.h
@@ -199,6 +199,10 @@ // by the subresource filter. bool IsInSubresourceFilterRoot(content::NavigationHandle* navigation_handle); +// Same as above but for RenderFrameHosts, returns true if the given +// RenderFrameHost is a subresource filter root. +bool IsSubresourceFilterRoot(content::RenderFrameHost* rfh); + // Gets the closest ancestor Page which is a subresource filter root, i.e. one // for which we have created a throttle manager. Note: This crosses the fenced // frame boundary (as they are considered a subresource filter child), but does
diff --git a/components/subresource_filter/content/browser/subresource_filter_test_harness.cc b/components/subresource_filter/content/browser/subresource_filter_test_harness.cc index 0bda150..1e171aa 100644 --- a/components/subresource_filter/content/browser/subresource_filter_test_harness.cc +++ b/components/subresource_filter/content/browser/subresource_filter_test_harness.cc
@@ -175,12 +175,12 @@ return throttle_manager_test_support_->profile_context()->settings_manager(); } -void SubresourceFilterTestHarness::SetIsAdSubframe( +void SubresourceFilterTestHarness::SetIsAdFrame( content::RenderFrameHost* render_frame_host, - bool is_ad_subframe) { + bool is_ad_frame) { ContentSubresourceFilterThrottleManager::FromPage( render_frame_host->GetPage()) - ->SetIsAdSubframeForTesting(render_frame_host, is_ad_subframe); + ->SetIsAdFrameForTesting(render_frame_host, is_ad_frame); } } // namespace subresource_filter
diff --git a/components/subresource_filter/content/browser/subresource_filter_test_harness.h b/components/subresource_filter/content/browser/subresource_filter_test_harness.h index 3fae669c..efe4707 100644 --- a/components/subresource_filter/content/browser/subresource_filter_test_harness.h +++ b/components/subresource_filter/content/browser/subresource_filter_test_harness.h
@@ -83,8 +83,8 @@ return database_manager_.get(); } - void SetIsAdSubframe(content::RenderFrameHost* render_frame_host, - bool is_ad_subframe); + void SetIsAdFrame(content::RenderFrameHost* render_frame_host, + bool is_ad_frame); content::WebContents* web_contents() { return content::RenderViewHostTestHarness::web_contents();
diff --git a/components/subresource_filter/content/mojom/subresource_filter.mojom b/components/subresource_filter/content/mojom/subresource_filter.mojom index f4209c1..82327237 100644 --- a/components/subresource_filter/content/mojom/subresource_filter.mojom +++ b/components/subresource_filter/content/mojom/subresource_filter.mojom
@@ -6,6 +6,7 @@ import "components/subresource_filter/core/mojom/subresource_filter.mojom"; import "third_party/blink/public/mojom/ad_tagging/ad_evidence.mojom"; +import "third_party/blink/public/mojom/tokens/tokens.mojom"; // The interface implemented in the renderer that the browser host can interact // with. This interface is per-frame. @@ -41,6 +42,23 @@ // browser keeps track of this for deciding whether to tag subframes as ads. SubframeWasCreatedByAdScript(); + // Notifies the host that an MPArch-based FencedFrame was created while an ad + // script was on the v8 stack. Note that this is called from the owning + // RenderFrame since in MPArch the fenced frame's inner RenderFrame is + // isolated from the embedding frame so it cannot inspect the creating v8 + // stack. The host uses this to initialize the AdEvidence for the inner + // frame. This is called immediately after the FencedFrame is created by the + // embedding RenderFrameHostImpl. + // + // Note: This is not called in the ShadowDOM FencedFrame implementation. + // + // `fenced_frame_root_placeholder_token` is the frame token for the + // placeholder remote frame representing the fenced frame root in the + // embedding renderer. i.e. what the browser side calls the "outer delegate + // proxy". + AdScriptDidCreateFencedFrame( + blink.mojom.RemoteFrameToken fenced_frame_root_placeholder_token); + // This is sent to a RenderFrameHost in the browser when a document load is // finished, just before the DidFinishLoad message, and contains statistics // collected by the DocumentSubresourceFilter up until that point: the number
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.cc b/components/subresource_filter/content/renderer/subresource_filter_agent.cc index 72254da..1e6f9b2 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.cc
@@ -25,6 +25,7 @@ #include "ipc/ipc_message.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/frame/frame_ad_evidence.h" #include "third_party/blink/public/platform/web_worker_fetch_context.h" #include "third_party/blink/public/web/web_document.h" @@ -32,6 +33,22 @@ #include "third_party/blink/public/web/web_local_frame.h" #include "url/url_constants.h" +namespace { + +bool IsMPArchFencedFrameRoot(content::RenderFrame* frame) { + if (blink::features::kFencedFramesImplementationTypeParam.Get() != + blink::features::FencedFramesImplementationType::kMPArch) { + return false; + } + + // Unit tests may have a nullptr render_frame. + if (!frame) + return false; + return frame->IsInFencedFrameTree() && frame->IsMainFrame(); +} + +} // namespace + namespace subresource_filter { SubresourceFilterAgent::SubresourceFilterAgent( @@ -61,7 +78,16 @@ // to match previous behaviour, and because this frame will always exist. // Whereas the provisional frame would only be created to perform the // navigation conditionally, so we ignore sending the IPC there. - if (!IsMainFrame() && !IsProvisional()) { + if (IsSubresourceFilterChild() && !IsMPArchFencedFrameRoot(render_frame()) && + !IsProvisional()) { + // Note: We intentionally exclude fenced-frame roots here since they do not + // create a RenderFrame in the creating renderer. By the time the fenced + // frame initializes its RenderFrame in a new process, + // IsSubframeCreatedByAdScript will not see the creating call stack. Fenced + // frames compute and send this information to the browser from + // DidCreateFencedFrame which is called by the creating RenderFrame. + // Additionally, there's no need to set evidence for the initial empty + // subframe since the fenced frame is isolated from its embedder. if (IsSubframeCreatedByAdScript()) SendSubframeWasCreatedByAdScript(); @@ -77,8 +103,8 @@ &SubresourceFilterAgent::OnSubresourceFilterAgentRequest, base::Unretained(this))); - if (IsMainFrame()) { - // If a main frame has an activated opener, we will activate the + if (!IsSubresourceFilterChild()) { + // If a root frame has an activated opener, we will activate the // subresource filter for the initial empty document, which was created // before the constructor for `this`. This ensures that a popup's final // document is appropriately activated, even when the the initial @@ -110,11 +136,15 @@ return render_frame()->GetWebFrame()->GetDocument().Url(); } -bool SubresourceFilterAgent::IsMainFrame() { - return render_frame()->IsMainFrame(); +bool SubresourceFilterAgent::IsSubresourceFilterChild() { + return !render_frame()->IsMainFrame() || + render_frame()->IsInFencedFrameTree(); } bool SubresourceFilterAgent::IsParentAdSubframe() { + // A fenced frame root should never ask this since it can't see the outer + // frame tree. Its AdEvidence is always computed by the browser. + DCHECK(!IsMPArchFencedFrameRoot(render_frame())); return render_frame()->GetWebFrame()->Parent()->IsAdSubframe(); } @@ -123,6 +153,7 @@ } bool SubresourceFilterAgent::IsSubframeCreatedByAdScript() { + DCHECK(!IsMPArchFencedFrameRoot(render_frame())); return render_frame()->GetWebFrame()->IsSubframeCreatedByAdScript(); } @@ -148,6 +179,7 @@ } void SubresourceFilterAgent::SendSubframeWasCreatedByAdScript() { + DCHECK(!IsMPArchFencedFrameRoot(render_frame())); GetSubresourceFilterHost()->SubframeWasCreatedByAdScript(); } @@ -171,6 +203,13 @@ if (!render_frame) return mojom::ActivationState(); + // A fenced frame is isolated from its outer embedder so we cannot inspect + // the parent's activation state. However, that's ok because the embedder + // cannot script the fenced frame so we can wait until a navigation to set + // activation state. + if (IsMPArchFencedFrameRoot(render_frame)) + return mojom::ActivationState(); + blink::WebFrame* frame_to_inherit_from = render_frame->IsMainFrame() ? render_frame->GetWebFrame()->Opener() : render_frame->GetWebFrame()->Parent(); @@ -203,7 +242,7 @@ UMA_HISTOGRAM_ENUMERATION("SubresourceFilter.DocumentLoad.ActivationState", activation_level); - if (IsMainFrame()) { + if (!IsSubresourceFilterChild()) { UMA_HISTOGRAM_BOOLEAN( "SubresourceFilter.MainFrameLoad.RulesetIsAvailableAnyActivationLevel", ruleset_dealer_->IsRulesetFileAvailable()); @@ -237,7 +276,7 @@ mojom::ActivationStatePtr activation_state, const absl::optional<blink::FrameAdEvidence>& ad_evidence) { activation_state_for_next_document_ = *activation_state; - if (!IsMainFrame()) { + if (IsSubresourceFilterChild()) { DCHECK(ad_evidence.has_value()); SetAdEvidence(ad_evidence.value()); } else { @@ -252,6 +291,7 @@ void SubresourceFilterAgent::SetAdEvidenceForInitialEmptySubframe() { DCHECK(!IsAdSubframe()); DCHECK(!AdEvidence().has_value()); + DCHECK(!IsMPArchFencedFrameRoot(render_frame())); blink::FrameAdEvidence ad_evidence(IsParentAdSubframe()); ad_evidence.set_created_by_ad_script( @@ -271,10 +311,10 @@ // which requires changes to the unit tests. const GURL& url = GetDocumentURL(); - // A new browser-side host is created for each new page (i.e. new main frame - // document) so we have to reset the remote so we re-bind on the next - // message. - if (IsMainFrame()) + // A new browser-side host is created for each new page (i.e. new document in + // a subresource filter root frame) so we have to reset the remote so we + // re-bind on the next message. + if (!IsSubresourceFilterChild()) subresource_filter_host_.reset(); const mojom::ActivationState activation_state = @@ -283,9 +323,10 @@ ResetInfoForNextDocument(); - // Do not pollute the histograms with uninteresting main frame documents. - const bool should_record_histograms = - !IsMainFrame() || url.SchemeIsHTTPOrHTTPS() || url.SchemeIsFile(); + // Do not pollute the histograms with uninteresting root frame documents. + const bool should_record_histograms = IsSubresourceFilterChild() || + url.SchemeIsHTTPOrHTTPS() || + url.SchemeIsFile(); if (should_record_histograms) { RecordHistogramsOnFilterCreation(activation_state); } @@ -365,9 +406,17 @@ GetSubresourceFilterHost()->OnAdsViolationTriggered( subresource_filter::mojom::AdsViolation::kOverlayPopupAd); } + void SubresourceFilterAgent::OnLargeStickyAdDetected() { GetSubresourceFilterHost()->OnAdsViolationTriggered( subresource_filter::mojom::AdsViolation::kLargeStickyAd); } +void SubresourceFilterAgent::DidCreateFencedFrame( + const blink::RemoteFrameToken& placeholder_token) { + if (render_frame()->GetWebFrame()->IsAdScriptInStack()) { + GetSubresourceFilterHost()->AdScriptDidCreateFencedFrame(placeholder_token); + } +} + } // namespace subresource_filter
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent.h b/components/subresource_filter/content/renderer/subresource_filter_agent.h index 3699f7b..32b880a 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent.h +++ b/components/subresource_filter/content/renderer/subresource_filter_agent.h
@@ -61,9 +61,15 @@ // Returns the URL of the currently committed document. virtual GURL GetDocumentURL(); - virtual bool IsMainFrame(); + // Returns true if this agent is attached to a frame that is a subresource + // filter child. See content_subresource_filter_throttle_manager.h for + // details. + virtual bool IsSubresourceFilterChild(); virtual bool IsParentAdSubframe(); virtual bool IsProvisional(); + // This is only called by non-main frames since a child main frames (e.g. + // Fenced Frame) will not be initialized on the same stack as the script that + // created it. virtual bool IsSubframeCreatedByAdScript(); // Injects the provided subresource |filter| into the DocumentLoader @@ -85,7 +91,8 @@ virtual void SendFrameIsAdSubframe(); // Tells the browser that the frame is a subframe that was created by ad - // script. + // script. Fenced frame roots do not call this as they're tagged via + // DidCreateFencedFrame. virtual void SendSubframeWasCreatedByAdScript(); // True if the frame has been heuristically determined to be an ad subframe. @@ -97,6 +104,8 @@ // The browser will not inform the renderer of the (sub)frame's ad status and // evidence in the case of an initial synchronous commit to about:blank. We // thus fill in the frame's ad evidence and, if necessary, tag it as an ad. + // Fenced frame roots do not call this as their ad evidence is initialized + // via DidCreateFencedFrame. void SetAdEvidenceForInitialEmptySubframe(); // mojom::SubresourceFilterAgent: @@ -135,6 +144,8 @@ void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) override; void OnOverlayPopupAdDetected() override; void OnLargeStickyAdDetected() override; + void DidCreateFencedFrame( + const blink::RemoteFrameToken& placeholder_token) override; // Owned by the ChromeContentRendererClient and outlives us. UnverifiedRulesetDealer* ruleset_dealer_;
diff --git a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc index 15bf998..9ddf6d66 100644 --- a/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc +++ b/components/subresource_filter/content/renderer/subresource_filter_agent_unittest.cc
@@ -41,14 +41,14 @@ public: explicit SubresourceFilterAgentUnderTest( UnverifiedRulesetDealer* ruleset_dealer, - bool is_main_frame, + bool is_subresource_filter_root, bool is_provisional, bool is_parent_ad_subframe, bool is_subframe_created_by_ad_script) : SubresourceFilterAgent(nullptr /* RenderFrame */, ruleset_dealer, nullptr /* AdResourceTracker */), - is_main_frame_(is_main_frame), + is_subresource_filter_root_(is_subresource_filter_root), is_provisional_(is_provisional), is_parent_ad_subframe_(is_parent_ad_subframe), is_subframe_created_by_ad_script_(is_subframe_created_by_ad_script) {} @@ -68,7 +68,9 @@ MOCK_METHOD0(SendFrameIsAdSubframe, void()); MOCK_METHOD0(SendSubframeWasCreatedByAdScript, void()); - bool IsMainFrame() override { return is_main_frame_; } + bool IsSubresourceFilterChild() override { + return !is_subresource_filter_root_; + } bool IsProvisional() override { return is_provisional_; } bool IsParentAdSubframe() override { return is_parent_ad_subframe_; } bool IsSubframeCreatedByAdScript() override { @@ -114,7 +116,7 @@ return inherited_activation_state_for_new_document_; } - const bool is_main_frame_; + const bool is_subresource_filter_root_; const bool is_provisional_; const bool is_parent_ad_subframe_; const bool is_subframe_created_by_ad_script_; @@ -152,25 +154,26 @@ protected: void SetUp() override { - ResetAgent(/*is_main_frame=*/true, + ResetAgent(/*is_subresource_filter_root=*/true, /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); } - void ResetAgent(bool is_main_frame, + void ResetAgent(bool is_subresource_filter_root, bool is_provisional, bool is_parent_ad_subframe, bool is_subframe_created_by_ad_script) { - ResetAgentWithoutInitialize(is_main_frame, is_provisional, + ResetAgentWithoutInitialize(is_subresource_filter_root, is_provisional, is_parent_ad_subframe, is_subframe_created_by_ad_script); ExpectSendSubframeWasCreatedByAdScript( - !is_main_frame && !is_provisional && is_subframe_created_by_ad_script + !is_subresource_filter_root && !is_provisional && + is_subframe_created_by_ad_script ? 1 : 0); ExpectSendFrameIsAdSubframe( - !is_main_frame && !is_provisional && + !is_subresource_filter_root && !is_provisional && (is_parent_ad_subframe || is_subframe_created_by_ad_script) ? 1 : 0); @@ -181,14 +184,14 @@ // This creates the `agent_` but does not initialize it, so that tests can // inject gmock expectations against the `agent_` to verify or change the // behaviour of the initialize step. - void ResetAgentWithoutInitialize(bool is_main_frame, + void ResetAgentWithoutInitialize(bool is_subresource_filter_root, bool is_provisional, bool is_parent_ad_subframe, bool is_subframe_created_by_ad_script) { agent_ = std::make_unique< ::testing::StrictMock<SubresourceFilterAgentUnderTest>>( - &ruleset_dealer_, is_main_frame, is_provisional, is_parent_ad_subframe, - is_subframe_created_by_ad_script); + &ruleset_dealer_, is_subresource_filter_root, is_provisional, + is_parent_ad_subframe, is_subframe_created_by_ad_script); // Initialize() will see about:blank. EXPECT_CALL(*agent(), GetDocumentURL()) .WillRepeatedly(::testing::Return(GURL("about:blank"))); @@ -233,7 +236,7 @@ agent_as_rfo()->ReadyToCommitNavigation(nullptr); absl::optional<blink::FrameAdEvidence> ad_evidence; - if (!agent()->IsMainFrame()) { + if (agent()->IsSubresourceFilterChild()) { // Generate an evidence object matching the `ad_type`. ad_evidence = blink::FrameAdEvidence(false /* parent_is_ad */); if (is_ad_subframe) { @@ -606,7 +609,7 @@ ASSERT_TRUE(::testing::Mock::VerifyAndClearExpectations(agent())); auto filter = agent()->TakeFilter(); - ResetAgent(/*is_main_frame=*/true, /*is_provisional=*/false, + ResetAgent(/*is_subresource_filter_root=*/true, /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); @@ -623,7 +626,7 @@ ASSERT_NO_FATAL_FAILURE( SetTestRulesetToDisallowURLsWithPathSuffix("somethingNotMatched")); - ResetAgent(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgent(/*is_subresource_filter_root=*/false, /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); agent()->SetInheritedActivationStateForNewDocument( @@ -662,7 +665,7 @@ ASSERT_NO_FATAL_FAILURE( SetTestRulesetToDisallowURLsWithPathSuffix(kTestFirstURLPathSuffix)); - ResetAgent(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgent(/*is_subresource_filter_root=*/false, /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); @@ -683,7 +686,7 @@ ASSERT_NO_FATAL_FAILURE( SetTestRulesetToDisallowURLsWithPathSuffix(kTestFirstURLPathSuffix)); - ResetAgent(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgent(/*is_subresource_filter_root=*/false, /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); @@ -709,7 +712,8 @@ } TEST_F(SubresourceFilterAgentTest, DryRun_SendsFrameIsAdSubframe) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/true, /*is_subframe_created_by_ad_script=*/false); ExpectSendFrameIsAdSubframe(1); @@ -726,7 +730,8 @@ TEST_F(SubresourceFilterAgentTest, DryRun_SendFrameIsAdSubframeNotSentFromProvisionalFrame) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/true, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/true, /*is_parent_ad_subframe=*/true, /*is_subframe_created_by_ad_script=*/false); ExpectSendFrameIsAdSubframe(0); @@ -744,7 +749,8 @@ TEST_F(SubresourceFilterAgentTest, DryRun_SendFrameIsAdSubframeNotSentFromNonAdFrame) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); ExpectSendFrameIsAdSubframe(0); @@ -762,7 +768,8 @@ TEST_F(SubresourceFilterAgentTest, DryRun_SendFrameIsAdSubframeNotSentFromMainFrame) { - ResetAgentWithoutInitialize(/*is_main_frame=*/true, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/true, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/true, /*is_subframe_created_by_ad_script=*/false); ExpectSendFrameIsAdSubframe(0); @@ -780,7 +787,8 @@ TEST_F(SubresourceFilterAgentTest, DryRun_SendFrameIsAdSubframeNotSentFromNonAdSubframe) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script*/ false); ExpectSendFrameIsAdSubframe(0); @@ -797,7 +805,8 @@ } TEST_F(SubresourceFilterAgentTest, DryRun_SendsSubframeWasCreatedByAdScript) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/true); ExpectSendSubframeWasCreatedByAdScript(1); @@ -816,7 +825,8 @@ TEST_F(SubresourceFilterAgentTest, DryRun_SendSubframeWasCreatedByAdScriptNotSentFromProvisionalFrame) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/true, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/true, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/true); ExpectSendSubframeWasCreatedByAdScript(0); @@ -835,7 +845,8 @@ TEST_F( SubresourceFilterAgentTest, DryRun_SendSubframeWasCreatedByAdScriptNotSentFromFrameNotCreatedByAdScript) { - ResetAgentWithoutInitialize(/*is_main_frame=*/false, /*is_provisional=*/false, + ResetAgentWithoutInitialize(/*is_subresource_filter_root=*/false, + /*is_provisional=*/false, /*is_parent_ad_subframe=*/false, /*is_subframe_created_by_ad_script=*/false); ExpectSendSubframeWasCreatedByAdScript(0);
diff --git a/components/sync/engine/cancelation_signal_unittest.cc b/components/sync/engine/cancelation_signal_unittest.cc index 8b8b9af0..1788982 100644 --- a/components/sync/engine/cancelation_signal_unittest.cc +++ b/components/sync/engine/cancelation_signal_unittest.cc
@@ -10,7 +10,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace syncer {
diff --git a/components/sync/engine/net/http_bridge_unittest.cc b/components/sync/engine/net/http_bridge_unittest.cc index 27e2601b..c315731 100644 --- a/components/sync/engine/net/http_bridge_unittest.cc +++ b/components/sync/engine/net/http_bridge_unittest.cc
@@ -18,7 +18,6 @@ #include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/sync/engine/cancelation_signal.h" #include "components/variations/scoped_variations_ids_provider.h"
diff --git a/components/test/data/ad_tagging/ad_script.js b/components/test/data/ad_tagging/ad_script.js index 0a7455f0..485ca94c 100644 --- a/components/test/data/ad_tagging/ad_script.js +++ b/components/test/data/ad_tagging/ad_script.js
@@ -4,6 +4,14 @@ 'use strict'; +function createAdFencedFrame(url, name) { + const frame = document.createElement('fencedframe'); + frame.name = name; + frame.id = name; + frame.src = url; + document.body.appendChild(frame); +} + function createAdFrame(url, name, sbox_attr, load_callback, error_callback) { const frame = document.createElement('iframe'); frame.name = name;
diff --git a/components/test/data/ad_tagging/create_frame.js b/components/test/data/ad_tagging/create_frame.js index 5feb62d8..39a83f8 100644 --- a/components/test/data/ad_tagging/create_frame.js +++ b/components/test/data/ad_tagging/create_frame.js
@@ -4,6 +4,14 @@ 'use strict'; +function createFencedFrame(url, name) { + const frame = document.createElement('fencedframe'); + frame.name = name; + frame.id = name; + frame.src = url; + document.body.appendChild(frame); +} + function createFrame(url, name, sbox_attr, load_callback, error_callback) { const frame = document.createElement('iframe'); frame.name = name;
diff --git a/components/test/data/ad_tagging/frame_factory.html.mock-http-headers b/components/test/data/ad_tagging/frame_factory.html.mock-http-headers new file mode 100644 index 0000000..27f34d2 --- /dev/null +++ b/components/test/data/ad_tagging/frame_factory.html.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Supports-Loading-Mode: fenced-frame
diff --git a/components/test/data/ad_tagging/test_div.html.mock-http-headers b/components/test/data/ad_tagging/test_div.html.mock-http-headers new file mode 100644 index 0000000..27f34d2 --- /dev/null +++ b/components/test/data/ad_tagging/test_div.html.mock-http-headers
@@ -0,0 +1,2 @@ +HTTP/1.1 200 OK +Supports-Loading-Mode: fenced-frame
diff --git a/components/test/data/webcrypto/hmac.json b/components/test/data/webcrypto/hmac.json deleted file mode 100644 index f18c9d8c..0000000 --- a/components/test/data/webcrypto/hmac.json +++ /dev/null
@@ -1,64 +0,0 @@ -[ - // Empty sets. Result generated via OpenSSL commandline tool. These - // particular results are also posted on the Wikipedia page examples: - // http://en.wikipedia.org/wiki/Hash-based_message_authentication_code - { - "hash": "sha-1", - "key": "00", - "message": "", - // openssl dgst -sha1 -hmac "" < /dev/null - "mac": "fbdb1d1b18aa6c08324b7d64b71fb76370690e1d" - }, - { - "hash": "sha-256", - "key": "00", - "message": "", - // openssl dgst -sha256 -hmac "" < /dev/null - "mac": "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad" - }, - // For this data, see http://csrc.nist.gov/groups/STM/cavp/index.html#07 - // Download: - // http://csrc.nist.gov/groups/STM/cavp/documents/mac/hmactestvectors.zip - // L=20 set 45 - { - "hash": "sha-1", - "key": "59785928d72516e31272", - "message": "a3ce8899df1022e8d2d539b47bf0e309c66f84095e21438ec355bf119ce5fdcb4e73a619cdf36f25b369d8c38ff419997f0c59830108223606e31223483fd39edeaa4d3f0d21198862d239c9fd26074130ff6c86493f5227ab895c8f244bd42c7afce5d147a20a590798c68e708e964902d124dadecdbda9dbd0051ed710e9bf", - "mac": "3c8162589aafaee024fc9a5ca50dd2336fe3eb28" - }, - // L=20 set 299 - { - "hash": "sha-1", - "key": "ceb9aedf8d6efcf0ae52bea0fa99a9e26ae81bacea0cff4d5eecf201e3bca3c3577480621b818fd717ba99d6ff958ea3d59b2527b019c343bb199e648090225867d994607962f5866aa62930d75b58f6", - "message": "99958aa459604657c7bf6e4cdfcc8785f0abf06ffe636b5b64ecd931bd8a456305592421fc28dbcccb8a82acea2be8e54161d7a78e0399a6067ebaca3f2510274dc9f92f2c8ae4265eec13d7d42e9f8612d7bc258f913ecb5a3a5c610339b49fb90e9037b02d684fc60da835657cb24eab352750c8b463b1a8494660d36c3ab2", - "mac": "4ac41ab89f625c60125ed65ffa958c6b490ea670" - }, - // L=32, set 30 - { - "hash": "sha-256", - "key": "9779d9120642797f1747025d5b22b7ac607cab08e1758f2f3a46c8be1e25c53b8c6a8f58ffefa176", - "message": "b1689c2591eaf3c9e66070f8a77954ffb81749f1b00346f9dfe0b2ee905dcc288baf4a92de3f4001dd9f44c468c3d07d6c6ee82faceafc97c2fc0fc0601719d2dcd0aa2aec92d1b0ae933c65eb06a03c9c935c2bad0459810241347ab87e9f11adb30415424c6c7f5f22a003b8ab8de54f6ded0e3ab9245fa79568451dfa258e", - "mac": "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b" - }, - // L=32, set 224 - { - "hash": "sha-256", - "key": "4b7ab133efe99e02fc89a28409ee187d579e774f4cba6fc223e13504e3511bef8d4f638b9aca55d4a43b8fbd64cf9d74dcc8c9e8d52034898c70264ea911a3fd70813fa73b083371289b", - "message": "138efc832c64513d11b9873c6fd4d8a65dbf367092a826ddd587d141b401580b798c69025ad510cff05fcfbceb6cf0bb03201aaa32e423d5200925bddfadd418d8e30e18050eb4f0618eb9959d9f78c1157d4b3e02cd5961f138afd57459939917d9144c95d8e6a94c8f6d4eef3418c17b1ef0b46c2a7188305d9811dccb3d99", - "mac": "4f1ee7cb36c58803a8721d4ac8c4cf8cae5d8832392eed2a96dc59694252801b" - }, - // L=48, Count=50 - { - "hash": "sha-384", - "key": "d137f3e6cc4af28554beb03ba7a97e60c9d3959cd3bb08068edbf68d402d0498c6ee0ae9e3a20dc7d8586e5c352f605cee19", - "message": "64a884670d1c1dff555483dcd3da305dfba54bdc4d817c33ccb8fe7eb2ebf623624103109ec41644fa078491900c59a0f666f0356d9bc0b45bcc79e5fc9850f4543d96bc68009044add0838ac1260e80592fbc557b2ddaf5ed1b86d3ed8f09e622e567f1d39a340857f6a850cceef6060c48dac3dd0071fe68eb4ed2ed9aca01", - "mac": "c550fa53514da34f15e7f98ea87226ab6896cdfae25d3ec2335839f755cdc9a4992092e70b7e5bd422784380b6396cf5" - }, - // L=64, Count=65 - { - "hash": "sha-512", - "key": "c367aeb5c02b727883ffe2a4ceebf911b01454beb328fb5d57fc7f11bf744576aba421e2a63426ea8109bd28ff21f53cd2bf1a11c6c989623d6ec27cdb0bbf458250857d819ff84408b4f3dce08b98b1587ee59683af8852a0a5f55bda3ab5e132b4010e", - "message": "1a7331c8ff1b748e3cee96952190fdbbe4ee2f79e5753bbb368255ee5b19c05a4ed9f1b2c72ff1e9b9cb0348205087befa501e7793770faf0606e9c901836a9bc8afa00d7db94ee29eb191d5cf3fc3e8da95a0f9f4a2a7964289c3129b512bd890de8700a9205420f28a8965b6c67be28ba7fe278e5fcd16f0f22cf2b2eacbb9", - "mac": "4459066109cb11e6870fa9c6bfd251adfa304c0a2928ca915049704972edc560cc7c0bc38249e9101aae2f7d4da62eaff83fb07134efc277de72b9e4ab360425" - } -]
diff --git a/components/user_notes/browser/user_note_service.cc b/components/user_notes/browser/user_note_service.cc index d7ea5d3c..eed2bef0 100644 --- a/components/user_notes/browser/user_note_service.cc +++ b/components/user_notes/browser/user_note_service.cc
@@ -20,21 +20,23 @@ return weak_ptr_factory_.GetSafeRef(); } -void UserNoteService::OnNoteInstanceAddedToPage(const std::string& guid, - UserNotesManager* manager) { +void UserNoteService::OnNoteInstanceAddedToPage( + const base::UnguessableToken& id, + UserNotesManager* manager) { DCHECK(IsUserNotesEnabled()); - const auto& entry_it = model_map_.find(guid); + const auto& entry_it = model_map_.find(id); DCHECK(entry_it != model_map_.end()) << "A note instance without backing model was added to a page"; entry_it->second.managers.insert(manager); } -void UserNoteService::OnNoteInstanceRemovedFromPage(const std::string& guid, - UserNotesManager* manager) { +void UserNoteService::OnNoteInstanceRemovedFromPage( + const base::UnguessableToken& id, + UserNotesManager* manager) { DCHECK(IsUserNotesEnabled()); - const auto& entry_it = model_map_.find(guid); + const auto& entry_it = model_map_.find(id); DCHECK(entry_it != model_map_.end()) << "A note model was destroyed before all its instances"; @@ -44,22 +46,23 @@ // If there are no longer any pages displaying this model, destroy it. if (entry_it->second.managers.empty()) { - model_map_.erase(guid); + model_map_.erase(id); } } -void UserNoteService::OnNoteFocused(const std::string& guid) { +void UserNoteService::OnNoteFocused(const base::UnguessableToken& id) { DCHECK(IsUserNotesEnabled()); NOTIMPLEMENTED(); } -void UserNoteService::OnNoteCreationDone(const std::string& guid, +void UserNoteService::OnNoteCreationDone(const base::UnguessableToken& id, const std::string& note_content) { DCHECK(IsUserNotesEnabled()); NOTIMPLEMENTED(); } -void UserNoteService::OnNoteCreationCancelled(const std::string& guid) { +void UserNoteService::OnNoteCreationCancelled( + const base::UnguessableToken& id) { DCHECK(IsUserNotesEnabled()); NOTIMPLEMENTED(); }
diff --git a/components/user_notes/browser/user_note_service.h b/components/user_notes/browser/user_note_service.h index c3e6218..be0c604 100644 --- a/components/user_notes/browser/user_note_service.h +++ b/components/user_notes/browser/user_note_service.h
@@ -15,6 +15,7 @@ #include "base/gtest_prod_util.h" #include "base/memory/safe_ref.h" #include "base/memory/weak_ptr.h" +#include "base/unguessable_token.h" #include "components/user_notes/interfaces/user_note_service_delegate.h" #include "components/user_notes/interfaces/user_notes_ui_delegate.h" #include "components/user_notes/model/user_note.h" @@ -36,22 +37,22 @@ // Called by |UserNotesManager| objects when a |UserNoteInstance| is added to // the page they're attached to. Updates the model map to add a ref to the - // given |UserNotesManager| for the note with the specified GUID. - void OnNoteInstanceAddedToPage(const std::string& guid, + // given |UserNotesManager| for the note with the specified ID. + void OnNoteInstanceAddedToPage(const base::UnguessableToken& id, UserNotesManager* manager); // Same as |OnNoteInstanceAddedToPage|, except for when a note is removed from // a page. Updates the model map to remove the ref to the given // |UserNotesManager|. If this is the last page where the note was displayed, // also deletes the model from the model map. - void OnNoteInstanceRemovedFromPage(const std::string& guid, + void OnNoteInstanceRemovedFromPage(const base::UnguessableToken& id, UserNotesManager* manager); // UserNotesUIDelegate implementation. - void OnNoteFocused(const std::string& guid) override; - void OnNoteCreationDone(const std::string& guid, + void OnNoteFocused(const base::UnguessableToken& id) override; + void OnNoteCreationDone(const base::UnguessableToken& id, const std::string& note_content) override; - void OnNoteCreationCancelled(const std::string& guid) override; + void OnNoteCreationCancelled(const base::UnguessableToken& id) override; private: struct ModelMapEntry { @@ -74,7 +75,10 @@ // instance of that note, which is necessary to clean up the models when // they're no longer in use and to remove notes from affected web pages when // they're deleted by the user. - std::unordered_map<std::string, ModelMapEntry> model_map_; + std::unordered_map<base::UnguessableToken, + ModelMapEntry, + base::UnguessableTokenHash> + model_map_; std::unique_ptr<UserNoteServiceDelegate> delegate_; base::WeakPtrFactory<UserNoteService> weak_ptr_factory_{this};
diff --git a/components/user_notes/browser/user_note_service_unittest.cc b/components/user_notes/browser/user_note_service_unittest.cc index cac6cb48..21e2bfc5 100644 --- a/components/user_notes/browser/user_note_service_unittest.cc +++ b/components/user_notes/browser/user_note_service_unittest.cc
@@ -17,9 +17,6 @@ namespace { -const std::string kNoteId1 = "note-id-1"; -const std::string kNoteId2 = "note-id-2"; - // This is a hack to use a null |Page| in the tests instead of creating a // mock, which is a relatively high effort task. Passing |nullptr| to this // function and using the return value in a constructor requiring a |Page&| @@ -51,22 +48,26 @@ class UserNoteServiceTest : public testing::Test { public: UserNoteServiceTest() { + // Create 2 note ids. + note_ids_.push_back(base::UnguessableToken::Create()); + note_ids_.push_back(base::UnguessableToken::Create()); + scoped_feature_list_.InitAndEnableFeature(user_notes::kUserNotes); note_service_ = std::make_unique<UserNoteService>( std::make_unique<UserNoteServiceDelegateMockImpl>()); - auto note1 = std::make_unique<UserNote>(kNoteId1, GetTestUserNoteMetadata(), - GetTestUserNoteBody(), - GetTestUserNotePageTarget()); - auto note2 = std::make_unique<UserNote>(kNoteId2, GetTestUserNoteMetadata(), - GetTestUserNoteBody(), - GetTestUserNotePageTarget()); + auto note1 = std::make_unique<UserNote>( + note_ids_[0], GetTestUserNoteMetadata(), GetTestUserNoteBody(), + GetTestUserNotePageTarget()); + auto note2 = std::make_unique<UserNote>( + note_ids_[1], GetTestUserNoteMetadata(), GetTestUserNoteBody(), + GetTestUserNotePageTarget()); UserNoteService::ModelMapEntry entry1(std::move(note1)); UserNoteService::ModelMapEntry entry2(std::move(note2)); - note_service_->model_map_.emplace(kNoteId1, std::move(entry1)); - note_service_->model_map_.emplace(kNoteId2, std::move(entry2)); + note_service_->model_map_.emplace(note_ids_[0], std::move(entry1)); + note_service_->model_map_.emplace(note_ids_[1], std::move(entry2)); } - int ManagerCountForId(const std::string& id) { + int ManagerCountForId(const base::UnguessableToken& id) { const auto& entry_it = note_service_->model_map_.find(id); if (entry_it == note_service_->model_map_.end()) { return -1; @@ -74,7 +75,7 @@ return entry_it->second.managers.size(); } - bool DoesModelExist(const std::string& id) { + bool DoesModelExist(const base::UnguessableToken& id) { const auto& entry_it = note_service_->model_map_.find(id); return entry_it != note_service_->model_map_.end(); } @@ -84,26 +85,27 @@ protected: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<UserNoteService> note_service_; + std::vector<base::UnguessableToken> note_ids_; }; TEST_F(UserNoteServiceTest, AddNoteIntancesToModelMap) { // Verify initial state. EXPECT_EQ(ModelMapSize(), 2); - EXPECT_EQ(ManagerCountForId(kNoteId1), 0); - EXPECT_EQ(ManagerCountForId(kNoteId2), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 0); // Simulate note instances being created in managers. auto m1 = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); auto m2 = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); - note_service_->OnNoteInstanceAddedToPage(kNoteId1, m1.get()); - note_service_->OnNoteInstanceAddedToPage(kNoteId1, m2.get()); - note_service_->OnNoteInstanceAddedToPage(kNoteId2, m1.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[0], m1.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[0], m2.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[1], m1.get()); EXPECT_EQ(ModelMapSize(), 2); - EXPECT_EQ(ManagerCountForId(kNoteId1), 2); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); } TEST_F(UserNoteServiceTest, RemoveNoteIntancesFromModelMap) { @@ -112,34 +114,34 @@ UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); auto m2 = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); - note_service_->OnNoteInstanceAddedToPage(kNoteId1, m1.get()); - note_service_->OnNoteInstanceAddedToPage(kNoteId1, m2.get()); - note_service_->OnNoteInstanceAddedToPage(kNoteId2, m1.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[0], m1.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[0], m2.get()); + note_service_->OnNoteInstanceAddedToPage(note_ids_[1], m1.get()); // Verify initial state. EXPECT_EQ(ModelMapSize(), 2); - EXPECT_EQ(ManagerCountForId(kNoteId1), 2); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); // Simulate a note instance being removed from a page. Its ref should be // removed from the model map, but only for the removed note. - note_service_->OnNoteInstanceRemovedFromPage(kNoteId1, m1.get()); + note_service_->OnNoteInstanceRemovedFromPage(note_ids_[0], m1.get()); EXPECT_EQ(ModelMapSize(), 2); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); // Simulate the last instance of a note being removed from its page. Its model // should be cleaned up from the model map. - note_service_->OnNoteInstanceRemovedFromPage(kNoteId1, m2.get()); + note_service_->OnNoteInstanceRemovedFromPage(note_ids_[0], m2.get()); EXPECT_EQ(ModelMapSize(), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); - EXPECT_FALSE(DoesModelExist(kNoteId1)); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); + EXPECT_FALSE(DoesModelExist(note_ids_[0])); // Repeat with the other note instance. - note_service_->OnNoteInstanceRemovedFromPage(kNoteId2, m1.get()); + note_service_->OnNoteInstanceRemovedFromPage(note_ids_[1], m1.get()); EXPECT_EQ(ModelMapSize(), 0); - EXPECT_FALSE(DoesModelExist(kNoteId1)); - EXPECT_FALSE(DoesModelExist(kNoteId2)); + EXPECT_FALSE(DoesModelExist(note_ids_[0])); + EXPECT_FALSE(DoesModelExist(note_ids_[1])); } } // namespace user_notes
diff --git a/components/user_notes/browser/user_notes_manager.cc b/components/user_notes/browser/user_notes_manager.cc index 828ec34a..c9c6a67 100644 --- a/components/user_notes/browser/user_notes_manager.cc +++ b/components/user_notes/browser/user_notes_manager.cc
@@ -23,13 +23,14 @@ UserNotesManager::~UserNotesManager() { for (const auto& entry_it : instance_map_) { - service_->OnNoteInstanceRemovedFromPage(entry_it.second->model().guid(), + service_->OnNoteInstanceRemovedFromPage(entry_it.second->model().id(), this); } } -UserNoteInstance* UserNotesManager::GetNoteInstance(const std::string& guid) { - const auto& entry_it = instance_map_.find(guid); +UserNoteInstance* UserNotesManager::GetNoteInstance( + const base::UnguessableToken id) { + const auto& entry_it = instance_map_.find(id); if (entry_it == instance_map_.end()) { return nullptr; } @@ -47,23 +48,23 @@ return notes; } -void UserNotesManager::RemoveNote(const std::string& guid) { - const auto& entry_it = instance_map_.find(guid); +void UserNotesManager::RemoveNote(const base::UnguessableToken id) { + const auto& entry_it = instance_map_.find(id); DCHECK(entry_it != instance_map_.end()) << "Attempted to remove a note instance from a page where it didn't " "exist"; - service_->OnNoteInstanceRemovedFromPage(guid, this); + service_->OnNoteInstanceRemovedFromPage(id, this); instance_map_.erase(entry_it); } void UserNotesManager::AddNoteInstance(std::unique_ptr<UserNoteInstance> note) { - DCHECK(instance_map_.find(note->model().guid()) == instance_map_.end()) + DCHECK(instance_map_.find(note->model().id()) == instance_map_.end()) << "Attempted to add a note instance for the same note to the same page " "more than once"; - service_->OnNoteInstanceAddedToPage(note->model().guid(), this); - instance_map_.emplace(note->model().guid(), std::move(note)); + service_->OnNoteInstanceAddedToPage(note->model().id(), this); + instance_map_.emplace(note->model().id(), std::move(note)); } } // namespace user_notes
diff --git a/components/user_notes/browser/user_notes_manager.h b/components/user_notes/browser/user_notes_manager.h index 6403505..36f095d 100644 --- a/components/user_notes/browser/user_notes_manager.h +++ b/components/user_notes/browser/user_notes_manager.h
@@ -12,6 +12,7 @@ #include "base/gtest_prod_util.h" #include "base/memory/safe_ref.h" +#include "base/unguessable_token.h" #include "components/user_notes/browser/user_note_instance.h" #include "components/user_notes/browser/user_note_service.h" #include "content/public/browser/page_user_data.h" @@ -39,15 +40,15 @@ UserNotesManager(const UserNotesManager&) = delete; UserNotesManager& operator=(const UserNotesManager&) = delete; - // Returns the note instance for the given GUID, or nullptr if this page does + // Returns the note instance for the given ID, or nullptr if this page does // not have an instance of that note. - UserNoteInstance* GetNoteInstance(const std::string& guid); + UserNoteInstance* GetNoteInstance(const base::UnguessableToken id); // Returns all note instances for the |Page| this object is attached to. const std::vector<UserNoteInstance*> GetAllNoteInstances(); // Destroys the note instance associated with the given GUID. - void RemoveNote(const std::string& guid); + void RemoveNote(const base::UnguessableToken id); // Stores the given note instance into this object's note instance container. void AddNoteInstance(std::unique_ptr<UserNoteInstance> note); @@ -69,7 +70,9 @@ base::SafeRef<UserNoteService> service_; // The list of note instances displayed in this page, mapped by their note ID. - std::unordered_map<std::string, std::unique_ptr<UserNoteInstance>> + std::unordered_map<base::UnguessableToken, + std::unique_ptr<UserNoteInstance>, + base::UnguessableTokenHash> instance_map_; };
diff --git a/components/user_notes/browser/user_notes_manager_unittest.cc b/components/user_notes/browser/user_notes_manager_unittest.cc index 4701f26..7c2a541 100644 --- a/components/user_notes/browser/user_notes_manager_unittest.cc +++ b/components/user_notes/browser/user_notes_manager_unittest.cc
@@ -17,10 +17,6 @@ namespace { -const std::string kNoteId1 = "note-id-1"; -const std::string kNoteId2 = "note-id-2"; -const std::string kNoteId3 = "note-id-3"; - // This is a hack to use a null |Page| in the tests instead of creating a // mock, which is a relatively high effort task. Passing |nullptr| to this // function and using the return value in a constructor requiring a |Page&| @@ -52,30 +48,35 @@ class UserNotesManagerTest : public testing::Test { public: UserNotesManagerTest() { + // Create 3 note ids. + note_ids_.push_back(base::UnguessableToken::Create()); + note_ids_.push_back(base::UnguessableToken::Create()); + note_ids_.push_back(base::UnguessableToken::Create()); + scoped_feature_list_.InitAndEnableFeature(user_notes::kUserNotes); note_service_ = std::make_unique<UserNoteService>( std::make_unique<UserNoteServiceDelegateMockImpl>()); UserNoteService::ModelMapEntry entry1(std::make_unique<UserNote>( - kNoteId1, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + note_ids_[0], GetTestUserNoteMetadata(), GetTestUserNoteBody(), GetTestUserNotePageTarget())); UserNoteService::ModelMapEntry entry2(std::make_unique<UserNote>( - kNoteId2, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + note_ids_[1], GetTestUserNoteMetadata(), GetTestUserNoteBody(), GetTestUserNotePageTarget())); UserNoteService::ModelMapEntry entry3(std::make_unique<UserNote>( - kNoteId3, GetTestUserNoteMetadata(), GetTestUserNoteBody(), + note_ids_[2], GetTestUserNoteMetadata(), GetTestUserNoteBody(), GetTestUserNotePageTarget())); - note_service_->model_map_.emplace(kNoteId1, std::move(entry1)); - note_service_->model_map_.emplace(kNoteId2, std::move(entry2)); - note_service_->model_map_.emplace(kNoteId3, std::move(entry3)); + note_service_->model_map_.emplace(note_ids_[0], std::move(entry1)); + note_service_->model_map_.emplace(note_ids_[1], std::move(entry2)); + note_service_->model_map_.emplace(note_ids_[2], std::move(entry3)); } - base::SafeRef<UserNote> GetSafeRefForNote(std::string id) { + base::SafeRef<UserNote> GetSafeRefForNote(base::UnguessableToken id) { const auto& entry_it = note_service_->model_map_.find(id); EXPECT_NE(entry_it, note_service_->model_map_.end()); return entry_it->second.model->GetSafeRef(); } - int ManagerCountForId(const std::string& id) { + int ManagerCountForId(const base::UnguessableToken& id) { const auto& entry_it = note_service_->model_map_.find(id); if (entry_it == note_service_->model_map_.end()) { return -1; @@ -85,7 +86,8 @@ int ModelMapSize() { return note_service_->model_map_.size(); } - bool DoesManagerExistForId(const std::string& id, UserNotesManager* manager) { + bool DoesManagerExistForId(const base::UnguessableToken& id, + UserNotesManager* manager) { const auto& model_entry_it = note_service_->model_map_.find(id); if (model_entry_it == note_service_->model_map_.end()) { return false; @@ -96,10 +98,10 @@ } bool DoResultsContainId(const std::vector<UserNoteInstance*>& instances, - const std::string& id) { + const base::UnguessableToken& id) { bool found = false; for (UserNoteInstance* instance : instances) { - if (instance->model().guid() == id) { + if (instance->model().id() == id) { found = true; break; } @@ -110,6 +112,7 @@ protected: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<UserNoteService> note_service_; + std::vector<base::UnguessableToken> note_ids_; }; TEST_F(UserNotesManagerTest, Destructor) { @@ -119,17 +122,17 @@ auto m2 = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId3))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[2]))); // Verify initial state. EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); - EXPECT_EQ(ManagerCountForId(kNoteId3), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 1); EXPECT_EQ(m1->instance_map_.size(), 0u); EXPECT_EQ(m2->instance_map_.size(), 3u); @@ -137,9 +140,9 @@ // map. m1.reset(); EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); - EXPECT_EQ(ManagerCountForId(kNoteId3), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 1); // Destroy a manager with instances. Refs to the manager should be removed // from the model map for all notes. In this case, since this was also the @@ -153,23 +156,23 @@ auto m = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); // Verify initial state. EXPECT_EQ(m->instance_map_.size(), 2u); // Try to get an instance that doesn't exist. There should be no crash. - UserNoteInstance* i = m->GetNoteInstance(kNoteId3); + UserNoteInstance* i = m->GetNoteInstance(note_ids_[2]); EXPECT_EQ(i, nullptr); // Try to get an instance that exists. It should return the expected instance. m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId3))); - i = m->GetNoteInstance(kNoteId3); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[2]))); + i = m->GetNoteInstance(note_ids_[2]); EXPECT_NE(i, nullptr); - EXPECT_EQ(i->model().guid(), kNoteId3); + EXPECT_EQ(i->model().id(), note_ids_[2]); } TEST_F(UserNotesManagerTest, GetAllNoteInstances) { @@ -187,16 +190,16 @@ // Add a few instances to the manager and try to get them. All instances // should be returned. m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); m->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId3))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[2]))); const auto& results = m->GetAllNoteInstances(); EXPECT_EQ(results.size(), 3u); - EXPECT_TRUE(DoResultsContainId(results, kNoteId1)); - EXPECT_TRUE(DoResultsContainId(results, kNoteId2)); - EXPECT_TRUE(DoResultsContainId(results, kNoteId3)); + EXPECT_TRUE(DoResultsContainId(results, note_ids_[0])); + EXPECT_TRUE(DoResultsContainId(results, note_ids_[1])); + EXPECT_TRUE(DoResultsContainId(results, note_ids_[2])); } TEST_F(UserNotesManagerTest, RemoveNote) { @@ -206,48 +209,48 @@ auto m2 = UserNotesManager::CreateForTest(NullPage(), note_service_->GetSafeRef()); m1->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m1->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); // Verify initial state. EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 2); - EXPECT_EQ(ManagerCountForId(kNoteId2), 2); - EXPECT_EQ(ManagerCountForId(kNoteId3), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 0); EXPECT_EQ(m1->instance_map_.size(), 2u); EXPECT_EQ(m2->instance_map_.size(), 2u); // Remove a note instance from a manager. It should not affect the other // managers this note appears in, and it should not affect the other instances // for this manager. - m1->RemoveNote(kNoteId1); + m1->RemoveNote(note_ids_[0]); EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 2); - EXPECT_EQ(ManagerCountForId(kNoteId3), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 0); EXPECT_EQ(m1->instance_map_.size(), 1u); EXPECT_EQ(m2->instance_map_.size(), 2u); - EXPECT_FALSE(DoesManagerExistForId(kNoteId1, m1.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId2, m1.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId1, m2.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[0], m1.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[1], m1.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], m2.get())); // Remove the last instance of a manager. It should not cause a problem or // affect the other managers. - m1->RemoveNote(kNoteId2); + m1->RemoveNote(note_ids_[1]); EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); - EXPECT_EQ(ManagerCountForId(kNoteId3), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 0); EXPECT_EQ(m1->instance_map_.size(), 0u); EXPECT_EQ(m2->instance_map_.size(), 2u); - EXPECT_FALSE(DoesManagerExistForId(kNoteId1, m1.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId2, m1.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId1, m2.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[0], m1.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[1], m1.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], m2.get())); } TEST_F(UserNotesManagerTest, AddNoteInstance) { @@ -259,9 +262,9 @@ // Verify initial state. EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 0); - EXPECT_EQ(ManagerCountForId(kNoteId2), 0); - EXPECT_EQ(ManagerCountForId(kNoteId3), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 0); EXPECT_EQ(m1->instance_map_.size(), 0u); EXPECT_EQ(m2->instance_map_.size(), 0u); @@ -269,41 +272,41 @@ // both the manager's instance map and the service's model map. It should not // affect other managers. m1->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId1))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[0]))); m1->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 1); - EXPECT_EQ(ManagerCountForId(kNoteId3), 0); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 0); EXPECT_EQ(m1->instance_map_.size(), 2u); EXPECT_EQ(m2->instance_map_.size(), 0u); - EXPECT_TRUE(DoesManagerExistForId(kNoteId1, m1.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId2, m1.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId3, m1.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId1, m2.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId2, m2.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId3, m2.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], m1.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[1], m1.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[2], m1.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[0], m2.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[1], m2.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[2], m2.get())); // Add instances to another manager. It should be correctly reflected in // both the manager's instance map and the service's model map. It should not // affect other managers or instances in other managers. m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId2))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[1]))); m2->AddNoteInstance( - std::make_unique<UserNoteInstance>(GetSafeRefForNote(kNoteId3))); + std::make_unique<UserNoteInstance>(GetSafeRefForNote(note_ids_[2]))); EXPECT_EQ(ModelMapSize(), 3); - EXPECT_EQ(ManagerCountForId(kNoteId1), 1); - EXPECT_EQ(ManagerCountForId(kNoteId2), 2); - EXPECT_EQ(ManagerCountForId(kNoteId3), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[0]), 1); + EXPECT_EQ(ManagerCountForId(note_ids_[1]), 2); + EXPECT_EQ(ManagerCountForId(note_ids_[2]), 1); EXPECT_EQ(m1->instance_map_.size(), 2u); EXPECT_EQ(m2->instance_map_.size(), 2u); - EXPECT_TRUE(DoesManagerExistForId(kNoteId1, m1.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId2, m1.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId3, m1.get())); - EXPECT_FALSE(DoesManagerExistForId(kNoteId1, m2.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId2, m2.get())); - EXPECT_TRUE(DoesManagerExistForId(kNoteId3, m2.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[0], m1.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[1], m1.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[2], m1.get())); + EXPECT_FALSE(DoesManagerExistForId(note_ids_[0], m2.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[1], m2.get())); + EXPECT_TRUE(DoesManagerExistForId(note_ids_[2], m2.get())); } } // namespace user_notes
diff --git a/components/user_notes/interfaces/user_note_storage.h b/components/user_notes/interfaces/user_note_storage.h index a753e6e..a278be2 100644 --- a/components/user_notes/interfaces/user_note_storage.h +++ b/components/user_notes/interfaces/user_note_storage.h
@@ -10,6 +10,7 @@ #include <unordered_map> #include "base/callback.h" +#include "base/unguessable_token.h" #include "components/user_notes/model/user_note.h" #include "components/user_notes/model/user_note_metadata.h" #include "url/gurl.h" @@ -18,7 +19,9 @@ // Interface that callers can use to interact with the UserNotes in storage. class UserNoteStorage { - typedef std::unordered_map<std::string, std::unique_ptr<UserNoteMetadata>> + typedef std::unordered_map<base::UnguessableToken, + std::unique_ptr<UserNoteMetadata>, + base::UnguessableTokenHash> NoteMetadataIdMap; public:
diff --git a/components/user_notes/interfaces/user_notes_ui_delegate.h b/components/user_notes/interfaces/user_notes_ui_delegate.h index b5997ef1..4bfed148 100644 --- a/components/user_notes/interfaces/user_notes_ui_delegate.h +++ b/components/user_notes/interfaces/user_notes_ui_delegate.h
@@ -7,6 +7,8 @@ #include <string> +#include "base/unguessable_token.h" + namespace user_notes { // Interface used by the UI layer (e.g. Side Panel on desktop) to delegate @@ -19,14 +21,14 @@ virtual ~UserNotesUIDelegate() = default; // Called when a note in the UI is focused. - virtual void OnNoteFocused(const std::string& guid) = 0; + virtual void OnNoteFocused(const base::UnguessableToken& id) = 0; // Called when the user successfully creates a new note in the UI. - virtual void OnNoteCreationDone(const std::string& guid, + virtual void OnNoteCreationDone(const base::UnguessableToken& id, const std::string& note_content) = 0; // Called when the user aborts the note creation process in the UI. - virtual void OnNoteCreationCancelled(const std::string& guid) = 0; + virtual void OnNoteCreationCancelled(const base::UnguessableToken& id) = 0; }; } // namespace user_notes
diff --git a/components/user_notes/model/user_note.cc b/components/user_notes/model/user_note.cc index e542ba9..ffe39bf5 100644 --- a/components/user_notes/model/user_note.cc +++ b/components/user_notes/model/user_note.cc
@@ -6,11 +6,11 @@ namespace user_notes { -UserNote::UserNote(const std::string& guid, +UserNote::UserNote(const base::UnguessableToken& id, std::unique_ptr<UserNoteMetadata> metadata, std::unique_ptr<UserNoteBody> body, std::unique_ptr<UserNoteTarget> target) - : guid_(guid), metadata_(std::move(metadata)), target_(std::move(target)) {} + : id_(id), metadata_(std::move(metadata)), target_(std::move(target)) {} UserNote::~UserNote() = default;
diff --git a/components/user_notes/model/user_note.h b/components/user_notes/model/user_note.h index 667a747f..cd58a3b 100644 --- a/components/user_notes/model/user_note.h +++ b/components/user_notes/model/user_note.h
@@ -9,6 +9,7 @@ #include "base/memory/safe_ref.h" #include "base/memory/weak_ptr.h" +#include "base/unguessable_token.h" #include "components/user_notes/model/user_note_body.h" #include "components/user_notes/model/user_note_metadata.h" #include "components/user_notes/model/user_note_target.h" @@ -18,7 +19,7 @@ // Model class for a note. class UserNote { public: - explicit UserNote(const std::string& guid, + explicit UserNote(const base::UnguessableToken& id, std::unique_ptr<UserNoteMetadata> metadata, std::unique_ptr<UserNoteBody> body, std::unique_ptr<UserNoteTarget> target); @@ -28,14 +29,14 @@ base::SafeRef<UserNote> GetSafeRef(); - const std::string& guid() const { return guid_; } + const base::UnguessableToken& id() const { return id_; } const UserNoteMetadata& metadata() const { return *metadata_; } const UserNoteBody& body() const { return *body_; } const UserNoteTarget& target() const { return *target_; } private: // The unique (among the user's notes) ID for this note. - std::string guid_; + base::UnguessableToken id_; std::unique_ptr<UserNoteMetadata> metadata_; std::unique_ptr<UserNoteBody> body_;
diff --git a/components/viz/demo/client/demo_client.h b/components/viz/demo/client/demo_client.h index f86f05b5..a5fe406 100644 --- a/components/viz/demo/client/demo_client.h +++ b/components/viz/demo/client/demo_client.h
@@ -10,7 +10,6 @@ #include "base/synchronization/lock.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/viz/common/frame_timing_details_map.h" #include "components/viz/common/quads/compositor_frame_metadata.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
diff --git a/components/viz/demo/demo_main.cc b/components/viz/demo/demo_main.cc index f8f77209..db021f9 100644 --- a/components/viz/demo/demo_main.cc +++ b/components/viz/demo/demo_main.cc
@@ -13,7 +13,6 @@ #include "base/task/single_thread_task_executor.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/viz/demo/host/demo_host.h" #include "components/viz/demo/service/demo_service.h"
diff --git a/components/viz/service/main/viz_compositor_thread_runner_impl.cc b/components/viz/service/main/viz_compositor_thread_runner_impl.cc index d39e1fba..798434c 100644 --- a/components/viz/service/main/viz_compositor_thread_runner_impl.cc +++ b/components/viz/service/main/viz_compositor_thread_runner_impl.cc
@@ -14,7 +14,6 @@ #include "base/task/bind_post_task.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h"
diff --git a/components/viz/service/main/viz_main_impl.h b/components/viz/service/main/viz_main_impl.h index 2dcfc9cb..b2965ba 100644 --- a/components/viz/service/main/viz_main_impl.h +++ b/components/viz/service/main/viz_main_impl.h
@@ -11,7 +11,6 @@ #include "base/process/process_handle.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/discardable_memory/client/client_discardable_shared_memory_manager.h" #include "components/viz/common/buildflags.h"
diff --git a/components/viz/test/test_gpu_service_holder.h b/components/viz/test/test_gpu_service_holder.h index 730c17fe..cef5cfb4 100644 --- a/components/viz/test/test_gpu_service_holder.h +++ b/components/viz/test/test_gpu_service_holder.h
@@ -11,7 +11,6 @@ #include "base/feature_list.h" #include "base/memory/scoped_refptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "gpu/ipc/gpu_in_process_thread_service.h" #include "gpu/vulkan/buildflags.h"
diff --git a/components/webcrypto/algorithms/aes_cbc_unittest.cc b/components/webcrypto/algorithms/aes_cbc_unittest.cc index c3759e6..cde7911 100644 --- a/components/webcrypto/algorithms/aes_cbc_unittest.cc +++ b/components/webcrypto/algorithms/aes_cbc_unittest.cc
@@ -341,20 +341,15 @@ TEST_F(WebCryptoAesCbcTest, ImportJwkInvalidJson) { blink::WebCryptoKey key; // Fail on empty JSON. - EXPECT_EQ( - Status::ErrorJwkNotDictionary(), - ImportKey(blink::kWebCryptoKeyFormatJwk, CryptoData(MakeJsonVector("")), - CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCbc), false, - blink::kWebCryptoKeyUsageEncrypt, &key)); + EXPECT_EQ(Status::ErrorJwkNotDictionary(), + ImportKey(blink::kWebCryptoKeyFormatJwk, CryptoData(), + CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCbc), + false, blink::kWebCryptoKeyUsageEncrypt, &key)); // Fail on invalid JSON. - const std::vector<uint8_t> bad_json_vec = MakeJsonVector( - "{" - "\"kty\" : \"oct\"," - "\"alg\" : \"HS256\"," - "\"use\" : "); + const std::string bad_json = R"({ "kty": "oct", "alg": "HS256", "use": )"; EXPECT_EQ(Status::ErrorJwkNotDictionary(), - ImportKey(blink::kWebCryptoKeyFormatJwk, CryptoData(bad_json_vec), + ImportKey(blink::kWebCryptoKeyFormatJwk, CryptoData(bad_json), CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCbc), false, blink::kWebCryptoKeyUsageEncrypt, &key)); }
diff --git a/components/webcrypto/algorithms/aes_kw_unittest.cc b/components/webcrypto/algorithms/aes_kw_unittest.cc index 3511d0a..a0709e3 100644 --- a/components/webcrypto/algorithms/aes_kw_unittest.cc +++ b/components/webcrypto/algorithms/aes_kw_unittest.cc
@@ -136,8 +136,8 @@ ImportKey(blink::kWebCryptoKeyFormatRaw, CryptoData(HexStringToBytes("")), algorithm, true, blink::kWebCryptoKeyUsageWrapKey, &key)); - // Fail import of 124-bit KEK - key_raw_hex_in = "3e4566a2bdaa10cb68134fa66c15ddb"; + // Fail import of 120-bit KEK + key_raw_hex_in = "3e4566a2bdaa10cb68134fa66c15dd"; EXPECT_EQ(Status::ErrorImportAesKeyLength(), ImportKey(blink::kWebCryptoKeyFormatRaw, CryptoData(HexStringToBytes(key_raw_hex_in)), algorithm, @@ -149,14 +149,6 @@ ImportKey(blink::kWebCryptoKeyFormatRaw, CryptoData(HexStringToBytes(key_raw_hex_in)), algorithm, true, blink::kWebCryptoKeyUsageWrapKey, &key)); - - // Fail import of 260-bit KEK - key_raw_hex_in = - "72d4e475ff34215416c9ad9c8281247a4d730c5f275ac23f376e73e3bce8d7d5a"; - EXPECT_EQ(Status::ErrorImportAesKeyLength(), - ImportKey(blink::kWebCryptoKeyFormatRaw, - CryptoData(HexStringToBytes(key_raw_hex_in)), algorithm, - true, blink::kWebCryptoKeyUsageWrapKey, &key)); } TEST_F(WebCryptoAesKwTest, UnwrapFailures) {
diff --git a/components/webcrypto/algorithms/hmac_unittest.cc b/components/webcrypto/algorithms/hmac_unittest.cc index 7f16c1a6..02eeae5 100644 --- a/components/webcrypto/algorithms/hmac_unittest.cc +++ b/components/webcrypto/algorithms/hmac_unittest.cc
@@ -10,6 +10,8 @@ #include <utility> #include "base/check.h" +#include "base/containers/contains.h" +#include "base/containers/flat_set.h" #include "base/values.h" #include "components/webcrypto/algorithm_dispatch.h" #include "components/webcrypto/algorithms/test_helpers.h" @@ -47,147 +49,192 @@ length_bits)); } +blink::WebCryptoKey GenerateHmacKey(blink::WebCryptoAlgorithmId hash, + size_t key_length_bits) { + blink::WebCryptoKey key; + auto status = + GenerateSecretKey(CreateHmacKeyGenAlgorithm(hash, key_length_bits), true, + blink::kWebCryptoKeyUsageSign, &key); + CHECK(status == Status::Success()); + return key; +} + class WebCryptoHmacTest : public WebCryptoTestBase {}; -TEST_F(WebCryptoHmacTest, HMACSampleSets) { - base::Value tests; - ASSERT_TRUE(ReadJsonTestFileAsList("hmac.json", &tests)); - for (size_t test_index = 0; test_index < tests.GetListDeprecated().size(); - ++test_index) { - SCOPED_TRACE(test_index); - const base::Value& test_value = tests.GetListDeprecated()[test_index]; - ASSERT_TRUE(test_value.is_dict()); - const base::DictionaryValue* test = - &base::Value::AsDictionaryValue(test_value); +struct HmacKnownAnswer { + blink::WebCryptoAlgorithmId hash; + const char* key; + const char* message; + const char* hmac; +}; - blink::WebCryptoAlgorithm test_hash = GetDigestAlgorithm(test, "hash"); - const std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key"); - const std::vector<uint8_t> test_message = - GetBytesFromHexString(test, "message"); - const std::vector<uint8_t> test_mac = GetBytesFromHexString(test, "mac"); +const HmacKnownAnswer kHmacKnownAnswers[] = { + // A single byte key with an empty message, generated with: + // openssl dgst -sha{1,256} -hmac "" < /dev/null + {blink::kWebCryptoAlgorithmIdSha1, "00", "", + "fbdb1d1b18aa6c08324b7d64b71fb76370690e1d"}, + {blink::kWebCryptoAlgorithmIdSha256, "00", "", + "b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad"}, - blink::WebCryptoAlgorithm algorithm = - CreateAlgorithm(blink::kWebCryptoAlgorithmIdHmac); + // NIST test vectors from: + // http://csrc.nist.gov/groups/STM/cavp/documents/mac/hmactestvectors.zip + // L = 20, set 45: + {blink::kWebCryptoAlgorithmIdSha1, "59785928d72516e31272", + "a3ce8899df1022e8d2d539b47bf0e309c66f84095e21438ec355bf119ce5fdcb4e73a619c" + "df36f25b369d8c38ff419997f0c59830108223606e31223483fd39edeaa4d3f0d21198862" + "d239c9fd26074130ff6c86493f5227ab895c8f244bd42c7afce5d147a20a590798c68e708" + "e964902d124dadecdbda9dbd0051ed710e9bf", + "3c8162589aafaee024fc9a5ca50dd2336fe3eb28"}, + // L = 20, set 299: + {blink::kWebCryptoAlgorithmIdSha1, + "ceb9aedf8d6efcf0ae52bea0fa99a9e26ae81bacea0cff4d5eecf201e3bca3c3577480621" + "b818fd717ba99d6ff958ea3d59b2527b019c343bb199e648090225867d994607962f5866a" + "a62930d75b58f6", + "99958aa459604657c7bf6e4cdfcc8785f0abf06ffe636b5b64ecd931bd8a456305592421f" + "c28dbcccb8a82acea2be8e54161d7a78e0399a6067ebaca3f2510274dc9f92f2c8ae4265e" + "ec13d7d42e9f8612d7bc258f913ecb5a3a5c610339b49fb90e9037b02d684fc60da835657" + "cb24eab352750c8b463b1a8494660d36c3ab2", + "4ac41ab89f625c60125ed65ffa958c6b490ea670"}, + // L = 32, set 30: + {blink::kWebCryptoAlgorithmIdSha256, + "9779d9120642797f1747025d5b22b7ac607cab08e1758f2f3a46c8be1e25c53b8c6a8f58f" + "fefa176", + "b1689c2591eaf3c9e66070f8a77954ffb81749f1b00346f9dfe0b2ee905dcc288baf4a92d" + "e3f4001dd9f44c468c3d07d6c6ee82faceafc97c2fc0fc0601719d2dcd0aa2aec92d1b0ae" + "933c65eb06a03c9c935c2bad0459810241347ab87e9f11adb30415424c6c7f5f22a003b8a" + "b8de54f6ded0e3ab9245fa79568451dfa258e", + "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b"}, + // L = 32, set 224: + {blink::kWebCryptoAlgorithmIdSha256, + "4b7ab133efe99e02fc89a28409ee187d579e774f4cba6fc223e13504e3511bef8d4f638b9" + "aca55d4a43b8fbd64cf9d74dcc8c9e8d52034898c70264ea911a3fd70813fa73b08337128" + "9b", + "138efc832c64513d11b9873c6fd4d8a65dbf367092a826ddd587d141b401580b798c69025" + "ad510cff05fcfbceb6cf0bb03201aaa32e423d5200925bddfadd418d8e30e18050eb4f061" + "8eb9959d9f78c1157d4b3e02cd5961f138afd57459939917d9144c95d8e6a94c8f6d4eef3" + "418c17b1ef0b46c2a7188305d9811dccb3d99", + "4f1ee7cb36c58803a8721d4ac8c4cf8cae5d8832392eed2a96dc59694252801b"}, + // L = 48, count 50: + {blink::kWebCryptoAlgorithmIdSha384, + "d137f3e6cc4af28554beb03ba7a97e60c9d3959cd3bb08068edbf68d402d0498c6ee0ae9e" + "3a20dc7d8586e5c352f605cee19", + "64a884670d1c1dff555483dcd3da305dfba54bdc4d817c33ccb8fe7eb2ebf623624103109" + "ec41644fa078491900c59a0f666f0356d9bc0b45bcc79e5fc9850f4543d96bc68009044ad" + "d0838ac1260e80592fbc557b2ddaf5ed1b86d3ed8f09e622e567f1d39a340857f6a850cce" + "ef6060c48dac3dd0071fe68eb4ed2ed9aca01", + "c550fa53514da34f15e7f98ea87226ab6896cdfae25d3ec2335839f755cdc9a4992092e70" + "b7e5bd422784380b6396cf5"}, + // L = 64, count 65: + {blink::kWebCryptoAlgorithmIdSha512, + "c367aeb5c02b727883ffe2a4ceebf911b01454beb328fb5d57fc7f11bf744576aba421e2a" + "63426ea8109bd28ff21f53cd2bf1a11c6c989623d6ec27cdb0bbf458250857d819ff84408" + "b4f3dce08b98b1587ee59683af8852a0a5f55bda3ab5e132b4010e", + "1a7331c8ff1b748e3cee96952190fdbbe4ee2f79e5753bbb368255ee5b19c05a4ed9f1b2c" + "72ff1e9b9cb0348205087befa501e7793770faf0606e9c901836a9bc8afa00d7db94ee29e" + "b191d5cf3fc3e8da95a0f9f4a2a7964289c3129b512bd890de8700a9205420f28a8965b6c" + "67be28ba7fe278e5fcd16f0f22cf2b2eacbb9", + "4459066109cb11e6870fa9c6bfd251adfa304c0a2928ca915049704972edc560cc7c0bc38" + "249e9101aae2f7d4da62eaff83fb07134efc277de72b9e4ab360425"}}; - blink::WebCryptoAlgorithm import_algorithm = - CreateHmacImportAlgorithmNoLength(test_hash.Id()); +blink::WebCryptoKey HmacKeyFromHexBytes(blink::WebCryptoAlgorithmId hash, + const char* key) { + return ImportSecretKeyFromRaw( + HexStringToBytes(key), CreateHmacImportAlgorithmNoLength(hash), + blink::kWebCryptoKeyUsageSign | blink::kWebCryptoKeyUsageVerify); +} - blink::WebCryptoKey key = ImportSecretKeyFromRaw( - test_key, import_algorithm, - blink::kWebCryptoKeyUsageSign | blink::kWebCryptoKeyUsageVerify); +std::vector<uint8_t> BytesFromHmacKey(blink::WebCryptoKey key) { + std::vector<uint8_t> raw_key; + auto status = ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key); + CHECK(status == Status::Success()); + return raw_key; +} - EXPECT_EQ(test_hash.Id(), key.Algorithm().HmacParams()->GetHash().Id()); - EXPECT_EQ(test_key.size() * 8, key.Algorithm().HmacParams()->LengthBits()); +std::vector<uint8_t> HmacSign(blink::WebCryptoKey key, + const std::vector<uint8_t>& message) { + std::vector<uint8_t> output; + auto status = Sign(CreateAlgorithm(blink::kWebCryptoAlgorithmIdHmac), key, + CryptoData(message), &output); + CHECK(status == Status::Success()); + return output; +} - // Verify exported raw key is identical to the imported data - std::vector<uint8_t> raw_key; - EXPECT_EQ(Status::Success(), - ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key)); - EXPECT_BYTES_EQ(test_key, raw_key); +bool HmacVerify(blink::WebCryptoKey key, + const std::vector<uint8_t>& message, + const std::vector<uint8_t>& hmac) { + bool match = false; + auto status = Verify(CreateAlgorithm(blink::kWebCryptoAlgorithmIdHmac), key, + CryptoData(hmac), CryptoData(message), &match); + CHECK(status == Status::Success()); + return match; +} - std::vector<uint8_t> output; +TEST_F(WebCryptoHmacTest, KnownAnswers) { + for (const auto& test : kHmacKnownAnswers) { + SCOPED_TRACE(&test - &kHmacKnownAnswers[0]); - ASSERT_EQ(Status::Success(), - Sign(algorithm, key, CryptoData(test_message), &output)); + std::vector<uint8_t> key_bytes = HexStringToBytes(test.key); + std::vector<uint8_t> message = HexStringToBytes(test.message); + std::vector<uint8_t> expected_hmac = HexStringToBytes(test.hmac); - EXPECT_BYTES_EQ(test_mac, output); + blink::WebCryptoKey key = HmacKeyFromHexBytes(test.hash, test.key); - bool signature_match = false; - EXPECT_EQ(Status::Success(), - Verify(algorithm, key, CryptoData(output), - CryptoData(test_message), &signature_match)); - EXPECT_TRUE(signature_match); + EXPECT_EQ(test.hash, key.Algorithm().HmacParams()->GetHash().Id()); + EXPECT_EQ(key_bytes.size() * 8, key.Algorithm().HmacParams()->LengthBits()); + EXPECT_BYTES_EQ(key_bytes, BytesFromHmacKey(key)); - // Ensure truncated signature does not verify by passing one less byte. - EXPECT_EQ(Status::Success(), - Verify(algorithm, key, - CryptoData(output.data(), - static_cast<unsigned int>(output.size()) - 1), - CryptoData(test_message), &signature_match)); - EXPECT_FALSE(signature_match); + std::vector<uint8_t> actual_hmac = HmacSign(key, message); - // Ensure truncated signature does not verify by passing no bytes. - EXPECT_EQ(Status::Success(), - Verify(algorithm, key, CryptoData(), CryptoData(test_message), - &signature_match)); - EXPECT_FALSE(signature_match); + EXPECT_EQ(expected_hmac, actual_hmac); - // Ensure extra long signature does not cause issues and fails. - const unsigned char kLongSignature[1024] = {0}; - EXPECT_EQ(Status::Success(), - Verify(algorithm, key, - CryptoData(kLongSignature, sizeof(kLongSignature)), - CryptoData(test_message), &signature_match)); - EXPECT_FALSE(signature_match); + std::vector<uint8_t> truncated_hmac(expected_hmac.begin(), + expected_hmac.end() - 1); + std::vector<uint8_t> empty_hmac; + std::vector<uint8_t> long_hmac(1024); + + EXPECT_TRUE(HmacVerify(key, message, actual_hmac)); + EXPECT_FALSE(HmacVerify(key, message, truncated_hmac)); + EXPECT_FALSE(HmacVerify(key, message, empty_hmac)); + EXPECT_FALSE(HmacVerify(key, message, long_hmac)); } } -TEST_F(WebCryptoHmacTest, GenerateKeyIsRandom) { - // Generate a small sample of HMAC keys. - std::vector<std::vector<uint8_t>> keys; - for (int i = 0; i < 16; ++i) { - std::vector<uint8_t> key_bytes; - blink::WebCryptoKey key; - blink::WebCryptoAlgorithm algorithm = - CreateHmacKeyGenAlgorithm(blink::kWebCryptoAlgorithmIdSha1, 512); - ASSERT_EQ(Status::Success(), - GenerateSecretKey(algorithm, true, blink::kWebCryptoKeyUsageSign, - &key)); - EXPECT_FALSE(key.IsNull()); - EXPECT_TRUE(key.Handle()); - EXPECT_EQ(blink::kWebCryptoKeyTypeSecret, key.GetType()); - EXPECT_EQ(blink::kWebCryptoAlgorithmIdHmac, key.Algorithm().Id()); - EXPECT_EQ(blink::kWebCryptoAlgorithmIdSha1, - key.Algorithm().HmacParams()->GetHash().Id()); - EXPECT_EQ(512u, key.Algorithm().HmacParams()->LengthBits()); +TEST_F(WebCryptoHmacTest, GeneratedKeysHaveExpectedProperties) { + auto key = GenerateHmacKey(blink::kWebCryptoAlgorithmIdSha1, 512); - std::vector<uint8_t> raw_key; - ASSERT_EQ(Status::Success(), - ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key)); - EXPECT_EQ(64U, raw_key.size()); - keys.push_back(raw_key); - } - // Ensure all entries in the key sample set are unique. This is a simplistic - // estimate of whether the generated keys appear random. - EXPECT_FALSE(CopiesExist(keys)); -} - -// If the key length is not provided, then the block size is used. -TEST_F(WebCryptoHmacTest, GenerateKeyNoLengthSha1) { - blink::WebCryptoKey key; - blink::WebCryptoAlgorithm algorithm = - CreateHmacKeyGenAlgorithm(blink::kWebCryptoAlgorithmIdSha1, 0); - ASSERT_EQ( - Status::Success(), - GenerateSecretKey(algorithm, true, blink::kWebCryptoKeyUsageSign, &key)); + EXPECT_FALSE(key.IsNull()); EXPECT_TRUE(key.Handle()); EXPECT_EQ(blink::kWebCryptoKeyTypeSecret, key.GetType()); EXPECT_EQ(blink::kWebCryptoAlgorithmIdHmac, key.Algorithm().Id()); EXPECT_EQ(blink::kWebCryptoAlgorithmIdSha1, key.Algorithm().HmacParams()->GetHash().Id()); EXPECT_EQ(512u, key.Algorithm().HmacParams()->LengthBits()); - std::vector<uint8_t> raw_key; - ASSERT_EQ(Status::Success(), - ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key)); - EXPECT_EQ(64U, raw_key.size()); +} + +TEST_F(WebCryptoHmacTest, GeneratedKeysAreRandomIsh) { + base::flat_set<std::vector<uint8_t>> seen_keys; + for (int i = 0; i < 16; ++i) { + std::vector<uint8_t> key_bytes = BytesFromHmacKey( + GenerateHmacKey(blink::kWebCryptoAlgorithmIdSha1, 512)); + EXPECT_FALSE(base::Contains(seen_keys, key_bytes)); + seen_keys.insert(key_bytes); + } } // If the key length is not provided, then the block size is used. -TEST_F(WebCryptoHmacTest, GenerateKeyNoLengthSha512) { - blink::WebCryptoKey key; - blink::WebCryptoAlgorithm algorithm = - CreateHmacKeyGenAlgorithm(blink::kWebCryptoAlgorithmIdSha512, 0); - ASSERT_EQ( - Status::Success(), - GenerateSecretKey(algorithm, true, blink::kWebCryptoKeyUsageSign, &key)); - EXPECT_EQ(blink::kWebCryptoAlgorithmIdHmac, key.Algorithm().Id()); - EXPECT_EQ(blink::kWebCryptoAlgorithmIdSha512, - key.Algorithm().HmacParams()->GetHash().Id()); - EXPECT_EQ(1024u, key.Algorithm().HmacParams()->LengthBits()); - std::vector<uint8_t> raw_key; - ASSERT_EQ(Status::Success(), - ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key)); - EXPECT_EQ(128U, raw_key.size()); +TEST_F(WebCryptoHmacTest, GeneratedKeysDefaultToBlockSize) { + auto sha1_key = GenerateHmacKey(blink::kWebCryptoAlgorithmIdSha1, 0); + auto sha512_key = GenerateHmacKey(blink::kWebCryptoAlgorithmIdSha512, 0); + + EXPECT_EQ(64u, BytesFromHmacKey(sha1_key).size()); + EXPECT_EQ(128u, BytesFromHmacKey(sha512_key).size()); +} + +TEST_F(WebCryptoHmacTest, Generating1BitKeyWorks) { + std::vector<uint8_t> key_bytes = + BytesFromHmacKey(GenerateHmacKey(blink::kWebCryptoAlgorithmIdSha1, 1)); + ASSERT_EQ(1u, key_bytes.size()); + EXPECT_EQ(key_bytes[0] & 0x7f, 0); } TEST_F(WebCryptoHmacTest, GenerateKeyEmptyUsage) { @@ -198,26 +245,6 @@ GenerateSecretKey(algorithm, true, 0, &key)); } -// Generate a 1 bit key. The exported key is 1 byte long, and 7 of the bits are -// guaranteed to be zero. -TEST_F(WebCryptoHmacTest, Generate1BitKey) { - blink::WebCryptoKey key; - blink::WebCryptoAlgorithm algorithm = - CreateHmacKeyGenAlgorithm(blink::kWebCryptoAlgorithmIdSha1, 1); - - ASSERT_EQ( - Status::Success(), - GenerateSecretKey(algorithm, true, blink::kWebCryptoKeyUsageSign, &key)); - EXPECT_EQ(1u, key.Algorithm().HmacParams()->LengthBits()); - - std::vector<uint8_t> raw_key; - ASSERT_EQ(Status::Success(), - ExportKey(blink::kWebCryptoKeyFormatRaw, key, &raw_key)); - ASSERT_EQ(1U, raw_key.size()); - - EXPECT_FALSE(raw_key[0] & 0x7F); -} - TEST_F(WebCryptoHmacTest, ImportKeyEmptyUsage) { blink::WebCryptoKey key; std::string key_raw_hex_in = "025a8cf3f08b4f6c5f33bbc76a471939";
diff --git a/components/webcrypto/algorithms/rsa_pss_unittest.cc b/components/webcrypto/algorithms/rsa_pss_unittest.cc index 7cf1500..2c1a744 100644 --- a/components/webcrypto/algorithms/rsa_pss_unittest.cc +++ b/components/webcrypto/algorithms/rsa_pss_unittest.cc
@@ -233,18 +233,11 @@ "6c4ec0b428aa47336f2178aeb276136563b7d"}, }; -std::vector<uint8_t> HexToBytes(const char* hex) { - std::vector<uint8_t> bytes; - bool result = base::HexStringToBytes(hex, &bytes); - CHECK(result); - return bytes; -} - blink::WebCryptoKey RsaPssKeyFromBytes(blink::WebCryptoAlgorithmId hash, const char* key) { auto pubkey = blink::WebCryptoKey::CreateNull(); webcrypto::Status result = ImportKey( - blink::kWebCryptoKeyFormatSpki, CryptoData(HexToBytes(key)), + blink::kWebCryptoKeyFormatSpki, CryptoData(HexStringToBytes(key)), CreateRsaHashedImportAlgorithm(blink::kWebCryptoAlgorithmIdRsaPss, hash), true, blink::kWebCryptoKeyUsageVerify, &pubkey); CHECK(result == Status::Success()); @@ -271,8 +264,8 @@ SCOPED_TRACE(&test - &kRsaPssKnownAnswers[0]); blink::WebCryptoKey pubkey = RsaPssKeyFromBytes(test.hash, test.key); - std::vector<uint8_t> message = HexToBytes(test.message); - std::vector<uint8_t> signature = HexToBytes(test.signature); + std::vector<uint8_t> message = HexStringToBytes(test.message); + std::vector<uint8_t> signature = HexStringToBytes(test.signature); EXPECT_TRUE(VerifySignature(test.salt_length, pubkey, signature, message));
diff --git a/components/webcrypto/algorithms/test_helpers.cc b/components/webcrypto/algorithms/test_helpers.cc index 674c97ac..1e8de72 100644 --- a/components/webcrypto/algorithms/test_helpers.cc +++ b/components/webcrypto/algorithms/test_helpers.cc
@@ -141,18 +141,25 @@ std::vector<uint8_t> HexStringToBytes(const std::string& hex) { std::vector<uint8_t> bytes; - base::HexStringToBytes(hex, &bytes); + + // HexStringToBytes() doesn't allow empty inputs, but this wrapper does. + if (hex.empty()) + return bytes; + + bool result = base::HexStringToBytes(hex, &bytes); + CHECK(result); return bytes; } -std::vector<uint8_t> MakeJsonVector(const std::string& json_string) { - return std::vector<uint8_t>(json_string.begin(), json_string.end()); +std::vector<uint8_t> MakeJsonVector(const base::DictionaryValue& value) { + return MakeJsonVector(base::ValueView(value)); } -std::vector<uint8_t> MakeJsonVector(const base::DictionaryValue& dict) { +std::vector<uint8_t> MakeJsonVector(const base::ValueView& value) { std::string json; - base::JSONWriter::Write(dict, &json); - return MakeJsonVector(json); + bool ok = base::JSONWriter::Write(value, &json); + CHECK(ok); + return std::vector<uint8_t>(json.begin(), json.end()); } ::testing::AssertionResult ReadJsonTestFileAsList(const char* test_file_name, @@ -337,7 +344,7 @@ EXPECT_EQ(private_key_usages, private_key->Usages()); } -Status ImportKeyJwkFromDict(const base::DictionaryValue& dict, +Status ImportKeyJwkFromDict(const base::ValueView& dict, const blink::WebCryptoAlgorithm& algorithm, bool extractable, blink::WebCryptoKeyUsageMask usages, @@ -347,6 +354,15 @@ usages, key); } +Status ImportKeyJwkFromDict(const base::DictionaryValue& dict, + const blink::WebCryptoAlgorithm& algorithm, + bool extractable, + blink::WebCryptoKeyUsageMask usages, + blink::WebCryptoKey* key) { + return ImportKeyJwkFromDict(base::ValueView(dict), algorithm, extractable, + usages, key); +} + absl::optional<base::DictionaryValue> GetJwkDictionary( const std::vector<uint8_t>& json) { base::StringPiece json_string(reinterpret_cast<const char*>(json.data()),
diff --git a/components/webcrypto/algorithms/test_helpers.h b/components/webcrypto/algorithms/test_helpers.h index 1cbfb36..63e5cbd 100644 --- a/components/webcrypto/algorithms/test_helpers.h +++ b/components/webcrypto/algorithms/test_helpers.h
@@ -12,6 +12,7 @@ #include <string> #include <vector> +#include "base/values.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/platform/web_crypto_algorithm.h" @@ -74,9 +75,13 @@ std::vector<uint8_t> HexStringToBytes(const std::string& hex); -std::vector<uint8_t> MakeJsonVector(const std::string& json_string); +// Deprecated; do not add new uses of this function, since base::DictionaryValue +// itself is deprecated. std::vector<uint8_t> MakeJsonVector(const base::DictionaryValue& dict); +// Serialize |value| to json, then return that json as a byte vector. +std::vector<uint8_t> MakeJsonVector(const base::ValueView& value); + // ---------------------------------------------------------------- // Helpers for working with JSON data files for test expectations. // ---------------------------------------------------------------- @@ -132,6 +137,15 @@ blink::WebCryptoKey* public_key, blink::WebCryptoKey* private_key); +Status ImportKeyJwkFromDict(const base::ValueView& dict, + const blink::WebCryptoAlgorithm& algorithm, + bool extractable, + blink::WebCryptoKeyUsageMask usages, + blink::WebCryptoKey* key); + +// Obsolete compatibility overload, do not add new uses. This is only present +// because base::DictionaryValue requires explicit conversion to +// base::ValueView. Status ImportKeyJwkFromDict(const base::DictionaryValue& dict, const blink::WebCryptoAlgorithm& algorithm, bool extractable,
diff --git a/components/webcrypto/webcrypto_impl.cc b/components/webcrypto/webcrypto_impl.cc index 2bec34e..0383e31 100644 --- a/components/webcrypto/webcrypto_impl.cc +++ b/components/webcrypto/webcrypto_impl.cc
@@ -18,7 +18,6 @@ #include "base/task/task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "components/webcrypto/algorithm_dispatch.h" #include "components/webcrypto/crypto_data.h"
diff --git a/content/app/mojo_ipc_support.h b/content/app/mojo_ipc_support.h index bcb99c2..fcd5953 100644 --- a/content/app/mojo_ipc_support.h +++ b/content/app/mojo_ipc_support.h
@@ -8,7 +8,6 @@ #include <memory> #include "base/threading/thread.h" -#include "base/time/time.h" #include "content/common/content_export.h" namespace mojo {
diff --git a/content/browser/android/nfc_host.cc b/content/browser/android/nfc_host.cc index 8085e2d9..3b6d8b0 100644 --- a/content/browser/android/nfc_host.cc +++ b/content/browser/android/nfc_host.cc
@@ -66,7 +66,7 @@ // TODO(crbug.com/1271543) : Move `SubscribePermissionStatusChange` to // `PermissionController`. subscription_id_ = permission_controller_->SubscribePermissionStatusChange( - PermissionType::NFC, render_frame_host, + PermissionType::NFC, /*render_process_host=*/nullptr, render_frame_host, render_frame_host->GetMainFrame()->GetLastCommittedOrigin().GetURL(), base::BindRepeating(&NFCHost::OnPermissionStatusChange, base::Unretained(this)));
diff --git a/content/browser/android/nfc_host_unittest.cc b/content/browser/android/nfc_host_unittest.cc index 5ea714b..9751868 100644 --- a/content/browser/android/nfc_host_unittest.cc +++ b/content/browser/android/nfc_host_unittest.cc
@@ -58,8 +58,9 @@ .WillOnce(Return(blink::mojom::PermissionStatus::GRANTED)) .WillOnce(Return(blink::mojom::PermissionStatus::GRANTED)); EXPECT_CALL(mock_permission_manager(), - SubscribePermissionStatusChange(PermissionType::NFC, main_rfh(), - GURL(kTestUrl), _)) + SubscribePermissionStatusChange(PermissionType::NFC, + /*render_process_host=*/nullptr, + main_rfh(), GURL(kTestUrl), _)) .WillOnce(Return(kSubscriptionId)); mojo::Remote<device::mojom::NFC> nfc1, nfc2;
diff --git a/content/browser/background_fetch/background_fetch_context.cc b/content/browser/background_fetch/background_fetch_context.cc index 566e33e..3cd3a7e 100644 --- a/content/browser/background_fetch/background_fetch_context.cc +++ b/content/browser/background_fetch/background_fetch_context.cc
@@ -146,6 +146,7 @@ blink::mojom::BackgroundFetchOptionsPtr options, const SkBitmap& icon, blink::mojom::BackgroundFetchUkmDataPtr ukm_data, + RenderProcessHost* rph, RenderFrameHostImpl* rfh, const net::IsolationInfo& isolation_info, blink::mojom::BackgroundFetchService::FetchCallback callback) { @@ -160,7 +161,7 @@ auto rfh_id = rfh ? rfh->GetGlobalId() : GlobalRenderFrameHostId(); delegate_proxy_.GetPermissionForOrigin( - registration_id.storage_key().origin(), rfh, + registration_id.storage_key().origin(), rph, rfh, base::BindOnce(&BackgroundFetchContext::DidGetPermission, weak_factory_.GetWeakPtr(), registration_id, std::move(requests), std::move(options), icon,
diff --git a/content/browser/background_fetch/background_fetch_context.h b/content/browser/background_fetch/background_fetch_context.h index de97fb7..f689148 100644 --- a/content/browser/background_fetch/background_fetch_context.h +++ b/content/browser/background_fetch/background_fetch_context.h
@@ -90,6 +90,7 @@ blink::mojom::BackgroundFetchOptionsPtr options, const SkBitmap& icon, blink::mojom::BackgroundFetchUkmDataPtr ukm_data, + RenderProcessHost* rph, RenderFrameHostImpl* rfh, const net::IsolationInfo& isolation_info, blink::mojom::BackgroundFetchService::FetchCallback callback);
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.cc b/content/browser/background_fetch/background_fetch_delegate_proxy.cc index 71e2ee4..f570cc36 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.cc +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.cc
@@ -57,6 +57,7 @@ void BackgroundFetchDelegateProxy::GetPermissionForOrigin( const url::Origin& origin, + RenderProcessHost* rph, RenderFrameHostImpl* rfh, GetPermissionForOriginCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -89,8 +90,15 @@ if (auto* controller = GetPermissionController()) { blink::mojom::PermissionStatus permission_status = - controller->GetPermissionStatusForServiceWorker( - PermissionType::BACKGROUND_FETCH, origin); + blink::mojom::PermissionStatus::DENIED; + if (rfh) { + DCHECK(origin == rfh->GetLastCommittedOrigin()); + permission_status = controller->GetPermissionStatusForCurrentDocument( + PermissionType::BACKGROUND_FETCH, rfh); + } else if (rph) { + permission_status = controller->GetPermissionStatusForWorker( + PermissionType::BACKGROUND_FETCH, rph, origin); + } switch (permission_status) { case blink::mojom::PermissionStatus::GRANTED: result = BackgroundFetchPermission::ALLOWED;
diff --git a/content/browser/background_fetch/background_fetch_delegate_proxy.h b/content/browser/background_fetch/background_fetch_delegate_proxy.h index 2c24134..64ccb84 100644 --- a/content/browser/background_fetch/background_fetch_delegate_proxy.h +++ b/content/browser/background_fetch/background_fetch_delegate_proxy.h
@@ -96,6 +96,7 @@ // Checks if the provided origin has permission to start a Background Fetch. void GetPermissionForOrigin(const url::Origin& origin, + RenderProcessHost* rph, RenderFrameHostImpl* rfh, GetPermissionForOriginCallback callback);
diff --git a/content/browser/background_fetch/background_fetch_service_impl.cc b/content/browser/background_fetch/background_fetch_service_impl.cc index 4a1a26b..def751f 100644 --- a/content/browser/background_fetch/background_fetch_service_impl.cc +++ b/content/browser/background_fetch/background_fetch_service_impl.cc
@@ -55,7 +55,7 @@ std::move(context), info.storage_key, net::IsolationInfo::CreatePartial( net::IsolationInfo::RequestType::kOther, network_isolation_key), - /*rfh=*/nullptr), + render_process_host, /*rfh=*/nullptr), std::move(receiver)); } @@ -90,7 +90,7 @@ mojo::MakeSelfOwnedReceiver( std::make_unique<BackgroundFetchServiceImpl>( std::move(context), rfhi->storage_key(), - rfhi->GetIsolationInfoForSubresources(), rfhi), + rfhi->GetIsolationInfoForSubresources(), rfhi->GetProcess(), rfhi), std::move(receiver)); } @@ -98,10 +98,12 @@ scoped_refptr<BackgroundFetchContext> background_fetch_context, blink::StorageKey storage_key, net::IsolationInfo isolation_info, + RenderProcessHost* rph, RenderFrameHostImpl* rfh) : background_fetch_context_(std::move(background_fetch_context)), storage_key_(std::move(storage_key)), isolation_info_(std::move(isolation_info)), + rph_id_(rph->GetID()), rfh_id_(rfh ? rfh->GetGlobalId() : GlobalRenderFrameHostId()) { DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -137,8 +139,9 @@ background_fetch_context_->StartFetch( registration_id, std::move(requests), std::move(options), icon, - std::move(ukm_data), RenderFrameHostImpl::FromID(rfh_id_), - isolation_info_, std::move(callback)); + std::move(ukm_data), RenderProcessHost::FromID(rph_id_), + RenderFrameHostImpl::FromID(rfh_id_), isolation_info_, + std::move(callback)); } void BackgroundFetchServiceImpl::GetIconDisplaySize(
diff --git a/content/browser/background_fetch/background_fetch_service_impl.h b/content/browser/background_fetch/background_fetch_service_impl.h index 9afb181..31664dc 100644 --- a/content/browser/background_fetch/background_fetch_service_impl.h +++ b/content/browser/background_fetch/background_fetch_service_impl.h
@@ -32,6 +32,7 @@ scoped_refptr<BackgroundFetchContext> background_fetch_context, blink::StorageKey storage_key, net::IsolationInfo isolation_info, + RenderProcessHost* rph, RenderFrameHostImpl* rfh); BackgroundFetchServiceImpl(const BackgroundFetchServiceImpl&) = delete; @@ -80,6 +81,8 @@ net::IsolationInfo isolation_info_; + int rph_id_; + // Identifies the RenderFrameHost that is using this service, if any. May not // resolve to a host if the frame has already been destroyed or a worker is // using this service.
diff --git a/content/browser/background_fetch/background_fetch_service_unittest.cc b/content/browser/background_fetch/background_fetch_service_unittest.cc index 6e18a8c3..eb3ba8a3 100644 --- a/content/browser/background_fetch/background_fetch_service_unittest.cc +++ b/content/browser/background_fetch/background_fetch_service_unittest.cc
@@ -103,12 +103,13 @@ public: ScopedCustomBackgroundFetchService(BackgroundFetchServiceTest* test, const blink::StorageKey& storage_key) - : scoped_service_( - &test->service_, - std::make_unique<BackgroundFetchServiceImpl>(test->context_, - storage_key, - net::IsolationInfo(), - /*rfhi=*/nullptr)) {} + : scoped_service_(&test->service_, + std::make_unique<BackgroundFetchServiceImpl>( + test->context_, + storage_key, + net::IsolationInfo(), + test->web_contents_->GetMainFrame()->GetProcess(), + /*rfhi=*/nullptr)) {} ScopedCustomBackgroundFetchService( const ScopedCustomBackgroundFetchService&) = delete; @@ -313,9 +314,12 @@ std::move(mock_permission_manager)); context_->Initialize(); + RenderFrameHostImpl* rfhi = + static_cast<RenderFrameHostImpl*>(web_contents_->GetMainFrame()); service_ = std::make_unique<BackgroundFetchServiceImpl>( context_, storage_key(), net::IsolationInfo(), - static_cast<RenderFrameHostImpl*>(web_contents_->GetMainFrame())); + web_contents_->GetMainFrame()->GetProcess(), rfhi); + rfhi->SetLastCommittedOriginForTesting(storage_key().origin()); } void TearDown() override {
diff --git a/content/browser/background_sync/background_sync_context_impl.cc b/content/browser/background_sync/background_sync_context_impl.cc index 2bd7df1..5e957b9 100644 --- a/content/browser/background_sync/background_sync_context_impl.cc +++ b/content/browser/background_sync/background_sync_context_impl.cc
@@ -71,24 +71,26 @@ void BackgroundSyncContextImpl::CreateOneShotSyncService( const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService> receiver) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(background_sync_manager_); one_shot_sync_services_.insert( - std::make_unique<OneShotBackgroundSyncServiceImpl>(this, origin, - std::move(receiver))); + std::make_unique<OneShotBackgroundSyncServiceImpl>( + this, origin, render_process_host, std::move(receiver))); } void BackgroundSyncContextImpl::CreatePeriodicSyncService( const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService> receiver) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(background_sync_manager_); periodic_sync_services_.insert( - std::make_unique<PeriodicBackgroundSyncServiceImpl>(this, origin, - std::move(receiver))); + std::make_unique<PeriodicBackgroundSyncServiceImpl>( + this, origin, render_process_host, std::move(receiver))); } void BackgroundSyncContextImpl::OneShotSyncServiceHadConnectionError(
diff --git a/content/browser/background_sync/background_sync_context_impl.h b/content/browser/background_sync/background_sync_context_impl.h index fafd8fc..8d902685 100644 --- a/content/browser/background_sync/background_sync_context_impl.h +++ b/content/browser/background_sync/background_sync_context_impl.h
@@ -24,6 +24,7 @@ class DevToolsBackgroundServicesContextImpl; class OneShotBackgroundSyncServiceImpl; class PeriodicBackgroundSyncServiceImpl; +class RenderProcessHost; class ServiceWorkerContextWrapper; // One instance of this exists per StoragePartition, and services multiple child @@ -58,12 +59,14 @@ // Creates a OneShotBackgroundSyncServiceImpl that is owned by `this`. void CreateOneShotSyncService( const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService> receiver); // Creates a PeriodicBackgroundSyncServiceImpl that is owned by `this`. void CreatePeriodicSyncService( const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService> receiver);
diff --git a/content/browser/background_sync/background_sync_manager.cc b/content/browser/background_sync/background_sync_manager.cc index f468a6da..290490c 100644 --- a/content/browser/background_sync/background_sync_manager.cc +++ b/content/browser/background_sync/background_sync_manager.cc
@@ -30,6 +30,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" +#include "content/public/browser/render_process_host.h" #include "third_party/blink/public/common/service_worker/service_worker_type_converters.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h" @@ -120,6 +121,7 @@ SyncAndNotificationPermissions GetBackgroundSyncPermission( scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, const url::Origin& origin, + RenderProcessHost* render_process_host, BackgroundSyncType sync_type) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -133,15 +135,14 @@ DCHECK(permission_controller); // The requesting origin always matches the embedding origin. - auto sync_permission = - permission_controller->GetPermissionStatusForServiceWorker( - sync_type == BackgroundSyncType::ONE_SHOT - ? PermissionType::BACKGROUND_SYNC - : PermissionType::PERIODIC_BACKGROUND_SYNC, - origin); + auto sync_permission = permission_controller->GetPermissionStatusForWorker( + sync_type == BackgroundSyncType::ONE_SHOT + ? PermissionType::BACKGROUND_SYNC + : PermissionType::PERIODIC_BACKGROUND_SYNC, + render_process_host, origin); auto notification_permission = - permission_controller->GetPermissionStatusForServiceWorker( - PermissionType::NOTIFICATIONS, origin); + permission_controller->GetPermissionStatusForWorker( + PermissionType::NOTIFICATIONS, render_process_host, origin); return {sync_permission, notification_permission}; } @@ -391,6 +392,7 @@ void BackgroundSyncManager::Register( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -405,10 +407,11 @@ DCHECK(options.min_interval >= 0 || options.min_interval == kMinIntervalForOneShotSync); - op_scheduler_.ScheduleOperation(base::BindOnce( - &BackgroundSyncManager::RegisterCheckIfHasMainFrame, - weak_ptr_factory_.GetWeakPtr(), sw_registration_id, std::move(options), - op_scheduler_.WrapCallbackToRunNext(std::move(callback)))); + op_scheduler_.ScheduleOperation( + base::BindOnce(&BackgroundSyncManager::RegisterCheckIfHasMainFrame, + weak_ptr_factory_.GetWeakPtr(), sw_registration_id, + render_process_host_id, std::move(options), + op_scheduler_.WrapCallbackToRunNext(std::move(callback)))); } void BackgroundSyncManager::UnregisterPeriodicSync( @@ -782,6 +785,7 @@ void BackgroundSyncManager::RegisterCheckIfHasMainFrame( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -799,11 +803,13 @@ sw_registration->key(), base::BindOnce(&BackgroundSyncManager::RegisterDidCheckIfMainFrame, weak_ptr_factory_.GetWeakPtr(), sw_registration_id, - std::move(options), std::move(callback))); + render_process_host_id, std::move(options), + std::move(callback))); } void BackgroundSyncManager::RegisterDidCheckIfMainFrame( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback, bool has_main_frame_client) { @@ -815,11 +821,13 @@ std::move(callback)); return; } - RegisterImpl(sw_registration_id, std::move(options), std::move(callback)); + RegisterImpl(sw_registration_id, render_process_host_id, std::move(options), + std::move(callback)); } void BackgroundSyncManager::RegisterImpl( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -847,6 +855,15 @@ return; } + RenderProcessHost* render_process_host = + RenderProcessHost::FromID(render_process_host_id); + if (!render_process_host) { + RecordFailureAndPostError(GetBackgroundSyncType(options), + BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER, + std::move(callback)); + return; + } + BackgroundSyncType sync_type = GetBackgroundSyncType(options); if (parameters_->skip_permissions_check_for_testing) { @@ -857,7 +874,8 @@ } SyncAndNotificationPermissions permission = GetBackgroundSyncPermission( - service_worker_context_, sw_registration->key().origin(), sync_type); + service_worker_context_, sw_registration->key().origin(), + render_process_host, sync_type); RegisterDidAskForPermission(sw_registration_id, std::move(options), std::move(callback), permission); }
diff --git a/content/browser/background_sync/background_sync_manager.h b/content/browser/background_sync/background_sync_manager.h index 8cc85a0..74c64169 100644 --- a/content/browser/background_sync/background_sync_manager.h +++ b/content/browser/background_sync/background_sync_manager.h
@@ -89,6 +89,7 @@ // parameters if the user or UA chose different parameters than those // supplied. void Register(int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback); @@ -296,14 +297,17 @@ // Register callbacks void RegisterCheckIfHasMainFrame( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback); void RegisterDidCheckIfMainFrame( int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback, bool has_main_frame_client); void RegisterImpl(int64_t sw_registration_id, + int render_process_host_id, blink::mojom::SyncRegistrationOptions options, StatusAndRegistrationCallback callback); void RegisterDidAskForPermission(
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc index c89961e5..5faa7fc 100644 --- a/content/browser/background_sync/background_sync_manager_unittest.cc +++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -39,6 +39,7 @@ #include "content/public/test/background_sync_test_util.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/mock_permission_manager.h" +#include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_utils.h" #include "content/test/mock_background_sync_controller.h" @@ -122,13 +123,14 @@ std::unique_ptr<MockPermissionManager> mock_permission_manager( new testing::NiceMock<MockPermissionManager>()); ON_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::BACKGROUND_SYNC, _, _)) + GetPermissionStatusForWorker(PermissionType::BACKGROUND_SYNC, _, _)) .WillByDefault(Return(blink::mojom::PermissionStatus::GRANTED)); ON_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::PERIODIC_BACKGROUND_SYNC, _, _)) + GetPermissionStatusForWorker( + PermissionType::PERIODIC_BACKGROUND_SYNC, _, _)) .WillByDefault(Return(blink::mojom::PermissionStatus::GRANTED)); ON_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::NOTIFICATIONS, _, _)) + GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, _)) .WillByDefault(Return(blink::mojom::PermissionStatus::DENIED)); helper_->browser_context()->SetPermissionControllerDelegate( std::move(mock_permission_manager)); @@ -139,6 +141,8 @@ helper_->browser_context()->GetStoragePartitionForUrl( GURL("https://example.com"))); helper_->context_wrapper()->set_storage_partition(storage_partition_impl_); + render_process_host_ = + std::make_unique<MockRenderProcessHost>(helper_->browser_context()); SetMaxSyncAttemptsAndRestartManager(1); @@ -369,14 +373,14 @@ if (GetBackgroundSyncType(options) == blink::mojom::BackgroundSyncType::ONE_SHOT) { test_background_sync_manager()->Register( - sw_registration_id, options, + sw_registration_id, render_process_host_->GetID(), options, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), &was_called)); callback_status = &one_shot_sync_callback_status_; } else { test_background_sync_manager()->Register( - sw_registration_id, options, + sw_registration_id, render_process_host_->GetID(), options, base::BindOnce(&BackgroundSyncManagerTest:: StatusAndPeriodicSyncRegistrationCallback, base::Unretained(this), &was_called)); @@ -750,6 +754,7 @@ BrowserTaskEnvironment task_environment_; std::unique_ptr<EmbeddedWorkerTestHelper> helper_; raw_ptr<StoragePartitionImpl> storage_partition_impl_; + std::unique_ptr<RenderProcessHost> render_process_host_; scoped_refptr<BackgroundSyncContextImpl> background_sync_context_; base::SimpleTestClock test_clock_; std::unique_ptr<TestBackgroundSyncProxy> test_proxy_; @@ -841,7 +846,7 @@ InitSyncEventTest(); bool was_called = false; test_background_sync_manager()->Register( - sw_registration_id_1_, sync_options_1_, + sw_registration_id_1_, render_process_host_->GetID(), sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), &was_called)); @@ -864,7 +869,7 @@ InitSyncEventTest(); bool was_called = false; test_background_sync_manager()->Register( - sw_registration_id_1_, sync_options_1_, + sw_registration_id_1_, render_process_host_->GetID(), sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), &was_called)); @@ -936,20 +941,20 @@ GetPermissionControllerDelegate(); EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::NOTIFICATIONS, - expected_origin, expected_origin)) + GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, + expected_origin)) .Times(2); EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::BACKGROUND_SYNC, - expected_origin, expected_origin)) + GetPermissionStatusForWorker(PermissionType::BACKGROUND_SYNC, _, + expected_origin)) .WillOnce(testing::Return(blink::mojom::PermissionStatus::DENIED)); EXPECT_FALSE(Register(sync_options_1_)); sync_options_2_.min_interval = 36000; EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::PERIODIC_BACKGROUND_SYNC, - expected_origin, expected_origin)) + GetPermissionStatusForWorker( + PermissionType::PERIODIC_BACKGROUND_SYNC, _, expected_origin)) .WillOnce(testing::Return(blink::mojom::PermissionStatus::DENIED)); EXPECT_FALSE(Register(sync_options_2_)); } @@ -960,20 +965,20 @@ GetPermissionControllerDelegate(); EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::NOTIFICATIONS, - expected_origin, expected_origin)) + GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, + expected_origin)) .Times(2); EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::BACKGROUND_SYNC, - expected_origin, expected_origin)) + GetPermissionStatusForWorker(PermissionType::BACKGROUND_SYNC, _, + expected_origin)) .WillOnce(testing::Return(blink::mojom::PermissionStatus::GRANTED)); EXPECT_TRUE(Register(sync_options_1_)); sync_options_2_.min_interval = 36000; EXPECT_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::PERIODIC_BACKGROUND_SYNC, - expected_origin, expected_origin)) + GetPermissionStatusForWorker( + PermissionType::PERIODIC_BACKGROUND_SYNC, _, expected_origin)) .WillOnce(testing::Return(blink::mojom::PermissionStatus::GRANTED)); EXPECT_TRUE(Register(sync_options_2_)); } @@ -1156,7 +1161,7 @@ bool register_called = false; bool get_registrations_called = false; test_background_sync_manager()->Register( - sw_registration_id_1_, sync_options_1_, + sw_registration_id_1_, render_process_host_->GetID(), sync_options_1_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndOneShotSyncRegistrationCallback, base::Unretained(this), ®ister_called)); @@ -1199,7 +1204,7 @@ test_background_sync_manager()->set_delay_backend(true); bool callback_called = false; test_background_sync_manager()->Register( - sw_registration_id_1_, sync_options_2_, + sw_registration_id_1_, render_process_host_->GetID(), sync_options_2_, base::BindOnce( &BackgroundSyncManagerTest::StatusAndPeriodicSyncRegistrationCallback, base::Unretained(this), &callback_called)); @@ -2474,7 +2479,7 @@ { ON_CALL(*mock_permission_manager, - GetPermissionStatus(PermissionType::NOTIFICATIONS, _, _)) + GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, _)) .WillByDefault(Return(blink::mojom::PermissionStatus::GRANTED)); EXPECT_TRUE(Register(sync_options_2_)); EXPECT_EQ(callback_one_shot_sync_registration_->max_attempts(),
diff --git a/content/browser/background_sync/background_sync_registration_helper.cc b/content/browser/background_sync/background_sync_registration_helper.cc index e3738dbd..8f1ec345 100644 --- a/content/browser/background_sync/background_sync_registration_helper.cc +++ b/content/browser/background_sync/background_sync_registration_helper.cc
@@ -10,13 +10,16 @@ #include "content/browser/background_sync/background_sync_status.h" #include "content/browser/service_worker/service_worker_registration.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" #include "url/origin.h" namespace content { BackgroundSyncRegistrationHelper::BackgroundSyncRegistrationHelper( - BackgroundSyncContextImpl* background_sync_context) - : background_sync_context_(background_sync_context) { + BackgroundSyncContextImpl* background_sync_context, + RenderProcessHost* render_process_host) + : background_sync_context_(background_sync_context), + render_process_host_id_(render_process_host->GetID()) { DCHECK(background_sync_context_); } @@ -49,7 +52,7 @@ DCHECK(background_sync_manager); background_sync_manager->Register( - sw_registration_id, *options, + sw_registration_id, render_process_host_id_, *options, base::BindOnce(&BackgroundSyncRegistrationHelper::OnRegisterResult, weak_ptr_factory_.GetWeakPtr(), std::move(callback))); }
diff --git a/content/browser/background_sync/background_sync_registration_helper.h b/content/browser/background_sync/background_sync_registration_helper.h index 6fcfecbd..742ad33 100644 --- a/content/browser/background_sync/background_sync_registration_helper.h +++ b/content/browser/background_sync/background_sync_registration_helper.h
@@ -21,6 +21,7 @@ namespace content { class BackgroundSyncContextImpl; +class RenderProcessHost; // Used by OneShotBackgroundSyncService and PeriodicBackgroundSyncService to // create and get BackgroundSync registrations. @@ -33,8 +34,9 @@ blink::mojom::BackgroundSyncError status, std::vector<blink::mojom::SyncRegistrationOptionsPtr> results)>; - explicit BackgroundSyncRegistrationHelper( - BackgroundSyncContextImpl* background_sync_context); + BackgroundSyncRegistrationHelper( + BackgroundSyncContextImpl* background_sync_context, + RenderProcessHost* render_process_host); BackgroundSyncRegistrationHelper(const BackgroundSyncRegistrationHelper&) = delete; @@ -66,6 +68,7 @@ private: // |background_sync_context_| (indirectly) owns |this|. const raw_ptr<BackgroundSyncContextImpl> background_sync_context_; + int render_process_host_id_; base::WeakPtrFactory<BackgroundSyncRegistrationHelper> weak_ptr_factory_{ this}; };
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.cc b/content/browser/background_sync/background_sync_service_impl_test_harness.cc index 8d1fd7021..8c198b90 100644 --- a/content/browser/background_sync/background_sync_service_impl_test_harness.cc +++ b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
@@ -197,4 +197,8 @@ EXPECT_TRUE(sw_registration_); } +BrowserContext* BackgroundSyncServiceImplTestHarness::browser_context() { + return embedded_worker_helper_->browser_context(); +} + } // namespace content
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.h b/content/browser/background_sync/background_sync_service_impl_test_harness.h index 02fbe82..05a6a763 100644 --- a/content/browser/background_sync/background_sync_service_impl_test_harness.h +++ b/content/browser/background_sync/background_sync_service_impl_test_harness.h
@@ -64,6 +64,8 @@ void TearDown() override; protected: + BrowserContext* browser_context(); + scoped_refptr<BackgroundSyncContextImpl> background_sync_context_; blink::mojom::SyncRegistrationOptionsPtr default_sync_registration_; std::vector<std::string> mojo_bad_messages_;
diff --git a/content/browser/background_sync/one_shot_background_sync_service_impl.cc b/content/browser/background_sync/one_shot_background_sync_service_impl.cc index 88bcbad..9d28321 100644 --- a/content/browser/background_sync/one_shot_background_sync_service_impl.cc +++ b/content/browser/background_sync/one_shot_background_sync_service_impl.cc
@@ -17,6 +17,7 @@ OneShotBackgroundSyncServiceImpl::OneShotBackgroundSyncServiceImpl( BackgroundSyncContextImpl* background_sync_context, const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService> receiver) : background_sync_context_(background_sync_context), origin_(origin), @@ -25,7 +26,7 @@ DCHECK(background_sync_context_); registration_helper_ = std::make_unique<BackgroundSyncRegistrationHelper>( - background_sync_context_); + background_sync_context_, render_process_host); receiver_.set_disconnect_handler(base::BindOnce( &OneShotBackgroundSyncServiceImpl::OnMojoDisconnect,
diff --git a/content/browser/background_sync/one_shot_background_sync_service_impl.h b/content/browser/background_sync/one_shot_background_sync_service_impl.h index 3699550..f083a25 100644 --- a/content/browser/background_sync/one_shot_background_sync_service_impl.h +++ b/content/browser/background_sync/one_shot_background_sync_service_impl.h
@@ -30,6 +30,7 @@ OneShotBackgroundSyncServiceImpl( BackgroundSyncContextImpl* background_sync_context, const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService> receiver);
diff --git a/content/browser/background_sync/one_shot_background_sync_service_impl_unittest.cc b/content/browser/background_sync/one_shot_background_sync_service_impl_unittest.cc index b989979d..2e76a11 100644 --- a/content/browser/background_sync/one_shot_background_sync_service_impl_unittest.cc +++ b/content/browser/background_sync/one_shot_background_sync_service_impl_unittest.cc
@@ -6,6 +6,7 @@ #include "base/memory/raw_ptr.h" #include "content/browser/background_sync/background_sync_service_impl_test_harness.h" +#include "content/public/test/mock_render_process_host.h" #include "url/origin.h" namespace content { @@ -23,13 +24,17 @@ protected: void CreateOneShotBackgroundSyncServiceImpl() { + render_process_host_ = + std::make_unique<MockRenderProcessHost>(browser_context()); + // Create a dummy mojo channel so that the OneShotBackgroundSyncServiceImpl // can be instantiated. mojo::PendingReceiver<blink::mojom::OneShotBackgroundSyncService> receiver = one_shot_sync_service_remote_.BindNewPipeAndPassReceiver(); // Create a new OneShotBackgroundSyncServiceImpl bound to the dummy channel. background_sync_context_->CreateOneShotSyncService( - url::Origin::Create(GURL(kServiceWorkerOrigin)), std::move(receiver)); + url::Origin::Create(GURL(kServiceWorkerOrigin)), + render_process_host_.get(), std::move(receiver)); base::RunLoop().RunUntilIdle(); // Since |background_sync_context_| is deleted after @@ -56,6 +61,7 @@ base::RunLoop().RunUntilIdle(); } + std::unique_ptr<MockRenderProcessHost> render_process_host_; mojo::Remote<blink::mojom::OneShotBackgroundSyncService> one_shot_sync_service_remote_;
diff --git a/content/browser/background_sync/periodic_background_sync_service_impl.cc b/content/browser/background_sync/periodic_background_sync_service_impl.cc index 64f48c7..cb3a1ea3 100644 --- a/content/browser/background_sync/periodic_background_sync_service_impl.cc +++ b/content/browser/background_sync/periodic_background_sync_service_impl.cc
@@ -17,6 +17,7 @@ PeriodicBackgroundSyncServiceImpl::PeriodicBackgroundSyncServiceImpl( BackgroundSyncContextImpl* background_sync_context, const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService> receiver) : background_sync_context_(background_sync_context), origin_(origin), @@ -25,7 +26,7 @@ DCHECK(background_sync_context_); registration_helper_ = std::make_unique<BackgroundSyncRegistrationHelper>( - background_sync_context_); + background_sync_context_, render_process_host); DCHECK(registration_helper_); receiver_.set_disconnect_handler(base::BindOnce(
diff --git a/content/browser/background_sync/periodic_background_sync_service_impl.h b/content/browser/background_sync/periodic_background_sync_service_impl.h index bd8c6f2..20b7124 100644 --- a/content/browser/background_sync/periodic_background_sync_service_impl.h +++ b/content/browser/background_sync/periodic_background_sync_service_impl.h
@@ -32,6 +32,7 @@ PeriodicBackgroundSyncServiceImpl( BackgroundSyncContextImpl* background_sync_context, const url::Origin& origin, + RenderProcessHost* render_process_host, mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService> receiver);
diff --git a/content/browser/background_sync/periodic_background_sync_service_impl_unittest.cc b/content/browser/background_sync/periodic_background_sync_service_impl_unittest.cc index 0441bd5f..b6b04ae 100644 --- a/content/browser/background_sync/periodic_background_sync_service_impl_unittest.cc +++ b/content/browser/background_sync/periodic_background_sync_service_impl_unittest.cc
@@ -6,6 +6,7 @@ #include "base/memory/raw_ptr.h" #include "content/browser/background_sync/background_sync_service_impl_test_harness.h" +#include "content/public/test/mock_render_process_host.h" namespace content { @@ -21,6 +22,9 @@ protected: void CreatePeriodicBackgroundSyncServiceImpl() { + render_process_host_ = + std::make_unique<MockRenderProcessHost>(browser_context()); + // Create a dummy mojo channel so that the PeriodicBackgroundSyncServiceImpl // can be instantiated. mojo::PendingReceiver<blink::mojom::PeriodicBackgroundSyncService> @@ -28,7 +32,8 @@ // Create a new PeriodicBackgroundSyncServiceImpl bound to the dummy // channel. background_sync_context_->CreatePeriodicSyncService( - url::Origin::Create(GURL(kServiceWorkerOrigin)), std::move(receiver)); + url::Origin::Create(GURL(kServiceWorkerOrigin)), + render_process_host_.get(), std::move(receiver)); base::RunLoop().RunUntilIdle(); // Since |background_sync_context_| is deleted after @@ -64,6 +69,7 @@ base::RunLoop().RunUntilIdle(); } + std::unique_ptr<MockRenderProcessHost> render_process_host_; mojo::Remote<blink::mojom::PeriodicBackgroundSyncService> periodic_sync_service_remote_;
diff --git a/content/browser/browser_associated_interface_unittest.cc b/content/browser/browser_associated_interface_unittest.cc index da3cd9e..d5bff49 100644 --- a/content/browser/browser_associated_interface_unittest.cc +++ b/content/browser/browser_associated_interface_unittest.cc
@@ -14,7 +14,6 @@ #include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "content/public/browser/browser_associated_interface.h" #include "content/public/browser/browser_message_filter.h" #include "content/public/browser/browser_task_traits.h"
diff --git a/content/browser/devtools/devtools_http_handler.h b/content/browser/devtools/devtools_http_handler.h index 48699a1..e12f1b5 100644 --- a/content/browser/devtools/devtools_http_handler.h +++ b/content/browser/devtools/devtools_http_handler.h
@@ -11,7 +11,6 @@ #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "content/public/browser/devtools_agent_host.h" #include "net/http/http_status_code.h"
diff --git a/content/browser/devtools/devtools_pipe_handler.cc b/content/browser/devtools/devtools_pipe_handler.cc index cdd401a..84c50d81 100644 --- a/content/browser/devtools/devtools_pipe_handler.cc +++ b/content/browser/devtools/devtools_pipe_handler.cc
@@ -4,7 +4,6 @@ #include "content/browser/devtools/devtools_pipe_handler.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "build/build_config.h" #if BUILDFLAG(IS_WIN)
diff --git a/content/browser/font_unique_name_lookup/font_unique_name_lookup.cc b/content/browser/font_unique_name_lookup/font_unique_name_lookup.cc index b58b174..80e5c00a 100644 --- a/content/browser/font_unique_name_lookup/font_unique_name_lookup.cc +++ b/content/browser/font_unique_name_lookup/font_unique_name_lookup.cc
@@ -14,7 +14,6 @@ #include "base/path_service.h" #include "base/strings/utf_string_conversions.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "third_party/blink/public/common/font_unique_name_lookup/font_table_matcher.h" #include "third_party/blink/public/common/font_unique_name_lookup/font_table_persistence.h"
diff --git a/content/browser/gpu/compositor_util.cc b/content/browser/gpu/compositor_util.cc index a918756..75a4318d 100644 --- a/content/browser/gpu/compositor_util.cc +++ b/content/browser/gpu/compositor_util.cc
@@ -221,6 +221,14 @@ DisableInfo::NotProblem(), false}, {"direct_rendering_display_compositor", gpu::kGpuFeatureStatusEnabled, !features::IsDrDcEnabled(), DisableInfo::NotProblem(), false}, + {"webgpu", + SafeGetFeatureStatus(gpu_feature_info, + gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGPU), + !command_line.HasSwitch(switches::kEnableUnsafeWebGPU) && + !base::FeatureList::IsEnabled(features::kWebGPUService), + DisableInfo::Problem( + "WebGPU has been disabled via blocklist or the command line."), + false}, }; DCHECK(index < std::size(kGpuFeatureData)); *eof = (index == std::size(kGpuFeatureData) - 1); @@ -275,7 +283,8 @@ status += "_on"; } if ((gpu_feature_data.name == "webgl" || - gpu_feature_data.name == "webgl2") && + gpu_feature_data.name == "webgl2" || + gpu_feature_data.name == "webgpu") && is_gpu_compositing_disabled) status += "_readback"; if (gpu_feature_data.name == "rasterization") {
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc index 3af3725..2322ce3 100644 --- a/content/browser/gpu/gpu_data_manager_impl_private.cc +++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -299,20 +299,23 @@ gpu::GPU_FEATURE_TYPE_ACCELERATED_GL, gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION, gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL, - gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL2}; + gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGL2, + gpu::GPU_FEATURE_TYPE_ACCELERATED_WEBGPU}; const std::string kGpuBlocklistFeatureHistogramNames[] = { "GPU.BlocklistFeatureTestResults.Accelerated2dCanvas", "GPU.BlocklistFeatureTestResults.GpuCompositing", "GPU.BlocklistFeatureTestResults.GpuRasterization", "GPU.BlocklistFeatureTestResults.Webgl", - "GPU.BlocklistFeatureTestResults.Webgl2"}; + "GPU.BlocklistFeatureTestResults.Webgl2", + "GPU.BlocklistFeatureTestResults.Webgpu"}; const bool kGpuFeatureUserFlags[] = { command_line.HasSwitch(switches::kDisableAccelerated2dCanvas), command_line.HasSwitch(switches::kDisableGpu), command_line.HasSwitch(switches::kDisableGpuRasterization), command_line.HasSwitch(switches::kDisableWebGL), (command_line.HasSwitch(switches::kDisableWebGL) || - command_line.HasSwitch(switches::kDisableWebGL2))}; + command_line.HasSwitch(switches::kDisableWebGL2)), + !command_line.HasSwitch(switches::kEnableUnsafeWebGPU)}; const size_t kNumFeatures = sizeof(kGpuFeatures) / sizeof(gpu::GpuFeatureType); for (size_t i = 0; i < kNumFeatures; ++i) {
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc index c31960b..b9e8f893 100644 --- a/content/browser/indexed_db/indexed_db_context_impl.cc +++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -349,7 +349,7 @@ std::sort(storage_keys.begin(), storage_keys.end()); - base::Value list(base::Value::Type::LIST); + base::Value::List list; for (const auto& storage_key : storage_keys) { base::Value info(base::Value::Type::DICTIONARY); // TODO(https://crbug.com/1199077): Serialize storage key directly
diff --git a/content/browser/indexed_db/indexed_db_internals_ui.cc b/content/browser/indexed_db/indexed_db_internals_ui.cc index 28c48c2..b8ac135 100644 --- a/content/browser/indexed_db/indexed_db_internals_ui.cc +++ b/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -100,12 +100,13 @@ control.GetAllStorageKeysDetails(base::BindOnce( [](base::WeakPtr<IndexedDBInternalsHandler> handler, base::FilePath partition_path, bool incognito, - base::Value info_list) { + base::Value::List info_list) { if (!handler) return; handler->OnStorageKeysReady( - info_list, incognito ? base::FilePath() : partition_path); + base::Value(std::move(info_list)), + incognito ? base::FilePath() : partition_path); }, handler, partition->GetPath())); },
diff --git a/content/browser/interest_group/auction_runner.cc b/content/browser/interest_group/auction_runner.cc index 39cab5d..713596f5 100644 --- a/content/browser/interest_group/auction_runner.cc +++ b/content/browser/interest_group/auction_runner.cc
@@ -46,6 +46,11 @@ constexpr base::TimeDelta kMaxTimeout = base::Milliseconds(500); +// For group freshness metrics. +constexpr base::TimeDelta kGroupFreshnessMin = base::Minutes(1); +constexpr base::TimeDelta kGroupFreshnessMax = base::Days(30); +constexpr int kGroupFreshnessBuckets = 100; + // All URLs received from worklets must be valid HTTPS URLs. It's up to callers // to call ReportBadMessage() on invalid URLs. bool IsUrlValid(const GURL& url) { @@ -487,6 +492,22 @@ post_auction_update_owners_.push_back( interest_groups[0].interest_group.owner); ++num_owners_with_interest_groups_; + // Report freshness metrics. + for (const StorageInterestGroup& group : interest_groups) { + if (group.interest_group.update_url.has_value()) { + UMA_HISTOGRAM_CUSTOM_COUNTS( + "Ads.InterestGroup.Auction.GroupFreshness.WithDailyUpdates", + (base::Time::Now() - group.last_updated).InMinutes(), + kGroupFreshnessMin.InMinutes(), kGroupFreshnessMax.InMinutes(), + kGroupFreshnessBuckets); + } else { + UMA_HISTOGRAM_CUSTOM_COUNTS( + "Ads.InterestGroup.Auction.GroupFreshness.NoDailyUpdates", + (base::Time::Now() - group.last_updated).InMinutes(), + kGroupFreshnessMin.InMinutes(), kGroupFreshnessMax.InMinutes(), + kGroupFreshnessBuckets); + } + } } OnOneLoadCompleted(); }
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc index 135676c..e336288 100644 --- a/content/browser/interest_group/interest_group_storage.cc +++ b/content/browser/interest_group/interest_group_storage.cc
@@ -578,12 +578,14 @@ const url::Origin& owner, const std::string& name, blink::InterestGroup& group, - url::Origin* joining_origin) { + url::Origin* joining_origin, + base::Time* last_updated) { // clang-format off sql::Statement load( db.GetCachedStatement(SQL_FROM_HERE, "SELECT expiration," "joining_origin," + "last_updated," "priority," "bidding_url," "bidding_wasm_helper_url," @@ -612,17 +614,19 @@ group.name = name; if (joining_origin) *joining_origin = DeserializeOrigin(load.ColumnString(1)); - group.priority = load.ColumnDouble(2); - group.bidding_url = DeserializeURL(load.ColumnString(3)); - group.bidding_wasm_helper_url = DeserializeURL(load.ColumnString(4)); - group.update_url = DeserializeURL(load.ColumnString(5)); - group.trusted_bidding_signals_url = DeserializeURL(load.ColumnString(6)); + if (last_updated) + *last_updated = load.ColumnTime(2); + group.priority = load.ColumnDouble(3); + group.bidding_url = DeserializeURL(load.ColumnString(4)); + group.bidding_wasm_helper_url = DeserializeURL(load.ColumnString(5)); + group.update_url = DeserializeURL(load.ColumnString(6)); + group.trusted_bidding_signals_url = DeserializeURL(load.ColumnString(7)); group.trusted_bidding_signals_keys = - DeserializeStringVector(load.ColumnString(7)); - if (load.GetColumnType(8) != sql::ColumnType::kNull) - group.user_bidding_signals = load.ColumnString(8); - group.ads = DeserializeInterestGroupAdVector(load.ColumnString(9)); - group.ad_components = DeserializeInterestGroupAdVector(load.ColumnString(10)); + DeserializeStringVector(load.ColumnString(8)); + if (load.GetColumnType(9) != sql::ColumnType::kNull) + group.user_bidding_signals = load.ColumnString(9); + group.ads = DeserializeInterestGroupAdVector(load.ColumnString(10)); + group.ad_components = DeserializeInterestGroupAdVector(load.ColumnString(11)); return true; } @@ -686,7 +690,8 @@ blink::InterestGroup stored_group; if (!DoLoadInterestGroup(db, update.owner, update.name, stored_group, - nullptr)) { + /*joining_origin=*/nullptr, + /*last_updated=*/nullptr)) { return false; } @@ -1155,7 +1160,8 @@ base::Time now) { StorageInterestGroup db_interest_group; if (!DoLoadInterestGroup(db, owner, name, db_interest_group.interest_group, - &db_interest_group.joining_origin)) { + &db_interest_group.joining_origin, + &db_interest_group.last_updated)) { return absl::nullopt; }
diff --git a/content/browser/interest_group/storage_interest_group.h b/content/browser/interest_group/storage_interest_group.h index 2dd3299..6d9a48a 100644 --- a/content/browser/interest_group/storage_interest_group.h +++ b/content/browser/interest_group/storage_interest_group.h
@@ -55,6 +55,8 @@ std::vector<KAnonymityData> ads_kanon; // Top level page origin from when the interest group was joined. url::Origin joining_origin; + // The last time this interest group was updated. + base::Time last_updated; }; // Stream operator so KAnonymityData can be used in assertion statements.
diff --git a/content/browser/notifications/blink_notification_service_impl.cc b/content/browser/notifications/blink_notification_service_impl.cc index 54f1f29..32a61e7 100644 --- a/content/browser/notifications/blink_notification_service_impl.cc +++ b/content/browser/notifications/blink_notification_service_impl.cc
@@ -19,6 +19,7 @@ #include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_type.h" #include "content/public/browser/platform_notification_service.h" +#include "content/public/browser/render_process_host.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "third_party/blink/public/common/notifications/notification_constants.h" @@ -80,12 +81,14 @@ PlatformNotificationContextImpl* notification_context, BrowserContext* browser_context, scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, + RenderProcessHost* render_process_host, const url::Origin& origin, const GURL& document_url, mojo::PendingReceiver<blink::mojom::NotificationService> receiver) : notification_context_(notification_context), browser_context_(browser_context), service_worker_context_(std::move(service_worker_context)), + render_process_host_id_(render_process_host->GetID()), origin_(origin), document_url_(document_url), receiver_(this, std::move(receiver)) { @@ -175,12 +178,17 @@ blink::mojom::PermissionStatus BlinkNotificationServiceImpl::CheckPermissionStatus() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - // TOOD(crbug.com/987654): It is odd that a service instance can be created + + RenderProcessHost* rph = RenderProcessHost::FromID(render_process_host_id_); + if (!rph) + return blink::mojom::PermissionStatus::DENIED; + + // TODO(crbug.com/987654): It is odd that a service instance can be created // for cross-origin subframes, yet the instance is completely oblivious of // whether it is serving a top-level browsing context or an embedded one. return browser_context_->GetPermissionController() - ->GetPermissionStatusForServiceWorker(PermissionType::NOTIFICATIONS, - origin_); + ->GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, rph, + origin_); } bool BlinkNotificationServiceImpl::ValidateNotificationDataAndResources(
diff --git a/content/browser/notifications/blink_notification_service_impl.h b/content/browser/notifications/blink_notification_service_impl.h index cb2b0991..dc8de24 100644 --- a/content/browser/notifications/blink_notification_service_impl.h +++ b/content/browser/notifications/blink_notification_service_impl.h
@@ -41,6 +41,7 @@ PlatformNotificationContextImpl* notification_context, BrowserContext* browser_context, scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, + RenderProcessHost* render_process_host, const url::Origin& origin, const GURL& document_url, mojo::PendingReceiver<blink::mojom::NotificationService> receiver); @@ -105,6 +106,8 @@ scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; + int render_process_host_id_; + // The origin that this notification service is communicating with. url::Origin origin_; // The document url that this notification service is communicating with.
diff --git a/content/browser/notifications/blink_notification_service_impl_unittest.cc b/content/browser/notifications/blink_notification_service_impl_unittest.cc index f0d5ea3..7461d50 100644 --- a/content/browser/notifications/blink_notification_service_impl_unittest.cc +++ b/content/browser/notifications/blink_notification_service_impl_unittest.cc
@@ -25,6 +25,7 @@ #include "content/public/common/content_features.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/mock_permission_manager.h" +#include "content/public/test/mock_render_process_host.h" #include "content/public/test/test_browser_context.h" #include "content/public/test/test_utils.h" #include "content/test/mock_platform_notification_service.h" @@ -100,7 +101,8 @@ BlinkNotificationServiceImplTest() : task_environment_(BrowserTaskEnvironment::IO_MAINLOOP), embedded_worker_helper_( - std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath())) { + std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath())), + render_process_host_(&browser_context_) { browser_context_.SetPlatformNotificationService( std::make_unique<MockPlatformNotificationService>(&browser_context_)); } @@ -126,7 +128,7 @@ notification_service_ = std::make_unique<BlinkNotificationServiceImpl>( notification_context_.get(), &browser_context_, - embedded_worker_helper_->context_wrapper(), + embedded_worker_helper_->context_wrapper(), &render_process_host_, url::Origin::Create(GURL(kTestOrigin)), /*document_url=*/GURL(), notification_service_remote_.BindNewPipeAndPassReceiver()); @@ -405,6 +407,9 @@ ON_CALL(*mock_permission_manager, GetPermissionStatus(PermissionType::NOTIFICATIONS, _, _)) .WillByDefault(Return(permission_status)); + ON_CALL(*mock_permission_manager, + GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, _)) + .WillByDefault(Return(permission_status)); } protected: @@ -420,6 +425,8 @@ TestBrowserContext browser_context_; + MockRenderProcessHost render_process_host_; + scoped_refptr<PlatformNotificationContextImpl> notification_context_; MockNonPersistentNotificationListener non_persistent_notification_listener_;
diff --git a/content/browser/notifications/platform_notification_context_impl.cc b/content/browser/notifications/platform_notification_context_impl.cc index 5580c415a..1195296 100644 --- a/content/browser/notifications/platform_notification_context_impl.cc +++ b/content/browser/notifications/platform_notification_context_impl.cc
@@ -281,13 +281,14 @@ } void PlatformNotificationContextImpl::CreateService( + RenderProcessHost* render_process_host, const url::Origin& origin, const GURL& document_url, mojo::PendingReceiver<blink::mojom::NotificationService> receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); services_.push_back(std::make_unique<BlinkNotificationServiceImpl>( - this, browser_context_, service_worker_context_, origin, document_url, - std::move(receiver))); + this, browser_context_, service_worker_context_, render_process_host, + origin, document_url, std::move(receiver))); } void PlatformNotificationContextImpl::RemoveService( @@ -363,7 +364,7 @@ // Erase all valid origins so we're left with invalid ones. base::EraseIf(origins, [controller](const GURL& origin) { - auto permission = controller->GetPermissionStatusForServiceWorker( + auto permission = controller->GetPermissionStatusForOriginWithoutContext( PermissionType::NOTIFICATIONS, url::Origin::Create(origin)); return permission == blink::mojom::PermissionStatus::GRANTED; });
diff --git a/content/browser/notifications/platform_notification_context_impl.h b/content/browser/notifications/platform_notification_context_impl.h index 9510757..69f000e 100644 --- a/content/browser/notifications/platform_notification_context_impl.h +++ b/content/browser/notifications/platform_notification_context_impl.h
@@ -46,6 +46,7 @@ class BrowserContext; struct NotificationDatabaseData; class PlatformNotificationServiceProxy; +class RenderProcessHost; class ServiceWorkerContextWrapper; // Implementation of the Web Notification storage context. The public methods @@ -76,6 +77,7 @@ // Creates a BlinkNotificationServiceImpl that is owned by this context. // |document_url| is empty when originating from a worker. void CreateService( + RenderProcessHost* render_process_host, const url::Origin& origin, const GURL& document_url, mojo::PendingReceiver<blink::mojom::NotificationService> receiver);
diff --git a/content/browser/payments/installed_payment_apps_finder_impl.cc b/content/browser/payments/installed_payment_apps_finder_impl.cc index a0d5b5b8..d1853d4 100644 --- a/content/browser/payments/installed_payment_apps_finder_impl.cc +++ b/content/browser/payments/installed_payment_apps_finder_impl.cc
@@ -77,7 +77,7 @@ PaymentApps permitted_apps; for (auto& app : apps) { GURL origin = app.second->scope.DeprecatedGetOriginAsURL(); - if (permission_controller->GetPermissionStatusForServiceWorker( + if (permission_controller->GetPermissionStatusForOriginWithoutContext( PermissionType::PAYMENT_HANDLER, url::Origin::Create(origin)) == blink::mojom::PermissionStatus::GRANTED) { permitted_apps[app.first] = std::move(app.second);
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc index 0e069fa..c03fe89 100644 --- a/content/browser/permissions/permission_controller_impl.cc +++ b/content/browser/permissions/permission_controller_impl.cc
@@ -151,6 +151,15 @@ return GetPermissionStatusForFrame(subscription.permission, rfh, subscription.requesting_origin); } + + content::RenderProcessHost* rph = + content::RenderProcessHost::FromID(subscription.render_process_id); + if (rph) { + return GetPermissionStatusForWorker( + subscription.permission, rph, + url::Origin::Create(subscription.requesting_origin)); + } + return DeprecatedGetPermissionStatus(subscription.permission, subscription.requesting_origin, subscription.embedding_origin); @@ -361,12 +370,21 @@ } blink::mojom::PermissionStatus -PermissionControllerImpl::GetPermissionStatusForServiceWorker( +PermissionControllerImpl::GetPermissionStatusForWorker( PermissionType permission, - const url::Origin& service_worker_origin) { - return DeprecatedGetPermissionStatus(permission, - service_worker_origin.GetURL(), - service_worker_origin.GetURL()); + RenderProcessHost* render_process_host, + const url::Origin& worker_origin) { + absl::optional<blink::mojom::PermissionStatus> status = + devtools_permission_overrides_.Get(worker_origin, permission); + if (status.has_value()) + return *status; + + PermissionControllerDelegate* delegate = + browser_context_->GetPermissionControllerDelegate(); + if (!delegate) + return blink::mojom::PermissionStatus::DENIED; + return delegate->GetPermissionStatusForWorker(permission, render_process_host, + worker_origin.GetURL()); } blink::mojom::PermissionStatus @@ -445,10 +463,12 @@ PermissionControllerImpl::SubscriptionId PermissionControllerImpl::SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, const base::RepeatingCallback<void(blink::mojom::PermissionStatus)>& callback) { + DCHECK(!render_process_host || !render_frame_host); auto subscription = std::make_unique<Subscription>(); subscription->permission = permission; subscription->callback = callback; @@ -464,7 +484,8 @@ } else { subscription->embedding_origin = requesting_origin; subscription->render_frame_id = -1; - subscription->render_process_id = -1; + subscription->render_process_id = + render_process_host ? render_process_host->GetID() : -1; } auto id = subscription_id_generator_.GenerateNextId(); @@ -473,7 +494,8 @@ if (delegate) { subscription->delegate_subscription_id = delegate->SubscribePermissionStatusChange( - permission, render_frame_host, requesting_origin, + permission, render_process_host, render_frame_host, + requesting_origin, base::BindRepeating( &PermissionControllerImpl::OnDelegatePermissionStatusChange, base::Unretained(this), id));
diff --git a/content/browser/permissions/permission_controller_impl.h b/content/browser/permissions/permission_controller_impl.h index bca8d76..2872ba3 100644 --- a/content/browser/permissions/permission_controller_impl.h +++ b/content/browser/permissions/permission_controller_impl.h
@@ -16,6 +16,7 @@ namespace content { class BrowserContext; +class RenderProcessHost; // Implementation of the PermissionController interface. This // is used by content/ layer to manage permissions. @@ -53,9 +54,10 @@ const GURL& requesting_origin, const GURL& embedding_origin) override; - blink::mojom::PermissionStatus GetPermissionStatusForServiceWorker( + blink::mojom::PermissionStatus GetPermissionStatusForWorker( PermissionType permission, - const url::Origin& service_worker_origin) override; + RenderProcessHost* render_process_host, + const url::Origin& worker_origin) override; blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( PermissionType permission, @@ -84,8 +86,11 @@ const GURL& requesting_origin, const GURL& embedding_origin); + // Only one of |render_process_host| and |render_frame_host| should be set, + // or neither. RenderProcessHost will be inferred from |render_frame_host|. SubscriptionId SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, const base::RepeatingCallback<void(blink::mojom::PermissionStatus)>&
diff --git a/content/browser/permissions/permission_controller_impl_unittest.cc b/content/browser/permissions/permission_controller_impl_unittest.cc index 127fa8aa..8c6523e 100644 --- a/content/browser/permissions/permission_controller_impl_unittest.cc +++ b/content/browser/permissions/permission_controller_impl_unittest.cc
@@ -269,19 +269,21 @@ // Setup. blink::mojom::PermissionStatus sync_status = - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::BACKGROUND_SYNC, kTestOrigin); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::BACKGROUND_SYNC, /*render_process_host=*/nullptr, + kTestOrigin); permission_controller()->SetOverrideForDevTools( kTestOrigin, PermissionType::GEOLOCATION, blink::mojom::PermissionStatus::DENIED); base::MockCallback<PermissionStatusCallback> geo_callback; permission_controller()->SubscribePermissionStatusChange( - PermissionType::GEOLOCATION, nullptr, kUrl, geo_callback.Get()); + PermissionType::GEOLOCATION, nullptr, nullptr, kUrl, geo_callback.Get()); base::MockCallback<PermissionStatusCallback> sync_callback; permission_controller()->SubscribePermissionStatusChange( - PermissionType::BACKGROUND_SYNC, nullptr, kUrl, sync_callback.Get()); + PermissionType::BACKGROUND_SYNC, nullptr, nullptr, kUrl, + sync_callback.Get()); // Geolocation should change status, so subscriber is updated. EXPECT_CALL(geo_callback, Run(blink::mojom::PermissionStatus::ASK)); @@ -317,8 +319,9 @@ blink::mojom::PermissionStatus::ASK)); blink::mojom::PermissionStatus status = - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::GEOLOCATION, kTestOrigin); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + kTestOrigin); EXPECT_EQ(blink::mojom::PermissionStatus::DENIED, status); } @@ -350,14 +353,17 @@ // Keep original settings as before. EXPECT_EQ(blink::mojom::PermissionStatus::DENIED, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::GEOLOCATION, kTestOrigin)); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + kTestOrigin)); + EXPECT_EQ( + blink::mojom::PermissionStatus::ASK, + permission_controller()->GetPermissionStatusForWorker( + PermissionType::MIDI, /*render_process_host=*/nullptr, kTestOrigin)); EXPECT_EQ(blink::mojom::PermissionStatus::ASK, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::MIDI, kTestOrigin)); - EXPECT_EQ(blink::mojom::PermissionStatus::ASK, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::BACKGROUND_SYNC, kTestOrigin)); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::BACKGROUND_SYNC, + /*render_process_host=*/nullptr, kTestOrigin)); EXPECT_CALL(*mock_manager(), IsPermissionOverridableByDevTools( PermissionType::GEOLOCATION, testing::_)) @@ -374,14 +380,17 @@ PermissionType::BACKGROUND_SYNC}); EXPECT_EQ(OverrideStatus::kOverrideSet, result); EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::GEOLOCATION, kTestOrigin)); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::GEOLOCATION, /*render_process_host=*/nullptr, + kTestOrigin)); + EXPECT_EQ( + blink::mojom::PermissionStatus::GRANTED, + permission_controller()->GetPermissionStatusForWorker( + PermissionType::MIDI, /*render_process_host=*/nullptr, kTestOrigin)); EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::MIDI, kTestOrigin)); - EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED, - permission_controller()->GetPermissionStatusForServiceWorker( - PermissionType::BACKGROUND_SYNC, kTestOrigin)); + permission_controller()->GetPermissionStatusForWorker( + PermissionType::BACKGROUND_SYNC, + /*render_process_host=*/nullptr, kTestOrigin)); } } // namespace
diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc index bec61615..c75a14c 100644 --- a/content/browser/permissions/permission_service_context.cc +++ b/content/browser/permissions/permission_service_context.cc
@@ -138,7 +138,8 @@ auto subscription_id = PermissionControllerImpl::FromBrowserContext(browser_context) ->SubscribePermissionStatusChange( - permission_type, render_frame_host_, requesting_origin, + permission_type, render_process_host_, render_frame_host_, + requesting_origin, base::BindRepeating( &PermissionSubscription::OnPermissionStatusChanged, base::Unretained(subscription.get())));
diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc index 59d629d..21d9ab9 100644 --- a/content/browser/permissions/permission_service_impl.cc +++ b/content/browser/permissions/permission_service_impl.cc
@@ -200,13 +200,17 @@ return browser_context->GetPermissionController() ->GetPermissionStatusForCurrentDocument(type, context_->render_frame_host()); - } else { - // If `context_->render_frame_host()` is empty, it means `PermissionService` - // is created for a ServiceWorker. - DCHECK(context_->GetEmbeddingOrigin().is_empty()); - return browser_context->GetPermissionController() - ->GetPermissionStatusForServiceWorker(type, origin_); } + + if (context_->render_process_host()) { + return browser_context->GetPermissionController() + ->GetPermissionStatusForWorker(type, context_->render_process_host(), + origin_); + } + + DCHECK(context_->GetEmbeddingOrigin().is_empty()); + return browser_context->GetPermissionController() + ->GetPermissionStatusForOriginWithoutContext(type, origin_); } void PermissionServiceImpl::ResetPermissionStatus(PermissionType type) {
diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc index c890be0..2cc0b70a 100644 --- a/content/browser/push_messaging/push_messaging_manager.cc +++ b/content/browser/push_messaging/push_messaging_manager.cc
@@ -18,6 +18,7 @@ #include "base/time/time.h" #include "content/browser/bad_message.h" #include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/permissions/permission_controller_impl.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/public/browser/browser_context.h"
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index 09ee5f14..e18b3db2 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -3138,6 +3138,7 @@ // owned by BrowserMainLoop. audio_subscription_id = controller->SubscribePermissionStatusChange( PermissionType::AUDIO_CAPTURE, + /*render_process_host=*/nullptr, RenderFrameHost::FromID(requesting_process_id, requesting_frame_id), origin, base::BindRepeating(&MediaStreamManager::PermissionChangedCallback, @@ -3151,6 +3152,7 @@ // owned by BrowserMainLoop. video_subscription_id = controller->SubscribePermissionStatusChange( PermissionType::VIDEO_CAPTURE, + /*render_process_host=*/nullptr, RenderFrameHost::FromID(requesting_process_id, requesting_frame_id), origin, base::BindRepeating(&MediaStreamManager::PermissionChangedCallback,
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 92ef1bd..3d5188d 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -1513,7 +1513,8 @@ // Called when a Portal needs to be destroyed. void DestroyPortal(Portal* portal); - // Return fenced frames owned by |this|. + // Return fenced frames owned by |this|. The returned vector is in the order + // the fenced frames were added (most recent at end). std::vector<FencedFrame*> GetFencedFrames() const; // Called when a fenced frame needs to be destroyed. @@ -3958,7 +3959,8 @@ // back to |this|. base::flat_set<std::unique_ptr<Portal>, base::UniquePtrComparator> portals_; - // The fenced frames owned by this document. + // The fenced frames owned by this document, ordered with newer fenced frames + // being appended to the end. std::vector<std::unique_ptr<FencedFrame>> fenced_frames_; // Tracking active features in this frame, for use in figuring out whether
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 6445dba..b769a06 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2083,7 +2083,7 @@ document_url = rfh->GetLastCommittedURL(); storage_partition_impl_->GetPlatformNotificationContext()->CreateService( - origin, document_url, std::move(receiver)); + this, origin, document_url, std::move(receiver)); } void RenderProcessHostImpl::CreateWebSocketConnector( @@ -2496,7 +2496,7 @@ receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); storage_partition_impl_->GetBackgroundSyncContext()->CreateOneShotSyncService( - origin, std::move(receiver)); + origin, this, std::move(receiver)); } void RenderProcessHostImpl::CreatePeriodicSyncService( @@ -2505,7 +2505,7 @@ receiver) { DCHECK_CURRENTLY_ON(BrowserThread::UI); storage_partition_impl_->GetBackgroundSyncContext() - ->CreatePeriodicSyncService(origin, std::move(receiver)); + ->CreatePeriodicSyncService(origin, this, std::move(receiver)); } void RenderProcessHostImpl::BindPushMessaging(
diff --git a/content/browser/resources/gpu/info_view.js b/content/browser/resources/gpu/info_view.js index a869873..f85a768 100644 --- a/content/browser/resources/gpu/info_view.js +++ b/content/browser/resources/gpu/info_view.js
@@ -281,6 +281,7 @@ 'video_encode': 'Video Encode', 'direct_rendering_display_compositor': 'Direct Rendering Display Compositor', + 'webgpu': 'WebGPU', }; const statusMap = {
diff --git a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc index 323dd20..8f07de58 100644 --- a/content/browser/scheduler/browser_io_thread_delegate_unittest.cc +++ b/content/browser/scheduler/browser_io_thread_delegate_unittest.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "content/browser/scheduler/browser_task_executor.h" #include "content/browser/scheduler/browser_task_queues.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index b4eec5cd..0651e95 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -11,7 +11,6 @@ #include "base/memory/scoped_refptr.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/services/storage/service_worker/service_worker_storage_control_impl.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_wrapper.h"
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index d65d5e2b..376fd8d4 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -2046,9 +2046,10 @@ std::vector<url::Origin> origins_out; for (auto& origin : origins) { - bool allowed = permission_controller->GetPermissionStatusForServiceWorker( - PermissionType::BACKGROUND_SYNC, origin) == - blink::mojom::PermissionStatus::GRANTED; + bool allowed = + permission_controller->GetPermissionStatusForOriginWithoutContext( + PermissionType::BACKGROUND_SYNC, origin) == + blink::mojom::PermissionStatus::GRANTED; if (allowed) origins_out.push_back(origin); } @@ -2063,7 +2064,7 @@ PermissionController* permission_controller = browser_context_->GetPermissionController(); std::move(callback).Run( - permission_controller->GetPermissionStatusForServiceWorker( + permission_controller->GetPermissionStatusForOriginWithoutContext( content::PermissionType::BACKGROUND_SYNC, url::Origin::Create(origin)) == blink::mojom::PermissionStatus::GRANTED);
diff --git a/content/browser/tracing/tracing_service_controller.cc b/content/browser/tracing/tracing_service_controller.cc index 1dfe048c..b638e2a 100644 --- a/content/browser/tracing/tracing_service_controller.cc +++ b/content/browser/tracing/tracing_service_controller.cc
@@ -8,7 +8,6 @@ #include "base/no_destructor.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/service_process_host.h"
diff --git a/content/browser/utility_process_host.h b/content/browser/utility_process_host.h index 41589ce9..b5784b7 100644 --- a/content/browser/utility_process_host.h +++ b/content/browser/utility_process_host.h
@@ -13,7 +13,6 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/process/launch.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" #include "content/common/child_process.mojom.h"
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index e31cf76..25f5b36 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -8121,7 +8121,13 @@ .Clone()); } - if (!proxy_host) + // If `render_view_host` is for an inner WebContents, ensure that its + // RenderWidgetHostView is properly reattached to the outer WebContents. Note + // that this should only be done when `render_view_host` is already the + // current RenderViewHost in this WebContents. If it isn't, the reattachment + // will happen later when `render_view_host` becomes current as part of + // committing the speculative RenderFrameHost it's associated with. + if (!proxy_host && render_view_host == GetRenderViewHost()) ReattachOuterDelegateIfNeeded(); SetHistoryOffsetAndLengthForView(
diff --git a/content/browser/worker_host/worker_browsertest.cc b/content/browser/worker_host/worker_browsertest.cc index 7fc191f..c9af3d1 100644 --- a/content/browser/worker_host/worker_browsertest.cc +++ b/content/browser/worker_host/worker_browsertest.cc
@@ -922,8 +922,10 @@ WorkerFromAnonymousIframeNikBrowserTest, testing::Range(0, 3)); -IN_PROC_BROWSER_TEST_P(WorkerFromAnonymousIframeNikBrowserTest, - SharedWorkerRequestIsDoneWithPartitionedNetworkState) { +// TODO(crbug.com/1309684): Test is flaky. +IN_PROC_BROWSER_TEST_P( + WorkerFromAnonymousIframeNikBrowserTest, + DISABLED_SharedWorkerRequestIsDoneWithPartitionedNetworkState) { if (!SupportsSharedWorker()) return;
diff --git a/content/child/child_process.h b/content/child/child_process.h index 78dc634..419033f 100644 --- a/content/child/child_process.h +++ b/content/child/child_process.h
@@ -12,7 +12,6 @@ #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "content/common/content_export.h" namespace content {
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h index 1b5b5f16..08908fda 100644 --- a/content/child/child_thread_impl.h +++ b/content/child/child_thread_impl.h
@@ -16,7 +16,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/variations/child_process_field_trial_syncer.h" #include "content/common/associated_interfaces.mojom.h"
diff --git a/content/public/browser/permission_controller.h b/content/public/browser/permission_controller.h index 2f476c2..a003456 100644 --- a/content/public/browser/permission_controller.h +++ b/content/public/browser/permission_controller.h
@@ -19,9 +19,11 @@ namespace content { class RenderFrameHost; +class RenderProcessHost; // This class allows the content layer to manipulate permissions. It's behavior // is defined by the embedder via PermissionControllerDelegate implementation. +// TODO(crbug.com/1312212): Use url::Origin instead of GURL. class CONTENT_EXPORT PermissionController : public base::SupportsUserData::Data { public: @@ -41,12 +43,14 @@ const GURL& requesting_origin, const GURL& embedding_origin) = 0; - // Returns the permission status for a given origin. ServiceWorker isn't - // associated with any WebContents, hence a document's lifecycle state isn't - // considered. - virtual blink::mojom::PermissionStatus GetPermissionStatusForServiceWorker( + // Returns the status of the given |permission| for a worker on + // |worker_origin| running in the renderer corresponding to + // |render_process_host|. Use this over GetPermissionStatus to correctly + // handle requests originating from workers. + virtual blink::mojom::PermissionStatus GetPermissionStatusForWorker( PermissionType permission, - const url::Origin& service_worker_origin) = 0; + RenderProcessHost* render_process_host, + const url::Origin& worker_origin) = 0; // Returns the permission status for the current document in the given // RenderFrameHost. Use this over `DeprecatedGetPermissionStatus` whenever
diff --git a/content/public/browser/permission_controller_delegate.h b/content/public/browser/permission_controller_delegate.h index f39bf9a..0adaa67 100644 --- a/content/public/browser/permission_controller_delegate.h +++ b/content/public/browser/permission_controller_delegate.h
@@ -15,6 +15,7 @@ namespace content { enum class PermissionType; class RenderFrameHost; +class RenderProcessHost; class CONTENT_EXPORT PermissionControllerDelegate { public: @@ -79,6 +80,15 @@ PermissionType permission, RenderFrameHost* render_frame_host) = 0; + // Returns the status of the given `permission` for a worker on + // `worker_origin` running in `render_process_host`, also performing + // additional checks such as Permission Policy. Use this over + // GetPermissionStatus whenever possible. + virtual blink::mojom::PermissionStatus GetPermissionStatusForWorker( + PermissionType permission, + RenderProcessHost* render_process_host, + const GURL& worker_origin) = 0; + // Sets the permission back to its default for the requesting_origin/ // embedding_origin tuple. virtual void ResetPermission(PermissionType permission, @@ -86,11 +96,14 @@ const GURL& embedding_origin) = 0; // Runs the given |callback| whenever the |permission| associated with the - // given RenderFrameHost changes. A nullptr should be passed if the request - // is from a worker. Returns the ID to be used to unsubscribe, which can be - // `is_null()` if the subscribe was not successful. + // given |render_frame_host| changes. |render_process_host| should be passed + // instead if the request is from a worker. Returns the ID to be used to + // unsubscribe, which can be `is_null()` if the subscribe was not successful. + // Exactly one of |render_process_host| and |render_frame_host| should be + // set, RenderProcessHost will be inferred from |render_frame_host|. virtual SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)>
diff --git a/content/public/renderer/render_frame_observer.h b/content/public/renderer/render_frame_observer.h index d55a1b4..eb6f4c8 100644 --- a/content/public/renderer/render_frame_observer.h +++ b/content/public/renderer/render_frame_observer.h
@@ -21,6 +21,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/loader/loading_behavior_flag.h" #include "third_party/blink/public/common/responsiveness_metrics/user_interaction_latency.h" +#include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/common/use_counter/use_counter_feature.h" #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h" #include "third_party/blink/public/platform/web_vector.h" @@ -141,6 +142,13 @@ const blink::WebVector<blink::WebString>& newly_matching_selectors, const blink::WebVector<blink::WebString>& stopped_matching_selectors) {} + // Called when the RenderFrame creates a FencedFrame and provides the + // RemoteFrameToken to identify the RenderFrameProxy to the inner + // RenderFrame. This is called immediately after the FencedFrame is created + // in the browser and the RenderFrameProxy initialized in this renderer. + virtual void DidCreateFencedFrame( + const blink::RemoteFrameToken& placeholder_token) {} + // Called when same-document navigation finishes. // This is the only callback for same-document navigations, // DidStartNavigation and ReadyToCommitNavigation are not called.
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc index c1d1436..915d148 100644 --- a/content/public/test/fenced_frame_test_util.cc +++ b/content/public/test/fenced_frame_test_util.cc
@@ -102,6 +102,17 @@ return target_node->current_frame_host(); } +// static +RenderFrameHost* FencedFrameTestHelper::GetMostRecentlyAddedFencedFrame( + RenderFrameHost* rfh) { + std::vector<FencedFrame*> fenced_frames = + static_cast<RenderFrameHostImpl*>(rfh)->GetFencedFrames(); + if (fenced_frames.empty()) + return nullptr; + + return fenced_frames.back()->GetInnerRoot(); +} + } // namespace test } // namespace content
diff --git a/content/public/test/fenced_frame_test_util.h b/content/public/test/fenced_frame_test_util.h index a872dd6..4dc54cf 100644 --- a/content/public/test/fenced_frame_test_util.h +++ b/content/public/test/fenced_frame_test_util.h
@@ -55,6 +55,11 @@ const GURL& url, net::Error expected_error_code = net::OK); + // Returns the last created fenced frame. This can be used by embedders who + // must create fenced frames from script but need to get the fence frame's + // inner root RenderFrameHost. + static RenderFrameHost* GetMostRecentlyAddedFencedFrame(RenderFrameHost* rfh); + private: base::test::ScopedFeatureList scoped_feature_list_; };
diff --git a/content/public/test/mock_permission_controller.h b/content/public/test/mock_permission_controller.h index 16b215d..60298f9 100644 --- a/content/public/test/mock_permission_controller.h +++ b/content/public/test/mock_permission_controller.h
@@ -33,10 +33,11 @@ blink::mojom::PermissionStatus(PermissionType permission, const GURL& requesting_origin, const GURL& embedding_origin)); - MOCK_METHOD2( - GetPermissionStatusForServiceWorker, + MOCK_METHOD3( + GetPermissionStatusForWorker, blink::mojom::PermissionStatus(PermissionType permission, - const url::Origin& requesting_origin)); + RenderProcessHost* render_process_host, + const url::Origin& worker_origin)); MOCK_METHOD2( GetPermissionStatusForCurrentDocument, blink::mojom::PermissionStatus(PermissionType permission,
diff --git a/content/public/test/mock_permission_manager.h b/content/public/test/mock_permission_manager.h index 11f1077..6cacf2f 100644 --- a/content/public/test/mock_permission_manager.h +++ b/content/public/test/mock_permission_manager.h
@@ -9,8 +9,6 @@ #include "testing/gmock/include/gmock/gmock.h" #include "url/gurl.h" -class GURL; - namespace content { enum class PermissionType; @@ -39,6 +37,11 @@ blink::mojom::PermissionStatus( PermissionType permission, content::RenderFrameHost* render_frame_host)); + MOCK_METHOD3(GetPermissionStatusForWorker, + blink::mojom::PermissionStatus( + PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin)); void RequestPermission( PermissionType permission, RenderFrameHost* render_frame_host, @@ -57,9 +60,10 @@ void ResetPermission(PermissionType permission, const GURL& requesting_origin, const GURL& embedding_origin) override {} - MOCK_METHOD4(SubscribePermissionStatusChange, + MOCK_METHOD5(SubscribePermissionStatusChange, SubscriptionId( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)>
diff --git a/content/public/test/web_transport_simple_test_server.h b/content/public/test/web_transport_simple_test_server.h index 7c8322c..5838099 100644 --- a/content/public/test/web_transport_simple_test_server.h +++ b/content/public/test/web_transport_simple_test_server.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/time/time.h" #include "net/base/ip_endpoint.h" namespace base {
diff --git a/content/renderer/pepper/pepper_webplugin_impl.cc b/content/renderer/pepper/pepper_webplugin_impl.cc index 109423ce..4802ac1 100644 --- a/content/renderer/pepper/pepper_webplugin_impl.cc +++ b/content/renderer/pepper/pepper_webplugin_impl.cc
@@ -13,7 +13,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "content/public/renderer/content_renderer_client.h" #include "content/renderer/pepper/message_channel.h" #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 2754ec1..b30fa0d 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -3617,6 +3617,10 @@ agent_scheduling_group_, this, proxy_routing_id, frame_token, devtools_frame_token, fenced_frame); proxy->SetReplicatedState(std::move(initial_replicated_state)); + + for (auto& observer : observers_) + observer.DidCreateFencedFrame(frame_token); + return proxy->web_frame(); }
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index 0c95984..475f3e1 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc
@@ -30,7 +30,6 @@ #include "base/system/sys_info.h" #include "base/task/thread_pool/initialization_util.h" #include "base/task/thread_pool/thread_pool_instance.h" -#include "base/time/time.h" #include "content/common/thread_pool_util.h" #include "content/public/common/bindings_policy.h" #include "content/public/common/content_client.h"
diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc index 3a7ca75..ad557d4 100644 --- a/content/shell/browser/shell_permission_manager.cc +++ b/content/shell/browser/shell_permission_manager.cc
@@ -157,9 +157,18 @@ render_frame_host)); } +blink::mojom::PermissionStatus +ShellPermissionManager::GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + return GetPermissionStatus(permission, worker_origin, worker_origin); +} + ShellPermissionManager::SubscriptionId ShellPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
diff --git a/content/shell/browser/shell_permission_manager.h b/content/shell/browser/shell_permission_manager.h index 6fdb78c..f8f02ae 100644 --- a/content/shell/browser/shell_permission_manager.h +++ b/content/shell/browser/shell_permission_manager.h
@@ -49,8 +49,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/content/test/fuzzer/mojolpm_fuzzer_support.h b/content/test/fuzzer/mojolpm_fuzzer_support.h index 363471c..cfd5c99a 100644 --- a/content/test/fuzzer/mojolpm_fuzzer_support.h +++ b/content/test/fuzzer/mojolpm_fuzzer_support.h
@@ -7,7 +7,6 @@ #include "base/at_exit.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_content_client_initializer.h" #include "content/public/test/test_renderer_host.h"
diff --git a/content/web_test/browser/web_test_permission_manager.cc b/content/web_test/browser/web_test_permission_manager.cc index 5d68981..3014378 100644 --- a/content/web_test/browser/web_test_permission_manager.cc +++ b/content/web_test/browser/web_test_permission_manager.cc
@@ -169,9 +169,18 @@ .DeprecatedGetOriginAsURL()); } +blink::mojom::PermissionStatus +WebTestPermissionManager::GetPermissionStatusForWorker( + content::PermissionType permission, + RenderProcessHost* render_process_host, + const GURL& worker_origin) { + return GetPermissionStatus(permission, worker_origin, worker_origin); +} + WebTestPermissionManager::SubscriptionId WebTestPermissionManager::SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
diff --git a/content/web_test/browser/web_test_permission_manager.h b/content/web_test/browser/web_test_permission_manager.h index 291930b..6e08274 100644 --- a/content/web_test/browser/web_test_permission_manager.h +++ b/content/web_test/browser/web_test_permission_manager.h
@@ -59,8 +59,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( PermissionType permission, + RenderProcessHost* render_process_host, RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/dbus/bus_unittest.cc b/dbus/bus_unittest.cc index db825330..c907bc8 100644 --- a/dbus/bus_unittest.cc +++ b/dbus/bus_unittest.cc
@@ -14,7 +14,6 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "dbus/exported_object.h" #include "dbus/object_path.h" #include "dbus/object_proxy.h"
diff --git a/dbus/property_unittest.cc b/dbus/property_unittest.cc index dcd226037..38c8b53 100644 --- a/dbus/property_unittest.cc +++ b/dbus/property_unittest.cc
@@ -18,7 +18,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_restrictions.h" -#include "base/time/time.h" #include "dbus/bus.h" #include "dbus/object_path.h" #include "dbus/object_proxy.h"
diff --git a/device/bluetooth/bluetooth_socket_thread.h b/device/bluetooth/bluetooth_socket_thread.h index 768042d..c1c5972 100644 --- a/device/bluetooth/bluetooth_socket_thread.h +++ b/device/bluetooth/bluetooth_socket_thread.h
@@ -9,7 +9,6 @@ #include "base/memory/ref_counted.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "device/bluetooth/bluetooth_export.h" namespace base {
diff --git a/device/bluetooth/dbus/bluez_dbus_thread_manager.h b/device/bluetooth/dbus/bluez_dbus_thread_manager.h index a97cb167..895e8764d 100644 --- a/device/bluetooth/dbus/bluez_dbus_thread_manager.h +++ b/device/bluetooth/dbus/bluez_dbus_thread_manager.h
@@ -9,7 +9,6 @@ #include "base/callback.h" #include "base/memory/ref_counted.h" -#include "base/time/time.h" #include "device/bluetooth/bluetooth_export.h" namespace base {
diff --git a/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc b/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc index d51ad45..2a19cbd3 100644 --- a/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc +++ b/device/bluetooth/dbus/fake_bluetooth_gatt_service_client.cc
@@ -10,7 +10,6 @@ #include "base/observer_list.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "device/bluetooth/dbus/bluez_dbus_manager.h" #include "device/bluetooth/dbus/fake_bluetooth_device_client.h" #include "device/bluetooth/dbus/fake_bluetooth_gatt_characteristic_client.h"
diff --git a/device/bluetooth/floss/floss_dbus_manager.h b/device/bluetooth/floss/floss_dbus_manager.h index 0f0455e..5152bee7 100644 --- a/device/bluetooth/floss/floss_dbus_manager.h +++ b/device/bluetooth/floss/floss_dbus_manager.h
@@ -11,7 +11,6 @@ #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "device/bluetooth/bluetooth_export.h" namespace base {
diff --git a/device/fido/features.cc b/device/fido/features.cc index fc24395d..e3d7fc8 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -48,4 +48,7 @@ "WebAuthenticationGoogleCorpRemoteDesktopClientPrivilege", base::FEATURE_DISABLED_BY_DEFAULT}; +extern const base::Feature kWebAuthPasskeysUIExperiment{ + "WebAuthenticationPasskeysUIExperiment", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h index 7ea0794..320bf25 100644 --- a/device/fido/features.h +++ b/device/fido/features.h
@@ -58,6 +58,10 @@ COMPONENT_EXPORT(DEVICE_FIDO) extern const base::Feature kWebAuthnGoogleCorpRemoteDesktopClientPrivilege; +// Enable some experimental UI changes +COMPONENT_EXPORT(DEVICE_FIDO) +extern const base::Feature kWebAuthPasskeysUIExperiment; + } // namespace device #endif // DEVICE_FIDO_FEATURES_H_
diff --git a/device/fido/virtual_u2f_device.cc b/device/fido/virtual_u2f_device.cc index 58f5994..6224a7d0 100644 --- a/device/fido/virtual_u2f_device.cc +++ b/device/fido/virtual_u2f_device.cc
@@ -15,7 +15,6 @@ #include "base/location.h" #include "base/numerics/safe_conversions.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/apdu/apdu_command.h" #include "components/apdu/apdu_response.h" #include "components/cbor/reader.h"
diff --git a/device/gamepad/nintendo_data_fetcher_unittest.cc b/device/gamepad/nintendo_data_fetcher_unittest.cc index 5420abe..0be61da 100644 --- a/device/gamepad/nintendo_data_fetcher_unittest.cc +++ b/device/gamepad/nintendo_data_fetcher_unittest.cc
@@ -11,7 +11,6 @@ #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "device/gamepad/gamepad_service.h" #include "services/device/device_service_test_base.h"
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md index 1d68c085..d4e4a05 100644 --- a/docs/updater/functional_spec.md +++ b/docs/updater/functional_spec.md
@@ -1,29 +1,132 @@ # Chromium Updater Functional Specification -This is the functional specification for [Chromium Updater](https://source.chromium.org/chromium/chromium/src/+/main:chrome/updater/). +This is the functional specification for +[Chromium Updater](https://source.chromium.org/chromium/chromium/src/+/main:chrome/updater/). +It describes the externally observable behavior of the updater, including APIs +and UI. [TOC] -## Elevation on Windows when a system application installer is executed +## Metainstaller +The metainstaller (UpdaterSetup) is a thin executable that contains a compressed +copy of the updater as a resource, extracts it, and triggers installation of the +updater / an app. The metainstaller is downloaded by the user and can be run +from any directory. -`UpdaterSetup.exe`, also known as the metainstaller, is typically downloaded -from the Internet and run by the user from a web browser. When this -metainstaller is executed, the browser launches it at -[medium integrity](https://docs.microsoft.com/en-us/windows/win32/secauthz/mandatory-integrity-control). -In order to be able to install a system application (i.e., an application -installed for all users on the system), this metainstaller needs to run with -administrative privileges. +TODO(crbug.com/1035895): Document tagging. -To achieve this, the metainstaller detects this condition (running at medium but -trying to install a system app) early on, and re-launches itself at high -integrity. This will result in an -[UAC prompt](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) -on Windows. +### Elevation (Windows) +The metainstaller parses its tag and re-launches itself at high integrity if +installing an application with `needsadmin=true` or `needsadmin=prefers`. -## Dynamic Install Parameters +## Standalone Installer +TODO(crbug.com/1035895): Document the standalone installer. -### `installdataindex` +TODO(crbug.com/1035895): Document bundled installers. + +TODO(crbug.com/1035895): Document bundling the updater on macOS. + +## Updater +The updater is installed at: +* (Windows, User): `%LOCAL_APP_DATA%\{COMPANY}\{UPDATERNAME}\{VERSION}\updater.exe` +* (Windows, System): `%PROGRAM_FILES%\{COMPANY}\{UPDATERNAME}\{VERSION}\updater.exe` +* (macOS, User): `~/Library/{COMPANY}/{UPDATERNAME}/{VERSION}/{UPDATERNAME}.app` +* (macOS, System): `/Library/{COMPANY}/{UPDATERNAME}/{VERSION}/{UPDATERNAME}.app` + +The updater's functionality is split between several processes. The mode of a +process is determined by command-line arguments: +* --install [--app-id=...] + * Install and activate this version of the updater if there is no active + updater. + * --app-id=... + * Also install the given application. + * --tag=... + * Supplies the install metadata needed when installing an + application. Typically, a tagged metainstaller invokes the updater + with this command line argument. + * If --tag is specified, --install is assumed. + * --handoff=... + * As --tag. + * --install-from-out-dir + * TODO(crbug.com/1035895): Document +* --uninstall + * Uninstall all versions of the updater. +* --uninstall-self + * Uninstall this version of the updater. +* --uninstall-if-unused + * Uninstall all versions of the updater, only if there are no apps being + kept up to date by the updater. +* --wake + * Trigger the updater's periodic background tasks. If this version of the + updater is inactive, it may qualify and activate, or uninstall itself. + If this version of the updater is active, it may check for updates for + applications, unregister uninstalled applications, and more. +* --crash-me + * Record a backtrace in the log, crash the program, save a crash dump, + and report the crash. +* --crash-handler + * Starts a crash handler for the parent process. +* --server + * Launch the updater RPC server. The server will answer RPC messages on + the UpdateService interface only. + * --service=update|update-internal + * If `update`, the server will answer RPC messages on the + UpdateService interface only. + * If `update-internal`, the server will answer RPC messages on the + UpdateServiceInternal interface only. +* --windows-service + * This switch starts the Windows service. This switch is invoked by the + SCM either as a part of system startup (`SERVICE_AUTO_START`) or when + `CoCreate` is called on one of several CLSIDs that the server supports. + * --console + * Run in interactive mode. + * -–com-service + * If present, run in a mode analogous to --server --service=update. + This switch is passed to `ServiceMain` by the SCM when CoCreate is + called on one of several CLSIDs that the server supports. This is + used for: + * The Server for the UI when installing Machine applications. + * The On-Demand COM Server for Machine applications. + * COM Server for launching processes at System Integrity, i.e., + an Elevator. +* --update + * Install this version of the updater as an inactive instance. +* --recover + * Repair the installation of the updater. + * --appguid=... + * After recovery, register an application with this id. + * --browser-version=... + * Register an application with this version. + * If --browser-version is specified, --recover can be omitted. + * --sessionid=... + * Specifies the sesionid associated with this recovery attempt. +* --test + * Exit immediately with no error. +* --healthcheck + * Exit immediately with no error. + +If none of the above arguments are set, the updater will exit with an error. + +Additionally, the mode may be modified by combining it with: +* --system + * The updater operates in system scope if and only if this switch is + present. + +### Installation +TODO(crbug.com/1035895): Document UI/UX + +TODO(crbug.com/1035895): Document installer APIs + +TODO(crbug.com/1035895): Document shim installation + +TODO(crbug.com/1035895): Document handoff + +TODO(crbug.com/1035895): Document relevant enterprise policies. + +#### Dynamic Install Parameters + +##### `installdataindex` `installdataindex` is one of the install parameters that can be specified for first installs on the command line or via the @@ -167,10 +270,46 @@ * This installerdata is not persisted anywhere else, and it is not sent as a part of pings to the update server. -## Telemetry +## Updates +TODO(crbug.com/1035895): Document server API (Omaha Protocol). + +TODO(crbug.com/1035895): Document supported update formats. + +TODO(crbug.com/1035895): Document differential updates. + +TODO(crbug.com/1035895): Document update timing. + +TODO(crbug.com/1035895): Document on-demand APIs. + +TODO(crbug.com/1035895): Document registration APIs. + +TODO(crbug.com/1035895): Document activity API. + +TODO(crbug.com/1035895): Document EULA signals. + +TODO(crbug.com/1035895): Document usage-stats opt-in signals. + +TODO(crbug.com/1035895): Document relevant enterprise policies. + +### Telemetry When the updater installs an application (an installer is run) it will send an event with `"eventtype": 2` indicating the outcome of installation. The updater does not send such a ping for its own installation. When the updater updates an application (including itself) it will send an event with `"eventtype": 3` indicating the outcome of update operation. + +## Services +TODO(crbug.com/1035895): Document app commands. + +TODO(crbug.com/1035895): Document updater crash reporting. + +## Uninstallation +TODO(crbug.com/1035895): Document uninstallation APIs. + +TODO(crbug.com/1035895): Document updater self-uninstallation. + +## Associated Tools +TODO(crbug.com/1035895): Document external constant overrides (test build only). + +TODO(crbug.com/1035895): Document tagging tools.
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h index a2a8a09..3d94778 100644 --- a/extensions/browser/api/networking_private/networking_private_linux.h +++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -12,7 +12,6 @@ #include "base/observer_list.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/keyed_service/core/keyed_service.h" #include "extensions/browser/api/networking_private/networking_private_delegate.h"
diff --git a/extensions/browser/api/sockets_udp/test_udp_echo_server.h b/extensions/browser/api/sockets_udp/test_udp_echo_server.h index 5a8af82..1d05486 100644 --- a/extensions/browser/api/sockets_udp/test_udp_echo_server.h +++ b/extensions/browser/api/sockets_udp/test_udp_echo_server.h
@@ -8,7 +8,6 @@ #include <memory> #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/base/host_port_pair.h" namespace net {
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc index a5bb03ec..97d615a 100644 --- a/extensions/browser/extension_function_dispatcher.cc +++ b/extensions/browser/extension_function_dispatcher.cc
@@ -397,6 +397,11 @@ function->histogram_value()); } + if (extension->manifest_version() == 3) { + base::UmaHistogramSparse("Extensions.Functions.ExtensionMV3Calls", + function->histogram_value()); + } + base::ElapsedTimer timer; function->RunWithValidation()->Execute(); // TODO(devlin): Once we have a baseline metric for how long functions take,
diff --git a/extensions/browser/extension_host_queue.cc b/extensions/browser/extension_host_queue.cc index 03065be..0353b8f 100644 --- a/extensions/browser/extension_host_queue.cc +++ b/extensions/browser/extension_host_queue.cc
@@ -12,7 +12,6 @@ #include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "extensions/browser/deferred_start_render_host.h" namespace extensions {
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn index 8887201..602a36c 100644 --- a/fuchsia/engine/BUILD.gn +++ b/fuchsia/engine/BUILD.gn
@@ -488,6 +488,7 @@ "browser/post_message_browsertest.cc", "browser/request_monitoring_browsertest.cc", "browser/theme_manager_browsertest.cc", + "browser/url_request_invalidation_browsertest.cc", "browser/virtual_keyboard_browsertest.cc", ]
diff --git a/fuchsia/engine/browser/request_monitoring_browsertest.cc b/fuchsia/engine/browser/request_monitoring_browsertest.cc index 7024ed8..bc342c72 100644 --- a/fuchsia/engine/browser/request_monitoring_browsertest.cc +++ b/fuchsia/engine/browser/request_monitoring_browsertest.cc
@@ -595,25 +595,4 @@ testing::Not(testing::Contains(testing::Key("Test4")))); } -// Tests the URLRequestRewrite API properly closes the Frame channel if the -// rules are invalid. -IN_PROC_BROWSER_TEST_F(RequestMonitoringTest, UrlRequestRewriteInvalidRules) { - auto frame = cr_fuchsia::FrameForTest::Create(context(), {}); - base::RunLoop run_loop; - frame.ptr().set_error_handler([&run_loop](zx_status_t status) { - EXPECT_EQ(status, ZX_ERR_INVALID_ARGS); - run_loop.Quit(); - }); - - std::vector<fuchsia::web::UrlRequestRewrite> rewrites; - rewrites.push_back(cr_fuchsia::CreateRewriteAddHeaders("Te\nst1", "Value")); - fuchsia::web::UrlRequestRewriteRule rule; - rule.set_rewrites(std::move(rewrites)); - std::vector<fuchsia::web::UrlRequestRewriteRule> rules; - rules.push_back(std::move(rule)); - - frame->SetUrlRequestRewriteRules(std::move(rules), []() {}); - run_loop.Run(); -} - } // namespace
diff --git a/fuchsia/engine/browser/url_request_invalidation_browsertest.cc b/fuchsia/engine/browser/url_request_invalidation_browsertest.cc new file mode 100644 index 0000000..0ff6ece6 --- /dev/null +++ b/fuchsia/engine/browser/url_request_invalidation_browsertest.cc
@@ -0,0 +1,112 @@ +// 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 <fuchsia/web/cpp/fidl.h> + +#include "content/public/test/browser_test.h" +#include "fuchsia/base/test/frame_test_util.h" +#include "fuchsia/base/test/test_navigation_listener.h" +#include "fuchsia/base/test/url_request_rewrite_test_util.h" +#include "fuchsia/engine/test/frame_for_test.h" +#include "fuchsia/engine/test/web_engine_browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +// Test harness for browser tests exercising the URL request rewrite rule +// invalidation logic. Sending incorrect rules should result in the frame +// disconnecting. +class UrlRequestInvalidationTest : public cr_fuchsia::WebEngineBrowserTest { + public: + UrlRequestInvalidationTest() = default; + ~UrlRequestInvalidationTest() override = default; + + UrlRequestInvalidationTest(const UrlRequestInvalidationTest&) = delete; + UrlRequestInvalidationTest& operator=(const UrlRequestInvalidationTest&) = + delete; + + // Tests that sending |rewrite| will cause the fuchsia.web.Frame to disconnect + // with ZX_ERR_INVALID_ARGS. + void ExpectInvalidArgsForRewrite(fuchsia::web::UrlRequestRewrite rewrite) { + auto frame = cr_fuchsia::FrameForTest::Create(context(), {}); + base::RunLoop run_loop; + frame.ptr().set_error_handler([&run_loop](zx_status_t status) { + EXPECT_EQ(status, ZX_ERR_INVALID_ARGS); + run_loop.Quit(); + }); + + std::vector<fuchsia::web::UrlRequestRewrite> rewrites; + rewrites.push_back(std::move(rewrite)); + fuchsia::web::UrlRequestRewriteRule rule; + rule.set_rewrites(std::move(rewrites)); + std::vector<fuchsia::web::UrlRequestRewriteRule> rules; + rules.push_back(std::move(rule)); + + frame->SetUrlRequestRewriteRules(std::move(rules), []() {}); + run_loop.Run(); + } +}; + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, EmptyRewrite) { + ExpectInvalidArgsForRewrite(fuchsia::web::UrlRequestRewrite()); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, InvalidAddHeaderName) { + ExpectInvalidArgsForRewrite( + cr_fuchsia::CreateRewriteAddHeaders("Te\nst1", "Value")); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, InvalidAddHeaderValue) { + ExpectInvalidArgsForRewrite( + cr_fuchsia::CreateRewriteAddHeaders("Test1", "Val\nue")); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, EmptyAddHeader) { + fuchsia::web::UrlRequestRewrite rewrite; + rewrite.set_add_headers(fuchsia::web::UrlRequestRewriteAddHeaders()); + ExpectInvalidArgsForRewrite(std::move(rewrite)); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, InvalidRemoveHeaderName) { + ExpectInvalidArgsForRewrite( + cr_fuchsia::CreateRewriteRemoveHeader("Query", "Head\ner")); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, EmptyRemoveHeader) { + fuchsia::web::UrlRequestRewrite rewrite; + rewrite.set_remove_header(fuchsia::web::UrlRequestRewriteRemoveHeader()); + ExpectInvalidArgsForRewrite(std::move(rewrite)); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, + EmptySubstituteQueryPattern) { + fuchsia::web::UrlRequestRewrite rewrite; + rewrite.set_substitute_query_pattern( + fuchsia::web::UrlRequestRewriteSubstituteQueryPattern()); + ExpectInvalidArgsForRewrite(std::move(rewrite)); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, InvalidReplaceUrlEndsWith) { + ExpectInvalidArgsForRewrite( + cr_fuchsia::CreateRewriteReplaceUrl("some%00thing", "http://site.xyz")); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, InvalidReplaceUrlNewUrl) { + ExpectInvalidArgsForRewrite( + cr_fuchsia::CreateRewriteReplaceUrl("/something", "http:site:xyz")); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, EmptyReplaceUrl) { + fuchsia::web::UrlRequestRewrite rewrite; + rewrite.set_replace_url(fuchsia::web::UrlRequestRewriteReplaceUrl()); + ExpectInvalidArgsForRewrite(std::move(rewrite)); +} + +IN_PROC_BROWSER_TEST_F(UrlRequestInvalidationTest, EmptyAppendToQuery) { + fuchsia::web::UrlRequestRewrite rewrite; + rewrite.set_append_to_query(fuchsia::web::UrlRequestRewriteAppendToQuery()); + ExpectInvalidArgsForRewrite(std::move(rewrite)); +} + +} // namespace
diff --git a/fuchsia/engine/browser/web_engine_permission_delegate.cc b/fuchsia/engine/browser/web_engine_permission_delegate.cc index 2292a472..4fe4835 100644 --- a/fuchsia/engine/browser/web_engine_permission_delegate.cc +++ b/fuchsia/engine/browser/web_engine_permission_delegate.cc
@@ -91,9 +91,20 @@ permission, render_frame_host->GetLastCommittedOrigin()); } +blink::mojom::PermissionStatus +WebEnginePermissionDelegate::GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + // Use |worker_origin| for requesting_origin and embedding_origin because + // workers don't have embedders. + return GetPermissionStatus(permission, worker_origin, worker_origin); +} + WebEnginePermissionDelegate::SubscriptionId WebEnginePermissionDelegate::SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
diff --git a/fuchsia/engine/browser/web_engine_permission_delegate.h b/fuchsia/engine/browser/web_engine_permission_delegate.h index 4f895a6..7cf534f 100644 --- a/fuchsia/engine/browser/web_engine_permission_delegate.h +++ b/fuchsia/engine/browser/web_engine_permission_delegate.h
@@ -49,8 +49,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc index 58a25ad..ac0c43b 100644 --- a/gpu/command_buffer/service/shared_image_factory.cc +++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -7,6 +7,7 @@ #include <inttypes.h> #include <memory> +#include "base/metrics/histogram_macros.h" #include "base/trace_event/memory_dump_manager.h" #include "build/build_config.h" #include "build/chromecast_buildflags.h" @@ -31,14 +32,17 @@ #include "gpu/config/gpu_preferences.h" #include "ui/base/ui_base_features.h" #include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_surface_egl.h" #include "ui/gl/gl_switches.h" #include "ui/gl/trace_util.h" #if BUILDFLAG(ENABLE_VULKAN) +#include "components/viz/common/gpu/vulkan_context_provider.h" #include "gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h" +#include "gpu/vulkan/vulkan_device_queue.h" #endif -#if BUILDFLAG(IS_LINUX) && defined(USE_OZONE) && BUILDFLAG(ENABLE_VULKAN) +#if defined(USE_OZONE) #include "ui/ozone/public/ozone_platform.h" #endif @@ -48,7 +52,6 @@ #elif BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_VULKAN) #include "gpu/command_buffer/service/external_vk_image_factory.h" #include "gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h" -#include "gpu/vulkan/vulkan_device_queue.h" #elif BUILDFLAG(IS_MAC) #include "gpu/command_buffer/service/shared_image_backing_factory_iosurface.h" #elif BUILDFLAG(IS_CHROMEOS_ASH) @@ -64,7 +67,6 @@ #if BUILDFLAG(IS_FUCHSIA) #include <lib/zx/channel.h> -#include "components/viz/common/gpu/vulkan_context_provider.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_implementation.h" #endif // BUILDFLAG(IS_FUCHSIA) @@ -98,6 +100,64 @@ #endif +namespace { + +bool ShouldUseOzoneFactory() { +#if defined(USE_OZONE) + return ui::OzonePlatform::GetInstance() + ->GetPlatformRuntimeProperties() + .supports_native_pixmaps; +#else + return false; +#endif +} + +enum DmaBufSupportedType { + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + kNoPixmapNoVulkanExtNoGlExt = 0, + kNoPixmapNoVulkanExtYesGlExt = 1, + kNoPixmapYesVulkanExtNoGlExt = 2, + kNoPixmapYesVulkanExtYesGlExt = 3, + kYesPixmapNoVulkanExtNoGlExt = 4, + kYesPixmapNoVulkanExtYesGlExt = 5, + kYesPixmapYesVulkanExtNoGlExt = 6, + kYesPixmapYesVulkanExtYesGlExt = 7, + kMaxValue = kYesPixmapYesVulkanExtYesGlExt +}; + +DmaBufSupportedType GetDmaBufSupportedType(bool pixmap_supported, + bool vulkan_ext_supported, + bool gl_ext_supported) { + if (pixmap_supported) { + if (vulkan_ext_supported) { + return gl_ext_supported ? kYesPixmapYesVulkanExtYesGlExt + : kYesPixmapYesVulkanExtNoGlExt; + } else { + return gl_ext_supported ? kYesPixmapNoVulkanExtYesGlExt + : kYesPixmapNoVulkanExtNoGlExt; + } + } else { + if (vulkan_ext_supported) { + return gl_ext_supported ? kNoPixmapYesVulkanExtYesGlExt + : kNoPixmapYesVulkanExtNoGlExt; + } else { + return gl_ext_supported ? kNoPixmapNoVulkanExtYesGlExt + : kNoPixmapNoVulkanExtNoGlExt; + } + } +} + +void ReportDmaBufSupportMetric(bool pixmap_supported, + bool vulkan_ext_supported, + bool gl_ext_supported) { + DmaBufSupportedType type = GetDmaBufSupportedType( + pixmap_supported, vulkan_ext_supported, gl_ext_supported); + UMA_HISTOGRAM_ENUMERATION("GPU.SharedImage.DmaBufSupportedType", type); +} + +} // namespace + // Overrides for flat_set lookups: bool operator<( const std::unique_ptr<SharedImageRepresentationFactoryRef>& lhs, @@ -116,6 +176,8 @@ return lhs->mailbox() < rhs; } +bool SharedImageFactory::set_dmabuf_supported_metric_ = false; + SharedImageFactory::SharedImageFactory( const GpuPreferences& gpu_preferences, const GpuDriverBugWorkarounds& workarounds, @@ -141,6 +203,27 @@ gr_context_type_ == GrContextType::kVulkan); #endif + if (!set_dmabuf_supported_metric_) { + bool pixmap_supported = ShouldUseOzoneFactory(); + bool vulkan_ext_supported = false; +#if BUILDFLAG(ENABLE_VULKAN) + if (gr_context_type_ == GrContextType::kVulkan && context_state) { + const auto& enabled_extensions = context_state->vk_context_provider() + ->GetDeviceQueue() + ->enabled_extensions(); + vulkan_ext_supported = + gfx::HasExtension(enabled_extensions, + VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME) && + gfx::HasExtension(enabled_extensions, + VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME); + } +#endif + bool gl_ext_supported = gl::GLSurfaceEGL::HasEGLExtension("EGL_KHR_image"); + ReportDmaBufSupportMetric(pixmap_supported, vulkan_ext_supported, + gl_ext_supported); + set_dmabuf_supported_metric_ = true; + } + auto shared_memory_backing_factory = std::make_unique<SharedImageBackingFactorySharedMemory>(); factories_.push_back(std::move(shared_memory_backing_factory));
diff --git a/gpu/command_buffer/service/shared_image_factory.h b/gpu/command_buffer/service/shared_image_factory.h index 9195d06..f6e1227 100644 --- a/gpu/command_buffer/service/shared_image_factory.h +++ b/gpu/command_buffer/service/shared_image_factory.h
@@ -146,6 +146,8 @@ MailboxManager* mailbox_manager() { return mailbox_manager_; } + static bool set_dmabuf_supported_metric_; + private: bool IsSharedBetweenThreads(uint32_t usage); SharedImageBackingFactory* GetFactoryByUsage(
diff --git a/gpu/command_buffer/service/webgpu_decoder.h b/gpu/command_buffer/service/webgpu_decoder.h index 2761be03..8e994cc 100644 --- a/gpu/command_buffer/service/webgpu_decoder.h +++ b/gpu/command_buffer/service/webgpu_decoder.h
@@ -12,6 +12,7 @@ namespace gpu { class DecoderClient; +struct GpuFeatureInfo; struct GpuPreferences; class MemoryTracker; class SharedContextState; @@ -42,7 +43,7 @@ // WebGPU-specific initialization that's different than DecoderContext's // Initialize that is tied to GLES2 concepts and a noop for WebGPU decoders. - virtual ContextResult Initialize() = 0; + virtual ContextResult Initialize(const GpuFeatureInfo& gpu_feature_info) = 0; ContextResult Initialize(const scoped_refptr<gl::GLSurface>& surface, const scoped_refptr<gl::GLContext>& context,
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 2852cec..acf08fa 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -185,7 +185,7 @@ ~WebGPUDecoderImpl() override; // WebGPUDecoder implementation - ContextResult Initialize() override; + ContextResult Initialize(const GpuFeatureInfo& gpu_feature_info) override; // DecoderContext implementation. base::WeakPtr<DecoderContext> AsWeakPtr() override { @@ -1030,7 +1030,13 @@ destroyed_ = true; } -ContextResult WebGPUDecoderImpl::Initialize() { +ContextResult WebGPUDecoderImpl::Initialize( + const GpuFeatureInfo& gpu_feature_info) { + if (kGpuFeatureStatusSoftware == + gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGPU]) { + use_webgpu_adapter_ = WebGPUAdapterName::kSwiftShader; + } + if (use_webgpu_adapter_ == WebGPUAdapterName::kCompat) { gl_surface_ = new gl::SurfacelessEGL(gfx::Size(1, 1)); gl::GLContextAttribs attribs;
diff --git a/gpu/command_buffer/service/webgpu_decoder_unittest.cc b/gpu/command_buffer/service/webgpu_decoder_unittest.cc index 6f77250..b7fd515 100644 --- a/gpu/command_buffer/service/webgpu_decoder_unittest.cc +++ b/gpu/command_buffer/service/webgpu_decoder_unittest.cc
@@ -37,7 +37,7 @@ decoder_.reset(WebGPUDecoder::Create( decoder_client_.get(), command_buffer_service_.get(), nullptr, nullptr, &outputter_, GpuPreferences(), nullptr)); - ASSERT_EQ(decoder_->Initialize(), ContextResult::kSuccess); + ASSERT_EQ(decoder_->Initialize(GpuFeatureInfo()), ContextResult::kSuccess); constexpr uint32_t kAdapterClientID = 0; cmds::RequestAdapter requestAdapterCmd;
diff --git a/gpu/command_buffer/tests/egl_test.cc b/gpu/command_buffer/tests/egl_test.cc index 79d7220..d34ffdfc 100644 --- a/gpu/command_buffer/tests/egl_test.cc +++ b/gpu/command_buffer/tests/egl_test.cc
@@ -11,7 +11,6 @@ #include "base/bind.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "gpu/gles2_conform_support/egl/test_support.h" // This file tests EGL basic interface for command_buffer_gles2, the mode of
diff --git a/gpu/command_buffer/tests/gl_helper_unittest.cc b/gpu/command_buffer/tests/gl_helper_unittest.cc index 5d47af6..d4cd3745 100644 --- a/gpu/command_buffer/tests/gl_helper_unittest.cc +++ b/gpu/command_buffer/tests/gl_helper_unittest.cc
@@ -25,7 +25,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/scoped_feature_list.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/viz/test/test_gpu_service_holder.h" #include "gpu/command_buffer/client/gl_helper_scaling.h"
diff --git a/gpu/config/gpu_blocklist.cc b/gpu/config/gpu_blocklist.cc index 35e1ff3b..9efcafd 100644 --- a/gpu/config/gpu_blocklist.cc +++ b/gpu/config/gpu_blocklist.cc
@@ -44,6 +44,8 @@ list->AddSupportedFeature("vulkan", GPU_FEATURE_TYPE_VULKAN); list->AddSupportedFeature("canvas_oop_rasterization", GPU_FEATURE_TYPE_CANVAS_OOP_RASTERIZATION); + list->AddSupportedFeature("accelerated_webgpu", + GPU_FEATURE_TYPE_ACCELERATED_WEBGPU); return list; }
diff --git a/gpu/config/gpu_blocklist_unittest.cc b/gpu/config/gpu_blocklist_unittest.cc index c0bae6bd..aaf8b71 100644 --- a/gpu/config/gpu_blocklist_unittest.cc +++ b/gpu/config/gpu_blocklist_unittest.cc
@@ -101,6 +101,9 @@ GPU_BLOCKLIST_FEATURE_TEST(Vulkan, GPU_FEATURE_TYPE_VULKAN) +GPU_BLOCKLIST_FEATURE_TEST(AcceleratedWebGPU, + GPU_FEATURE_TYPE_ACCELERATED_WEBGPU) + // Test for invariant "Assume the newly last added entry has the largest ID". // See GpuControlList::GpuControlList. // It checks software_rendering_list.json
diff --git a/gpu/config/gpu_feature_type.h b/gpu/config/gpu_feature_type.h index 8c3f94f..56d13b3 100644 --- a/gpu/config/gpu_feature_type.h +++ b/gpu/config/gpu_feature_type.h
@@ -22,6 +22,7 @@ GPU_FEATURE_TYPE_METAL, GPU_FEATURE_TYPE_VULKAN, GPU_FEATURE_TYPE_CANVAS_OOP_RASTERIZATION, + GPU_FEATURE_TYPE_ACCELERATED_WEBGPU, NUMBER_OF_GPU_FEATURE_TYPES };
diff --git a/gpu/config/gpu_util.cc b/gpu/config/gpu_util.cc index f2c7059e..31765b07 100644 --- a/gpu/config/gpu_util.cc +++ b/gpu/config/gpu_util.cc
@@ -217,6 +217,16 @@ return kGpuFeatureStatusEnabled; } +GpuFeatureStatus GetWebGPUFeatureStatus( + const std::set<int>& blocklisted_features, + bool use_swift_shader) { + if (use_swift_shader) + return kGpuFeatureStatusSoftware; + if (blocklisted_features.count(GPU_FEATURE_TYPE_ACCELERATED_WEBGPU)) + return kGpuFeatureStatusSoftware; + return kGpuFeatureStatusEnabled; +} + GpuFeatureStatus Get2DCanvasFeatureStatus( const std::set<int>& blocklisted_features, bool use_swift_shader) { @@ -429,6 +439,8 @@ kGpuFeatureStatusDisabled; gpu_feature_info.status_values[GPU_FEATURE_TYPE_CANVAS_OOP_RASTERIZATION] = kGpuFeatureStatusDisabled; + gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGPU] = + kGpuFeatureStatusSoftware; #if DCHECK_IS_ON() for (int ii = 0; ii < NUMBER_OF_GPU_FEATURE_TYPES; ++ii) { DCHECK_NE(kGpuFeatureStatusUndefined, gpu_feature_info.status_values[ii]); @@ -461,6 +473,8 @@ kGpuFeatureStatusDisabled; gpu_feature_info.status_values[GPU_FEATURE_TYPE_CANVAS_OOP_RASTERIZATION] = kGpuFeatureStatusDisabled; + gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGPU] = + kGpuFeatureStatusSoftware; #if DCHECK_IS_ON() for (int ii = 0; ii < NUMBER_OF_GPU_FEATURE_TYPES; ++ii) { DCHECK_NE(kGpuFeatureStatusUndefined, gpu_feature_info.status_values[ii]); @@ -493,6 +507,8 @@ kGpuFeatureStatusDisabled; gpu_feature_info.status_values[GPU_FEATURE_TYPE_CANVAS_OOP_RASTERIZATION] = kGpuFeatureStatusDisabled; + gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGPU] = + kGpuFeatureStatusSoftware; #if DCHECK_IS_ON() for (int ii = 0; ii < NUMBER_OF_GPU_FEATURE_TYPES; ++ii) { DCHECK_NE(kGpuFeatureStatusUndefined, gpu_feature_info.status_values[ii]); @@ -570,6 +586,8 @@ GetWebGLFeatureStatus(blocklisted_features, use_swift_shader); gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGL2] = GetWebGL2FeatureStatus(blocklisted_features, use_swift_shader); + gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_WEBGPU] = + GetWebGPUFeatureStatus(blocklisted_features, use_swift_shader); gpu_feature_info.status_values[GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS] = Get2DCanvasFeatureStatus(blocklisted_features, use_swift_shader); #if !BUILDFLAG(IS_CHROMEOS)
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc index 129607a5..d0bb708 100644 --- a/gpu/ipc/in_process_command_buffer.cc +++ b/gpu/ipc/in_process_command_buffer.cc
@@ -498,7 +498,8 @@ this, command_buffer_.get(), task_executor_->shared_image_manager(), gpu_dependency_->memory_tracker(), task_executor_->outputter(), task_executor_->gpu_preferences(), context_state_)); - gpu::ContextResult result = webgpu_decoder->Initialize(); + gpu::ContextResult result = + webgpu_decoder->Initialize(task_executor_->gpu_feature_info()); if (result != gpu::ContextResult::kSuccess) { DestroyOnGpuThread(); DLOG(ERROR) << "Failed to initialize WebGPU decoder.";
diff --git a/gpu/ipc/service/webgpu_command_buffer_stub.cc b/gpu/ipc/service/webgpu_command_buffer_stub.cc index 4000849..08aa826f 100644 --- a/gpu/ipc/service/webgpu_command_buffer_stub.cc +++ b/gpu/ipc/service/webgpu_command_buffer_stub.cc
@@ -127,7 +127,7 @@ channel_->sync_point_manager()->CreateSyncPointClientState( CommandBufferNamespace::GPU_IO, command_buffer_id_, sequence_id_); - result = decoder->Initialize(); + result = decoder->Initialize(manager->gpu_feature_info()); if (result != gpu::ContextResult::kSuccess) { DLOG(ERROR) << "Failed to initialize decoder."; return result;
diff --git a/gpu/vulkan/vulkan_swap_chain.cc b/gpu/vulkan/vulkan_swap_chain.cc index 07e86d3..2dec51b5 100644 --- a/gpu/vulkan/vulkan_swap_chain.cc +++ b/gpu/vulkan/vulkan_swap_chain.cc
@@ -12,7 +12,6 @@ #include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_fence_helper.h" #include "gpu/vulkan/vulkan_function_pointers.h"
diff --git a/headless/lib/browser/headless_permission_manager.cc b/headless/lib/browser/headless_permission_manager.cc index 1ee6c583..bb402a9e 100644 --- a/headless/lib/browser/headless_permission_manager.cc +++ b/headless/lib/browser/headless_permission_manager.cc
@@ -76,9 +76,18 @@ return blink::mojom::PermissionStatus::ASK; } +blink::mojom::PermissionStatus +HeadlessPermissionManager::GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) { + return blink::mojom::PermissionStatus::ASK; +} + HeadlessPermissionManager::SubscriptionId HeadlessPermissionManager::SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback) {
diff --git a/headless/lib/browser/headless_permission_manager.h b/headless/lib/browser/headless_permission_manager.h index a592ee2..a0888a8 100644 --- a/headless/lib/browser/headless_permission_manager.h +++ b/headless/lib/browser/headless_permission_manager.h
@@ -55,8 +55,13 @@ blink::mojom::PermissionStatus GetPermissionStatusForCurrentDocument( content::PermissionType permission, content::RenderFrameHost* render_frame_host) override; + blink::mojom::PermissionStatus GetPermissionStatusForWorker( + content::PermissionType permission, + content::RenderProcessHost* render_process_host, + const GURL& worker_origin) override; SubscriptionId SubscribePermissionStatusChange( content::PermissionType permission, + content::RenderProcessHost* render_process_host, content::RenderFrameHost* render_frame_host, const GURL& requesting_origin, base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback)
diff --git a/infra/config/generated/builders/try/android-cronet-kitkat-arm-rel/properties.json b/infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json similarity index 100% rename from infra/config/generated/builders/try/android-cronet-kitkat-arm-rel/properties.json rename to infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 4ab942f2..163c5a2 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -348,10 +348,6 @@ includable_only: true } builders { - name: "chromium/try/android-cronet-kitkat-arm-rel" - includable_only: true - } - builders { name: "chromium/try/android-cronet-x86-dbg" includable_only: true } @@ -382,6 +378,10 @@ includable_only: true } builders { + name: "chromium/try/android-cronet-x86-rel-kitkat-tests" + includable_only: true + } + builders { name: "chromium/try/android-deterministic-dbg" includable_only: true }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 7269573c..cae0601 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -49799,96 +49799,6 @@ } } builders { - name: "android-cronet-kitkat-arm-rel" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-18.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - exe { - cipd_package: "infra/chromium/bootstrapper/${platform}" - cipd_version: "latest" - cmd: "bootstrapper" - } - properties: - '{' - ' "$bootstrap/exe": {' - ' "exe": {' - ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' - ' "cipd_version": "refs/heads/main",' - ' "cmd": [' - ' "luciexe"' - ' ]' - ' }' - ' },' - ' "$bootstrap/properties": {' - ' "properties_file": "infra/config/generated/builders/try/android-cronet-kitkat-arm-rel/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "tryserver.chromium.android",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium_trybot"' - '}' - execution_timeout_secs: 14400 - expiration_secs: 7200 - grace_period { - seconds: 120 - } - caches { - name: "win_toolchain" - path: "win_toolchain" - } - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - task_template_canary_percentage { - value: 5 - } - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "try_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_try_test_results" - test_results { - predicate { - test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" - } - } - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "blink_web_tests_try_test_results" - test_results { - predicate { - test_id_regexp: "ninja://[^/]*blink_web_tests/.+" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "android-cronet-x86-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -50429,6 +50339,96 @@ } } builders { + name: "android-cronet-x86-rel-kitkat-tests" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/try/android-cronet-x86-rel-kitkat-tests/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "tryserver.chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium_trybot"' + '}' + execution_timeout_secs: 14400 + expiration_secs: 7200 + grace_period { + seconds: 120 + } + caches { + name: "win_toolchain" + path: "win_toolchain" + } + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage { + value: 5 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "android-deterministic-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 4360d048..96588c6 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -14727,9 +14727,6 @@ name: "buildbucket/luci.chromium.try/android-cronet-asan-arm-rel" } builders { - name: "buildbucket/luci.chromium.try/android-cronet-kitkat-arm-rel" - } - builders { name: "buildbucket/luci.chromium.try/android-cronet-x86-dbg" } builders { @@ -14748,6 +14745,9 @@ name: "buildbucket/luci.chromium.try/android-cronet-x86-rel" } builders { + name: "buildbucket/luci.chromium.try/android-cronet-x86-rel-kitkat-tests" + } + builders { name: "buildbucket/luci.chromium.try/android-deterministic-dbg" } builders { @@ -15862,9 +15862,6 @@ name: "buildbucket/luci.chromium.try/android-cronet-asan-arm-rel" } builders { - name: "buildbucket/luci.chromium.try/android-cronet-kitkat-arm-rel" - } - builders { name: "buildbucket/luci.chromium.try/android-cronet-x86-dbg" } builders { @@ -15883,6 +15880,9 @@ name: "buildbucket/luci.chromium.try/android-cronet-x86-rel" } builders { + name: "buildbucket/luci.chromium.try/android-cronet-x86-rel-kitkat-tests" + } + builders { name: "buildbucket/luci.chromium.try/android-deterministic-dbg" } builders {
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 3af27d5..a7ca5282 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -132,10 +132,6 @@ ) try_.builder( - name = "android-cronet-kitkat-arm-rel", -) - -try_.builder( name = "android-cronet-x86-dbg", ) @@ -174,6 +170,10 @@ ) try_.builder( + name = "android-cronet-x86-rel-kitkat-tests", +) + +try_.builder( name = "android-deterministic-dbg", executable = "recipe:swarming/deterministic_build", execution_timeout = 6 * time.hour,
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 2dfc6a0..a5c3a56 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -923,6 +923,21 @@ <message name="IDS_IOS_FEED_SORT_PUBLISHER" desc="Sort by publisher label text in feed sort menu."> Sort by Publisher </message> + <message name="IDS_IOS_FIRST_FOLLOW_TITLE" desc="The title of the first follow surface."> + You're following <ph name="CHANNEL_NAME">$1<ex>ESPN</ex></ph> + </message> + <message name="IDS_IOS_FIRST_FOLLOW_SUBTITLE" desc="The subtitle of the first follow surface."> + You'll now see stories from it when you open a new tab. + </message> + <message name="IDS_IOS_FIRST_FOLLOW_BODY" desc="The body of the first follow surface."> + Sites you follow are saved in your Google account. You can Manage them in Discover Settings. + </message> + <message name="IDS_IOS_FIRST_FOLLOW_GO_TO_FEED" desc="The action button to see the feed in the first follow surface."> + Go To Feed + </message> + <message name="IDS_IOS_FIRST_FOLLOW_GOT_IT" desc="The action button to dismiss the first follow surface."> + Got It + </message> <message name="IDS_IOS_FOLLOW_MANAGEMENT_TITLE" desc="The title of the following feed management UI."> Following </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_BODY.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_BODY.png.sha1 new file mode 100644 index 0000000..d78aa4f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_BODY.png.sha1
@@ -0,0 +1 @@ +f13a2d3f889201b352bf5a43cf2d0cc49c8a5f0b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GOT_IT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GOT_IT.png.sha1 new file mode 100644 index 0000000..d78aa4f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GOT_IT.png.sha1
@@ -0,0 +1 @@ +f13a2d3f889201b352bf5a43cf2d0cc49c8a5f0b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GO_TO_FEED.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GO_TO_FEED.png.sha1 new file mode 100644 index 0000000..d78aa4f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_GO_TO_FEED.png.sha1
@@ -0,0 +1 @@ +f13a2d3f889201b352bf5a43cf2d0cc49c8a5f0b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_SUBTITLE.png.sha1 new file mode 100644 index 0000000..d78aa4f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +f13a2d3f889201b352bf5a43cf2d0cc49c8a5f0b \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_TITLE.png.sha1 new file mode 100644 index 0000000..d78aa4f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FIRST_FOLLOW_TITLE.png.sha1
@@ -0,0 +1 @@ +f13a2d3f889201b352bf5a43cf2d0cc49c8a5f0b \ No newline at end of file
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm index f91ec63..fc16edc8 100644 --- a/ios/chrome/browser/prefs/browser_prefs.mm +++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -134,6 +134,9 @@ // Deprecated 10/2021 const char kSigninBottomSheetShownCount[] = "ios.signin.bottom_sheet_shown_count"; + +// Deprecated 03/2022 +const char kShowReadingListInBookmarkBar[] = "bookmark_bar.show_reading_list"; } void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { @@ -312,6 +315,8 @@ // Preference related to the browser sign-in policy that is being deprecated. registry->RegisterBooleanPref(kSigninAllowedByPolicy, true); + + registry->RegisterBooleanPref(kShowReadingListInBookmarkBar, true); } // This method should be periodically pruned of year+ old migrations. @@ -377,4 +382,7 @@ // Added 8/2021. prefs->ClearPref(kSigninAllowedByPolicy); + + // Added 03/2022 + prefs->ClearPref(kShowReadingListInBookmarkBar); }
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist index 04cab36..bd06271f 100644 --- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist +++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -26,9 +26,9 @@ <key>Type</key> <string>PSToggleSwitchSpecifier</string> <key>Title</key> - <string>Reset Notice Card</string> + <string>Reset First Follow</string> <key>Key</key> - <string>ResetNoticeCard</string> + <string>ResetFirstFollow</string> <key>DefaultValue</key> <false/> </dict>
diff --git a/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm b/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm index 64a4946..f97b71ae 100644 --- a/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm +++ b/ios/chrome/browser/safe_browsing/verdict_cache_manager_factory.mm
@@ -48,7 +48,8 @@ ios::HistoryServiceFactory::GetForBrowserState( chrome_browser_state, ServiceAccessType::EXPLICIT_ACCESS), ios::HostContentSettingsMapFactory::GetForBrowserState( - chrome_browser_state)); + chrome_browser_state), + chrome_browser_state->GetPrefs()); } web::BrowserState* VerdictCacheManagerFactory::GetBrowserStateToUse(
diff --git a/ios/chrome/browser/system_flags.h b/ios/chrome/browser/system_flags.h index eff9310..241f3f3 100644 --- a/ios/chrome/browser/system_flags.h +++ b/ios/chrome/browser/system_flags.h
@@ -39,10 +39,15 @@ // Returns the URL for the alternative Discover Feed server. NSString* GetAlternateDiscoverFeedServerURL(); -// Returns true if the prefs for the notice card views count and clicks count -// should be reset to zero on feed start. -// TODO(crbug.com/1189232): Remove after launch. -bool ShouldResetNoticeCardOnFeedStart(); +// Returns true if the count of showing the First Follow modal should be reset +// to zero. +// TODO(crbug.com/1312124): Remove after launch. +bool ShouldResetFirstFollowCount(); + +// Should be called after the count has been reset so that the resetting flag +// can be turned off. +// TODO(crbug.com/1312124): Remove after launch. +void DidResetFirstFollowCount(); // Whether memory debugging tools are enabled. bool IsMemoryDebuggingEnabled();
diff --git a/ios/chrome/browser/system_flags.mm b/ios/chrome/browser/system_flags.mm index 4b641668..a66198735 100644 --- a/ios/chrome/browser/system_flags.mm +++ b/ios/chrome/browser/system_flags.mm
@@ -68,9 +68,12 @@ stringForKey:kAlternateDiscoverFeedServerURL]; } -bool ShouldResetNoticeCardOnFeedStart() { - return [[NSUserDefaults standardUserDefaults] - boolForKey:@"ResetNoticeCard"]; +bool ShouldResetFirstFollowCount() { + return [[NSUserDefaults standardUserDefaults] boolForKey:@"ResetFirstFollow"]; +} + +void DidResetFirstFollowCount() { + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"ResetFirstFollow"]; } bool IsMemoryDebuggingEnabled() {
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index 15edd08..9ba9d173 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -109,6 +109,7 @@ "//ios/chrome/browser/ui/find_bar", "//ios/chrome/browser/ui/first_run", "//ios/chrome/browser/ui/first_run:utils", + "//ios/chrome/browser/ui/follow:first_follow", "//ios/chrome/browser/ui/fullscreen", "//ios/chrome/browser/ui/fullscreen:feature_flags", "//ios/chrome/browser/ui/fullscreen:ui",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index 31df501..4faaf4b 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -43,6 +43,7 @@ #import "ios/chrome/browser/ui/commands/application_commands.h" #import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#import "ios/chrome/browser/ui/commands/feed_commands.h" #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" #import "ios/chrome/browser/ui/commands/infobar_commands.h" #import "ios/chrome/browser/ui/commands/page_info_commands.h" @@ -69,6 +70,7 @@ #import "ios/chrome/browser/ui/elements/activity_overlay_coordinator.h" #import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h" #import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h" +#import "ios/chrome/browser/ui/follow/first_follow_coordinator.h" #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_mediator.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h" @@ -178,6 +180,9 @@ // Coordinator for the find bar. @property(nonatomic, strong) FindBarCoordinator* findBarCoordinator; +// Coordinator for the First Follow modal. +@property(nonatomic, strong) FirstFollowCoordinator* firstFollowCoordinator; + // Coordinator in charge of the presenting autofill options above the // keyboard. @property(nonatomic, strong) @@ -298,6 +303,7 @@ @protocol(BrowserCoordinatorCommands), @protocol(DefaultPromoCommands), @protocol(DefaultBrowserPromoNonModalCommands), + @protocol(FeedCommands), @protocol(FindInPageCommands), @protocol(PageInfoCommands), @protocol(PasswordBreachCommands), @@ -577,6 +583,9 @@ [self.findBarCoordinator stop]; self.findBarCoordinator = nil; + [self.firstFollowCoordinator stop]; + self.firstFollowCoordinator = nil; + [self.formInputAccessoryCoordinator stop]; self.formInputAccessoryCoordinator = nil; @@ -851,6 +860,16 @@ self.tailoredPromoCoordinator = nil; } +#pragma mark - FeedCommands + +- (void)showFirstFollowModalWithWebChannelTitle:(NSString*)webChannelTitle { + self.firstFollowCoordinator = [[FirstFollowCoordinator alloc] + initWithBaseViewController:self.viewController + browser:self.browser]; + self.firstFollowCoordinator.webChannelTitle = webChannelTitle; + [self.firstFollowCoordinator start]; +} + #pragma mark - FindInPageCommands - (void)openFindInPage {
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.mm b/ios/chrome/browser/ui/bubble/bubble_view.mm index 4b0b783..b1b31b4 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view.mm
@@ -46,18 +46,21 @@ // The corner radius of the bubble's background, which causes the ends of the // badge to be circular. const CGFloat kBubbleCornerRadius = 15.0f; -// Margin between the bubble view's bounds and its content. This margin is on -// all sides of the bubble. -const CGFloat kBubbleMargin = 4.0f; +// Margin between the bubble view's bounds and its content. Vertical for top and +// bottom margins, Horizontal for leading and trailing margins. +const CGFloat kBubbleVerticalMargin = 4.0f; +const CGFloat kBubbleHorizontalMargin = 16.0f; // Padding between the top and bottom the bubble's background and the top and // bottom of its content. -const CGFloat kBubbleVerticalPadding = 15.0f; +const CGFloat kBubbleVerticalPadding = 16.0f; // Padding between the sides of the bubble's background and the sides of its // content. -const CGFloat kBubbleHorizontalPadding = 20.0f; +const CGFloat kBubbleHorizontalPadding = 16.0f; // The size that the arrow will appear to have. const CGSize kArrowSize = {32, 9}; +// Margin to ensure that the arrow is not outside of the background. +const CGFloat kArrowMargin = kArrowSize.width / 2.0f; // The offset of the bubble's drop shadow, which will be slightly below the // bubble. @@ -410,7 +413,7 @@ if (self.imageView) { [constraints addObjectsFromArray:[self imageViewConstraints]]; } - // Add constriants for snooze button. + // Add constraints for snooze button. if (self.showsSnoozeButton) { [constraints addObjectsFromArray:[self snoozeButtonConstraints]]; } @@ -422,37 +425,74 @@ - (NSArray<NSLayoutConstraint*>*)generalConstraints { UIView* background = self.background; UIView* label = self.label; - // Ensure that the label is aligned to the top of the background. - NSLayoutConstraint* alignLabelToTop = - [label.topAnchor constraintEqualToAnchor:background.topAnchor - constant:kBubbleVerticalPadding]; - alignLabelToTop.priority = UILayoutPriorityDefaultLow; - NSArray<NSLayoutConstraint*>* constraints = @[ - // Center the background view on the bubble view. - [background.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], - // Add a margin to the sides of the background. - [background.widthAnchor constraintEqualToAnchor:self.widthAnchor - constant:-kBubbleMargin * 2], - // Ensure that the background view is as wide as the label, with added - // padding on the sides of the label. - [label.topAnchor - constraintGreaterThanOrEqualToAnchor:background.topAnchor + UIView* arrow = self.arrow; + // Ensure that the label is top aligned and properly aligned horizontaly. + NSArray<NSLayoutConstraint*>* labelAlignmentConstraints = @[ + [label.topAnchor constraintEqualToAnchor:background.topAnchor constant:kBubbleVerticalPadding], - [background.bottomAnchor - constraintGreaterThanOrEqualToAnchor:label.bottomAnchor - constant:kBubbleVerticalPadding], - [label.leadingAnchor - constraintGreaterThanOrEqualToAnchor:background.leadingAnchor - constant:kBubbleHorizontalPadding], + [label.leadingAnchor constraintEqualToAnchor:background.leadingAnchor + constant:kBubbleHorizontalPadding], [background.trailingAnchor - constraintGreaterThanOrEqualToAnchor:label.trailingAnchor - constant:kBubbleHorizontalPadding], - alignLabelToTop, - // Enforce the arrow's size, scaling by |kArrowScaleFactor| to prevent gaps - // between the arrow and the background view. - [self.arrow.widthAnchor constraintEqualToConstant:kArrowSize.width], - [self.arrow.heightAnchor constraintEqualToConstant:kArrowSize.height], + constraintEqualToAnchor:label.trailingAnchor + constant:kBubbleHorizontalPadding], ]; + for (NSLayoutConstraint* constraint in labelAlignmentConstraints) { + constraint.priority = UILayoutPriorityDefaultLow; + } + // Add horizontal margins between the bubble's frame and the background. These + // constraints are optional (if the bubble is too close to the edge of the + // screen, the margin is ignored), they shouldn't affect the arrow's position. + NSArray<NSLayoutConstraint*>* bubbleMarginConstraints = @[ + [background.leadingAnchor constraintEqualToAnchor:self.leadingAnchor + constant:kBubbleHorizontalMargin], + [self.trailingAnchor constraintEqualToAnchor:background.trailingAnchor + constant:kBubbleHorizontalMargin], + ]; + for (NSLayoutConstraint* constraint in bubbleMarginConstraints) { + constraint.priority = UILayoutPriorityDefaultHigh; + } + // Ensure that the arrow is inside the background's bound. These constraints + // shouldn't affect the arrow's position. + NSArray<NSLayoutConstraint*>* bubbleArrowMarginConstraints = @[ + [arrow.leadingAnchor + constraintGreaterThanOrEqualToAnchor:background.leadingAnchor + constant:kArrowMargin], + [background.trailingAnchor + constraintGreaterThanOrEqualToAnchor:arrow.trailingAnchor + constant:kArrowMargin], + ]; + for (NSLayoutConstraint* constraint in bubbleArrowMarginConstraints) { + constraint.priority = UILayoutPriorityDefaultHigh + 1; + } + NSMutableArray<NSLayoutConstraint*>* constraints = + [NSMutableArray arrayWithArray:@[ + // Ensure the background view is smaller than |self.view|. + [background.leadingAnchor + constraintGreaterThanOrEqualToAnchor:self.leadingAnchor], + [self.trailingAnchor + constraintGreaterThanOrEqualToAnchor:background.trailingAnchor], + // Ensure that the background view is as wide as the label, with added + // padding on the sides of the label. + [label.topAnchor + constraintGreaterThanOrEqualToAnchor:background.topAnchor + constant:kBubbleVerticalPadding], + [background.bottomAnchor + constraintGreaterThanOrEqualToAnchor:label.bottomAnchor + constant:kBubbleVerticalPadding], + [label.leadingAnchor + constraintGreaterThanOrEqualToAnchor:background.leadingAnchor + constant:kBubbleHorizontalPadding], + [background.trailingAnchor + constraintGreaterThanOrEqualToAnchor:label.trailingAnchor + constant:kBubbleHorizontalPadding], + // Enforce the arrow's size, scaling by |kArrowScaleFactor| to prevent + // gaps between the arrow and the background view. + [arrow.widthAnchor constraintEqualToConstant:kArrowSize.width], + [arrow.heightAnchor constraintEqualToConstant:kArrowSize.height] + ]]; + [constraints addObjectsFromArray:labelAlignmentConstraints]; + [constraints addObjectsFromArray:bubbleMarginConstraints]; + [constraints addObjectsFromArray:bubbleArrowMarginConstraints]; return constraints; } @@ -588,7 +628,7 @@ // Ensure that the top of the arrow is aligned with the top of the bubble // view and add a margin above the arrow. [self.arrow.topAnchor constraintEqualToAnchor:self.topAnchor - constant:kBubbleMargin] + constant:kBubbleVerticalMargin] ]; } else { DCHECK(self.direction == BubbleArrowDirectionDown); @@ -599,7 +639,7 @@ // Ensure that the bottom of the arrow is aligned with the bottom of the // bubble view and add a margin below the arrow. [self.bottomAnchor constraintEqualToAnchor:self.arrow.bottomAnchor - constant:kBubbleMargin] + constant:kBubbleVerticalMargin] ]; } return constraints; @@ -664,7 +704,7 @@ - (CGSize)sizeThatFits:(CGSize)size { // The combined horizontal inset distance of the label and title with respect // to the bubble. - CGFloat textHorizontalInset = kBubbleMargin * 2; + CGFloat textHorizontalInset = kBubbleHorizontalMargin * 2; // Add close button size, which is on the trailing edge of the labels. if (self.showsCloseButton) { textHorizontalInset += MAX(kCloseButtonSize, kBubbleHorizontalPadding); @@ -698,7 +738,7 @@ CGFloat imageContentHeight = self.imageView ? 2 * kBubbleVerticalPadding + kImageViewSize : 0.0f; // Calculates the height needed to display the bubble. - CGFloat bubbleHeight = 2 * kBubbleMargin + kArrowSize.height + + CGFloat bubbleHeight = 2 * kBubbleVerticalMargin + kArrowSize.height + MAX(imageContentHeight, textContentHeight); CGSize bubbleSize = CGSizeMake(bubbleWidth, bubbleHeight); return bubbleSize;
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm index c61df31..4cfe633 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view_controller_presenter.mm
@@ -347,6 +347,11 @@ CGRect bubbleFrame = bubble_util::BubbleFrame( anchorPoint, bubbleAlignmentOffset, bubbleSize, self.arrowDirection, self.alignment, CGRectGetWidth(rect)); + // If anchorPoint is too close to the edge of the screen, the bubble will be + // partially off screen and not look good. + if (!CGRectContainsRect(rect, bubbleFrame)) { + return CGRectNull; + } return bubbleFrame; }
diff --git a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm index 0719011..4f2f2421 100644 --- a/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm +++ b/ios/chrome/browser/ui/bubble/bubble_view_unittest.mm
@@ -84,8 +84,8 @@ CGSize bubbleSize = [bubble sizeThatFits:maxSize_]; // Since the label is shorter than the minimum line width, expect the bubble // to be the minimum width and accommodate one line of text. - EXPECT_NEAR(58.0f, bubbleSize.width, 1.0f); - EXPECT_NEAR(65.0f, bubbleSize.height, 1.0f); + EXPECT_NEAR(68.0f, bubbleSize.width, 1.0f); + EXPECT_NEAR(67.0f, bubbleSize.height, 1.0f); } // Test that the accessibility label matches the display text.
diff --git a/ios/chrome/browser/ui/commands/BUILD.gn b/ios/chrome/browser/ui/commands/BUILD.gn index e427b6a..c894813 100644 --- a/ios/chrome/browser/ui/commands/BUILD.gn +++ b/ios/chrome/browser/ui/commands/BUILD.gn
@@ -16,6 +16,7 @@ "browsing_data_commands.h", "command_dispatcher.h", "command_dispatcher.mm", + "feed_commands.h", "find_in_page_commands.h", "generate_qr_code_command.h", "generate_qr_code_command.mm",
diff --git a/ios/chrome/browser/ui/commands/feed_commands.h b/ios/chrome/browser/ui/commands/feed_commands.h new file mode 100644 index 0000000..7fa01c1 --- /dev/null +++ b/ios/chrome/browser/ui/commands/feed_commands.h
@@ -0,0 +1,16 @@ +// Copyright 2022 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_COMMANDS_FEED_COMMANDS_H_ +#define IOS_CHROME_BROWSER_UI_COMMANDS_FEED_COMMANDS_H_ + +// Commands related to feed. +@protocol FeedCommands + +// Displays the First Follow modal with |webChannelTitle|. +- (void)showFirstFollowModalWithWebChannelTitle:(NSString*)webChannelTitle; + +@end + +#endif // IOS_CHROME_BROWSER_UI_COMMANDS_FEED_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/first_run/first_run_util.mm b/ios/chrome/browser/ui/first_run/first_run_util.mm index 6a9b3e0b..7344b3b2 100644 --- a/ios/chrome/browser/ui/first_run/first_run_util.mm +++ b/ios/chrome/browser/ui/first_run/first_run_util.mm
@@ -9,7 +9,6 @@ #include "base/metrics/histogram_functions.h" #include "base/strings/sys_string_conversions.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #import "components/metrics/metrics_reporting_default_state.h" #include "components/signin/public/identity_manager/identity_manager.h" #import "ios/chrome/app/tests_hook.h"
diff --git a/ios/chrome/browser/ui/follow/BUILD.gn b/ios/chrome/browser/ui/follow/BUILD.gn index ea5a29f..85b8526 100644 --- a/ios/chrome/browser/ui/follow/BUILD.gn +++ b/ios/chrome/browser/ui/follow/BUILD.gn
@@ -14,6 +14,32 @@ deps = [] } +source_set("first_follow") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "first_follow_coordinator.h", + "first_follow_coordinator.mm", + ] + deps = [ + ":first_follow_ui", + "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + ] +} + +source_set("first_follow_ui") { + sources = [ + "first_follow_view_controller.h", + "first_follow_view_controller.mm", + ] + configs += [ "//build/config/compiler:enable_arc" ] + deps = [ + "//base", + "//ios/chrome/app/strings:ios_strings_grit", + "//ios/chrome/common/ui/colors", + "//ui/base", + ] +} + source_set("utils") { configs += [ "//build/config/compiler:enable_arc" ] sources = [
diff --git a/ios/chrome/browser/ui/follow/first_follow_coordinator.h b/ios/chrome/browser/ui/follow/first_follow_coordinator.h new file mode 100644 index 0000000..339fda6e --- /dev/null +++ b/ios/chrome/browser/ui/follow/first_follow_coordinator.h
@@ -0,0 +1,22 @@ +// Copyright 2022 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_FOLLOW_FIRST_FOLLOW_COORDINATOR_H_ +#define IOS_CHROME_BROWSER_UI_FOLLOW_FIRST_FOLLOW_COORDINATOR_H_ + +#import <Foundation/Foundation.h> + +#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" + +// Coordinator for the First Follow feature. This feature informs the user about +// the feed and following channels after the first few times the user follows +// any channel. +@interface FirstFollowCoordinator : ChromeCoordinator + +// The web channel title to display on the modal. +@property(nonatomic, copy) NSString* webChannelTitle; + +@end + +#endif // IOS_CHROME_BROWSER_UI_FOLLOW_FIRST_FOLLOW_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/follow/first_follow_coordinator.mm b/ios/chrome/browser/ui/follow/first_follow_coordinator.mm new file mode 100644 index 0000000..157367c8 --- /dev/null +++ b/ios/chrome/browser/ui/follow/first_follow_coordinator.mm
@@ -0,0 +1,56 @@ +// Copyright 2022 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/follow/first_follow_coordinator.h" + +#import "ios/chrome/browser/ui/follow/first_follow_view_controller.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Sets a custom radius for the half sheet presentation. +constexpr CGFloat kHalfSheetCornerRadius = 20; + +} // namespace + +@implementation FirstFollowCoordinator + +#pragma mark - ChromeCoordinator + +- (void)start { + FirstFollowViewController* firstFollowViewController = + [[FirstFollowViewController alloc] init]; + firstFollowViewController.webChannelTitle = self.webChannelTitle; + + if (@available(iOS 15, *)) { + firstFollowViewController.modalPresentationStyle = + UIModalPresentationPageSheet; + UISheetPresentationController* presentationController = + firstFollowViewController.sheetPresentationController; + presentationController.prefersEdgeAttachedInCompactHeight = YES; + presentationController.widthFollowsPreferredContentSizeWhenEdgeAttached = + YES; + presentationController.detents = + @[ UISheetPresentationControllerDetent.mediumDetent ]; + presentationController.preferredCornerRadius = kHalfSheetCornerRadius; + } else { + firstFollowViewController.modalPresentationStyle = + UIModalPresentationFormSheet; + } + + [self.baseViewController presentViewController:firstFollowViewController + animated:YES + completion:nil]; +} + +- (void)stop { + if (self.baseViewController.presentedViewController) { + [self.baseViewController dismissViewControllerAnimated:NO completion:nil]; + } +} + +@end \ No newline at end of file
diff --git a/ios/chrome/browser/ui/follow/first_follow_view_controller.h b/ios/chrome/browser/ui/follow/first_follow_view_controller.h new file mode 100644 index 0000000..5a409471 --- /dev/null +++ b/ios/chrome/browser/ui/follow/first_follow_view_controller.h
@@ -0,0 +1,19 @@ +// Copyright 2022 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_FOLLOW_FIRST_FOLLOW_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_UI_FOLLOW_FIRST_FOLLOW_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> + +// The UI that informs the user about the feed and following channels after the +// first few times the user follows any channel. +@interface FirstFollowViewController : UIViewController + +// The Web Channel title to be shown in the modal. +@property(nonatomic, copy) NSString* webChannelTitle; + +@end + +#endif // IOS_CHROME_BROWSER_UI_FOLLOW_FIRST_FOLLOW_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/follow/first_follow_view_controller.mm b/ios/chrome/browser/ui/follow/first_follow_view_controller.mm new file mode 100644 index 0000000..8f419d1 --- /dev/null +++ b/ios/chrome/browser/ui/follow/first_follow_view_controller.mm
@@ -0,0 +1,144 @@ +// Copyright 2022 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/follow/first_follow_view_controller.h" + +#include "base/strings/sys_string_conversions.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util_mac.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// Accessibility identifier for the Go To Feed button. +NSString* const kFirstFollowGoToFeedButtonIdentifier = + @"FirstFollowGoToFeedButtonIdentifier"; + +// Accessibility identifier for the Got It button. +NSString* const kFirstFollowGotItButtonIdentifier = + @"FirstFollowGotItButtonIdentifier"; + +// Spacing within stackView. +constexpr CGFloat kStackViewSubViewSpacing = 13.0; + +// Button corner radius. +constexpr CGFloat kButtonCornerRadius = 8; + +} // namespace + +@implementation FirstFollowViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + // TODO(crbug.com/1312124): Polish this UI and add favicon. + UILabel* titleLabel = + [self labelWithText:l10n_util::GetNSStringF( + IDS_IOS_FIRST_FOLLOW_TITLE, + base::SysNSStringToUTF16(self.webChannelTitle)) + textStyle:UIFontTextStyleTitle1]; + UILabel* subTitleLabel = + [self labelWithText:l10n_util::GetNSString(IDS_IOS_FIRST_FOLLOW_SUBTITLE) + textStyle:UIFontTextStyleHeadline]; + UILabel* bodyLabel = + [self labelWithText:l10n_util::GetNSString(IDS_IOS_FIRST_FOLLOW_BODY) + textStyle:UIFontTextStyleBody]; + UIButton* goToFeedButton = [self filledGoToFeedButton]; + UIButton* gotItButton = [self plainGotItButton]; + + UIStackView* verticalStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + titleLabel, subTitleLabel, bodyLabel, goToFeedButton, gotItButton + ]]; + verticalStack.axis = UILayoutConstraintAxisVertical; + verticalStack.distribution = UIStackViewDistributionFill; + verticalStack.alignment = UIStackViewAlignmentCenter; + verticalStack.spacing = kStackViewSubViewSpacing; + verticalStack.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:verticalStack]; + self.view.backgroundColor = [UIColor whiteColor]; + + [NSLayoutConstraint activateConstraints:@[ + [verticalStack.leadingAnchor + constraintEqualToAnchor:self.view.leadingAnchor], + [verticalStack.trailingAnchor + constraintEqualToAnchor:self.view.trailingAnchor], + [verticalStack.topAnchor constraintEqualToAnchor:self.view.topAnchor], + [verticalStack.bottomAnchor + constraintLessThanOrEqualToAnchor:self.view.bottomAnchor], + ]]; +} + +#pragma mark - Helper + +// Go To Feed button tapped. +- (void)handleGoToFeedTapped { + // TODO(crbug.com/1312124): Use a dispatcher to handle this action. +} + +// Dismisses the sheet. +- (void)handleGotItTapped { + [self.presentingViewController dismissViewControllerAnimated:YES + completion:nil]; +} + +// Returns a lable with |textStyle|. +- (UILabel*)labelWithText:(NSString*)text textStyle:(UIFontTextStyle)textStyle { + UILabel* label = [[UILabel alloc] init]; + label.translatesAutoresizingMaskIntoConstraints = NO; + label.font = [UIFont preferredFontForTextStyle:textStyle]; + label.adjustsFontForContentSizeCategory = YES; + label.numberOfLines = 0; + label.textAlignment = NSTextAlignmentCenter; + label.text = text; + return label; +} + +// Returns a filled button. +- (UIButton*)filledGoToFeedButton { + UIButton* button = [[UIButton alloc] init]; + button.backgroundColor = [UIColor colorNamed:kBlueColor]; + button.titleLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + button.titleLabel.adjustsFontForContentSizeCategory = YES; + button.titleLabel.adjustsFontSizeToFitWidth = YES; + button.titleLabel.textAlignment = NSTextAlignmentCenter; + button.layer.cornerRadius = kButtonCornerRadius; + button.clipsToBounds = YES; + [button setTranslatesAutoresizingMaskIntoConstraints:NO]; + + [button setTitle:l10n_util::GetNSString(IDS_IOS_FIRST_FOLLOW_GO_TO_FEED) + forState:UIControlStateNormal]; + [button setAccessibilityIdentifier:kFirstFollowGoToFeedButtonIdentifier]; + [button addTarget:self + action:@selector(handleGoToFeedTapped) + forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +// Returns a plain button. +// TODO(crbug.com/1312124): Consolidate button creation code. +- (UIButton*)plainGotItButton { + UIButton* button = [[UIButton alloc] init]; + [button setTitleColor:[UIColor colorNamed:kBlueColor] + forState:UIControlStateNormal]; + button.titleLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + button.titleLabel.adjustsFontForContentSizeCategory = YES; + button.titleLabel.textAlignment = NSTextAlignmentCenter; + [button setTranslatesAutoresizingMaskIntoConstraints:NO]; + + [button setTitle:l10n_util::GetNSString(IDS_IOS_FIRST_FOLLOW_GOT_IT) + forState:UIControlStateNormal]; + [button setAccessibilityIdentifier:kFirstFollowGotItButtonIdentifier]; + [button addTarget:self + action:@selector(handleGotItTapped) + forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +@end
diff --git a/ios/chrome/browser/ui/page_info/page_info_egtest.mm b/ios/chrome/browser/ui/page_info/page_info_egtest.mm index 751e2f40..6836966 100644 --- a/ios/chrome/browser/ui/page_info/page_info_egtest.mm +++ b/ios/chrome/browser/ui/page_info/page_info_egtest.mm
@@ -83,13 +83,18 @@ API_AVAILABLE(ios(15.0)) { NSDictionary<NSNumber*, NSNumber*>* actualStatesForPermissions = [PermissionsAppInterface statesForAllPermissions]; - GREYAssertEqualObjects(expectedStatesForPermissions[@(web::PermissionCamera)], - actualStatesForPermissions[@(web::PermissionCamera)], - @"Camera state does not match expected."); + GREYAssertEqualObjects( + expectedStatesForPermissions[@(web::PermissionCamera)], + actualStatesForPermissions[@(web::PermissionCamera)], + @"Camera state: %@ does not match expected: %@.", + actualStatesForPermissions[@(web::PermissionCamera)], + expectedStatesForPermissions[@(web::PermissionCamera)]); GREYAssertEqualObjects( expectedStatesForPermissions[@(web::PermissionMicrophone)], actualStatesForPermissions[@(web::PermissionMicrophone)], - @"Microphone state does not match expected."); + @"Microphone state: %@ does not match expected: %@.", + actualStatesForPermissions[@(web::PermissionMicrophone)], + expectedStatesForPermissions[@(web::PermissionMicrophone)]); } // Tests that rotating the device will don't dismiss the page info view.
diff --git a/ios/chrome/browser/ui/permissions/BUILD.gn b/ios/chrome/browser/ui/permissions/BUILD.gn index 2c37e5d..0838b7d 100644 --- a/ios/chrome/browser/ui/permissions/BUILD.gn +++ b/ios/chrome/browser/ui/permissions/BUILD.gn
@@ -81,6 +81,7 @@ ":constants", ":eg_test_support+eg2", "//base", + "//base/test:test_support", "//ios/chrome/app/strings", "//ios/chrome/browser/ui/badges:public", "//ios/chrome/browser/ui/infobars/banners:public",
diff --git a/ios/chrome/browser/ui/permissions/permissions_egtest.mm b/ios/chrome/browser/ui/permissions/permissions_egtest.mm index 04569ab..de1c65d 100644 --- a/ios/chrome/browser/ui/permissions/permissions_egtest.mm +++ b/ios/chrome/browser/ui/permissions/permissions_egtest.mm
@@ -5,6 +5,7 @@ #import <XCTest/XCTest.h> #include "base/logging.h" +#import "base/test/ios/wait_util.h" #import "ios/chrome/browser/ui/badges/badge_constants.h" #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h" @@ -13,7 +14,6 @@ #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" -#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" @@ -26,6 +26,10 @@ #error "This file requires ARC support." #endif +// TODO(crbug.com/1312064): Re-enable tests on devices once +// "https://openradar.appspot.com/radar?id=5520542106910720" is fixed. +#if TARGET_OS_SIMULATOR + namespace { // Matcher for banner shown when camera permission is enabled. @@ -45,6 +49,21 @@ nil); } +// Matcher for banner shown when both camera and microphone permissions are +// enabled. +id<GREYMatcher> InfobarBannerCameraAndMicrophone() { + return grey_allOf( + grey_accessibilityID(kInfobarBannerViewIdentifier), + grey_accessibilityLabel(l10n_util::GetNSString( + IDS_IOS_PERMISSIONS_INFOBAR_BANNER_CAMERA_AND_MICROPHONE_ACCESSIBLE)), + nil); +} + +// Matcher for infobar banner "Edit" button. +id<GREYMatcher> InfobarBannerEditButton() { + return grey_accessibilityID(kInfobarBannerAcceptButtonIdentifier); +} + // Matcher for camera infobar badge with acceptance state |accepted|; id<GREYMatcher> CameraBadge(BOOL accepted) { NSString* axid = @@ -89,7 +108,7 @@ @end @implementation PermissionsTestCase -#if !TARGET_OS_MACCATALYST + - (AppLaunchConfiguration)appConfigurationForTestCase { AppLaunchConfiguration config; if (@available(iOS 15.0, *)) { @@ -101,7 +120,7 @@ #pragma mark - Helper functions // Checks that if the alert for site permissions pops up, and allow it. -- (void)checkAndAllowPermissionAlerts { +- (void)checkAndDismissPermissionAlerts:(BOOL)allow { XCUIApplication* app = [[XCUIApplication alloc] init]; // Allow system permission if shown. NSError* systemAlertFoundError = nil; @@ -117,31 +136,10 @@ // Allow site permission. XCUIElement* alert = [[app descendantsMatchingType:XCUIElementTypeAlert] firstMatch]; - XCUIElement* button = alert.buttons[@"Allow"]; - GREYAssertNotNil(button, @"Cannot find \"Allow\" button in system alert."); - [button tap]; -} - -// Checks that if the alert for site permissions pops up, and deny it. -- (void)checkAndDenyPermissionAlerts { - XCUIApplication* app = [[XCUIApplication alloc] init]; - // Allow system permission if shown. - NSError* systemAlertFoundError = nil; - [[EarlGrey selectElementWithMatcher:grey_systemAlertViewShown()] - assertWithMatcher:grey_nil() - error:&systemAlertFoundError]; - if (systemAlertFoundError) { - NSError* acceptAlertError = nil; - [self grey_acceptSystemDialogWithError:&acceptAlertError]; - GREYAssertNil(acceptAlertError, @"Error accepting system alert.\n%@", - acceptAlertError); - } - // Allow site permission. - XCUIElement* alert = - [[app descendantsMatchingType:XCUIElementTypeAlert] firstMatch]; - XCUIElement* button = alert.buttons[@"Don’t Allow"]; - GREYAssertNotNil(button, - @"Cannot find \"Don't Allow\" button in system alert."); + NSString* buttonText = allow ? @"Allow" : @"Don’t Allow"; + XCUIElement* button = alert.buttons[buttonText]; + GREYAssertNotNil(button, @"Cannot find \"%@\" button in system alert.", + buttonText); [button tap]; } @@ -158,8 +156,9 @@ error:&error]; return error == nil; }]; - // Wait for infobar to be shown or timeout after 1 second. - BOOL success = [infobarShown waitWithTimeout:1]; + // Wait for infobar to be shown or timeout after kWaitForUIElementTimeout. + BOOL success = + [infobarShown waitWithTimeout:base::test::ios::kWaitForUIElementTimeout]; if (shouldShow) { GREYAssertTrue(success, @"Infobar does not appear."); } else { @@ -176,13 +175,18 @@ API_AVAILABLE(ios(15.0)) { NSDictionary<NSNumber*, NSNumber*>* actualStatesForPermissions = [PermissionsAppInterface statesForAllPermissions]; - GREYAssertEqualObjects(expectedStatesForPermissions[@(web::PermissionCamera)], - actualStatesForPermissions[@(web::PermissionCamera)], - @"Camera state does not match expected."); + GREYAssertEqualObjects( + expectedStatesForPermissions[@(web::PermissionCamera)], + actualStatesForPermissions[@(web::PermissionCamera)], + @"Camera state: %@ does not match expected: %@.", + actualStatesForPermissions[@(web::PermissionCamera)], + expectedStatesForPermissions[@(web::PermissionCamera)]); GREYAssertEqualObjects( expectedStatesForPermissions[@(web::PermissionMicrophone)], actualStatesForPermissions[@(web::PermissionMicrophone)], - @"Microphone state does not match expected."); + @"Microphone state: %@ does not match expected: %@.", + actualStatesForPermissions[@(web::PermissionMicrophone)], + expectedStatesForPermissions[@(web::PermissionMicrophone)]); } #pragma mark - Test cases @@ -195,14 +199,12 @@ GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); [ChromeEarlGrey loadURL:self.testServer->GetURL("/permissions/camera_only.html")]; - [self checkAndAllowPermissionAlerts]; + [self checkAndDismissPermissionAlerts:YES]; [self waitUntilInfobarBannerVisibleOrTimeout:YES]; [[EarlGrey selectElementWithMatcher:InfobarBannerCameraOnly()] assertWithMatcher:grey_sufficientlyVisible()]; - // Tap on the "Edit" button. - [[[EarlGrey - selectElementWithMatcher:grey_accessibilityID( - kInfobarBannerAcceptButtonIdentifier)] + // Tap "Edit" to show infobar modal. + [[[EarlGrey selectElementWithMatcher:InfobarBannerEditButton()] performAction:grey_tap()] assertWithMatcher:grey_notVisible()]; [self checkStatesForPermissions:@{ @(web::PermissionCamera) : @(web::PermissionStateAllowed), @@ -229,7 +231,7 @@ GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); [ChromeEarlGrey loadURL:self.testServer->GetURL("/permissions/microphone_only.html")]; - [self checkAndAllowPermissionAlerts]; + [self checkAndDismissPermissionAlerts:YES]; [self waitUntilInfobarBannerVisibleOrTimeout:YES]; [[EarlGrey selectElementWithMatcher:InfobarBannerMicrophoneOnly()] assertWithMatcher:grey_sufficientlyVisible()]; @@ -257,13 +259,69 @@ } } +// Tests that when both camera and microphone permissions are granted, the user +// could see a banner notification and then toggle the permissions through both +// the infobar modal and the location bar badge. +- (void)testAllowAndBlockCameraAndMicrophonePermissions { + if (@available(iOS 15.0, *)) { + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + [ChromeEarlGrey loadURL:self.testServer->GetURL( + "/permissions/camera_and_microphone.html")]; + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerCameraAndMicrophone()] + assertWithMatcher:grey_sufficientlyVisible()]; + // Tap "Edit" to show infobar modal. + [[[EarlGrey selectElementWithMatcher:InfobarBannerEditButton()] + performAction:grey_tap()] assertWithMatcher:grey_notVisible()]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateAllowed), + @(web::PermissionMicrophone) : @(web::PermissionStateAllowed) + }]; + // Block camera permission. + [[EarlGrey + selectElementWithMatcher:InfobarModalCameraPermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + // Taps "Done" button. Check infobar badge and tap it. + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:MicrophoneBadge(/*accepted=*/YES)] + performAction:grey_tap()]; + // Check current permission states and block microphone permission as well. + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateBlocked), + @(web::PermissionMicrophone) : @(web::PermissionStateAllowed) + }]; + [[EarlGrey + selectElementWithMatcher:InfobarModalMicrophonePermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + // Taps "Done" button. Check infobar badge and tap it again. + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:CameraBadge(/*accepted=*/NO)] + performAction:grey_tap()]; + // Check current permission states and re-enable camera permission. + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateBlocked), + @(web::PermissionMicrophone) : @(web::PermissionStateBlocked) + }]; + [[EarlGrey selectElementWithMatcher:InfobarModalCameraPermissionsSwitch(NO)] + performAction:chrome_test_util::TurnTableViewSwitchOn(YES)]; + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:CameraBadge(/*accepted=*/YES)] + assertWithMatcher:grey_sufficientlyVisible()]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateAllowed), + @(web::PermissionMicrophone) : @(web::PermissionStateBlocked) + }]; + } +} + // Tests that when permissions are denied, there will not be a banner or badge. - (void)testDenyPermissions { if (@available(iOS 15.0, *)) { GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); [ChromeEarlGrey loadURL:self.testServer->GetURL( "/permissions/camera_and_microphone.html")]; - [self checkAndDenyPermissionAlerts]; + [self checkAndDismissPermissionAlerts:NO]; [self waitUntilInfobarBannerVisibleOrTimeout:NO]; id<GREYMatcher> anyPermissionBadge = grey_anyOf(CameraBadge(/*accepted=*/YES), CameraBadge(NO), @@ -277,7 +335,181 @@ } } -// TODO(crbug.com/1311069): Addes more tests including overflow and incognito -// behaviors. -#endif +// Tests that permissions infobar banner, modal and badge works the same way in +// incognito by toggling camera access. +- (void)testTogglePermissionsInIncognito { + if (@available(iOS 15.0, *)) { + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + [ChromeEarlGrey openNewIncognitoTab]; + [ChromeEarlGrey + loadURL:self.testServer->GetURL("/permissions/camera_only.html")]; + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerCameraOnly()] + assertWithMatcher:grey_sufficientlyVisible()]; + // Tap "Edit" to show infobar modal. + [[[EarlGrey selectElementWithMatcher:InfobarBannerEditButton()] + performAction:grey_tap()] assertWithMatcher:grey_notVisible()]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateAllowed), + @(web::PermissionMicrophone) : @(web::PermissionStateNotAccessible) + }]; + [[EarlGrey + selectElementWithMatcher:InfobarModalCameraPermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateBlocked), + @(web::PermissionMicrophone) : @(web::PermissionStateNotAccessible) + }]; + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:CameraBadge(/*accepted=*/NO)] + assertWithMatcher:grey_sufficientlyVisible()]; + } +} + +// Tests that permissions are reset after user navigation. +- (void)testPermissionsAfterNavigation { + if (@available(iOS 15.0, *)) { + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + [ChromeEarlGrey + loadURL:self.testServer->GetURL("/permissions/microphone_only.html")]; + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerEditButton()] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher:InfobarModalMicrophonePermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:MicrophoneBadge(/*accepted=*/NO)] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Navigate away and go back. + [ChromeEarlGrey loadURL:self.testServer->GetURL("/pony.html")]; + [ChromeEarlGrey goBack]; + + // Note: There's currently an existing WebKit bug that WKUIDelegate method + // |requestMediaCapturePermissionForOrigin:| would not be invoked when the + // user hits backward/forward; therefore, the alert and banner would not + // show again, and the checks for the alert and the infobar banner are + // commented out. Once this issue is fixed, these checks should be + // uncommented. + + //[self checkAndDismissPermissionAlerts:YES]; + //[self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateNotAccessible), + @(web::PermissionMicrophone) : @(web::PermissionStateNotAccessible) + }]; + } +} + +// Tests that permissions stay the same after user switches to another tab then +// comes back. +- (void)testPermissionsAfterTabSwitch { + if (@available(iOS 15.0, *)) { + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + // Opens a page that requests both camera and microphone permissions, and + // block microphone permission. + [ChromeEarlGrey loadURL:self.testServer->GetURL( + "/permissions/camera_and_microphone.html")]; + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerEditButton()] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher:InfobarModalCameraPermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + TapDoneButtonOnInfobarModal(); + [[EarlGrey selectElementWithMatcher:MicrophoneBadge(/*accepted=*/YES)] + assertWithMatcher:grey_sufficientlyVisible()]; + // Switches tab and go back. + [ChromeEarlGrey openNewTab]; + [ChromeEarlGrey loadURL:self.testServer->GetURL("/pony.html")]; + [ChromeEarlGrey selectTabAtIndex:0]; + // Check if permission states stay the same. Wrap this in a GREYCondition + // since it takes a small timeout for the web state to retrieve its state. + GREYCondition* microphoneAcceptedBadgeShown = [GREYCondition + conditionWithName:@"Microphone accepted badge visible" + block:^BOOL { + NSError* error; + [[EarlGrey selectElementWithMatcher:MicrophoneBadge( + /*accepted=*/YES)] + assertWithMatcher:grey_sufficientlyVisible() + error:&error]; + return error == nil; + }]; + // Wait for infobar to be shown or timeout after kWaitForUIElementTimeout. + BOOL success = [microphoneAcceptedBadgeShown + waitWithTimeout:base::test::ios::kWaitForUIElementTimeout]; + GREYAssertTrue(success, @"Did not find accepted microphone badge."); + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateBlocked), + @(web::PermissionMicrophone) : @(web::PermissionStateAllowed) + }]; + } +} + +// Tests that permissions are reset after reload. +- (void)testPermissionsAfterReload { + if (@available(iOS 15.0, *)) { + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); + // Opens a page that requests camera permission. + [ChromeEarlGrey + loadURL:self.testServer->GetURL("/permissions/camera_only.html")]; + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerCameraOnly()] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Reload and allow again and check if things work as expected. Wait until + // permissions are reset to validate behaviors. + [ChromeEarlGrey reload]; + GREYCondition* permissionReset = [GREYCondition + conditionWithName:@"Permission is reset" + block:^BOOL { + NSDictionary<NSNumber*, NSNumber*>* + actualStatesForPermissions = + [PermissionsAppInterface statesForAllPermissions]; + return [actualStatesForPermissions[ + @(web::PermissionCamera)] + isEqualToNumber:@(web::PermissionStateNotAccessible)]; + }]; + BOOL success = [permissionReset + waitWithTimeout:base::test::ios::kWaitForPageLoadTimeout]; + GREYAssertTrue(success, + @"Camera permission state is not reset after reload."); + [self checkAndDismissPermissionAlerts:YES]; + [self waitUntilInfobarBannerVisibleOrTimeout:YES]; + [[EarlGrey selectElementWithMatcher:InfobarBannerCameraOnly()] + performAction:grey_swipeFastInDirection(kGREYDirectionUp)]; + [[EarlGrey selectElementWithMatcher:CameraBadge(/*accepted=*/YES)] + performAction:grey_tap()]; + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateAllowed), + @(web::PermissionMicrophone) : @(web::PermissionStateNotAccessible) + }]; + [[EarlGrey + selectElementWithMatcher:InfobarModalCameraPermissionsSwitch(YES)] + performAction:chrome_test_util::TurnTableViewSwitchOn(NO)]; + TapDoneButtonOnInfobarModal(); + [self checkStatesForPermissions:@{ + @(web::PermissionCamera) : @(web::PermissionStateBlocked), + @(web::PermissionMicrophone) : @(web::PermissionStateNotAccessible) + }]; + + // Reload and deny to check if permissions are no longer accessible. + [ChromeEarlGrey reload]; + [self checkAndDismissPermissionAlerts:NO]; + [self waitUntilInfobarBannerVisibleOrTimeout:NO]; + id<GREYMatcher> anyPermissionBadge = + grey_anyOf(CameraBadge(/*accepted=*/YES), CameraBadge(NO), + MicrophoneBadge(YES), MicrophoneBadge(NO), nil); + [[EarlGrey selectElementWithMatcher:anyPermissionBadge] + assertWithMatcher:grey_nil()]; + } +} + @end + +#endif // TARGET_OS_SIMULATOR
diff --git a/ios/web/init/web_main_loop.mm b/ios/web/init/web_main_loop.mm index 6abe9c88..3933f84 100644 --- a/ios/web/init/web_main_loop.mm +++ b/ios/web/init/web_main_loop.mm
@@ -21,7 +21,6 @@ #include "base/task/thread_pool/thread_pool_instance.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #import "ios/web/net/cookie_notification_bridge.h" #include "ios/web/public/init/ios_global_state.h" #include "ios/web/public/init/web_main_parts.h"
diff --git a/ios/web/test/test_web_thread.cc b/ios/web/test/test_web_thread.cc index 16bc5d26..5cfaffb 100644 --- a/ios/web/test/test_web_thread.cc +++ b/ios/web/test/test_web_thread.cc
@@ -5,7 +5,6 @@ #include "ios/web/public/test/test_web_thread.h" #include "base/message_loop/message_pump_type.h" -#include "base/time/time.h" #include "ios/web/web_sub_thread.h" #include "ios/web/web_thread_impl.h"
diff --git a/ipc/ipc_channel_mojo_unittest.cc b/ipc/ipc_channel_mojo_unittest.cc index 82a15e08..29270a96 100644 --- a/ipc/ipc_channel_mojo_unittest.cc +++ b/ipc/ipc_channel_mojo_unittest.cc
@@ -36,7 +36,6 @@ #include "base/test/test_timeouts.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "ipc/ipc_message.h" #include "ipc/ipc_message_utils.h"
diff --git a/ipc/ipc_channel_proxy_unittest.cc b/ipc/ipc_channel_proxy_unittest.cc index fd333bd..78b2b9f 100644 --- a/ipc/ipc_channel_proxy_unittest.cc +++ b/ipc/ipc_channel_proxy_unittest.cc
@@ -12,7 +12,6 @@ #include "base/pickle.h" #include "base/run_loop.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "ipc/ipc_message.h" #include "ipc/ipc_test_base.h" #include "ipc/message_filter.h"
diff --git a/ipc/ipc_sync_channel_unittest.cc b/ipc/ipc_sync_channel_unittest.cc index 7ff74da..b3c740f 100644 --- a/ipc/ipc_sync_channel_unittest.cc +++ b/ipc/ipc_sync_channel_unittest.cc
@@ -25,7 +25,6 @@ #include "base/threading/platform_thread.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_message.h"
diff --git a/media/audio/audio_thread_impl.h b/media/audio/audio_thread_impl.h index 7aa3e39..340b2719 100644 --- a/media/audio/audio_thread_impl.h +++ b/media/audio/audio_thread_impl.h
@@ -8,7 +8,6 @@ #include "base/task/sequenced_task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "media/audio/audio_thread.h" #include "media/audio/audio_thread_hang_monitor.h"
diff --git a/media/audio/power_observer_helper_unittest.cc b/media/audio/power_observer_helper_unittest.cc index b02a66909..9f92044a 100644 --- a/media/audio/power_observer_helper_unittest.cc +++ b/media/audio/power_observer_helper_unittest.cc
@@ -8,7 +8,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/audio/power_observer_helper.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/media/audio/test_audio_thread.h b/media/audio/test_audio_thread.h index d651960..db7acf5 100644 --- a/media/audio/test_audio_thread.h +++ b/media/audio/test_audio_thread.h
@@ -10,7 +10,6 @@ #include "base/memory/ref_counted.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "media/audio/audio_thread.h" namespace media {
diff --git a/media/base/key_systems.cc b/media/base/key_systems.cc index d2a1916..744b47f7 100644 --- a/media/base/key_systems.cc +++ b/media/base/key_systems.cc
@@ -18,7 +18,6 @@ #include "base/notreached.h" #include "base/strings/string_util.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "build/build_config.h" #include "media/base/key_system_names.h" #include "media/base/key_system_properties.h"
diff --git a/media/capture/run_all_unittests.cc b/media/capture/run_all_unittests.cc index 3131bbb2..6b69c1c 100644 --- a/media/capture/run_all_unittests.cc +++ b/media/capture/run_all_unittests.cc
@@ -12,7 +12,6 @@ #include "base/test/launcher/unit_test_launcher.h" #include "base/test/test_suite.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/core/embedder/embedder.h" #include "mojo/core/embedder/scoped_ipc_support.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/media/capture/video/chromeos/camera_hal_delegate.h b/media/capture/video/chromeos/camera_hal_delegate.h index 9bfc2d0..fbf9098 100644 --- a/media/capture/video/chromeos/camera_hal_delegate.h +++ b/media/capture/video/chromeos/camera_hal_delegate.h
@@ -15,7 +15,6 @@ #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/capture/video/chromeos/camera_hal_dispatcher_impl.h" #include "media/capture/video/chromeos/mojom/camera3.mojom.h" #include "media/capture/video/chromeos/mojom/camera_common.mojom.h"
diff --git a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h index feda1f7ef..042d5b4 100644 --- a/media/capture/video/chromeos/camera_hal_dispatcher_impl.h +++ b/media/capture/video/chromeos/camera_hal_dispatcher_impl.h
@@ -21,7 +21,6 @@ #include "base/synchronization/waitable_event.h" #include "base/thread_annotations.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/unguessable_token.h" #include "components/chromeos_camera/common/jpeg_encode_accelerator.mojom.h" #include "components/chromeos_camera/common/mjpeg_decode_accelerator.mojom.h"
diff --git a/media/capture/video/chromeos/mock_camera_module.h b/media/capture/video/chromeos/mock_camera_module.h index e9c3166..bdb6545d 100644 --- a/media/capture/video/chromeos/mock_camera_module.h +++ b/media/capture/video/chromeos/mock_camera_module.h
@@ -9,7 +9,6 @@ #include <stdint.h> #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/capture/video/chromeos/mojom/camera3.mojom.h" #include "media/capture/video/chromeos/mojom/camera_common.mojom.h" #include "mojo/public/cpp/bindings/associated_remote.h"
diff --git a/media/capture/video/chromeos/mock_vendor_tag_ops.h b/media/capture/video/chromeos/mock_vendor_tag_ops.h index 98d42ca4b..91eb412 100644 --- a/media/capture/video/chromeos/mock_vendor_tag_ops.h +++ b/media/capture/video/chromeos/mock_vendor_tag_ops.h
@@ -10,7 +10,6 @@ #include <vector> #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/capture/video/chromeos/mojom/camera_common.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h"
diff --git a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h index 1b28f10f..a0225c0 100644 --- a/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h +++ b/media/capture/video/chromeos/video_capture_device_chromeos_delegate.h
@@ -12,7 +12,6 @@ #include "base/synchronization/lock.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/capture/video/chromeos/camera_device_context.h" #include "media/capture/video/chromeos/display_rotation_observer.h" #include "media/capture/video/video_capture_device.h"
diff --git a/media/capture/video/linux/video_capture_device_linux.h b/media/capture/video/linux/video_capture_device_linux.h index a409185..08de3f0 100644 --- a/media/capture/video/linux/video_capture_device_linux.h +++ b/media/capture/video/linux/video_capture_device_linux.h
@@ -18,7 +18,6 @@ #include "base/files/file_util.h" #include "base/files/scoped_file.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/capture/video/linux/v4l2_capture_device_impl.h" #include "media/capture/video/video_capture_device.h" #include "media/capture/video_capture_types.h"
diff --git a/media/capture/video/win/video_capture_device_factory_win.h b/media/capture/video/win/video_capture_device_factory_win.h index ed2126b..6dab62d5 100644 --- a/media/capture/video/win/video_capture_device_factory_win.h +++ b/media/capture/video/win/video_capture_device_factory_win.h
@@ -16,7 +16,6 @@ #include <wrl.h> #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/base/win/dxgi_device_manager.h" #include "media/capture/video/video_capture_device_factory.h"
diff --git a/media/cast/test/utility/standalone_cast_environment.h b/media/cast/test/utility/standalone_cast_environment.h index f744c063..1a89540 100644 --- a/media/cast/test/utility/standalone_cast_environment.h +++ b/media/cast/test/utility/standalone_cast_environment.h
@@ -7,7 +7,6 @@ #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "media/cast/cast_environment.h" namespace media {
diff --git a/media/gpu/test/video_encoder/bitstream_file_writer.h b/media/gpu/test/video_encoder/bitstream_file_writer.h index 6fcaff82..0de3056 100644 --- a/media/gpu/test/video_encoder/bitstream_file_writer.h +++ b/media/gpu/test/video_encoder/bitstream_file_writer.h
@@ -13,7 +13,6 @@ #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/gpu/test/bitstream_helpers.h" namespace media {
diff --git a/media/gpu/test/video_encoder/bitstream_validator.h b/media/gpu/test/video_encoder/bitstream_validator.h index 23e6f61..500aff53 100644 --- a/media/gpu/test/video_encoder/bitstream_validator.h +++ b/media/gpu/test/video_encoder/bitstream_validator.h
@@ -16,7 +16,6 @@ #include "base/synchronization/lock.h" #include "base/thread_annotations.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/base/bitstream_buffer.h" #include "media/base/decoder_status.h" #include "media/base/video_decoder.h"
diff --git a/media/gpu/test/video_frame_file_writer.h b/media/gpu/test/video_frame_file_writer.h index d84a955..56add48 100644 --- a/media/gpu/test/video_frame_file_writer.h +++ b/media/gpu/test/video_frame_file_writer.h
@@ -14,7 +14,6 @@ #include "base/synchronization/condition_variable.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/gpu/test/video_frame_helpers.h" namespace media {
diff --git a/media/gpu/test/video_frame_validator.h b/media/gpu/test/video_frame_validator.h index 352a3ca..6be1f3e9 100644 --- a/media/gpu/test/video_frame_validator.h +++ b/media/gpu/test/video_frame_validator.h
@@ -18,7 +18,6 @@ #include "base/synchronization/lock.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "media/base/video_types.h" #include "media/gpu/test/video_frame_helpers.h" #include "ui/gfx/geometry/rect.h"
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h index 264fe63..c0ee013 100644 --- a/media/gpu/test/video_player/video_decoder_client.h +++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -13,7 +13,6 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "gpu/ipc/service/gpu_memory_buffer_factory.h" #include "media/base/decoder_status.h" #include "media/base/video_decoder.h"
diff --git a/media/gpu/v4l2/v4l2_device_poller.h b/media/gpu/v4l2/v4l2_device_poller.h index 2e5b38c..9abe4416 100644 --- a/media/gpu/v4l2/v4l2_device_poller.h +++ b/media/gpu/v4l2/v4l2_device_poller.h
@@ -11,7 +11,6 @@ #include "base/synchronization/waitable_event.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace media {
diff --git a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h index bc229c9..8a94b61 100644 --- a/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h +++ b/media/gpu/v4l2/v4l2_jpeg_encode_accelerator.h
@@ -16,7 +16,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/chromeos_camera/jpeg_encode_accelerator.h" #include "gpu/ipc/common/gpu_memory_buffer_support.h" #include "media/base/bitstream_buffer.h"
diff --git a/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h index f99c42d..f13e529 100644 --- a/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h +++ b/media/gpu/v4l2/v4l2_mjpeg_decode_accelerator.h
@@ -16,7 +16,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/chromeos_camera/mjpeg_decode_accelerator.h" #include "media/gpu/media_gpu_export.h" #include "media/gpu/v4l2/v4l2_device.h"
diff --git a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h index 5fecaeaa..6aad0f46 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h +++ b/media/gpu/v4l2/v4l2_slice_video_decode_accelerator.h
@@ -19,7 +19,6 @@ #include "base/memory/weak_ptr.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/trace_event/memory_dump_provider.h" #include "media/gpu/chromeos/fourcc.h" #include "media/gpu/decode_surface_handler.h"
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_video_decode_accelerator.h index 96aea5e..1639071 100644 --- a/media/gpu/v4l2/v4l2_video_decode_accelerator.h +++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.h
@@ -24,7 +24,6 @@ #include "base/memory/ref_counted.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/trace_event/memory_dump_provider.h" #include "media/base/limits.h" #include "media/base/video_decoder_config.h"
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h index ee04164..94c2af1 100644 --- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h +++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.h
@@ -10,7 +10,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/chromeos_camera/jpeg_encode_accelerator.h" #include "media/base/bitstream_buffer.h" #include "media/base/unaligned_shared_memory.h"
diff --git a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h index 8ca5bcb..0821d5c 100644 --- a/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h +++ b/media/gpu/vaapi/vaapi_mjpeg_decode_accelerator.h
@@ -13,7 +13,6 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "components/chromeos_camera/mjpeg_decode_accelerator.h" #include "media/gpu/chromeos/image_processor_backend.h" #include "media/gpu/media_gpu_export.h"
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator.h b/media/gpu/vaapi/vaapi_video_decode_accelerator.h index 843fe64..bc5bc19 100644 --- a/media/gpu/vaapi/vaapi_video_decode_accelerator.h +++ b/media/gpu/vaapi/vaapi_video_decode_accelerator.h
@@ -25,7 +25,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/thread_annotations.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/trace_event/memory_dump_provider.h" #include "media/base/bitstream_buffer.h" #include "media/gpu/decode_surface_handler.h"
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.h b/media/gpu/windows/dxva_video_decode_accelerator_win.h index 6cb8a525..3bf7d99 100644 --- a/media/gpu/windows/dxva_video_decode_accelerator_win.h +++ b/media/gpu/windows/dxva_video_decode_accelerator_win.h
@@ -23,7 +23,6 @@ #include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "gpu/config/gpu_preferences.h" #include "media/base/video_color_space.h" #include "media/gpu/gpu_video_decode_accelerator_helpers.h"
diff --git a/mojo/core/channel_unittest.cc b/mojo/core/channel_unittest.cc index 0ceebf0..e9dee38 100644 --- a/mojo/core/channel_unittest.cc +++ b/mojo/core/channel_unittest.cc
@@ -17,7 +17,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "mojo/core/platform_handle_utils.h" #include "mojo/public/cpp/platform/platform_channel.h"
diff --git a/mojo/core/ports/ports_unittest.cc b/mojo/core/ports/ports_unittest.cc index f0fee94..8825a96 100644 --- a/mojo/core/ports/ports_unittest.cc +++ b/mojo/core/ports/ports_unittest.cc
@@ -23,7 +23,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/core/ports/event.h" #include "mojo/core/ports/node.h" #include "mojo/core/ports/node_delegate.h"
diff --git a/mojo/public/cpp/bindings/tests/receiver_unittest.cc b/mojo/public/cpp/bindings/tests/receiver_unittest.cc index 338ef55a..17efb6be 100644 --- a/mojo/public/cpp/bindings/tests/receiver_unittest.cc +++ b/mojo/public/cpp/bindings/tests/receiver_unittest.cc
@@ -16,7 +16,6 @@ #include "base/synchronization/waitable_event.h" #include "base/test/bind.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/lib/validation_errors.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/net/BUILD.gn b/net/BUILD.gn index d89546e..ae7601d9 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -2089,6 +2089,8 @@ "socket/read_buffering_stream_socket.h", "socket/socket_test_util.cc", "socket/socket_test_util.h", + "socket/transport_client_socket_test_util.cc", + "socket/transport_client_socket_test_util.h", "spdy/spdy_test_util_common.cc", "spdy/spdy_test_util_common.h", "ssl/client_cert_identity_test_util.cc",
diff --git a/net/base/network_activity_monitor_unittest.cc b/net/base/network_activity_monitor_unittest.cc index 90bd0fb0..ae13296 100644 --- a/net/base/network_activity_monitor_unittest.cc +++ b/net/base/network_activity_monitor_unittest.cc
@@ -12,7 +12,6 @@ #include "base/bind.h" #include "base/strings/string_number_conversions.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace net {
diff --git a/net/base/network_change_notifier_fuchsia_unittest.cc b/net/base/network_change_notifier_fuchsia_unittest.cc index bf8e9ac..893bfa7 100644 --- a/net/base/network_change_notifier_fuchsia_unittest.cc +++ b/net/base/network_change_notifier_fuchsia_unittest.cc
@@ -17,7 +17,6 @@ #include "base/test/task_environment.h" #include "base/threading/sequence_bound.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/base/ip_address.h" #include "net/dns/dns_config_service.h" #include "net/dns/system_dns_config_change_notifier.h"
diff --git a/net/base/network_config_watcher_mac.h b/net/base/network_config_watcher_mac.h index 2187d61..8c01b7a 100644 --- a/net/base/network_config_watcher_mac.h +++ b/net/base/network_config_watcher_mac.h
@@ -10,7 +10,6 @@ #include <memory> #include "base/mac/scoped_cftyperef.h" -#include "base/time/time.h" namespace base { class Thread;
diff --git a/net/base/network_notification_thread_mac.cc b/net/base/network_notification_thread_mac.cc index 922f0fd88..105c3bb3 100644 --- a/net/base/network_notification_thread_mac.cc +++ b/net/base/network_notification_thread_mac.cc
@@ -7,7 +7,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/no_destructor.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace net {
diff --git a/net/cert_net/cert_net_fetcher_url_request_unittest.cc b/net/cert_net/cert_net_fetcher_url_request_unittest.cc index 34a3acb4..3def9a1 100644 --- a/net/cert_net/cert_net_fetcher_url_request_unittest.cc +++ b/net/cert_net/cert_net_fetcher_url_request_unittest.cc
@@ -13,7 +13,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" -#include "base/time/time.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/ct_policy_enforcer.h" #include "net/cert/mock_cert_verifier.h"
diff --git a/net/cookies/cookie_store_test_callbacks.h b/net/cookies/cookie_store_test_callbacks.h index 7830168..e1dcf6b1 100644 --- a/net/cookies/cookie_store_test_callbacks.h +++ b/net/cookies/cookie_store_test_callbacks.h
@@ -12,7 +12,6 @@ #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" -#include "base/time/time.h" #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_store.h"
diff --git a/net/data/ssl/chrome_root_store/root_store.certs b/net/data/ssl/chrome_root_store/root_store.certs index 87d34986..32fc0eb 100644 --- a/net/data/ssl/chrome_root_store/root_store.certs +++ b/net/data/ssl/chrome_root_store/root_store.certs
@@ -5955,127 +5955,6 @@ uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- -# 3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 10003001 (0x98a239) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = NL, O = Staat der Nederlanden, CN = Staat der Nederlanden Root CA - G3 - Validity - Not Before: Nov 14 11:28:42 2013 GMT - Not After : Nov 13 23:00:00 2028 GMT - Subject: C = NL, O = Staat der Nederlanden, CN = Staat der Nederlanden Root CA - G3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:be:32:a2:54:0f:70:fb:2c:5c:59:eb:6c:c4:a4: - 51:e8:85:2a:b3:cc:4a:34:f2:b0:5f:f3:0e:c7:1c: - 3d:53:1e:88:08:68:d8:6f:3d:ad:c2:9e:cc:82:67: - 07:27:87:68:71:3a:9f:75:96:22:46:05:b0:ed:ad: - c7:5b:9e:2a:de:9c:fc:3a:c6:95:a7:f5:17:67:18: - e7:2f:49:08:0c:5c:cf:e6:cc:34:ed:78:fb:50:b1: - dc:6b:32:f0:a2:fe:b6:3c:e4:ec:5a:97:c7:3f:1e: - 70:08:30:a0:dc:c5:b3:6d:6f:d0:82:72:11:ab:d2: - 81:68:59:82:17:b7:78:92:60:fa:cc:de:3f:84:eb: - 8d:38:33:90:0a:72:23:fa:35:cc:26:71:31:d1:72: - 28:92:d9:5b:23:6d:66:b5:6d:07:42:eb:a6:33:ce: - 92:db:c0:f6:6c:63:78:cd:ca:4e:3d:b5:e5:52:9b: - f1:be:3b:e6:54:60:b0:66:1e:09:ab:07:fe:54:89: - 11:42:d1:f7:24:ba:60:78:1a:98:f7:c9:11:fd:16: - c1:35:1a:54:75:ef:43:d3:e5:ae:4e:ce:e7:7b:c3: - c6:4e:61:51:4b:ab:9a:45:4b:a1:1f:41:bd:48:53: - 15:71:64:0b:86:b3:e5:2e:be:ce:a4:1b:c1:29:84: - a2:b5:cb:08:23:76:43:22:24:1f:17:04:d4:6e:9c: - c6:fc:7f:2b:66:1a:ec:8a:e5:d6:cf:4d:f5:63:09: - b7:15:39:d6:7b:ac:eb:e3:7c:e9:4e:fc:75:42:c8: - ed:58:95:0c:06:42:a2:9c:f7:e4:70:b3:df:72:6f: - 5a:37:40:89:d8:85:a4:d7:f1:0b:de:43:19:d4:4a: - 58:2c:8c:8a:39:9e:bf:84:87:f1:16:3b:36:0c:e9: - d3:b4:ca:6c:19:41:52:09:a1:1d:b0:6a:bf:82:ef: - 70:51:21:32:dc:05:76:8c:cb:f7:64:e4:03:50:af: - 8c:91:67:ab:c5:f2:ee:58:d8:de:be:f7:e7:31:cf: - 6c:c9:3b:71:c1:d5:88:b5:65:bc:c0:e8:17:17:07: - 12:b5:5c:d2:ab:20:93:b4:e6:82:83:70:36:c5:cd: - a3:8d:ad:8b:ec:a3:c1:43:87:e6:43:e2:34:be:95: - 8b:35:ed:07:39:da:a8:1d:7a:9f:36:9e:12:b0:0c: - 65:12:90:15:60:d9:26:40:44:e3:56:60:a5:10:d4: - 6a:3c:fd:41:dc:0e:5a:47:b6:ef:97:61:75:4f:d9: - fe:c7:b2:1d:d4:ed:5d:49:b3:a9:6a:cb:66:84:13: - d5:5c:a0:dc:df:6e:77:06:d1:71:75:c8:57:6f:af: - 0f:77:5b - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 54:AD:FA:C7:92:57:AE:CA:35:9C:2E:12:FB:E4:BA:5D:20:DC:94:57 - Signature Algorithm: sha256WithRSAEncryption - 30:99:9d:05:32:c8:5e:0e:3b:98:01:3a:8a:a4:e7:07:f7:7a: - f8:e7:9a:df:50:43:53:97:2a:3d:ca:3c:47:98:2e:e1:15:7b: - f1:92:f3:61:da:90:25:16:65:c0:9f:54:5d:0e:03:3b:5b:77: - 02:9c:84:b6:0d:98:5f:34:dd:3b:63:c2:c3:28:81:c2:9c:29: - 2e:29:e2:c8:c3:01:f2:33:ea:2a:aa:cc:09:08:f7:65:67:c6: - cd:df:d3:b6:2b:a7:bd:cc:d1:0e:70:5f:b8:23:d1:cb:91:4e: - 0a:f4:c8:7a:e5:d9:63:36:c1:d4:df:fc:22:97:f7:60:5d:ea: - 29:2f:58:b2:bd:58:bd:8d:96:4f:10:75:bf:48:7b:3d:51:87: - a1:3c:74:22:c2:fc:07:7f:80:dc:c4:ac:fe:6a:c1:70:30:b0: - e9:8e:69:e2:2c:69:81:94:09:ba:dd:fe:4d:c0:83:8c:94:58: - c0:46:20:af:9c:1f:02:f8:35:55:49:2f:46:d4:c0:f0:a0:96: - 02:0f:33:c5:71:f3:9e:23:7d:94:b7:fd:3a:d3:09:83:06:21: - fd:60:3d:ae:32:c0:d2:ee:8d:a6:f0:e7:b4:82:7c:0a:cc:70: - c9:79:80:f8:fe:4c:f7:35:84:19:8a:31:fb:0a:d9:d7:7f:9b: - f0:a2:9a:6b:c3:05:4a:ed:41:60:14:30:d1:aa:11:42:6e:d3: - 23:02:04:0b:c6:65:dd:dd:52:77:da:81:6b:b2:a8:fa:01:38: - b9:96:ea:2a:6c:67:97:89:94:9e:bc:e1:54:d5:e4:6a:78:ef: - 4a:bd:2b:9a:3d:40:7e:c6:c0:75:d2:6e:fb:68:30:ec:ec:8b: - 9d:f9:49:35:9a:1a:2c:d9:b3:95:39:d5:1e:92:f7:a6:b9:65: - 2f:e5:3d:6d:3a:48:4c:08:dc:e4:28:12:28:be:7d:35:5c:ea: - e0:16:7e:13:1b:6a:d7:3e:d7:9e:fc:2d:75:b2:c1:14:d5:23: - 03:db:5b:6f:0b:3e:78:2f:0d:de:33:8d:16:b7:48:e7:83:9a: - 81:0f:7b:c1:43:4d:55:04:17:38:4a:51:d5:59:a2:89:74:d3: - 9f:be:1e:4b:d7:c6:6d:b7:88:24:6f:60:91:a4:82:85:5b:56: - 41:bc:d0:44:ab:6a:13:be:d1:2c:58:b7:12:33:58:b2:37:63: - dc:13:f5:94:1d:3f:40:51:f5:4f:f5:3a:ed:c8:c5:eb:c2:1e: - 1d:16:95:7a:c7:7e:42:71:93:6e:4b:15:b7:30:df:aa:ed:57: - 85:48:ac:1d:6a:dd:39:69:e4:e1:79:78:be:ce:05:bf:a1:0c: - f7:80:7b:21:67:27:30:59 ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO -TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX -DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl -ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv -b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP -cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW -IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX -xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy -KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR -9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az -5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 -6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 -Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP -bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt -BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt -XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd -INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp -LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 -Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp -gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh -/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw -0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A -fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq -4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR -1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ -QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM -94B7IWcnMFk= ------END CERTIFICATE----- - # 4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a Certificate: Data: @@ -6461,100 +6340,6 @@ vm9qp/UsQu0yrbYhnr68 -----END CERTIFICATE----- -# bc104f15a48be709dca542a7e1d4b9df6f054527e802eaa92d595444258afe71 -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C = GR, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions RootCA 2011 - Validity - Not Before: Dec 6 13:49:52 2011 GMT - Not After : Dec 1 13:49:52 2031 GMT - Subject: C = GR, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions RootCA 2011 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:a9:53:00:e3:2e:a6:f6:8e:fa:60:d8:2d:95:3e: - f8:2c:2a:54:4e:cd:b9:84:61:94:58:4f:8f:3d:8b: - e4:43:f3:75:89:8d:51:e4:c3:37:d2:8a:88:4d:79: - 1e:b7:12:dd:43:78:4a:8a:92:e6:d7:48:d5:0f:a4: - 3a:29:44:35:b8:07:f6:68:1d:55:cd:38:51:f0:8c: - 24:31:85:af:83:c9:7d:e9:77:af:ed:1a:7b:9d:17: - f9:b3:9d:38:50:0f:a6:5a:79:91:80:af:37:ae:a6: - d3:31:fb:b5:26:09:9d:3c:5a:ef:51:c5:2b:df:96: - 5d:eb:32:1e:02:da:70:49:ec:6e:0c:c8:9a:37:8d: - f7:f1:36:60:4b:26:2c:82:9e:d0:78:f3:0d:0f:63: - a4:51:30:e1:f9:2b:27:12:07:d8:ea:bd:18:62:98: - b0:59:37:7d:be:ee:f3:20:51:42:5a:83:ef:93:ba: - 69:15:f1:62:9d:9f:99:39:82:a1:b7:74:2e:8b:d4: - c5:0b:7b:2f:f0:c8:0a:da:3d:79:0a:9a:93:1c:a5: - 28:72:73:91:43:9a:a7:d1:4d:85:84:b9:a9:74:8f: - 14:40:c7:dc:de:ac:41:64:6c:b4:19:9b:02:63:6d: - 24:64:8f:44:b2:25:ea:ce:5d:74:0c:63:32:5c:8d: - 87:e5 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - A6:91:42:FD:13:61:4A:23:9E:08:A4:29:E5:D8:13:04:23:EE:41:25 - X509v3 Name Constraints: - Permitted: - DNS:.gr - DNS:.eu - DNS:.edu - DNS:.org - email:.gr - email:.eu - email:.edu - email:.org - - Signature Algorithm: sha1WithRSAEncryption - 1f:ef:79:41:e1:7b:6e:3f:b2:8c:86:37:42:4a:4e:1c:37:1e: - 8d:66:ba:24:81:c9:4f:12:0f:21:c0:03:97:86:25:6d:5d:d3: - 22:29:a8:6c:a2:0d:a9:eb:3d:06:5b:99:3a:c7:cc:c3:9a:34: - 7f:ab:0e:c8:4e:1c:e1:fa:e4:dc:cd:0d:be:bf:24:fe:6c:e7: - 6b:c2:0d:c8:06:9e:4e:8d:61:28:a6:6a:fd:e5:f6:62:ea:18: - 3c:4e:a0:53:9d:b2:3a:9c:eb:a5:9c:91:16:b6:4d:82:e0:0c: - 05:48:a9:6c:f5:cc:f8:cb:9d:49:b4:f0:02:a5:fd:70:03:ed: - 8a:21:a5:ae:13:86:49:c3:33:73:be:87:3b:74:8b:17:45:26: - 4c:16:91:83:fe:67:7d:cd:4d:63:67:fa:f3:03:12:96:78:06: - 8d:b1:67:ed:8e:3f:be:9f:4f:02:f5:b3:09:2f:f3:4c:87:df: - 2a:cb:95:7c:01:cc:ac:36:7a:bf:a2:73:7a:f7:8f:c1:b5:9a: - a1:14:b2:8f:33:9f:0d:ef:22:dc:66:7b:84:bd:45:17:06:3d: - 3c:ca:b9:77:34:8f:ca:ea:cf:3f:31:3e:e3:88:e3:80:49:25: - c8:97:b5:9d:9a:99:4d:b0:3c:f8:4a:00:9b:64:dd:9f:39:4b: - d1:27:d7:b8 ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix -RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p -YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw -NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK -EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl -cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz -dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ -fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns -bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD -75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP -FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV -HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp -5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu -b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA -A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p -6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 -dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys -Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI -l7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - # 30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f Certificate: Data:
diff --git a/net/data/ssl/chrome_root_store/root_store.textproto b/net/data/ssl/chrome_root_store/root_store.textproto index b992d19..621d387 100644 --- a/net/data/ssl/chrome_root_store/root_store.textproto +++ b/net/data/ssl/chrome_root_store/root_store.textproto
@@ -5,7 +5,7 @@ # Version # should always be incremented up whenever this (or any pem file that # it references) is changed. -version_major: 1 +version_major: 2 # CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT trust_anchors { @@ -332,11 +332,6 @@ sha256_hex: "ebc5570c29018c4d67b1aa127baf12f703b4611ebc17b7dab5573894179b93fa" } -# CN=Staat der Nederlanden Root CA - G3, O=Staat der Nederlanden, C=NL -trust_anchors { - sha256_hex: "3c4fb0b95ab8b30032f432b86f535fe172c185d0fd39865837cf36187fa6f428" -} - # CN=Staat der Nederlanden EV Root CA, O=Staat der Nederlanden, C=NL trust_anchors { sha256_hex: "4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a" @@ -357,11 +352,6 @@ sha256_hex: "a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36" } -# CN=Hellenic Academic and Research Institutions RootCA 2011, O=Hellenic Academic and Research Institutions Cert. Authority, C=GR -trust_anchors { - sha256_hex: "bc104f15a48be709dca542a7e1d4b9df6f054527e802eaa92d595444258afe71" -} - # CN=IdenTrust Public Sector Root CA 1, O=IdenTrust, C=US trust_anchors { sha256_hex: "30d0895a9a448a262091635522d1f52010b5867acae12c78ef958fd4f4389f2f"
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc index f977658..5aed1148 100644 --- a/net/http/http_cache.cc +++ b/net/http/http_cache.cc
@@ -28,7 +28,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_clock.h" -#include "base/time/time.h" #include "build/build_config.h" #include "net/base/cache_type.h" #include "net/base/features.h"
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver.cc b/net/proxy_resolution/multi_threaded_proxy_resolver.cc index a3f11a24..f7dd6639 100644 --- a/net/proxy_resolution/multi_threaded_proxy_resolver.cc +++ b/net/proxy_resolution/multi_threaded_proxy_resolver.cc
@@ -20,7 +20,6 @@ #include "base/threading/thread_checker.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "net/base/net_errors.h" #include "net/base/network_isolation_key.h" #include "net/log/net_log.h"
diff --git a/net/socket/transport_client_socket_test_util.cc b/net/socket/transport_client_socket_test_util.cc new file mode 100644 index 0000000..9904c18 --- /dev/null +++ b/net/socket/transport_client_socket_test_util.cc
@@ -0,0 +1,113 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <memory> +#include <string> + +#include "net/socket/transport_client_socket_test_util.h" + +#include "base/memory/ref_counted.h" +#include "net/base/io_buffer.h" +#include "net/base/net_errors.h" +#include "net/test/gtest_util.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +void SendRequestAndResponse(StreamSocket* socket, + StreamSocket* connected_socket) { + // Send client request. + const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; + int request_len = strlen(request_text); + scoped_refptr<DrainableIOBuffer> request_buffer = + base::MakeRefCounted<DrainableIOBuffer>( + base::MakeRefCounted<IOBuffer>(request_len), request_len); + memcpy(request_buffer->data(), request_text, request_len); + + int bytes_written = 0; + while (request_buffer->BytesRemaining() > 0) { + TestCompletionCallback write_callback; + int write_result = + socket->Write(request_buffer.get(), request_buffer->BytesRemaining(), + write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS); + + write_result = write_callback.GetResult(write_result); + ASSERT_GT(write_result, 0); + ASSERT_LE(bytes_written + write_result, request_len); + request_buffer->DidConsume(write_result); + + bytes_written += write_result; + } + ASSERT_EQ(request_len, bytes_written); + + // Confirm that the server receives what client sent. + std::string data_received = + ReadDataOfExpectedLength(connected_socket, bytes_written); + ASSERT_TRUE(connected_socket->IsConnectedAndIdle()); + ASSERT_EQ(request_text, data_received); + + // Write server response. + SendServerResponse(connected_socket); +} + +std::string ReadDataOfExpectedLength(StreamSocket* socket, + int expected_bytes_read) { + int bytes_read = 0; + scoped_refptr<IOBufferWithSize> read_buffer = + base::MakeRefCounted<IOBufferWithSize>(expected_bytes_read); + while (bytes_read < expected_bytes_read) { + TestCompletionCallback read_callback; + int rv = socket->Read(read_buffer.get(), expected_bytes_read - bytes_read, + read_callback.callback()); + EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); + rv = read_callback.GetResult(rv); + EXPECT_GE(rv, 0); + bytes_read += rv; + } + EXPECT_EQ(expected_bytes_read, bytes_read); + return std::string(read_buffer->data(), bytes_read); +} + +void SendServerResponse(StreamSocket* socket) { + const char kServerReply[] = "HTTP/1.1 404 Not Found"; + int reply_len = strlen(kServerReply); + scoped_refptr<DrainableIOBuffer> write_buffer = + base::MakeRefCounted<DrainableIOBuffer>( + base::MakeRefCounted<IOBuffer>(reply_len), reply_len); + memcpy(write_buffer->data(), kServerReply, reply_len); + int bytes_written = 0; + while (write_buffer->BytesRemaining() > 0) { + TestCompletionCallback write_callback; + int write_result = + socket->Write(write_buffer.get(), write_buffer->BytesRemaining(), + write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS); + write_result = write_callback.GetResult(write_result); + ASSERT_GE(write_result, 0); + ASSERT_LE(bytes_written + write_result, reply_len); + write_buffer->DidConsume(write_result); + bytes_written += write_result; + } +} + +int DrainStreamSocket(StreamSocket* socket, + IOBuffer* buf, + uint32_t buf_len, + uint32_t bytes_to_read, + TestCompletionCallback* callback) { + int rv = OK; + uint32_t bytes_read = 0; + + while (bytes_read < bytes_to_read) { + rv = socket->Read(buf, buf_len, callback->callback()); + EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); + rv = callback->GetResult(rv); + EXPECT_GT(rv, 0); + bytes_read += rv; + } + + return static_cast<int>(bytes_read); +} + +} // namespace net
diff --git a/net/socket/transport_client_socket_test_util.h b/net/socket/transport_client_socket_test_util.h new file mode 100644 index 0000000..5f1ac677 --- /dev/null +++ b/net/socket/transport_client_socket_test_util.h
@@ -0,0 +1,41 @@ +// Copyright 2022 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 NET_SOCKET_TRANSPORT_CLIENT_SOCKET_TEST_UTIL_H_ +#define NET_SOCKET_TRANSPORT_CLIENT_SOCKET_TEST_UTIL_H_ + +#include <stdint.h> +#include <string> + +#include "net/base/test_completion_callback.h" +#include "net/socket/stream_socket.h" + +namespace net { + +class IOBuffer; + +// Sends a request from `socket` to `connected_socket`. Makes `connected_socket` +// read the request and send a response. +void SendRequestAndResponse(StreamSocket* socket, + StreamSocket* connected_socket); + +// Reads `expected_bytes_read` bytes from `socket`. Returns the data +// read as a string. +std::string ReadDataOfExpectedLength(StreamSocket* socket, + int expected_bytes_read); + +// Sends response from `socket`. +void SendServerResponse(StreamSocket* socket); + +// `socket` reads `bytes_to_read` number of bytes into `buf`. Returns number of +// bytes read. +int DrainStreamSocket(StreamSocket* socket, + IOBuffer* buf, + uint32_t buf_len, + uint32_t bytes_to_read, + TestCompletionCallback* callback); + +} // namespace net + +#endif // NET_SOCKET_TRANSPORT_CLIENT_SOCKET_TEST_UTIL_H_
diff --git a/net/socket/transport_client_socket_unittest.cc b/net/socket/transport_client_socket_unittest.cc index a9de9ce2..cd21ee5401 100644 --- a/net/socket/transport_client_socket_unittest.cc +++ b/net/socket/transport_client_socket_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 <memory> +#include "net/socket/transport_client_socket_test_util.h" + #include <string> #include "base/bind.h" @@ -45,8 +46,7 @@ public: TransportClientSocketTest() : listen_port_(0), - socket_factory_(ClientSocketFactory::GetDefaultFactory()), - close_server_socket_on_next_send_(false) {} + socket_factory_(ClientSocketFactory::GetDefaultFactory()) {} ~TransportClientSocketTest() override = default; @@ -63,29 +63,9 @@ connect_loop_.Quit(); } - int DrainClientSocket(IOBuffer* buf, - uint32_t buf_len, - uint32_t bytes_to_read, - TestCompletionCallback* callback); - // Establishes a connection to the server. void EstablishConnection(TestCompletionCallback* callback); - // Sends a request from the client to the server socket. Makes the server read - // the request and send a response. - void SendRequestAndResponse(); - - // Makes |connected_sock_| to read |expected_bytes_read| bytes. Returns the - // the data read as a string. - std::string ReadServerData(int expected_bytes_read); - - // Sends server response. - void SendServerResponse(); - - void set_close_server_socket_on_next_send(bool close) { - close_server_socket_on_next_send_ = close; - } - protected: base::RunLoop connect_loop_; uint16_t listen_port_; @@ -96,7 +76,6 @@ private: std::unique_ptr<TCPServerSocket> listen_sock_; - bool close_server_socket_on_next_send_; }; void TransportClientSocketTest::SetUp() { @@ -118,25 +97,6 @@ addr, nullptr, nullptr, NetLog::Get(), NetLogSource()); } -int TransportClientSocketTest::DrainClientSocket( - IOBuffer* buf, - uint32_t buf_len, - uint32_t bytes_to_read, - TestCompletionCallback* callback) { - int rv = OK; - uint32_t bytes_read = 0; - - while (bytes_read < bytes_to_read) { - rv = sock_->Read(buf, buf_len, callback->callback()); - EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); - rv = callback->GetResult(rv); - EXPECT_GT(rv, 0); - bytes_read += rv; - } - - return static_cast<int>(bytes_read); -} - void TransportClientSocketTest::EstablishConnection( TestCompletionCallback* callback) { int rv = sock_->Connect(callback->callback()); @@ -146,79 +106,6 @@ EXPECT_THAT(callback->GetResult(rv), IsOk()); } -void TransportClientSocketTest::SendRequestAndResponse() { - // Send client request. - const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; - int request_len = strlen(request_text); - scoped_refptr<DrainableIOBuffer> request_buffer = - base::MakeRefCounted<DrainableIOBuffer>( - base::MakeRefCounted<IOBuffer>(request_len), request_len); - memcpy(request_buffer->data(), request_text, request_len); - - int bytes_written = 0; - while (request_buffer->BytesRemaining() > 0) { - TestCompletionCallback write_callback; - int write_result = - sock_->Write(request_buffer.get(), request_buffer->BytesRemaining(), - write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS); - write_result = write_callback.GetResult(write_result); - ASSERT_GT(write_result, 0); - ASSERT_LE(bytes_written + write_result, request_len); - request_buffer->DidConsume(write_result); - bytes_written += write_result; - } - ASSERT_EQ(request_len, bytes_written); - - // Confirm that the server receives what client sent. - std::string data_received = ReadServerData(bytes_written); - ASSERT_TRUE(connected_sock_->IsConnectedAndIdle()); - ASSERT_EQ(request_text, data_received); - - // Write server response. - SendServerResponse(); -} - -void TransportClientSocketTest::SendServerResponse() { - // TODO(dkegel): this might not be long enough to tickle some bugs. - int reply_len = strlen(kServerReply); - scoped_refptr<DrainableIOBuffer> write_buffer = - base::MakeRefCounted<DrainableIOBuffer>( - base::MakeRefCounted<IOBuffer>(reply_len), reply_len); - memcpy(write_buffer->data(), kServerReply, reply_len); - int bytes_written = 0; - while (write_buffer->BytesRemaining() > 0) { - TestCompletionCallback write_callback; - int write_result = connected_sock_->Write( - write_buffer.get(), write_buffer->BytesRemaining(), - write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS); - write_result = write_callback.GetResult(write_result); - ASSERT_GE(write_result, 0); - ASSERT_LE(bytes_written + write_result, reply_len); - write_buffer->DidConsume(write_result); - bytes_written += write_result; - } - if (close_server_socket_on_next_send_) - CloseServerSocket(); -} - -std::string TransportClientSocketTest::ReadServerData(int expected_bytes_read) { - int bytes_read = 0; - scoped_refptr<IOBufferWithSize> read_buffer = - base::MakeRefCounted<IOBufferWithSize>(expected_bytes_read); - while (bytes_read < expected_bytes_read) { - TestCompletionCallback read_callback; - int rv = connected_sock_->Read(read_buffer.get(), - expected_bytes_read - bytes_read, - read_callback.callback()); - EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); - rv = read_callback.GetResult(rv); - EXPECT_GE(rv, 0); - bytes_read += rv; - } - EXPECT_EQ(expected_bytes_read, bytes_read); - return std::string(read_buffer->data(), bytes_read); -} - TEST_F(TransportClientSocketTest, Connect) { TestCompletionCallback callback; EXPECT_FALSE(sock_->IsConnected()); @@ -262,10 +149,10 @@ EXPECT_TRUE(sock_->IsConnectedAndIdle()); // Send the request and wait for the server to respond. - SendRequestAndResponse(); + SendRequestAndResponse(sock_.get(), connected_sock_.get()); // Drain a single byte so we know we've received some data. - bytes_read = DrainClientSocket(buf.get(), 1, 1, &callback); + bytes_read = DrainStreamSocket(sock_.get(), buf.get(), 1, 1, &callback); ASSERT_EQ(bytes_read, 1u); // Socket should be considered connected, but not idle, due to @@ -273,8 +160,8 @@ EXPECT_TRUE(sock_->IsConnected()); EXPECT_FALSE(sock_->IsConnectedAndIdle()); - bytes_read = - DrainClientSocket(buf.get(), 4096, strlen(kServerReply) - 1, &callback); + bytes_read = DrainStreamSocket(sock_.get(), buf.get(), 4096, + strlen(kServerReply) - 1, &callback); ASSERT_EQ(bytes_read, strlen(kServerReply) - 1); // After draining the data, the socket should be back to connected @@ -283,18 +170,18 @@ EXPECT_TRUE(sock_->IsConnectedAndIdle()); // This time close the server socket immediately after the server response. - set_close_server_socket_on_next_send(true); - SendRequestAndResponse(); + SendRequestAndResponse(sock_.get(), connected_sock_.get()); + CloseServerSocket(); - bytes_read = DrainClientSocket(buf.get(), 1, 1, &callback); + bytes_read = DrainStreamSocket(sock_.get(), buf.get(), 1, 1, &callback); ASSERT_EQ(bytes_read, 1u); // As above because of data. EXPECT_TRUE(sock_->IsConnected()); EXPECT_FALSE(sock_->IsConnectedAndIdle()); - bytes_read = - DrainClientSocket(buf.get(), 4096, strlen(kServerReply) - 1, &callback); + bytes_read = DrainStreamSocket(sock_.get(), buf.get(), 4096, + strlen(kServerReply) - 1, &callback); ASSERT_EQ(bytes_read, strlen(kServerReply) - 1); // Once the data is drained, the socket should now be seen as not @@ -313,11 +200,11 @@ TestCompletionCallback callback; EstablishConnection(&callback); - SendRequestAndResponse(); + SendRequestAndResponse(sock_.get(), connected_sock_.get()); scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(4096); - uint32_t bytes_read = - DrainClientSocket(buf.get(), 4096, strlen(kServerReply), &callback); + uint32_t bytes_read = DrainStreamSocket(sock_.get(), buf.get(), 4096, + strlen(kServerReply), &callback); ASSERT_EQ(bytes_read, strlen(kServerReply)); ASSERT_EQ(std::string(kServerReply), std::string(buf->data(), bytes_read)); @@ -334,7 +221,7 @@ TestCompletionCallback callback; EstablishConnection(&callback); - SendRequestAndResponse(); + SendRequestAndResponse(sock_.get(), connected_sock_.get()); scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(1); uint32_t bytes_read = 0; @@ -361,7 +248,7 @@ TestCompletionCallback callback; EstablishConnection(&callback); - SendRequestAndResponse(); + SendRequestAndResponse(sock_.get(), connected_sock_.get()); // Do a partial read and then exit. This test should not crash! scoped_refptr<IOBuffer> buf = base::MakeRefCounted<IOBuffer>(16); @@ -396,8 +283,8 @@ write_callback.callback(), TRAFFIC_ANNOTATION_FOR_TESTS); ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); if (rv == ERR_IO_PENDING) { - ReadServerData(bytes_written); - SendServerResponse(); + ReadDataOfExpectedLength(connected_sock_.get(), bytes_written); + SendServerResponse(connected_sock_.get()); rv = write_callback.WaitForResult(); break; } @@ -451,8 +338,8 @@ // run the write and read callbacks to make sure they can handle full duplex // communications. - ReadServerData(bytes_written); - SendServerResponse(); + ReadDataOfExpectedLength(connected_sock_.get(), bytes_written); + SendServerResponse(connected_sock_.get()); int rv = write_callback.WaitForResult(); EXPECT_GE(rv, 0);
diff --git a/net/ssl/ssl_platform_key_util.cc b/net/ssl/ssl_platform_key_util.cc index f78a378..38a8741 100644 --- a/net/ssl/ssl_platform_key_util.cc +++ b/net/ssl/ssl_platform_key_util.cc
@@ -8,7 +8,6 @@ #include "base/logging.h" #include "base/strings/string_piece.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "crypto/openssl_util.h" #include "net/cert/asn1_util.h" #include "net/cert/x509_certificate.h"
diff --git a/net/test/embedded_test_server/embedded_test_server.h b/net/test/embedded_test_server/embedded_test_server.h index 68d86548..7c5fa125 100644 --- a/net/test/embedded_test_server/embedded_test_server.h +++ b/net/test/embedded_test_server/embedded_test_server.h
@@ -20,7 +20,6 @@ #include "base/strings/string_piece.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "net/base/address_list.h" #include "net/base/host_port_pair.h" #include "net/base/ip_endpoint.h"
diff --git a/net/test/quic_simple_test_server.cc b/net/test/quic_simple_test_server.cc index 35741e2..5c855e3 100644 --- a/net/test/quic_simple_test_server.cc +++ b/net/test/quic_simple_test_server.cc
@@ -16,7 +16,6 @@ #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/quic/crypto/proof_source_chromium.h"
diff --git a/net/test/spawned_test_server/remote_test_server.h b/net/test/spawned_test_server/remote_test_server.h index d835eeda..ab5c1c5 100644 --- a/net/test/spawned_test_server/remote_test_server.h +++ b/net/test/spawned_test_server/remote_test_server.h
@@ -8,7 +8,6 @@ #include <string> #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/test/spawned_test_server/base_test_server.h" namespace net {
diff --git a/net/tools/quic/quic_http_proxy_backend.h b/net/tools/quic/quic_http_proxy_backend.h index 5a30e8be..7e730e4 100644 --- a/net/tools/quic/quic_http_proxy_backend.h +++ b/net/tools/quic/quic_http_proxy_backend.h
@@ -29,7 +29,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "net/third_party/quiche/src/quic/tools/quic_simple_server_backend.h" #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_builder.h"
diff --git a/pdf/paint_manager.cc b/pdf/paint_manager.cc index 18e8614..b29f0a95 100644 --- a/pdf/paint_manager.cc +++ b/pdf/paint_manager.cc
@@ -15,7 +15,6 @@ #include "base/check.h" #include "base/location.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "pdf/paint_ready_rect.h" #include "pdf/ppapi_migration/graphics.h" #include "ui/gfx/geometry/point.h"
diff --git a/ppapi/proxy/plugin_globals.cc b/ppapi/proxy/plugin_globals.cc index 32d584c..6cba804 100644 --- a/ppapi/proxy/plugin_globals.cc +++ b/ppapi/proxy/plugin_globals.cc
@@ -11,7 +11,6 @@ #include "base/task/task_runner.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "ipc/ipc_message.h" #include "ipc/ipc_sender.h" #include "ppapi/proxy/plugin_dispatcher.h"
diff --git a/ppapi/proxy/plugin_globals.h b/ppapi/proxy/plugin_globals.h index 25b5633..6631e8f6 100644 --- a/ppapi/proxy/plugin_globals.h +++ b/ppapi/proxy/plugin_globals.h
@@ -11,7 +11,6 @@ #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/threading/thread_local_storage.h" -#include "base/time/time.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource_tracker.h" #include "ppapi/proxy/plugin_var_tracker.h"
diff --git a/ppapi/proxy/ppapi_proxy_test.h b/ppapi/proxy/ppapi_proxy_test.h index 87afca3..47c8c22 100644 --- a/ppapi/proxy/ppapi_proxy_test.h +++ b/ppapi/proxy/ppapi_proxy_test.h
@@ -17,7 +17,6 @@ #include "base/test/task_environment.h" #include "base/threading/simple_thread.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "ppapi/c/pp_instance.h" #include "ppapi/proxy/host_dispatcher.h" #include "ppapi/proxy/plugin_dispatcher.h"
diff --git a/remoting/BUILD.gn b/remoting/BUILD.gn index a1770e31..fec1448 100644 --- a/remoting/BUILD.gn +++ b/remoting/BUILD.gn
@@ -57,7 +57,7 @@ } } - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { deps += [ "//remoting/host/linux:remoting_dev_me2me_host", "//remoting/host/linux:remoting_user_session",
diff --git a/remoting/base/oauth_token_getter_proxy_unittest.cc b/remoting/base/oauth_token_getter_proxy_unittest.cc index b73170d..7427ca0 100644 --- a/remoting/base/oauth_token_getter_proxy_unittest.cc +++ b/remoting/base/oauth_token_getter_proxy_unittest.cc
@@ -13,7 +13,6 @@ #include "base/threading/thread.h" #include "base/threading/thread_checker.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace remoting {
diff --git a/remoting/base/queued_task_poster_unittest.cc b/remoting/base/queued_task_poster_unittest.cc index f6e6b84b..6f3b5dea 100644 --- a/remoting/base/queued_task_poster_unittest.cc +++ b/remoting/base/queued_task_poster_unittest.cc
@@ -14,7 +14,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace remoting {
diff --git a/remoting/client/client_context.h b/remoting/client/client_context.h index 66e1be1..2f3cc8e 100644 --- a/remoting/client/client_context.h +++ b/remoting/client/client_context.h
@@ -6,7 +6,6 @@ #define REMOTING_CLIENT_CLIENT_CONTEXT_H_ #include "base/threading/thread.h" -#include "base/time/time.h" namespace base { class SingleThreadTaskRunner;
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index 0955e6f..f348b65 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -451,7 +451,7 @@ ] } - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { sources += [ "linux/audio_pipe_reader.cc", "linux/audio_pipe_reader.h", @@ -482,7 +482,7 @@ "//ui/events/platform/x11", "//ui/gfx/x", ] - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { deps += [ "//build/config/linux/gtk" ] } } @@ -494,7 +494,7 @@ sources += [ "desktop_resizer_linux.cc" ] } - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { sources += [ "audio_capturer_linux.cc", "audio_capturer_linux.h", @@ -753,7 +753,7 @@ sources += [ "pairing_registry_delegate_linux_unittest.cc" ] } - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { deps += [ "//remoting/host/linux:unit_tests" ] }
diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index 92c243d..a2be0a4 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc
@@ -18,7 +18,6 @@ #include "base/notreached.h" #include "base/process/process_handle.h" #include "base/task/bind_post_task.h" -#include "base/time/time.h" #include "build/build_config.h" #include "ipc/ipc_channel_proxy.h" #include "ipc/ipc_message.h"
diff --git a/remoting/host/host_power_save_blocker_unittest.cc b/remoting/host/host_power_save_blocker_unittest.cc index 4066cd2..09065b7 100644 --- a/remoting/host/host_power_save_blocker_unittest.cc +++ b/remoting/host/host_power_save_blocker_unittest.cc
@@ -9,7 +9,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "remoting/host/host_status_monitor.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/remoting/host/it2me/BUILD.gn b/remoting/host/it2me/BUILD.gn index 476ef83..a991344 100644 --- a/remoting/host/it2me/BUILD.gn +++ b/remoting/host/it2me/BUILD.gn
@@ -48,7 +48,7 @@ "it2me_native_messaging_host.h", ] - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { sources += [ "it2me_confirmation_dialog_linux.cc" ] } @@ -92,7 +92,7 @@ "//services/network/public/cpp:cpp", ] - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { deps += [ "//build/config/linux/gtk", "//ui/base:base", @@ -203,7 +203,7 @@ "//ui/gfx", ] - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { deps += [ "//build/config/linux/gtk", "//ui/events/platform/x11",
diff --git a/remoting/host/it2me/it2me_confirmation_dialog_proxy_unittest.cc b/remoting/host/it2me/it2me_confirmation_dialog_proxy_unittest.cc index cd21ab9..5e2904e9 100644 --- a/remoting/host/it2me/it2me_confirmation_dialog_proxy_unittest.cc +++ b/remoting/host/it2me/it2me_confirmation_dialog_proxy_unittest.cc
@@ -13,7 +13,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/remoting/host/mouse_cursor_monitor_proxy_unittest.cc b/remoting/host/mouse_cursor_monitor_proxy_unittest.cc index f586f2ec5..9b897cc 100644 --- a/remoting/host/mouse_cursor_monitor_proxy_unittest.cc +++ b/remoting/host/mouse_cursor_monitor_proxy_unittest.cc
@@ -13,7 +13,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "remoting/host/mouse_cursor_monitor_proxy.h" #include "remoting/protocol/protocol_mock_objects.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/remoting/host/native_messaging/native_messaging_reader.h b/remoting/host/native_messaging/native_messaging_reader.h index eceb5501..b3710463 100644 --- a/remoting/host/native_messaging/native_messaging_reader.h +++ b/remoting/host/native_messaging/native_messaging_reader.h
@@ -11,7 +11,6 @@ #include "base/files/file.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace base { class SequencedTaskRunner;
diff --git a/remoting/host/remote_open_url/BUILD.gn b/remoting/host/remote_open_url/BUILD.gn index cf7486b2..9cbddef 100644 --- a/remoting/host/remote_open_url/BUILD.gn +++ b/remoting/host/remote_open_url/BUILD.gn
@@ -38,7 +38,7 @@ public_deps = [ "//remoting/proto" ] - if (is_linux && !is_chromeos_lacros) { + if (is_linux) { sources += [ "remote_open_url_client_delegate_linux.cc", "remote_open_url_client_delegate_linux.h",
diff --git a/remoting/host/security_key/security_key_message_reader_impl.h b/remoting/host/security_key/security_key_message_reader_impl.h index 413ed56..52d668a 100644 --- a/remoting/host/security_key/security_key_message_reader_impl.h +++ b/remoting/host/security_key/security_key_message_reader_impl.h
@@ -11,7 +11,6 @@ #include "base/files/file.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "remoting/host/security_key/security_key_message.h" #include "remoting/host/security_key/security_key_message_reader.h"
diff --git a/remoting/host/security_key/security_key_message_writer_impl_unittest.cc b/remoting/host/security_key/security_key_message_writer_impl_unittest.cc index 1df43b2..2ac691d7 100644 --- a/remoting/host/security_key/security_key_message_writer_impl_unittest.cc +++ b/remoting/host/security_key/security_key_message_writer_impl_unittest.cc
@@ -13,7 +13,6 @@ #include "base/task/task_runner_util.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "remoting/host/security_key/security_key_message.h" #include "remoting/host/setup/test_util.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/remoting/host/setup/me2me_native_messaging_host_unittest.cc b/remoting/host/setup/me2me_native_messaging_host_unittest.cc index e74bd95..2bce5ef 100644 --- a/remoting/host/setup/me2me_native_messaging_host_unittest.cc +++ b/remoting/host/setup/me2me_native_messaging_host_unittest.cc
@@ -20,7 +20,6 @@ #include "base/run_loop.h" #include "base/strings/stringize_macros.h" #include "base/test/task_environment.h" -#include "base/time/time.h" #include "base/values.h" #include "google_apis/gaia/gaia_oauth_client.h" #include "net/base/file_stream.h"
diff --git a/sandbox/policy/linux/sandbox_linux.cc b/sandbox/policy/linux/sandbox_linux.cc index d2e85c57..6e744e6 100644 --- a/sandbox/policy/linux/sandbox_linux.cc +++ b/sandbox/policy/linux/sandbox_linux.cc
@@ -28,7 +28,6 @@ #include "base/posix/eintr_wrapper.h" #include "base/strings/string_number_conversions.h" #include "base/system/sys_info.h" -#include "base/time/time.h" #include "build/build_config.h" #include "ppapi/buildflags/buildflags.h" #include "sandbox/constants.h"
diff --git a/services/audio/stream_factory.h b/services/audio/stream_factory.h index 72ef86a..df1f77d 100644 --- a/services/audio/stream_factory.h +++ b/services/audio/stream_factory.h
@@ -15,7 +15,6 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "media/media_buildflags.h" #include "media/mojo/mojom/audio_logging.mojom.h" #include "media/mojo/mojom/audio_output_stream.mojom.h"
diff --git a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc index 12aa626e..866e93e4 100644 --- a/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc +++ b/services/cert_verifier/cert_net_url_loader/cert_net_fetcher_url_loader_unittest.cc
@@ -13,7 +13,6 @@ #include "base/message_loop/message_pump_type.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" -#include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "net/cert/cert_net_fetcher.h" #include "net/cert/ct_policy_enforcer.h"
diff --git a/services/device/geolocation/geolocation_provider_impl.cc b/services/device/geolocation/geolocation_provider_impl.cc index 677f90ab..3ad39d7 100644 --- a/services/device/geolocation/geolocation_provider_impl.cc +++ b/services/device/geolocation/geolocation_provider_impl.cc
@@ -18,7 +18,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/default_tick_clock.h" -#include "base/time/time.h" #include "build/build_config.h" #include "net/base/network_change_notifier.h" #include "services/device/geolocation/location_arbitrator.h"
diff --git a/services/device/wake_lock/power_save_blocker/power_save_blocker_mac.cc b/services/device/wake_lock/power_save_blocker/power_save_blocker_mac.cc index de3c87b4..82fee71 100644 --- a/services/device/wake_lock/power_save_blocker/power_save_blocker_mac.cc +++ b/services/device/wake_lock/power_save_blocker/power_save_blocker_mac.cc
@@ -14,7 +14,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/platform_thread.h" #include "base/threading/thread.h" -#include "base/time/time.h" namespace device { namespace {
diff --git a/services/network/public/cpp/corb/corb_impl_unittest.cc b/services/network/public/cpp/corb/corb_impl_unittest.cc index de41165..4c1fef98 100644 --- a/services/network/public/cpp/corb/corb_impl_unittest.cc +++ b/services/network/public/cpp/corb/corb_impl_unittest.cc
@@ -1081,7 +1081,7 @@ // range specified, so we can get away with testing with arbitrary/random // values. { - "Allowed: Javascript 206", + "Blocked-by-ORB: Javascript 206", __LINE__, "http://www.b.com/script.js", // target_url "http://www.a.com/", // initiator_origin @@ -1117,7 +1117,7 @@ kVerdictPacketForHeadersBasedVerdict, // verdict_packet }, { - "Allowed: text/plain 206 media", + "Blocked-by-ORB: text/plain 206 media", __LINE__, "http://www.b.com/movie.txt", // target_url "http://www.a.com/", // initiator_origin @@ -1142,12 +1142,82 @@ "text/html", // response_content_type MimeType::kHtml, // canonical_mime_type MimeTypeBucket::kProtected, // mime_type_bucket - {"simulated *middle*-of-html content"}, // packets + {"these middle bytes are unsniffable"}, // packets false, // resource_is_sensitive CrossOriginProtectionDecision::kBlock, // protection_decision Verdict::kBlock, // verdict kVerdictPacketForHeadersBasedVerdict, // verdict_packet }, + { + "Blocked-by-ORB: application/octet-stream 206 (middle)", + __LINE__, + "http://www.b.com/movie.html", // target_url + "http://www.a.com/", // initiator_origin + "HTTP/1.1 206 OK\n" + "Content-Range: bytes 200-1000/67589", // response_headers + "application/octet-stream", // response_content_type + MimeType::kOthers, // canonical_mime_type + MimeTypeBucket::kProtected, // mime_type_bucket + {"these middle bytes are unsniffable"}, // packets + false, // resource_is_sensitive + CrossOriginProtectionDecision::kBlock, // protection_decision + Verdict::kAllow, // verdict + kVerdictPacketForHeadersBasedVerdict, // verdict_packet + }, + { + "Allowed: application/octet-stream 206 media - beginning of video", + __LINE__, + "http://www.b.com/movie.mp4", // target_url + "http://www.a.com/", // initiator_origin + "HTTP/1.1 206 OK\n" + "Content-Range: bytes 0-800/67589", // response_headers + "application/octet-stream", // response_content_type + MimeType::kOthers, // canonical_mime_type + MimeTypeBucket::kProtected, // mime_type_bucket + // Body of test response is based on: + // 1) net/base/mime_sniffer.cc + // 2) https://mimesniff.spec.whatwg.org/#signature-for-mp4 + {"....ftypmp4...."}, // packets + false, // resource_is_sensitive + CrossOriginProtectionDecision::kAllow, // protection_decision + Verdict::kAllow, // verdict + kVerdictPacketForHeadersBasedVerdict, // verdict_packet + }, + { + "Allowed: video/mp4 206 media - beginning of resource", + __LINE__, + "http://www.b.com/movie.mp4", // target_url + "http://www.a.com/", // initiator_origin + "HTTP/1.1 206 OK\n" + "Content-Range: bytes 0-800/67589", // response_headers + "video/mp4", // response_content_type + MimeType::kOthers, // canonical_mime_type + MimeTypeBucket::kProtected, // mime_type_bucket + // Body of test response is based on: + // 1) net/base/mime_sniffer.cc + // 2) https://mimesniff.spec.whatwg.org/#signature-for-mp4 + {"MIME type means this doesn't have to sniff as video"}, // packets + false, // resource_is_sensitive + CrossOriginProtectionDecision::kAllow, // protection_decision + Verdict::kAllow, // verdict + kVerdictPacketForHeadersBasedVerdict, // verdict_packet + }, + { + "Allowed: video/mp4 206 media - middle of resource", + __LINE__, + "http://www.b.com/movie.mp4", // target_url + "http://www.a.com/", // initiator_origin + "HTTP/1.1 206 OK\n" + "Content-Range: bytes 200-1000/67589", // response_headers + "video/mp4", // response_content_type + MimeType::kOthers, // canonical_mime_type + MimeTypeBucket::kProtected, // mime_type_bucket + {"these middle bytes are unsniffable"}, // packets + false, // resource_is_sensitive + CrossOriginProtectionDecision::kAllow, // protection_decision + Verdict::kAllow, // verdict + kVerdictPacketForHeadersBasedVerdict, // verdict_packet + }, // Responses with no data. { "Allowed: same-origin 204 response with no data", @@ -2239,8 +2309,9 @@ // request to the same URL and that earlier request was classified (based on // the MIME type or sniffing) as an audio-or-video response. base::StringPiece description = scenario.description; - if (description == "Allowed: text/plain 206 media" || - description == "Allowed: Javascript 206") { + if (description == "Blocked-by-ORB: text/plain 206 media" || + description == "Blocked-by-ORB: Javascript 206" || + description == "Blocked-by-ORB: application/octet-stream 206 (middle)") { scenario.verdict = Verdict::kBlock; scenario.verdict_packet = kVerdictPacketForHeadersBasedVerdict; }
diff --git a/services/network/public/cpp/corb/orb_impl.cc b/services/network/public/cpp/corb/orb_impl.cc index 86076a0..317971cb9 100644 --- a/services/network/public/cpp/corb/orb_impl.cc +++ b/services/network/public/cpp/corb/orb_impl.cc
@@ -45,7 +45,8 @@ // (with only HTML/XML/JSON sniffing current implementation wouldn't block // such non-webby images anyway). // - The current implementation reduces risk of blocking range requests for - // non-sniffable types. + // A) non-sniffable types and B) range responses for middle-of-resource + // when first-bytes-response wasn't seen earlier. constexpr auto kCaseInsensitive = base::CompareCase::INSENSITIVE_ASCII; if (base::StartsWith(mime_type, "audio/", kCaseInsensitive) || base::StartsWith(mime_type, "video/", kCaseInsensitive)) { @@ -269,6 +270,15 @@ break; case CrossOriginReadBlocking::MimeType::kOthers: + // TODO(lukasza): Departure from the spec: The implementation below + // allows any response with an audio/video MIME type. For more details + // please see *all* TODO comments in the IsAudioOrVideoMimeType function + // and also the "ORB v0.1 vs full ORB differences" section in the + // "Gradual CORB -> ORB transition" doc. + if (IsAudioOrVideoMimeType(mime_type_)) + return Decision::kAllow; + break; + case CrossOriginReadBlocking::MimeType::kInvalidMimeType: break; } @@ -305,12 +315,7 @@ // 7. If the audio or video type pattern matching algorithm given bytes does // not return undefined, then: - // - // TODO(lukasza): Inspecting `mime_type_` (in addition to `sniffed_mime_type`) - // is a departure from the spec. For more details please see *all* 3 of the - // TODO comments in the IsAudioOrVideoMimeType function. - if (IsAudioOrVideoMimeType(sniffed_mime_type) || - IsAudioOrVideoMimeType(mime_type_)) { + if (IsAudioOrVideoMimeType(sniffed_mime_type)) { // i. Append (request's opaque media identifier, request's current URL) to // the user agent's opaque-safelisted requesters set. StoreAllowedAudioVideoRequest(final_request_url_);
diff --git a/services/network/public/cpp/network_connection_tracker_unittest.cc b/services/network/public/cpp/network_connection_tracker_unittest.cc index 4eef6cf..cfc2a73 100644 --- a/services/network/public/cpp/network_connection_tracker_unittest.cc +++ b/services/network/public/cpp/network_connection_tracker_unittest.cc
@@ -14,7 +14,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_checker.h" -#include "base/time/time.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/services/network/transitional_url_loader_factory_owner_unittest.cc b/services/network/transitional_url_loader_factory_owner_unittest.cc index 25bd6b61..3de85c5 100644 --- a/services/network/transitional_url_loader_factory_owner_unittest.cc +++ b/services/network/transitional_url_loader_factory_owner_unittest.cc
@@ -12,7 +12,6 @@ #include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "net/test/embedded_test_server/default_handlers.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
diff --git a/services/proxy_resolver/proxy_resolver_v8_tracing.cc b/services/proxy_resolver/proxy_resolver_v8_tracing.cc index 63fc2ae..4390e878 100644 --- a/services/proxy_resolver/proxy_resolver_v8_tracing.cc +++ b/services/proxy_resolver/proxy_resolver_v8_tracing.cc
@@ -21,7 +21,6 @@ #include "base/threading/thread_checker.h" #include "base/threading/thread_restrictions.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "net/base/ip_address.h" #include "net/base/net_errors.h"
diff --git a/services/service_manager/background_service_manager.h b/services/service_manager/background_service_manager.h index b7df2b3..438791d 100644 --- a/services/service_manager/background_service_manager.h +++ b/services/service_manager/background_service_manager.h
@@ -9,7 +9,6 @@ #include <vector> #include "base/threading/thread.h" -#include "base/time/time.h" #include "build/build_config.h" #include "services/service_manager/public/cpp/manifest.h" #include "services/service_manager/public/mojom/connector.mojom.h"
diff --git a/services/service_manager/public/cpp/service_executable/service_executable_environment.h b/services/service_manager/public/cpp/service_executable/service_executable_environment.h index 5a3aeb0..4c32cc68 100644 --- a/services/service_manager/public/cpp/service_executable/service_executable_environment.h +++ b/services/service_manager/public/cpp/service_executable/service_executable_environment.h
@@ -6,7 +6,6 @@ #define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_EXECUTABLE_SERVICE_EXECUTABLE_ENVIRONMENT_H_ #include "base/threading/thread.h" -#include "base/time/time.h" #include "mojo/core/embedder/scoped_ipc_support.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "services/service_manager/public/mojom/service.mojom.h"
diff --git a/services/viz/public/cpp/gpu/client_gpu_memory_buffer_manager.h b/services/viz/public/cpp/gpu/client_gpu_memory_buffer_manager.h index 018c3215..22847985 100644 --- a/services/viz/public/cpp/gpu/client_gpu_memory_buffer_manager.h +++ b/services/viz/public/cpp/gpu/client_gpu_memory_buffer_manager.h
@@ -14,7 +14,6 @@ #include "base/memory/unsafe_shared_memory_pool.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h"
diff --git a/services/viz/public/cpp/gpu/gpu_unittest.cc b/services/viz/public/cpp/gpu/gpu_unittest.cc index 39082d3..2973522 100644 --- a/services/viz/public/cpp/gpu/gpu_unittest.cc +++ b/services/viz/public/cpp/gpu/gpu_unittest.cc
@@ -14,7 +14,6 @@ #include "base/run_loop.h" #include "base/synchronization/waitable_event.h" #include "base/test/task_environment.h" -#include "base/time/time.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "gpu/config/gpu_feature_info.h"
diff --git a/storage/browser/blob/blob_reader.cc b/storage/browser/blob/blob_reader.cc index 9a801c2..a3eede48 100644 --- a/storage/browser/blob/blob_reader.cc +++ b/storage/browser/blob/blob_reader.cc
@@ -16,7 +16,6 @@ #include "base/callback_helpers.h" #include "base/memory/ptr_util.h" #include "base/task/thread_pool.h" -#include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h"
diff --git a/storage/browser/file_system/local_file_stream_writer_unittest.cc b/storage/browser/file_system/local_file_stream_writer_unittest.cc index 53fc9bb..1648557 100644 --- a/storage/browser/file_system/local_file_stream_writer_unittest.cc +++ b/storage/browser/file_system/local_file_stream_writer_unittest.cc
@@ -15,7 +15,6 @@ #include "base/files/scoped_temp_dir.h" #include "base/memory/ptr_util.h" #include "base/run_loop.h" -#include "base/time/time.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/base/test_completion_callback.h"
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index f758b9f..f84a24e6 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -8178,7 +8178,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -8682,7 +8682,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index a52cc6d..3559d619 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -45929,7 +45929,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -46433,7 +46433,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -46941,7 +46941,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -47445,7 +47445,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48020,7 +48020,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -48524,7 +48524,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -49099,7 +49099,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}", @@ -49603,7 +49603,7 @@ { "cipd_package": "chromium/testing/weblayer-x86", "location": "weblayer_instrumentation_test_M100", - "revision": "version:100.0.4896.73" + "revision": "version:100.0.4896.75" }, { "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 351bf3d..fd1148e 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5795,7 +5795,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -5803,14 +5803,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [ @@ -5937,7 +5937,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -5945,14 +5945,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index e078b8b..afda841 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -86115,7 +86115,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -86123,14 +86123,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -86232,7 +86232,7 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "isolate_profile_data": true, @@ -86240,14 +86240,14 @@ "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -87614,21 +87614,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [ @@ -87756,21 +87756,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [ @@ -89311,21 +89311,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [ @@ -89453,21 +89453,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "dimension_sets": [ @@ -90204,21 +90204,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -90300,21 +90300,21 @@ }, { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome", "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4977.0", + "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4978.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v102.0.4977.0", - "revision": "version:102.0.4977.0" + "location": "lacros_version_skew_tests_v102.0.4978.0", + "revision": "version:102.0.4978.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 9c4b6cd5..64d3d6d 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -1804,7 +1804,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1825,7 +1825,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1845,7 +1845,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1866,7 +1866,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5273,7 +5273,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5294,7 +5294,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5316,7 +5316,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5338,7 +5338,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5359,7 +5359,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5380,7 +5380,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5402,7 +5402,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5423,7 +5423,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5446,7 +5446,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5467,7 +5467,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5488,7 +5488,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5509,7 +5509,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5530,7 +5530,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5551,7 +5551,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5573,7 +5573,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5594,7 +5594,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5615,7 +5615,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5637,7 +5637,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5662,7 +5662,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5685,7 +5685,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5706,7 +5706,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5727,7 +5727,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5748,7 +5748,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5769,7 +5769,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5790,7 +5790,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5811,7 +5811,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5832,7 +5832,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5853,7 +5853,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5874,7 +5874,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5895,7 +5895,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5916,7 +5916,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5938,7 +5938,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -5960,7 +5960,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -5981,7 +5981,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6002,7 +6002,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6023,7 +6023,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6044,7 +6044,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6065,7 +6065,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6086,7 +6086,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6107,7 +6107,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6128,7 +6128,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6149,7 +6149,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6170,7 +6170,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6191,7 +6191,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6212,7 +6212,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6233,7 +6233,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6254,7 +6254,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6275,7 +6275,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6296,7 +6296,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6318,7 +6318,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6339,7 +6339,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6360,7 +6360,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6381,7 +6381,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6402,7 +6402,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6423,7 +6423,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6444,7 +6444,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6465,7 +6465,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6486,7 +6486,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6507,7 +6507,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6528,7 +6528,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6549,7 +6549,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6570,7 +6570,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -6593,7 +6593,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6614,7 +6614,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6635,7 +6635,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6656,7 +6656,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6677,7 +6677,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6698,7 +6698,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6719,7 +6719,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6740,7 +6740,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6761,7 +6761,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6782,7 +6782,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6803,7 +6803,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6824,7 +6824,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6845,7 +6845,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6866,7 +6866,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6887,7 +6887,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6908,7 +6908,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6929,7 +6929,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6950,7 +6950,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6971,7 +6971,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -6992,7 +6992,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7013,7 +7013,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7035,7 +7035,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7057,7 +7057,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7078,7 +7078,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7099,7 +7099,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7120,7 +7120,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7141,7 +7141,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7162,7 +7162,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7183,7 +7183,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7204,7 +7204,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7229,7 +7229,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7250,7 +7250,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7272,7 +7272,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7294,7 +7294,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7315,7 +7315,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7336,7 +7336,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7357,7 +7357,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7378,7 +7378,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7399,7 +7399,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7420,7 +7420,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7442,7 +7442,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7463,7 +7463,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7484,7 +7484,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7505,7 +7505,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7528,7 +7528,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7549,7 +7549,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7570,7 +7570,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7591,7 +7591,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7612,7 +7612,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7633,7 +7633,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7654,7 +7654,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7675,7 +7675,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7696,7 +7696,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7717,7 +7717,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -7739,7 +7739,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7760,7 +7760,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7781,7 +7781,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7802,7 +7802,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7823,7 +7823,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7844,7 +7844,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7865,7 +7865,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7886,7 +7886,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7907,7 +7907,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7928,7 +7928,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7949,7 +7949,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7970,7 +7970,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -7991,7 +7991,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8012,7 +8012,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8033,7 +8033,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8054,7 +8054,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8075,7 +8075,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8096,7 +8096,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8117,7 +8117,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8138,7 +8138,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8159,7 +8159,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -8181,7 +8181,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8202,7 +8202,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8223,7 +8223,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8244,7 +8244,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8265,7 +8265,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8286,7 +8286,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8307,7 +8307,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8328,7 +8328,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8349,7 +8349,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8370,7 +8370,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8391,7 +8391,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8412,7 +8412,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8433,7 +8433,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8454,7 +8454,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8475,7 +8475,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8496,7 +8496,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8517,7 +8517,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8538,7 +8538,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8559,7 +8559,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8580,7 +8580,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8601,7 +8601,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8622,7 +8622,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8643,7 +8643,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8664,7 +8664,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8685,7 +8685,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8706,7 +8706,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8727,7 +8727,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8748,7 +8748,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8769,7 +8769,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8790,7 +8790,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8811,7 +8811,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8832,7 +8832,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8853,7 +8853,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8874,7 +8874,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8895,7 +8895,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8916,7 +8916,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8937,7 +8937,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8958,7 +8958,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -8979,7 +8979,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -9001,7 +9001,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -9022,7 +9022,7 @@ "dimension_sets": [ { "cpu": "x86-64", - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -12519,7 +12519,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-16.04" + "os": "Ubuntu-18.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index 7e4a02e..2f2ebb3 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -498,11 +498,6 @@ -ClientHintsBrowserTest.SwitchNotJson -ClientHintsBrowserTest.SwitchOriginNotSecure -CollectedCookiesTest.InvokeUi_default --CommandServiceTest.GetExtensionActionCommandQueryActive --CommandServiceTest.GetExtensionActionCommandQueryAll --CommandServiceTest.GetNamedCommandsQueryAll --CommandServiceTest.RemoveKeybindingPrefsShouldBePlatformSpecific --CommandServiceTest.RemoveShortcutSurvivesUpdate -CommerceHintAddToCartPatternTest.AddToCartByForm -CommerceHintAddToCartPatternTest.AddToCartByURL -CommerceHintAgentFencedFrameTest.VisitCartInFencedFrame
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 6be9f26f..ea72ab5e 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -28,16 +28,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4977.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v102.0.4978.0/test_ash_chrome', '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter', ], - 'identifier': 'Lacros version skew testing ash 102.0.4977.0', + 'identifier': 'Lacros version skew testing ash 102.0.4978.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v102.0.4977.0', - 'revision': 'version:102.0.4977.0', + 'location': 'lacros_version_skew_tests_v102.0.4978.0', + 'revision': 'version:102.0.4978.0', }, ], }, @@ -483,7 +483,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M100', - 'revision': 'version:100.0.4896.73', + 'revision': 'version:100.0.4896.75', } ], }, @@ -627,7 +627,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M100', - 'revision': 'version:100.0.4896.73', + 'revision': 'version:100.0.4896.75', } ], }, @@ -771,7 +771,7 @@ { 'cipd_package': 'chromium/testing/weblayer-x86', 'location': 'weblayer_instrumentation_test_M100', - 'revision': 'version:100.0.4896.73', + 'revision': 'version:100.0.4896.75', } ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index d2ec62a..0e54f09 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -5444,7 +5444,7 @@ }, 'Linux ASan Tests (sandboxed)': { 'mixins': [ - 'linux-xenial', + 'linux-bionic', ], 'test_suites': { 'gtest_tests': 'sandboxed_chromium_memory_linux_gtests', @@ -5474,7 +5474,7 @@ }, 'Linux ChromiumOS MSan Tests': { 'mixins': [ - 'linux-xenial', + 'linux-bionic', 'x86-64', ], 'test_suites': { @@ -5488,7 +5488,7 @@ }, 'Linux MSan Tests': { 'mixins': [ - 'linux-xenial', + 'linux-bionic', 'x86-64', ], 'test_suites': { @@ -5522,7 +5522,7 @@ }, 'WebKit Linux ASAN': { 'mixins': [ - 'linux-xenial', + 'linux-bionic', ], 'test_suites': { 'isolated_scripts': 'chromium_webkit_isolated_scripts',
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py index 7404317..c3117110 100755 --- a/testing/scripts/run_finch_smoke_tests_android.py +++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -88,8 +88,6 @@ super(FinchTestCase, self).__init__() self._device = device self.parse_args() - self.output_directory = os.path.join(SRC_DIR, 'out', self.options.target) - self.mojo_js_directory = os.path.join(self.output_directory, 'gen') self.browser_package_name = apk_helper.GetPackageName( self.options.browser_apk) self.browser_activity_name = (self.options.browser_activity_name or @@ -109,10 +107,6 @@ def product_name(cls): raise NotImplementedError - @classmethod - def wpt_product_name(cls): - raise NotImplementedError - @property def tests(self): return [ @@ -164,23 +158,8 @@ @property def rest_args(self): rest_args = super(FinchTestCase, self).rest_args - # Update the output directory to the default if it's not set. - self.maybe_set_default_isolated_script_test_output() - # Here we add all of the arguments required to run WPT tests on Android. rest_args.extend([ - os.path.join(SRC_DIR, 'third_party', 'wpt_tools', 'wpt', 'wpt')]) - - # By default, WPT will treat unexpected passes as errors, so we disable - # that to be consistent with Chromium CI. - rest_args.extend(['--no-fail-on-unexpected-pass']) - - # vpython has packages needed by wpt, so force it to skip the setup - rest_args.extend(['--venv=' + SRC_DIR, '--skip-venv-setup']) - - rest_args.extend(['run', - self.wpt_product_name(), - '--tests=' + wpt_common.TESTS_ROOT_DIR, '--device-serial', self._device.serial, '--webdriver-binary', @@ -190,11 +169,6 @@ '--package-name', self.browser_package_name, '--keep-app-data-directory', - '--no-pause-after-test', - '--no-capture-stdio', - '--no-manifest-download', - '--enable-mojojs', - '--mojojs-path=' + self.mojo_js_directory, ]) for binary_arg in self.browser_command_line_args(): @@ -203,18 +177,10 @@ for test in self.tests: rest_args.extend(['--include', test]) - if self.options.verbose >= 3: - rest_args.extend(['--log-mach=-', '--log-mach-level=debug', - '--log-mach-verbose']) - - if self.options.verbose >= 4: - rest_args.extend(['--webdriver-arg=--verbose', - '--webdriver-arg="--log-path=-"']) - return rest_args @classmethod - def add_extra_arguments(cls, parser): + def add_common_arguments(cls, parser): parser.add_argument('--test-case', choices=TEST_CASES.keys(), # TODO(rmhasan): Remove default values after @@ -242,10 +208,6 @@ parser.add_argument('--browser-activity-name', action='store', help='Browser activity name') - parser.add_argument('--target', - action='store', - default='Release', - help='Build configuration') parser.add_argument('--fake-variations-channel', action='store', default='stable', @@ -253,9 +215,10 @@ help='Finch seed release channel') add_emulator_args(parser) - script_common.AddDeviceArguments(parser) - script_common.AddEnvironmentArguments(parser) - logging_common.AddLoggingArguments(parser) + + def add_extra_arguments(self, parser): + super(FinchTestCase, self).add_extra_arguments(parser) + self.add_common_arguments(parser) @contextlib.contextmanager def _install_apks(self): @@ -554,13 +517,21 @@ for p in [ChromeFinchTestCase, WebViewFinchTestCase, WebLayerFinchTestCase]}) + # Unfortunately, there's a circular dependency between the parser made + # available from `FinchTestCase.add_extra_arguments` and the selection of the + # correct test case. The workaround is a second parser used in `main` only + # that shares some arguments with the script adapter parser. The second parser + # handles --help, so not all arguments are documented. Important arguments + # added by the script adapter are re-added here for visibility. parser = argparse.ArgumentParser() - - FinchTestCase.add_extra_arguments(parser) + FinchTestCase.add_common_arguments(parser) parser.add_argument( '--isolated-script-test-output', type=str, required=False, help='path to write test results JSON object to') + script_common.AddDeviceArguments(parser) + script_common.AddEnvironmentArguments(parser) + logging_common.AddLoggingArguments(parser) options, _ = parser.parse_known_args(args) with get_device(options) as device, \
diff --git a/testing/scripts/run_wpt_tests.py b/testing/scripts/run_wpt_tests.py index 8980be4b..5989c00 100755 --- a/testing/scripts/run_wpt_tests.py +++ b/testing/scripts/run_wpt_tests.py
@@ -44,7 +44,6 @@ OUT_DIR, "Chromium.app", "Contents", "MacOS", "Chromium") CHROMEDRIVER_BINARY = os.path.join(OUT_DIR, "chromedriver") -MOJO_JS_PATH = os.path.join(OUT_DIR, "gen") class WPTTestAdapter(wpt_common.BaseWptScriptAdapter): @@ -52,9 +51,6 @@ def rest_args(self): rest_args = super(WPTTestAdapter, self).rest_args - # Update the output directory to the default if it's not set. - self.maybe_set_default_isolated_script_test_output() - chrome = CHROME_BINARY.format(self.options.target) chromedriver = CHROMEDRIVER_BINARY.format(self.options.target) if self.port.host.platform.is_win(): @@ -65,12 +61,6 @@ # Here we add all of the arguments required to run WPT tests on Chrome. rest_args.extend([ - self.wpt_binary, - "--venv=" + SRC_DIR, - "--skip-venv-setup", - "run", - "chrome" - ] + self.options.test_list + [ "--binary=" + chrome, "--binary-arg=--host-resolver-rules=" "MAP nonexistent.*.test ~NOTFOUND, MAP *.test 127.0.0.1", @@ -81,15 +71,9 @@ "--webdriver-binary=" + chromedriver, "--webdriver-arg=--enable-chrome-logs", "--headless", - "--no-capture-stdio", - "--no-manifest-download", - "--no-pause-after-test", # Exclude webdriver tests for now. They are run separately on the CI "--exclude=webdriver", "--exclude=infrastructure/webdriver", - # By default, WPT will treat unexpected passes as errors, so we - # disable that to be consistent with Chromium CI. - "--no-fail-on-unexpected-pass", "--metadata", WPT_METADATA_OUTPUT_DIR.format(self.options.target), # By specifying metadata above, WPT will try to find manifest in the # metadata directory. So here we point it back to the correct path @@ -101,47 +85,38 @@ # update the manifest in cast it's stale. #"--no-manifest-update", "--manifest", WPT_WORKING_COPY_MANIFEST.format(self.options.target), - # (crbug.com/1023835) The flags below are temporary to aid debugging - "--log-mach=-", - "--log-mach-verbose", # See if multi-processing affects timeouts. # TODO(lpz): Consider removing --processes and compute automatically # from multiprocessing.cpu_count() "--processes=" + self.options.child_processes, - "--mojojs-path=" + MOJO_JS_PATH.format(self.options.target), - "--tests=" + wpt_common.TESTS_ROOT_DIR, - "--repeat=" + str(self.options.repeat), ]) + tests = list(self.options.test_list) if self.options.test_filter: - for pattern in self.options.test_filter.split(":"): - rest_args.extend([ + tests.extend(self.options.test_filter.split(":")) + for test_prefix in tests: + rest_args.extend([ "--include", - wpt_common.strip_wpt_root_prefix(pattern), - ]) + self.path_finder.strip_wpt_path(test_prefix), + ]) return rest_args def add_extra_arguments(self, parser): - target_help = "Specify the target build subdirectory under src/out/" - parser.add_argument("-t", "--target", dest="target", default="Release", - help=target_help) + super(WPTTestAdapter, self).add_extra_arguments(parser) child_processes_help = "Number of drivers to run in parallel" parser.add_argument("-j", "--child-processes", dest="child_processes", default="1", help=child_processes_help) - parser.add_argument("--repeat", "--gtest_repeat", type=int, default=1, - help="Number of times to run the tests") parser.add_argument("--test-filter", "--gtest_filter", help="Colon-separated list of test names " "(URL prefixes)") - # TODO(crbug/1306222): wptrunner currently cannot rerun individual - # failed tests, so this flag is unused. - parser.add_argument("--test-launcher-retry-limit", type=int, default=0, - help="Maximum number of times to rerun " - "a failed test") parser.add_argument("test_list", nargs="*", help="List of tests or test directories to run") + @classmethod + def wpt_product_name(cls): + return 'chrome' + def do_pre_test_run_tasks(self): # Copy the checked-in manifest to the temporary working directory shutil.copy(WPT_CHECKED_IN_MANIFEST,
diff --git a/testing/scripts/wpt_android_lib.py b/testing/scripts/wpt_android_lib.py index 21c6df43..95bfedf 100644 --- a/testing/scripts/wpt_android_lib.py +++ b/testing/scripts/wpt_android_lib.py
@@ -77,16 +77,6 @@ # Arguments from add_extra_argumentsparse were added so # its safe to parse the arguments and set self._options self.parse_args() - self.output_directory = os.path.join(SRC_DIR, 'out', self.options.target) - self.mojo_js_directory = os.path.join(self.output_directory, 'gen') - - def _wpt_report(self): - env = os.environ.copy() - if 'GTEST_SHARD_INDEX' in env: - shard_index = int(env['GTEST_SHARD_INDEX']) - return 'wpt_reports_%s_%02d.json' % (self.options.product, shard_index) - else: - return 'wpt_reports_%s.json' % self.options.product def get_version_provider_package_name(self): """Get the name of a package containing the product's version. @@ -118,23 +108,7 @@ def rest_args(self): rest_args = super(WPTAndroidAdapter, self).rest_args - # Update the output directory to the default if it's not set. - self.maybe_set_default_isolated_script_test_output() - - # Here we add all of the arguments required to run WPT tests on Android. - rest_args.extend([self.wpt_binary]) - - # By default, WPT will treat unexpected passes as errors, so we disable - # that to be consistent with Chromium CI. - rest_args.extend(['--no-fail-on-unexpected-pass']) - if self.options.default_exclude: - rest_args.extend(['--default-exclude']) - - # vpython has packages needed by wpt, so force it to skip the setup - rest_args.extend(['--venv=' + SRC_DIR, '--skip-venv-setup']) - - rest_args.extend(['run', - '--tests=' + wpt_common.TESTS_ROOT_DIR, + rest_args.extend([ '--webdriver-binary', self.options.webdriver_binary, '--symbols-path', @@ -142,22 +116,16 @@ '--stackwalk-binary', TOMBSTONE_PARSER, '--headless', - '--no-pause-after-test', - '--no-capture-stdio', - '--no-manifest-download', # Exclude webdriver tests for now. "--exclude=webdriver", "--exclude=infrastructure/webdriver", '--binary-arg=--enable-blink-features=MojoJS,MojoJSTest', '--binary-arg=--enable-blink-test-features', '--binary-arg=--disable-field-trial-config', - '--enable-mojojs', - '--mojojs-path=' + self.mojo_js_directory, '--binary-arg=--enable-features=DownloadService<DownloadServiceStudy', '--binary-arg=--force-fieldtrials=DownloadServiceStudy/Enabled', '--binary-arg=--force-fieldtrial-params=DownloadServiceStudy.Enabled:' 'start_up_delay_ms/0', - '--repeat=' + str(self.options.repeat), ]) for device in self._devices: @@ -168,21 +136,6 @@ if self._metadata_dir: rest_args.extend(['--metadata', self._metadata_dir]) - if self.options.verbose >= 3: - rest_args.extend(['--log-mach=-', '--log-mach-level=debug', - '--log-mach-verbose']) - - if self.options.verbose >= 4: - rest_args.extend(['--webdriver-arg=--verbose', - '--webdriver-arg="--log-path=-"']) - - if self.options.log_wptreport: - wpt_output = self.options.isolated_script_test_output - self.wptreport = os.path.join(os.path.dirname(wpt_output), - self._wpt_report()) - rest_args.extend(['--log-wptreport', - self.wptreport]) - version = self.get_version() if version: rest_args.extend(['--browser-version', version]) @@ -191,7 +144,7 @@ for pattern in self.options.test_filter.split(':'): rest_args.extend([ '--include', - wpt_common.strip_wpt_root_prefix(pattern), + self.path_finder.strip_wpt_path(pattern), ]) rest_args.extend(self.pass_through_wpt_args) @@ -250,6 +203,8 @@ self._metadata_dir = None def add_extra_arguments(self, parser): + super(WPTAndroidAdapter, self).add_extra_arguments(parser) + # TODO: |pass_through_args| are broke and need to be supplied by way of # --binary-arg". class BinaryPassThroughArgs(PassThroughArgs): @@ -259,9 +214,6 @@ # Add this so that product argument does not go in self._rest_args # when self.parse_args() is called - parser.add_argument('--target', '-t', default='Release', - help='Specify the target build subdirectory under' - ' src/out/.') parser.add_argument('--product', help=argparse.SUPPRESS) parser.add_argument('--webdriver-binary', required=True, help='Path of the webdriver binary. It needs to have' @@ -275,35 +227,20 @@ parser.add_argument('--ignore-browser-specific-expectations', action='store_true', default=False, help='Ignore browser specific expectation files.') - parser.add_argument('--verbose', '-v', action='count', default=0, - help='Verbosity level.') - parser.add_argument('--repeat', '--gtest_repeat', type=int, default=1, - help='Number of times to run the tests.') parser.add_argument('--test-filter', '--gtest_filter', help='Colon-separated list of test names ' '(URL prefixes)') - # TODO(crbug/1306222): wptrunner currently cannot rerun individual failed - # tests, so this flag is unused. - parser.add_argument('--test-launcher-retry-limit', type=int, default=0, - help='Maximum number of times to rerun a failed test') parser.add_argument('--include', metavar='TEST_OR_DIR', action=WPTPassThroughArgs, help='Test(s) to run, defaults to run all tests.') parser.add_argument('--include-file', action=WPTPassThroughArgs, help='A file listing test(s) to run') - parser.add_argument('--default-exclude', action='store_true', default=False, - help="Only run the tests explicitly given in arguments." - "No tests will run if the list is empty, and the " - "program will exit with status code 0.") parser.add_argument('--list-tests', action=WPTPassThroughArgs, nargs=0, help="Don't run any tests, just print out a list of" ' tests that would be run.') parser.add_argument('--webdriver-arg', action=WPTPassThroughArgs, help='WebDriver args.') - parser.add_argument('--log-wptreport', - action='store_true', default=False, - help="Generates a test report in JSON format.") parser.add_argument('--log-raw', metavar='RAW_REPORT_FILE', action=WPTPassThroughArgs, help="Log raw report.") @@ -370,9 +307,12 @@ args = super(WPTWeblayerAdapter, self).rest_args args.append('--test-type=testharness') args.extend(['--package-name', self.WEBLAYER_SHELL_PKG]) - args.append(ANDROID_WEBLAYER) return args + @classmethod + def wpt_product_name(cls): + return ANDROID_WEBLAYER + class WPTWebviewAdapter(WPTAndroidAdapter): @@ -430,9 +370,12 @@ def rest_args(self): args = super(WPTWebviewAdapter, self).rest_args args.extend(['--package-name', self.system_webview_shell_pkg]) - args.append(ANDROID_WEBVIEW) return args + @classmethod + def wpt_product_name(cls): + return ANDROID_WEBVIEW + class WPTClankAdapter(WPTAndroidAdapter): @@ -468,10 +411,12 @@ logger.info("Using Chrome apk's default package %s." % self.options.chrome_package_name) args.extend(['--package-name', self.options.chrome_package_name]) - # add the product postional argument - args.append(CHROME_ANDROID) return args + @classmethod + def wpt_product_name(cls): + return CHROME_ANDROID + def add_emulator_args(parser): parser.add_argument(
diff --git a/testing/scripts/wpt_common.py b/testing/scripts/wpt_common.py index 20f2be0..02905466 100644 --- a/testing/scripts/wpt_common.py +++ b/testing/scripts/wpt_common.py
@@ -15,8 +15,6 @@ TYP_DIR = os.path.join(CATAPULT_DIR, 'third_party', 'typ') WEB_TESTS_DIR = os.path.normpath( os.path.join(BLINK_TOOLS_DIR, os.pardir, 'web_tests')) -_WPT_ROOT_FRAGMENT = posixpath.join('external', 'wpt', '') -TESTS_ROOT_DIR = os.path.join(WEB_TESTS_DIR, 'external', 'wpt') if BLINK_TOOLS_DIR not in sys.path: sys.path.append(BLINK_TOOLS_DIR) @@ -25,23 +23,7 @@ sys.path.append(TYP_DIR) from blinkpy.common.host import Host - - -def strip_wpt_root_prefix(path): - """Remove a redundant prefix from a WPT path. - - ResultDB identifies WPTs as web tests with the prefix "external/wpt", but - wptrunner expects paths relative to the WPT root, which already ends in - "external/wpt". This function transforms a general web test path into a - WPT path. - - WPT paths are always POSIX-style. - """ - if path.startswith(_WPT_ROOT_FRAGMENT): - return posixpath.relpath(path, _WPT_ROOT_FRAGMENT) - # Path is absolute or does not start with the prefix. - # Assume the path already points to a valid WPT and pass through. - return path +from blinkpy.common.path_finder import PathFinder class BaseWptScriptAdapter(common.BaseIsolatedScriptArgsAdapter): @@ -55,6 +37,7 @@ if not host: host = Host() self.fs = host.filesystem + self.path_finder = PathFinder(self.fs) self.port = host.port_factory.get() # Path to the output of the test run. Comes from the args passed to the # run, parsed after this constructor. Can be overwritten by tests. @@ -63,7 +46,63 @@ self.layout_test_results_subdir = 'layout-test-results' default_wpt_binary = os.path.join( common.SRC_DIR, "third_party", "wpt_tools", "wpt", "wpt") - self.wpt_binary = os.environ.get("WPT_BINARY") or default_wpt_binary + self.wpt_binary = os.environ.get("WPT_BINARY", default_wpt_binary) + + @property + def wpt_root_dir(self): + return self.path_finder.path_from_web_tests( + self.path_finder.wpt_prefix()) + + @property + def output_directory(self): + return self.path_finder.path_from_chromium_base('out', + self.options.target) + + @property + def mojo_js_directory(self): + return self.fs.join(self.output_directory, 'gen') + + def add_extra_arguments(self, parser): + parser.add_argument( + '-t', + '--target', + default='Release', + help='target build subdirectory under //src/out') + parser.add_argument( + '--repeat', + '--gtest_repeat', + type=int, + default=1, + help='number of times to run the tests') + # TODO(crbug/1306222): wptrunner currently cannot rerun individual + # failed tests, so this flag is accepted but not used. + parser.add_argument( + '--test-launcher-retry-limit', + metavar='LIMIT', + type=int, + default=0, + help='maximum number of times to rerun a failed test') + parser.add_argument( + '--default-exclude', + action='store_true', + help=('only run the tests explicitly given in arguments ' + '(can run no tests, which will exit with code 0)')) + parser.add_argument( + '--log-wptreport', + nargs='?', + const=self._default_wpt_report(), + help=('log a wptreport in JSON to the output directory' + ' (default filename: %(const)s)')) + parser.add_argument( + '--dry-run', + action='store_true', + help='do not upload results to ResultDB') + parser.add_argument( + '-v', + '--verbose', + action='count', + default=0, + help='increase verbosity') def maybe_set_default_isolated_script_test_output(self): if self.options.isolated_script_test_output: @@ -87,6 +126,60 @@ # tests across many shards. '--chunk-type=hash'] + def parse_args(self, args=None): + super(BaseWptScriptAdapter, self).parse_args(args) + # Update the output directory to the default if it's not set. + # We cannot provide a CLI arg default because the path depends on + # --target. + self.maybe_set_default_isolated_script_test_output() + if self.options.log_wptreport: + wpt_output = self.options.isolated_script_test_output + self.wptreport = self.fs.join( + self.fs.dirname(wpt_output), + self.options.log_wptreport) + + @property + def rest_args(self): + rest_args = super(BaseWptScriptAdapter, self).rest_args + + rest_args.extend([ + self.wpt_binary, + # By default, wpt will treat unexpected passes as errors, so we + # disable that to be consistent with Chromium CI. + '--no-fail-on-unexpected-pass', + # Use virtualenv packages installed by vpython, not wpt. + '--venv=%s' % self.path_finder.chromium_base(), + '--skip-venv-setup', + 'run', + self.wpt_product_name(), + '--no-pause-after-test', + '--no-capture-stdio', + '--no-manifest-download', + '--tests=%s' % self.wpt_root_dir, + '--mojojs-path=%s' % self.mojo_js_directory, + '--repeat=%d' % self.options.repeat, + ]) + + if self.options.default_exclude: + rest_args.extend(['--default-exclude']) + + if self.wptreport: + rest_args.extend(['--log-wptreport', self.wptreport]) + + if self.options.verbose >= 3: + rest_args.extend([ + '--log-mach=-', + '--log-mach-level=debug', + '--log-mach-verbose', + ]) + if self.options.verbose >= 4: + rest_args.extend([ + '--webdriver-arg=--verbose', + '--webdriver-arg="--log-path=-"', + ]) + + return rest_args + def do_post_test_run_tasks(self): if not self.wpt_output and self.options: self.wpt_output = self.options.isolated_script_test_output @@ -103,6 +196,19 @@ '--wpt-results', self.wpt_output, ] + if self.options.dry_run: + command.extend(['--dry-run']) if self.wptreport: command.extend(['--wpt-report', self.wptreport]) common.run_command(command) + + @classmethod + def wpt_product_name(cls): + raise NotImplementedError + + def _default_wpt_report(self): + product = self.wpt_product_name() + shard_index = os.environ.get('GTEST_SHARD_INDEX') + if shard_index is not None: + return 'wpt_reports_%s_%02d.json' % (product, int(shard_index)) + return 'wpt_reports_%s.json' % product
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index f87b791..84fc630 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -4142,8 +4142,8 @@ ], "experiments": [ { - "name": "Enabled", - "enable_features": [ + "name": "Disabled", + "disable_features": [ "LacrosNonSyncingProfiles" ] }
diff --git a/third_party/blink/public/common/frame/frame_ad_evidence.h b/third_party/blink/public/common/frame/frame_ad_evidence.h index 091fff96..11b68bf 100644 --- a/third_party/blink/public/common/frame/frame_ad_evidence.h +++ b/third_party/blink/public/common/frame/frame_ad_evidence.h
@@ -69,6 +69,8 @@ bool is_complete_ = false; // Whether the frame's parent is an ad. Not const to allow copy assignment. + // Note, for embedded main frames that are a subresource filter child (e.g. + // FencedFrame), this will specify if the outer delegate frame is an ad. bool parent_is_ad_; // Whether any URL for this frame has been checked against the filter list
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index 3cdebd4d..ddd9643 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -265,8 +265,8 @@ const = 0; // "Returns true if the frame the document belongs to, or any of its ancestor - // nodes is a fenced frame. See blink::Frame::IsInFencedFrameTree() for more - // details. + // nodes (within the frame tree) is a fenced frame. See + // blink::Frame::IsInFencedFrameTree() for more details. virtual bool IsInFencedFrameTree() const = 0; // Navigation Ping -------------------------------------------------------- @@ -809,6 +809,11 @@ // See blink::LocalFrame::AdEvidence() virtual const absl::optional<blink::FrameAdEvidence>& AdEvidence() = 0; + // This is used to check if a script tagged as an ad is currently on the v8 + // stack. This is the same method used to compute the below bit which will + // persist. + virtual bool IsAdScriptInStack() const = 0; + // True iff a script tagged as an ad was on the v8 stack when the frame was // created and the frame is a subframe. This is not currently propagated when // a frame navigates cross-origin.
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc index 8ec00c6..b1383ab5 100644 --- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc +++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -604,15 +604,6 @@ style.UpdateFontOrientation(); } - // FIXME: Since we don't support block-flow on flexible boxes yet, disallow - // setting of block-flow to anything other than TopToBottomWritingMode. - // https://bugs.webkit.org/show_bug.cgi?id=46418 - Flexible box support. - if (style.GetWritingMode() != WritingMode::kHorizontalTb && - style.IsDeprecatedWebkitBox()) { - style.SetWritingMode(WritingMode::kHorizontalTb); - style.UpdateFontOrientation(); - } - // Disable editing custom layout elements, until EditingNG is ready. if (!RuntimeEnabledFeatures::EditingNGEnabled() && (style.Display() == EDisplay::kLayoutCustom ||
diff --git a/third_party/blink/renderer/core/dom/README.md b/third_party/blink/renderer/core/dom/README.md index 9a35c3c4..95f9702 100644 --- a/third_party/blink/renderer/core/dom/README.md +++ b/third_party/blink/renderer/core/dom/README.md
@@ -62,7 +62,7 @@ child. - Parent can't tell how many children it has in O(1). - + Further info: @@ -93,7 +93,7 @@ Tree order is: - + However, traversing a tree in this way might be error-prone. Instead, you can use `NodeTraversal` and `ElementTraversal`. They provides a C++11's range-based @@ -137,7 +137,7 @@ - The node tree of a shadow root’s host is sometimes referred to as the **light tree**. - + For example, given the example node tree: @@ -292,7 +292,7 @@ in some sense. We call this _super tree_ as _composed tree_, which is a _tree of trees_. - + The following is a complex example: @@ -481,7 +481,7 @@ have to _flatten_ the composed tree to the one node tree, called a _flat tree_, from which a layout tree is constructed. - + For example, given the following composed tree, @@ -732,7 +732,7 @@ Basically, an event is dispatched across shadow trees. - + Let me show more complex example composed tree, involving a slot:
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 7fbd224..247f1d5 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -452,12 +452,6 @@ if (NeedsLegacyLayoutForEntireDocument(document)) return true; - if (!RuntimeEnabledFeatures::LayoutNGTextCombineEnabled() && - style.HasTextCombine() && !style.IsHorizontalWritingMode()) { - UseCounter::Count(document, WebFeature::kLegacyLayoutByTextCombine); - return true; - } - if (NeedsLegacyBlockFragmentation(element, style)) { UseCounter::Count( document, @@ -2415,7 +2409,7 @@ stack.push_back(this); GetDocument().AddToTopLayer(this); PseudoStateChanged(CSSSelector::kPseudoPopupOpen); - // TODO(masonf): Set the focus appropriately here. + SetPopupFocusOnShow(); } void Element::hidePopup() { @@ -2440,8 +2434,79 @@ GetDocument().EnqueueAnimationFrameEvent(event); } +void Element::SetPopupFocusOnShow() { + DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled() || + RuntimeEnabledFeatures::HTMLPopupElementEnabled()); + // The layout must be updated here because we call Element::isFocusable, + // which requires an up-to-date layout. + GetDocument().UpdateStyleAndLayoutTreeForNode(this); + + Element* control = nullptr; + if (IsAutofocusable() || hasAttribute(html_names::kDelegatesfocusAttr)) { + // If the popup has autofocus or delegatesfocus, focus it. + control = this; + } else { + // Otherwise, look for a child control that has the autofocus attribute. + control = GetPopupFocusableArea(/*autofocus_only=*/true); + } + + // If the popup does not use autofocus or delegatesfocus, then the focus + // should remain on the currently active element. + // https://open-ui.org/components/popup.research.explainer#autofocus-logic + if (!control) + return; + + // 3. Run the focusing steps for control. + control->focus(); + + // 4. Let topDocument be the active document of control's node document's + // browsing context's top-level browsing context. + // 5. If control's node document's origin is not the same as the origin of + // topDocument, then return. + Document& doc = control->GetDocument(); + if (!doc.IsActive()) + return; + if (!doc.IsInMainFrame() && + !doc.TopFrameOrigin()->CanAccess( + doc.GetExecutionContext()->GetSecurityOrigin())) { + return; + } + + // 6. Empty topDocument's autofocus candidates. + // 7. Set topDocument's autofocus processed flag to true. + doc.TopDocument().FinalizeAutofocus(); +} + +// TODO(masonf) This should really be combined with Element::GetFocusableArea(), +// and can possibly be merged with the similar logic for <dialog>. The spec for +// https://html.spec.whatwg.org/multipage/interaction.html#get-the-focusable-area +// does not include dialogs or popups yet. +Element* Element::GetPopupFocusableArea(bool autofocus_only) const { + DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled() || + RuntimeEnabledFeatures::HTMLPopupElementEnabled()); + Node* next = nullptr; + for (Node* node = FlatTreeTraversal::FirstChild(*this); node; node = next) { + next = FlatTreeTraversal::Next(*node, this); + auto* element = DynamicTo<Element>(node); + if (!element) + continue; + if (IsA<HTMLPopupElement>(*element) || element->HasValidPopupAttribute() || + IsA<HTMLDialogElement>(*element)) { + next = FlatTreeTraversal::NextSkippingChildren(*element, this); + continue; + } + if (element->IsFocusable() && + (!autofocus_only || element->IsAutofocusable())) { + return element; + } + } + return nullptr; +} + // static const Element* Element::NearestOpenAncestralPopup(Node* start_node) { + DCHECK(RuntimeEnabledFeatures::HTMLPopupElementEnabled() || + RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()); if (!start_node) return nullptr; // We need to walk up from the start node to see if there is a parent popup, @@ -2451,22 +2516,13 @@ // popup, but we will stop on any of them. Therefore, just store the popup // that is highest (last) on the popup stack for each anchor and/or invoker. - // TODO(masonf): getAnchor and getInvoker can be removed once the - // HTMLPopupElement is removed. - auto getAnchor = [](const Element* element) -> Element* { - if (auto* popup_element = DynamicTo<HTMLPopupElement>(element)) { - DCHECK(RuntimeEnabledFeatures::HTMLPopupElementEnabled()); - return popup_element->anchor(); - } else { - DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()); - // TODO(masonf): Implement the anchor attribute for general elements. - return nullptr; - } - }; + // TODO(masonf): getInvoker can be removed once the HTMLPopupElement is + // removed. auto getInvoker = [](const Element* element) -> Element* { if (auto* popup_element = DynamicTo<HTMLPopupElement>(element)) { DCHECK(RuntimeEnabledFeatures::HTMLPopupElementEnabled()); - return popup_element->invoker(); + // The <popup> element `popup` attribute has been deprecated and removed. + return nullptr; } else { DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()); return element->GetPopupData()->invoker(); @@ -2477,7 +2533,7 @@ anchors_and_invokers; Document& document = start_node->GetDocument(); for (auto popup : document.PopupElementStack()) { - if (const auto* anchor = getAnchor(popup)) + if (const auto* anchor = popup->anchorElement()) anchors_and_invokers.Set(anchor, popup); if (const auto* invoker = getInvoker(popup)) anchors_and_invokers.Set(invoker, popup); @@ -2506,7 +2562,7 @@ if (IsA<HTMLPopupElement>(start_element) || start_element->HasValidPopupAttribute()) { if (auto* anchor_ancestor = - NearestOpenAncestralPopup(getAnchor(start_element))) { + NearestOpenAncestralPopup(start_element->anchorElement())) { return anchor_ancestor; } if (auto* invoker_ancestor = @@ -2530,12 +2586,9 @@ auto& document = target_node->GetDocument(); DCHECK(document.PopupShowing()); const AtomicString& event_type = event.type(); - if (event_type == event_type_names::kMousedown || - event_type == event_type_names::kScroll) { - // - For scroll, hide everything up to the scrolled element, to allow - // scrolling within a popup. - // - For mousedown, hide everything up to the clicked element. We do - // this on mousedown, rather than mouseup/click, for two reasons: + if (event_type == event_type_names::kMousedown) { + // - Hide everything up to the clicked element. We do this on mousedown, + // rather than mouseup/click, for two reasons: // 1. This mirrors typical platform popups, which dismiss on mousedown. // 2. This allows a mouse-drag that starts on a popup and finishes off // the popup, without light-dismissing the popup. @@ -2557,6 +2610,18 @@ showPopup(); } +Element* Element::anchorElement() const { + if (!RuntimeEnabledFeatures::HTMLPopupAttributeEnabled() && + !RuntimeEnabledFeatures::HTMLPopupElementEnabled()) { + return nullptr; + } + const AtomicString& anchor_id = FastGetAttribute(html_names::kAnchorAttr); + if (anchor_id.IsNull()) + return nullptr; + if (!IsInTreeScope()) + return nullptr; + return GetTreeScope().getElementById(anchor_id); // may be null +} bool Element::HasLegalLinkAttribute(const QualifiedName&) const { return false; } @@ -4779,6 +4844,16 @@ frame_owner_element->contentDocument()->UnloadStarted()) return; + if ((IsA<HTMLPopupElement>(this) || HasValidPopupAttribute()) && + hasAttribute(html_names::kDelegatesfocusAttr)) { + DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled() || + RuntimeEnabledFeatures::HTMLPopupElementEnabled()); + if (auto* node_to_focus = GetPopupFocusableArea(/*autofocus_only=*/false)) { + node_to_focus->focus(params); + } + return; + } + // Ensure we have clean style (including forced display locks). GetDocument().UpdateStyleAndLayoutTreeForNode(this);
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index f89b7414..2b3b9e3e 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -543,6 +543,7 @@ static const Element* NearestOpenAncestralPopup(Node* start_node); static void HandlePopupLightDismiss(const Event& event); void InvokePopup(Element* invoker); + void SetPopupFocusOnShow(); virtual bool HasLegalLinkAttribute(const QualifiedName&) const; virtual const QualifiedName& SubResourceAttributeName() const; @@ -1273,6 +1274,13 @@ kAttachLayoutTree, }; + // Retrieves the element pointed to by this element's 'anchor' content + // attribute, if that element exists. + Element* anchorElement() const; + + // Special focus handling for popups. + Element* GetPopupFocusableArea(bool autofocus_only) const; + void UpdateFirstLetterPseudoElement(StyleUpdatePhase, const StyleRecalcContext&);
diff --git a/third_party/blink/renderer/core/dom/range_test.cc b/third_party/blink/renderer/core/dom/range_test.cc index 58ffe7f..a6e044c 100644 --- a/third_party/blink/renderer/core/dom/range_test.cc +++ b/third_party/blink/renderer/core/dom/range_test.cc
@@ -351,7 +351,7 @@ // http://crbug.com/1240510 TEST_F(RangeTest, GetBorderAndTextQuadsWithCombinedText) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( @@ -369,22 +369,12 @@ EXPECT_THAT(GetBorderAndTextQuads(Position(text1, 0), Position(text1, 1)), ElementsAre(gfx::QuadF(gfx::RectF(3, 0, 20, 20)))); - - if (RuntimeEnabledFeatures::LayoutNGTextCombineEnabled()) { - EXPECT_THAT(GetBorderAndTextQuads(Position(text2, 0), Position(text2, 2)), - ElementsAre(gfx::QuadF(gfx::RectF(2, 20, 22, 20)))); - EXPECT_THAT(GetBorderAndTextQuads(Position(text3, 0), Position(text3, 3)), - ElementsAre(gfx::QuadF(gfx::RectF(2, 40, 22, 20)))); - EXPECT_THAT(GetBorderAndTextQuads(Position(text4, 0), Position(text4, 4)), - ElementsAre(gfx::QuadF(gfx::RectF(2, 60, 22, 20)))); - } else { - EXPECT_THAT(GetBorderAndTextQuads(Position(text2, 0), Position(text2, 2)), - ElementsAre(gfx::QuadF(gfx::RectF(3, 20, 20, 20)))); - EXPECT_THAT(GetBorderAndTextQuads(Position(text3, 0), Position(text3, 3)), - ElementsAre(gfx::QuadF(gfx::RectF(3, 40, 20, 20)))); - EXPECT_THAT(GetBorderAndTextQuads(Position(text4, 0), Position(text4, 4)), - ElementsAre(gfx::QuadF(gfx::RectF(3, 60, 20, 20)))); - } + EXPECT_THAT(GetBorderAndTextQuads(Position(text2, 0), Position(text2, 2)), + ElementsAre(gfx::QuadF(gfx::RectF(2, 20, 22, 20)))); + EXPECT_THAT(GetBorderAndTextQuads(Position(text3, 0), Position(text3, 3)), + ElementsAre(gfx::QuadF(gfx::RectF(2, 40, 22, 20)))); + EXPECT_THAT(GetBorderAndTextQuads(Position(text4, 0), Position(text4, 4)), + ElementsAre(gfx::QuadF(gfx::RectF(2, 60, 22, 20)))); } TEST_F(RangeTest, GetBorderAndTextQuadsWithFirstLetterOne) {
diff --git a/third_party/blink/renderer/core/editing/local_caret_rect_test.cc b/third_party/blink/renderer/core/editing/local_caret_rect_test.cc index 991e499..e6d3a15 100644 --- a/third_party/blink/renderer/core/editing/local_caret_rect_test.cc +++ b/third_party/blink/renderer/core/editing/local_caret_rect_test.cc
@@ -1379,7 +1379,7 @@ TEST_P(ParameterizedLocalCaretRectTest, TextCombineOneTextNode) { if (!LayoutNGEnabled()) return; - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "div {" @@ -1444,7 +1444,7 @@ TEST_P(ParameterizedLocalCaretRectTest, TextCombineTwoTextNodes) { if (!LayoutNGEnabled()) return; - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "div {"
diff --git a/third_party/blink/renderer/core/editing/visible_position_test.cc b/third_party/blink/renderer/core/editing/visible_position_test.cc index 6eaa813..66caef4 100644 --- a/third_party/blink/renderer/core/editing/visible_position_test.cc +++ b/third_party/blink/renderer/core/editing/visible_position_test.cc
@@ -330,7 +330,7 @@ } TEST_P(ParameterizedVisiblePositionTest, TextCombine) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(GetParam()); + ScopedLayoutNGForTest enable_layout_ng(GetParam()); InsertStyleElement( "div {" " font: 100px/110px Ahem;"
diff --git a/third_party/blink/renderer/core/frame/frame_overlay.cc b/third_party/blink/renderer/core/frame/frame_overlay.cc index a0cd975..54b74bf1 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay.cc
@@ -74,7 +74,7 @@ gfx::Size FrameOverlay::Size() const { gfx::Size size = frame_->GetPage()->GetVisualViewport().Size(); - if (!frame_->IsMainFrame()) + if (!frame_->IsMainFrame() || frame_->IsInFencedFrameTree()) size.SetToMax(frame_->View()->Size()); return size; } @@ -98,7 +98,7 @@ PropertyTreeState FrameOverlay::DefaultPropertyTreeState() const { auto state = PropertyTreeState::Root(); - if (frame_->IsMainFrame()) { + if (frame_->IsMainFrame() && !frame_->IsInFencedFrameTree()) { if (const auto* device_emulation = frame_->GetPage() ->GetVisualViewport() .GetDeviceEmulationTransformNode())
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index 0940d78b..8b55fe6 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1523,6 +1523,8 @@ : !RuntimeEnabledFeatures::AdTaggingEnabled()); absl::optional<AdTracker::AdScriptIdentifier> ad_script_on_stack; + // See SubresourceFilterAgent::Initialize for why we don't set this here for + // fenced frames. is_subframe_created_by_ad_script_ = !IsMainFrame() && ad_tracker_ && ad_tracker_->IsAdScriptInStack(AdTracker::StackType::kBottomAndTop, @@ -2206,7 +2208,7 @@ } void LocalFrame::SetAdEvidence(const blink::FrameAdEvidence& ad_evidence) { - DCHECK(!IsMainFrame()); + DCHECK(!IsMainFrame() || IsInFencedFrameTree()); DCHECK(ad_evidence.is_complete()); // Once set, `is_subframe_created_by_ad_script_` should not be unset. @@ -2256,10 +2258,17 @@ } } +bool LocalFrame::IsAdScriptInStack() const { + return ad_tracker_ && + ad_tracker_->IsAdScriptInStack(AdTracker::StackType::kBottomAndTop); +} + void LocalFrame::UpdateAdHighlight() { - if (IsMainFrame()) + if (IsMainFrame() && !IsInFencedFrameTree()) return; + // TODO(bokan): Fenced frames may need some work to propagate the ad + // highlighting setting to the inner tree. if (IsAdRoot() && GetPage()->GetSettings().GetHighlightAds()) SetSubframeColorOverlay(SkColorSetARGB(128, 255, 0, 0)); else @@ -2414,12 +2423,12 @@ } // namespace void LocalFrame::SetMainFrameColorOverlay(SkColor color) { - DCHECK(IsMainFrame()); + DCHECK(IsMainFrame() && !IsInFencedFrameTree()); SetFrameColorOverlay(color); } void LocalFrame::SetSubframeColorOverlay(SkColor color) { - DCHECK(!IsMainFrame()); + DCHECK(!IsMainFrame() || IsInFencedFrameTree()); SetFrameColorOverlay(color); }
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 224194b..44ca524 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -521,6 +521,10 @@ // all other documents, just before commit (ReadyToCommitNavigation time). void SetAdEvidence(const blink::FrameAdEvidence& ad_evidence); + // This is used to check if a script tagged as an ad is currently on the v8 + // stack. + bool IsAdScriptInStack() const; + // The evidence for or against a frame being an ad. `absl::nullopt` if not yet // set or if the frame is a top-level frame as only subframes can be tagged as // ads. @@ -952,6 +956,8 @@ // True if this frame is a subframe that had a script tagged as an ad on the // v8 stack at the time of creation. This is updated in `SetAdEvidence()`, // allowing the bit to be propagated when a frame navigates cross-origin. + // Fenced frames do not set this bit for the initial empty document, see + // SubresourceFilterAgent::Initialize. bool is_subframe_created_by_ad_script_ = false; bool evict_cached_session_storage_on_freeze_or_unload_ = false;
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index d7158b3..219038f 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -862,6 +862,11 @@ return GetFrame()->IsAdSubframe(); } +bool WebLocalFrameImpl::IsAdScriptInStack() const { + DCHECK(GetFrame()); + return GetFrame()->IsAdScriptInStack(); +} + void WebLocalFrameImpl::SetAdEvidence( const blink::FrameAdEvidence& ad_evidence) { DCHECK(GetFrame());
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 6381007f..85c37b8 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -310,6 +310,7 @@ bool ShouldSuppressKeyboardForFocusedElement() override; WebPerformance Performance() const override; bool IsAdSubframe() const override; + bool IsAdScriptInStack() const override; void SetAdEvidence(const blink::FrameAdEvidence& ad_evidence) override; const absl::optional<blink::FrameAdEvidence>& AdEvidence() override; bool IsSubframeCreatedByAdScript() override;
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc index 299a520..7958471 100644 --- a/third_party/blink/renderer/core/html/html_dialog_element.cc +++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -176,7 +176,8 @@ SetBooleanAttribute(html_names::kOpenAttr, true); // Showing a <dialog> should hide all open popups. - if (RuntimeEnabledFeatures::HTMLPopupElementEnabled()) { + if (RuntimeEnabledFeatures::HTMLPopupElementEnabled() || + RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()) { GetDocument().HideAllPopupsUntil(nullptr); } @@ -213,7 +214,8 @@ } // Showing a <dialog> should hide all open popups. - if (RuntimeEnabledFeatures::HTMLPopupElementEnabled()) { + if (RuntimeEnabledFeatures::HTMLPopupElementEnabled() || + RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()) { document.HideAllPopupsUntil(nullptr); }
diff --git a/third_party/blink/renderer/core/html/html_popup_element.cc b/third_party/blink/renderer/core/html/html_popup_element.cc index b64b175..58a9880 100644 --- a/third_party/blink/renderer/core/html/html_popup_element.cc +++ b/third_party/blink/renderer/core/html/html_popup_element.cc
@@ -24,7 +24,6 @@ : HTMLElement(html_names::kPopupTag, document), open_(false), had_initiallyopen_when_parsed_(false), - invoker_(nullptr), needs_repositioning_for_select_menu_(false), owner_select_menu_element_(nullptr) { DCHECK(RuntimeEnabledFeatures::HTMLPopupElementEnabled()); @@ -48,7 +47,6 @@ if (!open_) return; open_ = false; - invoker_ = nullptr; needs_repositioning_for_select_menu_ = false; DCHECK(isConnected()); GetDocument().HideAllPopupsUntil(this); @@ -64,12 +62,6 @@ GetDocument().EnqueueAnimationFrameEvent(event); } -void HTMLPopupElement::Invoke(Element* invoker) { - DCHECK(invoker); - invoker_ = invoker; - show(); -} - void HTMLPopupElement::show() { if (open_ || !isConnected()) return; @@ -79,7 +71,7 @@ PseudoStateChanged(CSSSelector::kPseudoPopupOpen); PushNewPopupElement(this); MarkStyleDirty(); - SetFocus(); + SetPopupFocusOnShow(); } bool HTMLPopupElement::IsKeyboardFocusable() const { @@ -91,79 +83,6 @@ return true; } -// TODO(masonf) This should really live in either Element or FocusController. -// The spec for -// https://html.spec.whatwg.org/multipage/interaction.html#get-the-focusable-area -// does not include dialogs or popups yet. -Element* HTMLPopupElement::GetFocusableArea(bool autofocus_only) const { - Node* next = nullptr; - for (Node* node = FlatTreeTraversal::FirstChild(*this); node; node = next) { - if (IsA<HTMLPopupElement>(*node) || IsA<HTMLDialogElement>(*node)) { - next = FlatTreeTraversal::NextSkippingChildren(*node, this); - continue; - } - next = FlatTreeTraversal::Next(*node, this); - auto* element = DynamicTo<Element>(node); - if (element && element->IsFocusable() && - (!autofocus_only || element->IsAutofocusable())) { - return element; - } - } - return nullptr; -} - -void HTMLPopupElement::focus(const FocusParams& params) { - if (hasAttribute(html_names::kDelegatesfocusAttr)) { - if (auto* node_to_focus = GetFocusableArea(/*autofocus_only=*/false)) { - node_to_focus->focus(params); - } - } else { - HTMLElement::focus(params); - } -} - -void HTMLPopupElement::SetFocus() { - // The layout must be updated here because we call Element::isFocusable, - // which requires an up-to-date layout. - GetDocument().UpdateStyleAndLayoutTreeForNode(this); - - Element* control = nullptr; - if (IsAutofocusable() || hasAttribute(html_names::kDelegatesfocusAttr)) { - // If the <popup> has the autofocus or delegatesfocus, focus it. - control = this; - } else { - // Otherwise, look for a child control that has the autofocus attribute. - control = GetFocusableArea(/*autofocus_only=*/true); - } - - // If the popup does not use autofocus or delegatesfocus, then the focus - // should remain on the currently active element. - // https://open-ui.org/components/popup.research.explainer#autofocus-logic - if (!control) - return; - - // 3. Run the focusing steps for control. - DCHECK(control->IsFocusable()); - control->focus(); - - // 4. Let topDocument be the active document of control's node document's - // browsing context's top-level browsing context. - // 5. If control's node document's origin is not the same as the origin of - // topDocument, then return. - Document& doc = control->GetDocument(); - if (!doc.IsActive()) - return; - if (!doc.IsInMainFrame() && - !doc.TopFrameOrigin()->CanAccess( - doc.GetExecutionContext()->GetSecurityOrigin())) { - return; - } - - // 6. Empty topDocument's autofocus candidates. - // 7. Set topDocument's autofocus processed flag to true. - doc.TopDocument().FinalizeAutofocus(); -} - namespace { void ShowInitiallyOpenPopup(HTMLPopupElement* popup) { // If a <popup> has the initiallyopen attribute upon page @@ -221,21 +140,6 @@ GetDocument().RemoveFromTopLayer(popup); } -Element* HTMLPopupElement::anchor() const { - const AtomicString& anchor_id = FastGetAttribute(html_names::kAnchorAttr); - if (anchor_id.IsNull()) - return nullptr; - if (!IsInTreeScope()) - return nullptr; - if (Element* anchor = GetTreeScope().getElementById(anchor_id)) - return anchor; - return nullptr; -} - -Element* HTMLPopupElement::invoker() const { - return invoker_.Get(); -} - // TODO(crbug.com/1197720): The popup position should be provided by the new // anchored positioning scheme. void HTMLPopupElement::SetNeedsRepositioningForSelectMenu(bool flag) { @@ -329,7 +233,6 @@ } void HTMLPopupElement::Trace(Visitor* visitor) const { - visitor->Trace(invoker_); visitor->Trace(owner_select_menu_element_); HTMLElement::Trace(visitor); }
diff --git a/third_party/blink/renderer/core/html/html_popup_element.h b/third_party/blink/renderer/core/html/html_popup_element.h index c2e8c21..d7ec494 100644 --- a/third_party/blink/renderer/core/html/html_popup_element.h +++ b/third_party/blink/renderer/core/html/html_popup_element.h
@@ -30,13 +30,6 @@ void hide(); void show(); - Element* anchor() const; - Element* invoker() const; - - // This is used by invoking elements (which have a "popup" attribute) - // to invoke the popup. - void Invoke(Element* invoker); - // TODO(crbug.com/1197720): The popup position should be provided by the new // anchored positioning scheme. void SetNeedsRepositioningForSelectMenu(bool flag); @@ -50,9 +43,6 @@ private: void ScheduleHideEvent(); void MarkStyleDirty(); - void focus(const FocusParams& params) override; - Element* GetFocusableArea(bool autofocus_only) const; - void SetFocus(); bool IsKeyboardFocusable() const override; bool IsMouseFocusable() const override; @@ -70,7 +60,6 @@ bool open_; bool had_initiallyopen_when_parsed_; - WeakMember<Element> invoker_; bool needs_repositioning_for_select_menu_; WeakMember<HTMLSelectMenuElement> owner_select_menu_element_;
diff --git a/third_party/blink/renderer/core/html/html_popup_element.idl b/third_party/blink/renderer/core/html/html_popup_element.idl index 148e609..58ebfab2 100644 --- a/third_party/blink/renderer/core/html/html_popup_element.idl +++ b/third_party/blink/renderer/core/html/html_popup_element.idl
@@ -9,6 +9,4 @@ [CEReactions, Reflect] attribute boolean initiallyOpen; [CEReactions, Measure] void show(); [CEReactions, Measure] void hide(); - - readonly attribute Element anchor; };
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc index 7d3083a..1e3b81b 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc
@@ -32,6 +32,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/frame/remote_frame.h" #include "third_party/blink/renderer/core/frame/remote_frame_view.h" +#include "third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h" #include "third_party/blink/renderer/core/html/html_frame_element_base.h" #include "third_party/blink/renderer/core/html/html_plugin_element.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" @@ -90,6 +91,15 @@ return nullptr; } +const absl::optional<PhysicalSize> LayoutEmbeddedContent::FrozenFrameSize() + const { + // The `<fencedframe>` element can freeze the child frame size when navigated. + if (const auto* fenced_frame = DynamicTo<HTMLFencedFrameElement>(GetNode())) + return fenced_frame->FrozenFrameSize(); + + return absl::nullopt; +} + PaintLayerType LayoutEmbeddedContent::LayerTypeRequired() const { NOT_DESTROYED(); PaintLayerType type = LayoutReplaced::LayerTypeRequired(); @@ -281,6 +291,15 @@ content_rect.size = View()->ViewRect().size; } + if (const absl::optional<PhysicalSize> frozen_size = FrozenFrameSize()) { + // TODO(kojii): Setting the `offset` to non-zero values breaks + // hit-testing/inputs. Even different size is suspicious, as the input + // system forwards mouse events to the child frame even when the mouse is + // outside of the child frame. Revisit this when the input system supports + // different |ReplacedContentRect| from |PhysicalContentBoxRect|. + content_rect.size = *frozen_size; + } + // We don't propagate sub-pixel into sub-frame layout, in other words, the // rect is snapped at the document boundary, and sub-pixel movement could // cause the sub-frame to layout due to the 1px snap difference. In order to
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.h b/third_party/blink/renderer/core/layout/layout_embedded_content.h index a9210d1..a23a846 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.h +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.h
@@ -70,6 +70,10 @@ bool IsThrottledFrameView() const; protected: + // The size of the child frame when it should be "frozen"; i.e., it should not + // change even when the size of |this| changes. + const absl::optional<PhysicalSize> FrozenFrameSize() const; + PaintLayerType LayerTypeRequired() const override; void StyleDidChange(StyleDifference, const ComputedStyle* old_style) final;
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.cc b/third_party/blink/renderer/core/layout/layout_object_factory.cc index e921275..5a53bc3e 100644 --- a/third_party/blink/renderer/core/layout/layout_object_factory.cc +++ b/third_party/blink/renderer/core/layout/layout_object_factory.cc
@@ -334,7 +334,7 @@ scoped_refptr<StringImpl> str, LegacyLayout legacy) { bool force_legacy = false; - if (RuntimeEnabledFeatures::LayoutNGTextCombineEnabled()) { + if (RuntimeEnabledFeatures::LayoutNGEnabled()) { force_legacy = legacy == LegacyLayout::kForce; if (!force_legacy) return MakeGarbageCollected<LayoutNGText>(node, str);
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory_test.cc b/third_party/blink/renderer/core/layout/layout_object_factory_test.cc index 76b4e0e..8c26a4f 100644 --- a/third_party/blink/renderer/core/layout/layout_object_factory_test.cc +++ b/third_party/blink/renderer/core/layout/layout_object_factory_test.cc
@@ -77,7 +77,7 @@ SetBodyInnerHTML("<div><tcy id=sample>ab</tcy></div>"); const auto& sample_layout_object = *GetLayoutObjectByElementId("sample"); - if (RuntimeEnabledFeatures::LayoutNGTextCombineEnabled()) { + if (RuntimeEnabledFeatures::LayoutNGEnabled()) { EXPECT_EQ(R"DUMP( LayoutInline TCY id="sample" +--LayoutText #text "ab" @@ -99,7 +99,7 @@ SetBodyInnerHTML("<div><tcy id=sample>ab</tcy></div>"); const auto& sample_layout_object = *GetLayoutObjectByElementId("sample"); - if (RuntimeEnabledFeatures::LayoutNGTextCombineEnabled()) { + if (RuntimeEnabledFeatures::LayoutNGEnabled()) { EXPECT_EQ(R"DUMP( LayoutInline TCY id="sample" +--LayoutNGTextCombine (anonymous)
diff --git a/third_party/blink/renderer/core/layout/layout_text_test.cc b/third_party/blink/renderer/core/layout/layout_text_test.cc index c047961..c6f0f2a 100644 --- a/third_party/blink/renderer/core/layout/layout_text_test.cc +++ b/third_party/blink/renderer/core/layout/layout_text_test.cc
@@ -1123,7 +1123,7 @@ } TEST_P(ParameterizedLayoutTextTest, PhysicalLinesBoundingBoxTextCombine) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "body { font: 100px/130px Ahem; }" @@ -1149,15 +1149,10 @@ // EXPECT_EQ(PhysicalRect(15, 0, 100, 100), text_a.PhysicalLinesBoundingBox()); - if (text_01234.Parent()->IsLayoutNGTextCombine()) { - // Note: Width 110 comes from |100px * kTextCombineMargin| in - // |LayoutNGTextCombine::DesiredWidth()|. - EXPECT_EQ(PhysicalRect(-5, 0, 110, 100), - text_01234.PhysicalLinesBoundingBox()); - } else { - EXPECT_EQ(PhysicalRect(15, 100, 100, 100), - text_01234.PhysicalLinesBoundingBox()); - } + // Note: Width 110 comes from |100px * kTextCombineMargin| in + // |LayoutNGTextCombine::DesiredWidth()|. + EXPECT_EQ(PhysicalRect(-5, 0, 110, 100), + text_01234.PhysicalLinesBoundingBox()); EXPECT_EQ(PhysicalRect(15, 200, 100, 100), text_b.PhysicalLinesBoundingBox()); }
diff --git a/third_party/blink/renderer/core/layout/layout_view_test.cc b/third_party/blink/renderer/core/layout/layout_view_test.cc index 9ab6c4c..b469b2a4 100644 --- a/third_party/blink/renderer/core/layout/layout_view_test.cc +++ b/third_party/blink/renderer/core/layout/layout_view_test.cc
@@ -1502,7 +1502,7 @@ } TEST_P(LayoutViewHitTestTest, TextCombineOneTextNode) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "body { margin: 0px; font: 100px/110px Ahem; }" @@ -1577,7 +1577,7 @@ } TEST_P(LayoutViewHitTestTest, TextCombineTwoTextNodes) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "body { margin: 0px; font: 100px/110px Ahem; }"
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc index 07d32eb9..61916ac2 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
@@ -19,11 +19,8 @@ using ::testing::ElementsAre; -class LayoutNGTextCombineTest : public NGLayoutTest, - private ScopedLayoutNGTextCombineForTest { +class LayoutNGTextCombineTest : public NGLayoutTest { protected: - LayoutNGTextCombineTest() : ScopedLayoutNGTextCombineForTest(true) {} - std::string AsInkOverflowString(const LayoutBlockFlow& root) { std::ostringstream ostream; ostream << std::endl;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc index 13ea0f86..b8708e8 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
@@ -590,7 +590,7 @@ // See also NGInlineLayoutAlgorithmTest.TextCombineFake TEST_F(NGInlineLayoutAlgorithmTest, TextCombineBasic) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "body { margin: 0px; font: 100px/110px Ahem; }" @@ -618,7 +618,7 @@ // See also NGInlineLayoutAlgorithmTest.TextCombineBasic TEST_F(NGInlineLayoutAlgorithmTest, TextCombineFake) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "body { margin: 0px; font: 100px/110px Ahem; }"
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc index c421d8b..10c9f14 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -315,7 +315,7 @@ } TEST_F(NGInlineNodeTest, CollectInlinesTextCombineBR) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); InsertStyleElement( "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); SetupHtml("t", u"<div id=t>a<br>z</div>"); @@ -332,7 +332,7 @@ // http://crbug.com/1222633 TEST_F(NGInlineNodeTest, CollectInlinesTextCombineListItemMarker) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); InsertStyleElement( "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); SetupHtml("t", u"<li id=t>ab</li>"); @@ -353,7 +353,7 @@ } TEST_F(NGInlineNodeTest, CollectInlinesTextCombineNewline) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); InsertStyleElement( "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); SetupHtml("t", u"<pre id=t>a\nz</pre>"); @@ -369,7 +369,7 @@ } TEST_F(NGInlineNodeTest, CollectInlinesTextCombineWBR) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); InsertStyleElement( "#t { text-combine-upright: all; writing-mode: vertical-rl; }"); SetupHtml("t", u"<div id=t>a<wbr>z</div>"); @@ -1622,7 +1622,7 @@ } TEST_F(NGInlineNodeTest, TextCombineUsesScalingX) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "div {" @@ -1644,7 +1644,7 @@ // http://crbug.com/1226930 TEST_F(NGInlineNodeTest, TextCombineWordSpacing) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "div {"
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc index 9dfd8da..b6c5ff5f 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc
@@ -167,7 +167,7 @@ // For "text-combine-upright-break-inside-001a.html" TEST_F(NGLineBreakerTest, TextCombineCloseTag) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "#container {" @@ -194,7 +194,7 @@ } TEST_F(NGLineBreakerTest, TextCombineBreak) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "#container {" @@ -213,7 +213,7 @@ } TEST_F(NGLineBreakerTest, TextCombineNoBreak) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "#container {" @@ -232,7 +232,7 @@ } TEST_F(NGLineBreakerTest, TextCombineNoBreakWithSpace) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng(true); LoadAhem(); InsertStyleElement( "#container {"
diff --git a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item_test.cc b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item_test.cc index 386b3ef..1432f53 100644 --- a/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item_test.cc +++ b/third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item_test.cc
@@ -16,7 +16,7 @@ // http://crbug.com/1222633 TEST_F(LayoutNGListItemTest, FindSymbolMarkerLayoutTextWithTextCombine) { - ScopedLayoutNGTextCombineForTest enable_layout_ng_text_combine(true); + ScopedLayoutNGForTest enable_layout_ng_text_combine(true); InsertStyleElement( "li { text-combine-upright: all; writing-mode: vertical-rl; }"); SetBodyInnerHTML("<li id=target>a</li>");
diff --git a/third_party/blink/renderer/core/navigation_api/navigate_event.cc b/third_party/blink/renderer/core/navigation_api/navigate_event.cc index 9a80287..d6d3297 100644 --- a/third_party/blink/renderer/core/navigation_api/navigate_event.cc +++ b/third_party/blink/renderer/core/navigation_api/navigate_event.cc
@@ -148,18 +148,30 @@ "mode"); return; } - if (did_restore_scroll_) - return; - RestoreScrollInternal(); - did_restore_scroll_ = true; + + switch (restore_state_) { + case ManualRestoreState::kNotRestored: + RestoreScrollInternal(); + restore_state_ = ManualRestoreState::kRestored; + return; + case ManualRestoreState::kRestored: + exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError, + "restoreScroll() already called"); + return; + case ManualRestoreState::kDone: + exception_state.ThrowDOMException( + DOMExceptionCode::kInvalidStateError, + "restoreScroll() may not be called after the transition completes"); + return; + } + NOTREACHED(); } void NavigateEvent::RestoreScrollAfterTransitionIfNeeded() { - if (navigation_type_ == "traverse" && !InManualScrollRestorationMode()) { - DCHECK(!did_restore_scroll_); + if (InManualScrollRestorationMode()) + restore_state_ = ManualRestoreState::kDone; + else if (navigation_type_ == "traverse") RestoreScrollInternal(); - } - did_restore_scroll_ = true; } void NavigateEvent::SaveStateFromDestinationItem(HistoryItem* item) {
diff --git a/third_party/blink/renderer/core/navigation_api/navigate_event.h b/third_party/blink/renderer/core/navigation_api/navigate_event.h index 82386ea..d9c050d9 100644 --- a/third_party/blink/renderer/core/navigation_api/navigate_event.h +++ b/third_party/blink/renderer/core/navigation_api/navigate_event.h
@@ -94,7 +94,9 @@ KURL url_; HeapVector<ScriptPromise> navigation_action_promises_list_; - bool did_restore_scroll_ = false; + + enum class ManualRestoreState { kNotRestored, kRestored, kDone }; + ManualRestoreState restore_state_ = ManualRestoreState::kNotRestored; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/style/computed_style.cc b/third_party/blink/renderer/core/style/computed_style.cc index a650f0a..65429b8 100644 --- a/third_party/blink/renderer/core/style/computed_style.cc +++ b/third_party/blink/renderer/core/style/computed_style.cc
@@ -288,7 +288,7 @@ return false; // We use LayoutNGTextCombine only for vertical writing mode. - if (RuntimeEnabledFeatures::LayoutNGTextCombineEnabled() && + if (RuntimeEnabledFeatures::LayoutNGEnabled() && new_style->HasTextCombine() && old_style->IsHorizontalWritingMode() != new_style->IsHorizontalWritingMode()) {
diff --git a/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc index 44aee0b..d0e04b4a 100644 --- a/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc +++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache.cc
@@ -198,8 +198,6 @@ if (cache_iter != cache_.end()) { // Found unused sink; mark it as used and return. cache_iter->used = true; - UMA_HISTOGRAM_BOOLEAN( - "Media.Audio.Render.SinkCache.InfoSinkReusedForOutput", true); TRACE_EVENT_END1("audio", "AudioRendererSinkCache::GetSink", "result", "Cache hit"); return cache_iter->sink; @@ -273,11 +271,8 @@ // To stop the sink before deletion if it's not used, we need to hold // a ref to it. - if (!cache_iter->used) { + if (!cache_iter->used) sink_to_stop = cache_iter->sink; - UMA_HISTOGRAM_BOOLEAN( - "Media.Audio.Render.SinkCache.InfoSinkReusedForOutput", false); - } cache_.erase(cache_iter); } // Lock scope;
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_track_metrics_test.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_track_metrics_test.cc index 4bf7a86..b40ed14 100644 --- a/third_party/blink/renderer/modules/peerconnection/media_stream_track_metrics_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/media_stream_track_metrics_test.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/run_loop.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/modules/peerconnection/media_stream_track_metrics.h"
diff --git a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h index 8658f03..56f1408 100644 --- a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h +++ b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h
@@ -9,7 +9,6 @@ #include <string> #include <vector> -#include "base/time/time.h" #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h" #include "third_party/webrtc/api/media_stream_interface.h" #include "third_party/webrtc/rtc_base/ref_counted_object.h"
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport.cc b/third_party/blink/renderer/modules/webtransport/web_transport.cc index 5cc65a8d..079e065 100644 --- a/third_party/blink/renderer/modules/webtransport/web_transport.cc +++ b/third_party/blink/renderer/modules/webtransport/web_transport.cc
@@ -1319,10 +1319,11 @@ } void WebTransport::RejectPendingStreamResolvers(v8::Local<v8::Value> error) { - for (ScriptPromiseResolver* resolver : create_stream_resolvers_) { + HeapHashSet<Member<ScriptPromiseResolver>> create_stream_resolvers; + create_stream_resolvers_.swap(create_stream_resolvers); + for (ScriptPromiseResolver* resolver : create_stream_resolvers) { resolver->Reject(error); } - create_stream_resolvers_.clear(); } void WebTransport::OnCreateSendStreamResponse(
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index c6adc91..8bd1555 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1396,11 +1396,6 @@ depends_on: ["LayoutNG"], }, { - name: "LayoutNGTextCombine", - depends_on: ["LayoutNG"], - status: "stable" - }, - { name: "LayoutNGView", implied_by: ["LayoutNGPrinting"], },
diff --git a/third_party/blink/renderer/platform/video_capture/gpu_memory_buffer_test_support.h b/third_party/blink/renderer/platform/video_capture/gpu_memory_buffer_test_support.h index bad3274..cbe0b17 100644 --- a/third_party/blink/renderer/platform/video_capture/gpu_memory_buffer_test_support.h +++ b/third_party/blink/renderer/platform/video_capture/gpu_memory_buffer_test_support.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/time/time.h" #include "gpu/ipc/common/gpu_memory_buffer_support.h" #include "third_party/blink/renderer/platform/testing/io_task_runner_testing_platform_support.h"
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/server_process_unittest.py b/third_party/blink/tools/blinkpy/web_tests/port/server_process_unittest.py index fe4c9e19..97ac78b 100644 --- a/third_party/blink/tools/blinkpy/web_tests/port/server_process_unittest.py +++ b/third_party/blink/tools/blinkpy/web_tests/port/server_process_unittest.py
@@ -90,6 +90,7 @@ class TestServerProcess(unittest.TestCase): + @unittest.skip("https://crbug.com/1309323") def test_basic(self): cmd = [ sys.executable, '-c',
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ea70ac9c..5650794 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -7725,3 +7725,11 @@ crbug.com/1312266 [ Mac10.13 ] external/wpt/preload/preload-time-to-fetch.https.html [ Failure ] crbug.com/1312266 [ Mac10.13 ] external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-meter-border-right-width-001.html [ Failure ] crbug.com/1312266 [ Mac10.13 ] external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-meter-background-clip-001.html [ Failure ] +crbug.com/1312469 [ Mac10.12 ] external/wpt/hr-time/clamped-time-origin-isolated.https.html [ Skip ] +crbug.com/1312469 [ Mac10.12 ] fast/forms/calendar-picker/date-picker-select-value-with-keyboard.html [ Skip ] +crbug.com/1312469 [ Mac10.12 ] virtual/scroll-unification-prefer_compositing_to_lcd_text/fast/scroll-behavior/smooth-scroll/mousewheel-scroll.html [ Skip ] +crbug.com/1312469 [ Mac10.12 ] virtual/threaded-no-composited-antialiasing/animations/interpolation/svg-d-interpolation-001.html [ Skip ] +crbug.com/1312469 [ Mac10.12 ] virtual/fledge/http/tests/inspector-protocol/storage/interest-groups.js [ Skip ] +crbug.com/1312469 [ Mac10.12 ] virtual/partitioned-cookies-first-party-sets/http/tests/inspector-protocol/network/blocked-setcookie-same-site-lax.js [ Skip ] +crbug.com/1312469 [ Mac10.12 ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/blocked-cookie-same-site-strict.js [ Skip ] +crbug.com/1312484 [ Mac11 ] external/wpt/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Skip ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode-ref.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode-ref.html new file mode 100644 index 0000000..81da85d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode-ref.html
@@ -0,0 +1,4 @@ +<!DOCTYPE html> +<div style="display: flex; writing-mode: vertical-rl;"> + This text should be vertical. +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode.html new file mode 100644 index 0000000..c041b011 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/webkit-box-vertical-writing-mode.html
@@ -0,0 +1,6 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/"> +<link rel="match" href="webkit-box-vertical-writing-mode-ref.html"> +<div style="display: -webkit-box; writing-mode: vertical-rl;"> + This text should be vertical. +</div>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window-expected.txt deleted file mode 100644 index 5f2713b..0000000 --- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-background-fetch.https.window-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -PASS local to local: success. -FAIL private to local: success. assert_equals: error expected (undefined) undefined but got (string) "TypeError" -FAIL private to private: success. assert_equals: error expected (undefined) undefined but got (string) "TypeError" -FAIL public to local: success. assert_equals: error expected (undefined) undefined but got (string) "TypeError" -FAIL public to private: success. assert_equals: error expected (undefined) undefined but got (string) "TypeError" -FAIL public to public: success. assert_equals: error expected (undefined) undefined but got (string) "TypeError" -PASS treat-as-public to local: success. -PASS treat-as-public to private: success. -PASS treat-as-public to public: success. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-anchor-element.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-anchor-element.tentative.html deleted file mode 100644 index e1c890abf..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-anchor-element.tentative.html +++ /dev/null
@@ -1,16 +0,0 @@ -<!DOCTYPE html> -<meta charset="utf-8"> -<link rel="author" href="mailto:masonf@chromium.org"> -<link rel=help href="https://open-ui.org/components/popup.research.explainer"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<button id=b1>This is an anchor button</button> -<popup id=p1 anchor=b1>This is a popup</popup> -<button id=b2 popup=p1>This button invokes the popup but isn't an anchor</button> - -<script> - test(function() { - assert_equals(p1.anchor,b1); - }, "popup anchor IDL property returns the anchor element"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-light-dismiss-on-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-light-dismiss-on-scroll.tentative.html deleted file mode 100644 index 4f14dd7a..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-popup-element/popup-light-dismiss-on-scroll.tentative.html +++ /dev/null
@@ -1,47 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<meta charset="utf-8" /> -<title>Popup light dismiss on scroll</title> -<link rel="author" href="mailto:masonf@chromium.org"> -<link rel=help href="https://open-ui.org/components/popup.research.explainer"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<div id=scroller> - Scroll me<br><br> - Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt - ut labore et dolore magna aliqua. Enim ut sem viverra aliquet eget sit amet tellus. Massa - sed elementum tempus egestas sed sed risus pretium. Felis bibendum ut tristique et egestas - quis. Tortor dignissim convallis aenean et. Eu mi bibendum neque egestas congue quisque -</div> - -<popup id=popup1>This is popup 1<div id=anchor></div></popup> -<popup id=popup2 anchor=anchor>This is popup 2</popup> -<button onclick='popup1.show();popup2.show();'>Open popups</button> - -<style> - #popup1 { top:50px; left: 50px; } - #popup2 { top:150px; left: 50px; } - #scroller { - height: 150px; - width: 150px; - overflow-y: scroll; - border: 1px solid black; - } -</style> - -<script> - async_test(t => { - popup1.addEventListener('hide',e => { - assert_false(popup2.open); - t.done(); - }) - assert_false(popup1.open); - assert_false(popup2.open); - popup1.show(); - popup2.show(); - assert_true(popup1.open); - assert_true(popup2.open); - scroller.scrollTo(0, 100); - },'Scrolling light-dismisses all popups'); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-element.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-idl-property.tentative-expected.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-element.tentative-expected.txt rename to third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-idl-property.tentative-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-element.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-idl-property.tentative.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-element.tentative.html rename to third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-anchor-idl-property.tentative.html
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative-expected.txt deleted file mode 100644 index f2c6ea58..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative-expected.txt +++ /dev/null
@@ -1,18 +0,0 @@ -This is a testharness.js-based test. -FAIL Popup focus test: default behavior - popup is not focused assert_equals: default behavior - popup is not focused directly focus with popup.focus() expected Element node <div popup="popup" data-test="default behavior - popup is... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus popup assert_equals: autofocus popup activated by popup.showPopup() expected Element node <div popup="popup" data-test="autofocus popup" autofocus=... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus empty popup assert_equals: autofocus empty popup activated by popup.showPopup() expected Element node <div popup="popup" data-test="autofocus empty popup" auto... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus popup with button assert_equals: autofocus popup with button activated by popup.showPopup() expected Element node <div popup="popup" data-test="autofocus popup with button... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus child assert_equals: autofocus child activated by popup.showPopup() expected Element node <button autofocus="" class="should-be-focused">autofocus ... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus on tabindex=0 element assert_equals: autofocus on tabindex=0 element activated by popup.showPopup() expected Element node <p autofocus="" tabindex="0" class="should-be-focused">Th... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus multiple children assert_equals: autofocus multiple children activated by popup.showPopup() expected Element node <button autofocus="" class="should-be-focused">autofocus ... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: autofocus popup and multiple autofocus children assert_equals: autofocus popup and multiple autofocus children activated by popup.showPopup() expected Element node <div popup="popup" autofocus="" data-test="autofocus popu... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: delegatesfocus popup assert_equals: delegatesfocus popup activated by popup.showPopup() expected Element node <button class="should-be-focused">first button should be ... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: delegatesfocus takes precedence over autofocus assert_equals: delegatesfocus takes precedence over autofocus activated by popup.showPopup() expected Element node <button class="should-be-focused">first button</button> but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: delegatesfocus takes precedence over autofocus 2 assert_equals: delegatesfocus takes precedence over autofocus 2 activated by popup.showPopup() expected Element node <button class="should-be-focused">first button</button> but got Element node <button id="prior-focus"></button> -PASS Popup focus test: delegatesfocus on empty popup has no effect -FAIL Popup focus test: delegatesfocus on child has no effect assert_equals: delegatesfocus on child has no effect directly focus with popup.focus() expected Element node <div popup="popup" data-test="delegatesfocus on child has... but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: delegatesfocus skips contained popups assert_equals: delegatesfocus skips contained popups activated by popup.showPopup() expected Element node <button class="should-be-focused">first button</button> but got Element node <button id="prior-focus"></button> -FAIL Popup focus test: delegatesfocus skips contained dialogs assert_equals: delegatesfocus skips contained dialogs activated by popup.showPopup() expected Element node <button class="should-be-focused">first button</button> but got Element node <button id="prior-focus"></button> -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html index 28dc0c9..26b30b28 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html
@@ -11,13 +11,13 @@ <button>first button</button> </div> -<div popup=popup data-test='autofocus popup' autofocus class=should-be-focused> +<div popup=popup data-test='autofocus popup' autofocus tabindex=-1 class=should-be-focused> <p>This is a popup</p> </div> -<div popup=popup data-test='autofocus empty popup' autofocus class=should-be-focused></div> +<div popup=popup data-test='autofocus empty popup' autofocus tabindex=-1 class=should-be-focused></div> -<div popup=popup data-test='autofocus popup with button' autofocus class=should-be-focused> +<div popup=popup data-test='autofocus popup with button' autofocus tabindex=-1 class=should-be-focused> <p>This is a popup</p> <button>button</button> </div> @@ -38,7 +38,7 @@ <button autofocus>second autofocus button</button> </div> -<div popup=popup autofocus data-test='autofocus popup and multiple autofocus children' class=should-be-focused> +<div popup=popup autofocus tabindex=-1 data-test='autofocus popup and multiple autofocus children' class=should-be-focused> <p>This is a popup</p> <button autofocus>autofocus button</button> <button autofocus>second autofocus button</button> @@ -129,14 +129,14 @@ button.remove(); }); popup.id = popupId; - button.setAttribute('popup', popupId); + button.setAttribute('triggerpopup', popupId); priorFocus.focus(); button.click(); assert_equals(document.activeElement, expectedFocusedElement, `${testName} activated by button.click()`); // Make sure we can directly focus the (already open) popup: popup.focus(); - assert_equals(document.activeElement, popup.hasAttribute('delegatesfocus') ? expectedFocusedElement : popup, `${testName} directly focus with popup.focus()`); + assert_equals(document.activeElement, popup.hasAttribute('tabindex') ? popup : expectedFocusedElement, `${testName} directly focus with popup.focus()`); popup.hidePopup(); }, "Popup focus test: " + testName); }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative-expected.txt deleted file mode 100644 index 5dce3539..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Scrolling light-dismisses all popups assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative.html index d1ae7fc..bafa50dae 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss-on-scroll.tentative.html
@@ -1,9 +1,10 @@ <!DOCTYPE html> <html lang="en"> <meta charset="utf-8" /> -<title>Popup light dismiss on scroll</title> +<title>Popup should *not* light dismiss on scroll</title> <link rel="author" href="mailto:masonf@chromium.org"> <link rel=help href="https://open-ui.org/components/popup.research.explainer"> +<link rel=help href="https://github.com/openui/open-ui/issues/240"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -15,8 +16,12 @@ quis. Tortor dignissim convallis aenean et. Eu mi bibendum neque egestas congue quisque </div> -<div popup=popup id=popup1>This is popup 1<div id=anchor></div></div> -<div popup=popup id=popup2 anchor=anchor>This is popup 2</div> +<div popup=popup id=popup1> + This is popup 1 + <div popup=popup id=popup2 anchor=anchor> + This is popup 2 + </div> +</div> <button onclick='popup1.showPopup();popup2.showPopup();'>Open popups</button> <style> @@ -31,17 +36,28 @@ </style> <script> + const popups = document.querySelectorAll('[popup]'); + function assertAll(showing) { + for(let popup of popups) { + assert_equals(popup.matches(':popup-open'),showing); + } + } async_test(t => { - popup1.addEventListener('hide',e => { - assert_false(popup2.matches(':popup-open')); - t.done(); - }) - assert_false(popup1.matches(':popup-open')); - assert_false(popup2.matches(':popup-open')); - popup1.showPopup(); - popup2.showPopup(); - assert_true(popup1.matches(':popup-open')); - assert_true(popup2.matches(':popup-open')); + for(let popup of popups) { + popup.addEventListener('hide',e => { + assert_unreached('Scrolling should not light-dismiss a popup'); + }); + } + assertAll(/*showing*/false); + popups[0].showPopup(); + popups[1].showPopup(); + assertAll(/*showing*/true); scroller.scrollTo(0, 100); - },'Scrolling light-dismisses all popups'); + requestAnimationFrame(() => { + requestAnimationFrame(() => { + assertAll(/*showing*/true); + t.done(); + }); + }); + },'Scrolling should not light-dismiss popups'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative-expected.txt deleted file mode 100644 index 819a60d..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: element click intercepted error -PASS Clicking outside a popup will dismiss the popup -PASS Clicking inside a popup does not close that popup -FAIL Clicking inside a child popup shouldn't close either popup assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html index 9b470b5..00b1029a 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-light-dismiss.tentative.html
@@ -9,17 +9,17 @@ <script src="/resources/testdriver-actions.js"></script> <script src="/resources/testdriver-vendor.js"></script> -<button id=b1 onclick='p1.showPopup()'>Popup 1</button> +<button id=b1 triggerpopup='p1'>Popup 1</button> <span id=outside>Outside all popups</span> <div popup=popup id=p1 anchor=b1> <span id=inside1>Inside popup 1</span> - <button id=b2 onclick='p2.showPopup()'>Popup 2</button> + <button id=b2 triggerpopup='p2'>Popup 2</button> </div> <div popup=popup id=p2 anchor=b2> <span id=inside2>Inside popup 2</span> </div> -<button id=b3 popup=p3>Popup 3 - button 3 +<button id=b3 triggerpopup=p3>Popup 3 - button 3 <div popup=popup id=p4>Inside popup 4</div> </button> <div popup=popup id=p3>Inside popup 3</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-shadow-dom.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-shadow-dom.tentative-expected.txt deleted file mode 100644 index 1a87c07..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-shadow-dom.tentative-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -PASS Popups located inside shadow DOM can still be shown -PASS anchor references do not cross shadow boundaries -FAIL anchor references use the flat tree not the DOM tree assert_true: expected true got false -PASS The popup stack is preserved across shadow-inclusive ancestors -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative-expected.txt deleted file mode 100644 index 65a5b59..0000000 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -FAIL popup stacking behavior assert_equals: Popup #1 incorrect state expected true but got false -FAIL popups should be closed by dialogs assert_equals: Popup #1 incorrect state expected true but got false -FAIL dialogs should not be closed by popups assert_true: expected true got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative.html index dc4ae57c..12ee992 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-stacking.tentative.html
@@ -5,6 +5,67 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> +<!-- Enumerate all the ways of creating an ancestor popup relationship --> + +<div class="example"> + <p>Direct DOM children</p> + <div popup=popup class=ancestor><p>Ancestor popup</p> + <div popup=popup class=child><p>Child popup</p></div> + </div> +</div> + +<div class="example"> + <p>Grandchildren</p> + <div popup=popup class=ancestor><p>Ancestor popup</p> + <div> + <div> + <div popup=popup class=child><p>Child popup</p></div> + </div> + </div> + </div> +</div> + +<div class="example"> + <p>triggerpopup attribute relationship</p> + <div popup=popup class=ancestor><p>Ancestor popup</p> + <button triggerpopup=trigger1 class=clickme>Button</button> + </div> + <div id=trigger1 popup=popup class=child><p>Child popup</p></div> +</div> + +<div class="example"> + <p>nested triggerpopup attribute relationship</p> + <div popup=popup class=ancestor><p>Ancestor popup</p> + <div> + <div> + <button triggerpopup=trigger2 class=clickme>Button</button> + </div> + </div> + </div> + <div id=trigger2 popup=popup class=child><p>Child popup</p></div> +</div> + +<div class="example"> + <p>anchor attribute relationship</p> + <div id=anchor1 popup=popup class=ancestor><p>Ancestor popup</p></div> + <div anchor=anchor1 popup=popup class=child><p>Child popup</p></div> +</div> + +<div class="example"> + <p>indirect anchor attribute relationship</p> + <div popup=popup class=ancestor> + <p>Ancestor popup</p> + <div> + <div> + <span id=anchor2>Anchor</span> + </div> + </div> + </div> + <div anchor=anchor2 popup=popup class=child><p>Child popup</p></div> +</div> + +<!-- Other examples --> + <div popup=popup id=p1 anchor=b1><p>This is popup #1</p> <button id=b2 onclick='p2.showPopup()'>Popup 2</button> <button id=b4 onclick='p4.showPopup()'>Popup 4</button> @@ -20,6 +81,29 @@ <button id=b5 onclick='d1.showPopup()'>Dialog</button> <script> + // Test basic ancestor relationships + for(let example of document.querySelectorAll('.example')) { + const descr = example.querySelector('p').textContent; + const ancestor = example.querySelector('[popup].ancestor'); + const child = example.querySelector('[popup].child'); + const clickToActivate = example.querySelector('.clickme'); + test(function() { + assert_true(!!descr && !!ancestor && !!child); + assert_false(ancestor.matches(':popup-open')); + assert_false(child.matches(':popup-open')); + ancestor.showPopup(); + if (clickToActivate) + clickToActivate.click(); + else + child.showPopup(); + assert_true(child.matches(':popup-open')); + assert_true(ancestor.matches(':popup-open')); + ancestor.hidePopup(); + assert_false(ancestor.matches(':popup-open')); + assert_false(child.matches(':popup-open')); + },descr); + } + const popups = [p1, p2, p3, p4]; function assertState(...states) { @@ -46,7 +130,7 @@ // Hiding P1 should hide all. p1.hidePopup(); assertState(false,false,false,false); - }, "popup stacking behavior") + }, "more complex nesting, all using anchor ancestry") test(function() { function openManyPopups() { @@ -56,7 +140,7 @@ assertState(true,true,true,false); } openManyPopups(); - d1.showPopup(); // Dialog.showPopup() should hide all popups. + d1.show(); // Dialog.showPopup() should hide all popups. assertState(false,false,false,false); d1.close(); openManyPopups(); @@ -66,14 +150,17 @@ }, "popups should be closed by dialogs") test(function() { - d1.showPopup(); - assert_true(d1.matches(':popup-open')); + // Note: d1 is a <dialog> element, not a popup. + assert_false(d1.open); + d1.show(); + assert_true(d1.open); p1.showPopup(); assertState(true,false,false,false); - assert_true(d1.matches(':popup-open')); + assert_true(d1.open); p1.hidePopup(); - assert_true(d1.matches(':popup-open')); + assert_true(d1.open); d1.close(); + assert_false(d1.open); }, "dialogs should not be closed by popups") </script>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-after-resolve.html b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-after-resolve.html index e15f499a..6cf0fe16 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-after-resolve.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-after-resolve.html
@@ -20,8 +20,8 @@ }; await navigation.back().finished; assert_not_equals(window.scrollY, 0); - navigate_event.restoreScroll(); + assert_throws_dom("InvalidStateError", () => navigate_event.restoreScroll()); assert_not_equals(window.scrollY, 0); -}, "scrollRestoration: restoreScroll() should not work after a navigation finished promise fulfills"); +}, "scrollRestoration: restoreScroll() should throw after a navigation finished promise fulfills"); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-repeated.html b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-repeated.html new file mode 100644 index 0000000..9ca5bfa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/navigation-api/scroll-restoration/manual-restoreScroll-repeated.html
@@ -0,0 +1,25 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<div style="height: 1000px; width: 1000px;"></div> +<div id="frag"></div> +<script> +promise_test(async t => { + // Wait for after the load event so that the navigation doesn't get converted + // into a replace navigation. + await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0)); + assert_equals(window.scrollY, 0); + await navigation.navigate("#frag").finished; + assert_not_equals(window.scrollY, 0); + navigation.onnavigate = t.step_func(e => { + e.transitionWhile(Promise.resolve(), { scrollRestoration: "manual" }); + e.restoreScroll(); + assert_equals(window.scrollY, 0); + assert_throws_dom("InvalidStateError", () => e.restoreScroll()); + }); + await navigation.back().finished; + assert_equals(window.scrollY, 0); +}, "scrollRestoration: restoreScroll() should throw if called a second time"); +</script> +</body>
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..52162505 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..19593c23 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..7a44ce95 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..828ada8 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..7a44ce95 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..828ada8 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..7a44ce95 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..828ada8 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..7a44ce95 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..828ada8 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png index ec947bef..9d6cc51 100644 --- a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png index 694dd1c7..2a74e98 100644 --- a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png new file mode 100644 index 0000000..9d6cc51 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png new file mode 100644 index 0000000..2a74e98 --- /dev/null +++ b/third_party/blink/web_tests/platform/win7/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/resize-lock.https-expected.txt b/third_party/blink/web_tests/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/resize-lock.https-expected.txt deleted file mode 100644 index 34398b2..0000000 --- a/third_party/blink/web_tests/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/resize-lock.https-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Test Resize Lock assert_equals: fenced frame dimensions should not be updated by parent page expected "300x150" but got "444x444" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 2eaaa06..7ac6b69 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -919,7 +919,6 @@ html element picture html element plaintext html element popup - property anchor property hide property open property show
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index 7c18911..de29c07 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -4135,7 +4135,6 @@ method constructor interface HTMLPopupElement : HTMLElement attribute @@toStringTag - getter anchor getter initiallyOpen getter open method constructor
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index b1133596..28a37411 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-12-0-2-g385345037 -Revision: 385345037e04f9ee6ffc8b14318f1a079520c41d +Version: VER-2-12-0-8-gaee6b9472 +Revision: aee6b9472732c627ff844d4fb75a588d388b6570 CPEPrefix: cpe:/a:freetype:freetype:2.11.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/tools/android/forwarder2/device_forwarder_main.cc b/tools/android/forwarder2/device_forwarder_main.cc index 440270a..33df045 100644 --- a/tools/android/forwarder2/device_forwarder_main.cc +++ b/tools/android/forwarder2/device_forwarder_main.cc
@@ -19,7 +19,6 @@ #include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "tools/android/forwarder2/common.h" #include "tools/android/forwarder2/daemon.h" #include "tools/android/forwarder2/device_controller.h"
diff --git a/tools/android/forwarder2/device_listener.h b/tools/android/forwarder2/device_listener.h index ecf93a5..e7cf7fd 100644 --- a/tools/android/forwarder2/device_listener.h +++ b/tools/android/forwarder2/device_listener.h
@@ -11,7 +11,6 @@ #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "tools/android/forwarder2/forwarders_manager.h" #include "tools/android/forwarder2/pipe_notifier.h" #include "tools/android/forwarder2/self_deleter_helper.h"
diff --git a/tools/android/forwarder2/forwarders_manager.h b/tools/android/forwarder2/forwarders_manager.h index 03dedf84..dd5d2b1 100644 --- a/tools/android/forwarder2/forwarders_manager.h +++ b/tools/android/forwarder2/forwarders_manager.h
@@ -9,7 +9,6 @@ #include <vector> #include "base/threading/thread.h" -#include "base/time/time.h" #include "tools/android/forwarder2/pipe_notifier.h" namespace forwarder2 {
diff --git a/tools/android/forwarder2/host_controller.h b/tools/android/forwarder2/host_controller.h index 54a25d6a..87ab3b64 100644 --- a/tools/android/forwarder2/host_controller.h +++ b/tools/android/forwarder2/host_controller.h
@@ -12,7 +12,6 @@ #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "tools/android/forwarder2/forwarders_manager.h" #include "tools/android/forwarder2/pipe_notifier.h" #include "tools/android/forwarder2/self_deleter_helper.h"
diff --git a/tools/android/forwarder2/host_controllers_manager.h b/tools/android/forwarder2/host_controllers_manager.h index d809b7b..fb7d888 100644 --- a/tools/android/forwarder2/host_controllers_manager.h +++ b/tools/android/forwarder2/host_controllers_manager.h
@@ -12,7 +12,6 @@ #include "base/at_exit.h" #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "tools/android/forwarder2/host_controller.h" #include "tools/android/forwarder2/socket.h"
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.h b/tools/ipc_fuzzer/message_replay/replay_process.h index 6eb7128..9fa4528 100644 --- a/tools/ipc_fuzzer/message_replay/replay_process.h +++ b/tools/ipc_fuzzer/message_replay/replay_process.h
@@ -12,7 +12,6 @@ #include "base/synchronization/waitable_event.h" #include "base/task/single_thread_task_executor.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "base/timer/timer.h" #include "ipc/ipc_channel_proxy.h" #include "ipc/ipc_listener.h"
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index c1ae82a5..8cdceb3 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -846,15 +846,15 @@ 'android-cronet-arm-dbg': 'android_cronet_debug_static_bot_arm_no_neon', 'android-cronet-arm64-dbg': 'android_cronet_debug_static_bot_arm64', 'android-cronet-arm64-rel': 'android_cronet_release_bot_minimal_symbols_arm64', - 'android-cronet-kitkat-arm-rel': 'android_cronet_release_bot_minimal_symbols_arm_no_neon', 'android-cronet-lollipop-arm-rel': 'android_cronet_release_bot_minimal_symbols_arm_no_neon', 'android-cronet-marshmallow-arm64-rel': 'android_cronet_release_trybot_arm64', 'android-cronet-x86-dbg': 'android_cronet_debug_static_bot_x86', - 'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86', 'android-cronet-x86-dbg-10-tests': 'android_cronet_debug_static_bot_x86', 'android-cronet-x86-dbg-11-tests': 'android_cronet_debug_static_bot_x86', 'android-cronet-x86-dbg-oreo-tests': 'android_cronet_debug_static_bot_x86', 'android-cronet-x86-dbg-pie-tests': 'android_cronet_debug_static_bot_x86', + 'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86', + 'android-cronet-x86-rel-kitkat-tests': 'android_cronet_release_bot_minimal_symbols_x86', 'android-inverse-fieldtrials-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google_invert_fieldtrials', 'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_fastbuild_java_coverage', 'android-marshmallow-x86-fyi-rel-reviver': 'android_release_trybot_x86_fastbuild_webview_google',
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index e8a3cfd..fe09a6fe1 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -255,36 +255,6 @@ "use_thin_lto": false } }, - "android-cronet-kitkat-arm-rel": { - "gn_args": { - "arm_use_neon": false, - "clang_use_default_sample_profile": false, - "dcheck_always_on": false, - "default_min_sdk_version": 19, - "disable_file_support": true, - "enable_jdk_library_desugaring": false, - "enable_reporting": true, - "enable_resource_allowlist_generation": false, - "enable_websockets": false, - "ffmpeg_branding": "Chrome", - "include_transport_security_state_preload_list": false, - "is_component_build": false, - "is_debug": false, - "is_official_build": true, - "media_use_ffmpeg": false, - "proprietary_codecs": true, - "strip_debug_info": true, - "symbol_level": 1, - "target_cpu": "arm", - "target_os": "android", - "use_crash_key_stubs": true, - "use_goma": true, - "use_hashed_jni_names": true, - "use_partition_alloc": false, - "use_platform_icu_alternatives": true, - "use_thin_lto": false - } - }, "android-cronet-lollipop-arm-rel": { "gn_args": { "arm_use_neon": false, @@ -504,6 +474,35 @@ "use_thin_lto": false } }, + "android-cronet-x86-rel-kitkat-tests": { + "gn_args": { + "clang_use_default_sample_profile": false, + "dcheck_always_on": false, + "default_min_sdk_version": 19, + "disable_file_support": true, + "enable_jdk_library_desugaring": false, + "enable_reporting": true, + "enable_resource_allowlist_generation": false, + "enable_websockets": false, + "ffmpeg_branding": "Chrome", + "include_transport_security_state_preload_list": false, + "is_component_build": false, + "is_debug": false, + "is_official_build": true, + "media_use_ffmpeg": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 1, + "target_cpu": "x86", + "target_os": "android", + "use_crash_key_stubs": true, + "use_goma": true, + "use_hashed_jni_names": true, + "use_partition_alloc": false, + "use_platform_icu_alternatives": true, + "use_thin_lto": false + } + }, "android-deterministic-dbg": { "gn_args": { "ffmpeg_branding": "Chrome",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 2939c738..a0fba6ca 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -12792,6 +12792,12 @@ <int value="2140268492" label="CSS.startRuleUsageTracking"/> </enum> +<enum name="CellularConfigurationFailureType"> + <int value="0" label="Failed to get shill properties"/> + <int value="1" label="Fetched shill properties with no type"/> + <int value="2" label="Failed to set shill properties"/> +</enum> + <enum name="CellularConnectResult"> <obsolete> Deprecated as of 04/2021. @@ -19253,6 +19259,7 @@ <int value="31" label="Crash.Sender.AttemptedCrashRemoval"/> <int value="32" label="Chaps.DatabaseOpenedSuccessfully"/> <int value="33" label="Chaps.DatabaseOpenAttempt"/> + <int value="34" label="Crostini.OomEvent"/> </enum> <enum name="CrosFirstRunTutorialCompletionType"> @@ -23379,6 +23386,17 @@ <int value="2132270559" label="libsvn_tsvn32.dll"/> </enum> +<enum name="DmaBufSupportedType"> + <int value="0" label="No Native Pixmaps + No Vulkan Ext + No GL Ext"/> + <int value="1" label="GL Ext"/> + <int value="2" label="Vulkan Ext"/> + <int value="3" label="Vulkan Ext + GL Ext"/> + <int value="4" label="Native Pixmaps"/> + <int value="5" label="Native Pixmaps + GL Ext"/> + <int value="6" label="Native Pixmaps + Vulkan Ext"/> + <int value="7" label="Native Pixmaps + Vulkan Ext + GL Ext"/> +</enum> + <enum name="DNS.AddressListDeltaType"> <int value="0" label="Same addresses in the same order"/> <int value="1" label="Same addresses in a different order"/> @@ -29075,6 +29093,7 @@ <int value="969" label="FirstPartySetsOverrides"/> <int value="970" label="DownloadBubbleEnabled"/> <int value="971" label="DevicePowerAdaptiveChargingEnabled"/> + <int value="972" label="GetDisplayMediaSetSelectAllScreens"/> </enum> <enum name="EnterprisePolicyDeviceIdValidity"> @@ -54110,6 +54129,8 @@ label="OmniboxClobberIsZeroSuggestEntrypoint:enabled"/> <int value="-585508682" label="DownloadRange:enabled"/> <int value="-584866456" label="LacrosProfileMigrationForceOff:disabled"/> + <int value="-583842972" + label="WebAuthenticationPasskeysUIExperiment:enabled"/> <int value="-582870536" label="BluetoothNextHandsfreeProfile:enabled"/> <int value="-581236612" label="ConnectivityDiagnosticsWebUi:disabled"/> <int value="-580897686" label="SharedHighlightingAmp:enabled"/> @@ -57982,6 +58003,8 @@ <int value="2096736155" label="BrowsingDataLifetimeManager:enabled"/> <int value="2097048479" label="disable-auto-hiding-toolbar-threshold"/> <int value="2098059607" label="WifiSyncAllowDeletes:disabled"/> + <int value="2098597721" + label="WebAuthenticationPasskeysUIExperiment:disabled"/> <int value="2098714203" label="enable-generic-sensors"/> <int value="2098907258" label="UseSurfaceLayerForVideo:disabled"/> <int value="2099583779" label="DefaultLinkCapturingInBrowser:enabled"/> @@ -79136,6 +79159,10 @@ <int value="3" label="Not populated due to SB pref changing"/> </enum> +<enum name="SafeBrowsingPageLoadTokenClearReason"> + <int value="0" label="Safe Browsing state changed"/> +</enum> + <enum name="SafeBrowsingParseV4HashResult"> <int value="0" label="PARSE_FROM_STRING_ERROR"/> <int value="1" label="UNEXPECTED_THREAT_ENTRY_TYPE_ERROR"/>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml index 21cdeb0..d7ed658 100644 --- a/tools/metrics/histograms/metadata/extensions/histograms.xml +++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -1781,6 +1781,19 @@ </summary> </histogram> +<histogram name="Extensions.Functions.ExtensionMV3Calls" + enum="ExtensionFunctions" expires_after="2023-10-01"> + <owner>tjudkins@chromium.org</owner> + <owner>rdevlin.cronin@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> + <summary> + Recorded when a manifest V3 extension calls an extension API. Note that the + function would also be included in either + Extensions.Functions.ExtensionCalls or + Extensions.Functions.ComponentExtensionCalls histogram. + </summary> +</histogram> + <histogram name="Extensions.Functions.ExtensionServiceWorkerCalls" enum="ExtensionFunctions" expires_after="2022-08-09"> <owner>lazyboy@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml index de41cc8a7..369b818 100644 --- a/tools/metrics/histograms/metadata/gpu/histograms.xml +++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1422,6 +1422,19 @@ </summary> </histogram> +<histogram name="GPU.SharedImage.DmaBufSupportedType" + enum="DmaBufSupportedType" expires_after="2022-09-30"> + <owner>vasilyt@chromium.org</owner> + <owner>hitawala@chromium.org</owner> + <summary> + Tracks which extensions are supported for creating shared images using DMA + buffers. Result is an enum that represents three flags - are native pixmaps + supported for the ozone platform, are Vulkan extensions supported and are GL + extensions supported. This is logged once per gpu process launch through + SharedImageFactory constructor call. + </summary> +</histogram> + <histogram name="GPU.SharedImageManager.TimeToAcquireLock" units="microseconds" expires_after="2020-08-12"> <owner>samans@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml index 955e011..a75d104 100644 --- a/tools/metrics/histograms/metadata/history/histograms.xml +++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -889,8 +889,10 @@ </summary> </histogram> -<histogram name="History.DatabaseFileMB" units="MB" expires_after="M85"> - <owner>shess@chromium.org</owner> +<histogram name="History.DatabaseFileMB" units="MB" expires_after="M110"> + <owner>sophiechang@chromium.org</owner> + <owner>tommycli@chromium.org</owner> + <owner>chrome-journeys@google.com</owner> <summary> Size of History DB file. Duplicate of Profile.HistorySize and Sqlite.SizeKB.History. Logged on initialization of the History DB on 1% of
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index db59bbc..978b087 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -980,6 +980,9 @@ <histogram name="Media.Audio.Render.SinkCache.InfoSinkReusedForOutput" enum="BooleanReused" expires_after="2022-04-05"> + <obsolete> + Removed 04/2022. + </obsolete> <owner>guidou@chromium.org</owner> <owner>olka@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index 3d247b47..212c76b 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -49,6 +49,16 @@ <variant name="L2tpIpsec" summary="L2TP/IPsec"/> </variants> +<histogram name="Network.Ash.Cellular.ConfigurationFailure.Type" + enum="CellularConfigurationFailureType" expires_after="2022-11-01"> + <owner>hsuregan@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Tracks the type of cellular configuration failures that occur when + connecting to a cellular network. + </summary> +</histogram> + <histogram name="Network.Ash.VPN.{VPNProviderType}.ConfigurationSource" enum="VPNConfigurationSource" expires_after="2022-12-31"> <owner>chadduffin@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index 2fa1653..c3460cd 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -797,6 +797,15 @@ </summary> </histogram> +<histogram name="OptimizationGuide.PageTopicsOverrideList.UsedOverride" + enum="Boolean" expires_after="M106"> + <owner>robertogden@chromium.org</owner> + <owner>chrome-intelligence-core@google.com</owner> + <summary> + When the override list is loaded, whether it contained the given input. + </summary> +</histogram> + <histogram name="OptimizationGuide.PredictionManager.DownloadServiceAvailabilityBlockedFetch" units="BooleanBlocked" expires_after="M106">
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index f741f91dbd..3725fd6 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -308,6 +308,28 @@ </summary> </histogram> +<histogram name="Ads.InterestGroup.Auction.GroupFreshness.{Type}" + units="minutes" expires_after="2022-08-31"> + <owner>caraitto@chromium.org</owner> + <owner>pauljensen@chromium.org</owner> + <owner>privacy-sandbox-dev@chromium.org</owner> + <summary> + For every interest group that participates in an auction, the time duration + since the last join or update of that interest group. + + This metric only measures {Type}. + + See https://github.com/WICG/turtledove/blob/main/FLEDGE.md for the latest + version of the FLEDGE explainer. + </summary> + <token key="Type"> + <variant name="NoDailyUpdates" + summary="interest groups that don't specify a dailyUpdateUrl"/> + <variant name="WithDailyUpdates" + summary="interest groups that specify a dailyUpdateUrl"/> + </token> +</histogram> + <histogram name="Ads.InterestGroup.Auction.NumAuctionsPerPage" units="auctions" expires_after="2022-08-31"> <owner>caraitto@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml index 14c86de..71413f744 100644 --- a/tools/metrics/histograms/metadata/permissions/histograms.xml +++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -707,9 +707,11 @@ <owner>engedy@chromium.org</owner> <owner>src/components/permissions/PERMISSIONS_OWNERS</owner> <summary> - Records whether chrome has notifications enabled at app level on Android. + Records whether chrome has notifications already enabled at the app level or + at least is allowed to request for app level permission. When none of these + conditions are true, site level notification permissions are blocked. Recorded when a site attempts to prompt the user for notifications - permission. + permission. Android only. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 00516514..8c98e61 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -1367,6 +1367,16 @@ </summary> </histogram> +<histogram name="SafeBrowsing.PageLoadToken.ClearReason" + enum="SafeBrowsingPageLoadTokenClearReason" expires_after="2022-10-01"> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-safebrowsing-alerts@google.com</owner> + <summary> + Records the reason that page load tokens are cleared. Logged each time + tokens are cleared. + </summary> +</histogram> + <histogram name="SafeBrowsing.PageLoadToken.HasExpired" units="BooleanExpired" expires_after="2022-09-02"> <owner>xinghuilu@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index f0fe642f..8bef90b6 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -13,8 +13,8 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "064824789fcdab74f8ec188949c9cd362f204669", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/be7e3b9ba78503da04d08f06502aa8f86e9b0ac4/trace_processor_shell" + "hash": "0d19e703ec92f119f88e47e43ac128fd8bae6383", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/71cbb3f996fe8eafb3937369418dbf9927a776bd/trace_processor_shell" }, "mac_arm64": { "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config index c1e10e74..d52b4dd 100644 --- a/tools/perf/expectations.config +++ b/tools/perf/expectations.config
@@ -516,6 +516,7 @@ crbug.com/875159 [ win10 ] v8.browsing_desktop/browse:media:imgur [ Skip ] crbug.com/958507 [ desktop ] v8.browsing_desktop/browse:media:imgur [ Skip ] crbug.com/1008001 [ win ] v8.browsing_desktop/browse:tools:sheets:2019 [ Skip ] +crbug.com/1296788 [ chromeos ] v8.browsing_desktop/browse:tools:sheets:2019 [ Skip ] crbug.com/1008028 [ desktop ] v8.browsing_desktop/browse:news:hackernews:2020 [ Skip ] crbug.com/1009838 [ mac ] v8.browsing_desktop/browse:tools:maps:2019 [ Skip ] crbug.com/1009838 [ chromeos ] v8.browsing_desktop/browse:tools:maps:2019 [ Skip ] @@ -550,6 +551,7 @@ crbug.com/875159 [ win10 ] v8.browsing_desktop-future/browse:media:imgur [ Skip ] crbug.com/958507 [ desktop ] v8.browsing_desktop-future/browse:media:imgur [ Skip ] crbug.com/1008001 [ win ] v8.browsing_desktop-future/browse:tools:sheets:2019 [ Skip ] +crbug.com/1296788 [ chromeos ] v8.browsing_desktop-future/browse:tools:sheets:2019 [ Skip ] crbug.com/1008028 [ desktop ] v8.browsing_desktop-future/browse:news:hackernews:2020 [ Skip ] crbug.com/1009838 [ mac ] v8.browsing_desktop-future/browse:tools:maps:2019 [ Skip ] crbug.com/1009838 [ chromeos ] v8.browsing_desktop-future/browse:tools:maps:2019 [ Skip ]
diff --git a/ui/accessibility/extensions/colorenhancer/res/setup.css b/ui/accessibility/extensions/colorenhancer/res/setup.css index fbb1470..9fb2d59 100644 --- a/ui/accessibility/extensions/colorenhancer/res/setup.css +++ b/ui/accessibility/extensions/colorenhancer/res/setup.css
@@ -53,6 +53,13 @@ vertical-align: middle; margin: 5px; margin-left: 10px; + justify-content: space-evenly; +} + +.row label { + align-items: center; + display: flex; + flex-direction: row; } .swatch { @@ -67,6 +74,11 @@ margin-right: 10px; } +.row input.axis { + margin-top: 1px; + margin-right: 5px; +} + .swatch span { transform: translate(-5px, -22px); font: 60pt sans; @@ -113,6 +125,13 @@ background: rgb(240, 240, 255); } +#step-3.advanced { + border-top: 1px transparent; + max-height: 0; + max-width: 300px; + visibility: hidden; +} + #setup-button-strip { display: flex; flex-direction: row;
diff --git a/ui/accessibility/extensions/colorenhancer/src/background.js b/ui/accessibility/extensions/colorenhancer/src/background.js index a090f30f..5d3697d 100644 --- a/ui/accessibility/extensions/colorenhancer/src/background.js +++ b/ui/accessibility/extensions/colorenhancer/src/background.js
@@ -52,7 +52,8 @@ 'severity': Storage.severity, 'type': Storage.type, 'simulate': Storage.simulate, - 'enable': Storage.enable + 'enable': Storage.enable, + 'axis': Storage.axis }; Common.debugPrint( 'updateTabs: sending ' + JSON.stringify(msg) + ' to ' + @@ -75,7 +76,8 @@ 'severity': Storage.severity, 'type': Storage.type, 'simulate': Storage.simulate, - 'enable': Storage.enable + 'enable': Storage.enable, + 'axis': Storage.axis }; } @@ -90,6 +92,7 @@ Storage.TYPE.listeners.push(this.updateTabs_.bind(this)); Storage.SIMULATE.listeners.push(this.updateTabs_.bind(this)); Storage.ENABLE.listeners.push(this.updateTabs_.bind(this)); + Storage.AXIS.listeners.push(this.updateTabs_.bind(this)); this.updateTabs_();
diff --git a/ui/accessibility/extensions/colorenhancer/src/cvd.js b/ui/accessibility/extensions/colorenhancer/src/cvd.js index f5305dd..3eee15b 100644 --- a/ui/accessibility/extensions/colorenhancer/src/cvd.js +++ b/ui/accessibility/extensions/colorenhancer/src/cvd.js
@@ -16,6 +16,8 @@ this.curEnable = false; /** @private {number} */ this.curFilter = 0; + /** @private {!CvdAxis} */ + this.curAxis = CvdAxis.DEFAULT; this.init_(); } @@ -98,23 +100,23 @@ /** * TODO(mustaq): This should be nuked, see this.getCvdCorrectionMatrix_(). - * @const {Object<!CvdType, {addendum: !Matrix3x3, delta_factor: !Matrix3x3}>} + * @const {Object<!CvdAxis, {addendum: !Matrix3x3, delta_factor: !Matrix3x3}>} * @private */ static correctionParams_ = { - [CvdType.PROTANOMALY]: { + [CvdAxis.RED]: { addendum: Matrix3x3.fromData( [[0.0, 0.0, 0.0], [0.7, 1.0, 0.0], [0.7, 0.0, 1.0]]), delta_factor: Matrix3x3.fromData( [[0.0, 0.0, 0.0], [0.3, 0.0, 0.0], [-0.3, 0.0, 0.0]]) }, - [CvdType.DEUTERANOMALY]: { + [CvdAxis.GREEN]: { addendum: Matrix3x3.fromData( - [[0.0, 0.0, 0.0], [0.7, 1.0, 0.0], [0.7, 0.0, 1.0]]), + [[1.0, 0.7, 0.0], [0.0, 0.0, 0.0], [0.0, 0.7, 1.0]]), delta_factor: Matrix3x3.fromData( - [[0.0, 0.0, 0.0], [0.3, 0.0, 0.0], [-0.3, 0.0, 0.0]]) + [[0.0, 0.3, 0.0], [0.3, 0.0, 0.0], [0.0, -0.3, 0.0]]) }, - [CvdType.TRITANOMALY]: { + [CvdAxis.BLUE]: { addendum: Matrix3x3.fromData( [[1.0, 0.0, 0.7], [0.0, 1.0, 0.7], [0.0, 0.0, 0.0]]), delta_factor: Matrix3x3.fromData( @@ -162,12 +164,30 @@ * color adjustment. * @param {!CvdType} cvdType Type of CVD, either PROTANOMALY or * DEUTERANOMALY or TRITANOMALY. + * @param {!CvdAxis} cvdAxis Axis of correction: RED, GREEN, BLUE or DEFAULT. * @param {number} delta A real number in [0,1] denoting color adjustment. * @return {!Matrix3x3} * @private */ - getCvdCorrectionMatrix_(cvdType, delta) { - const cvdCorrectionParam = CVD.correctionParams_[cvdType]; + getCvdCorrectionMatrix_(cvdType, cvdAxis, delta) { + if (cvdAxis == CvdAxis.DEFAULT) { + switch (cvdType) { + case CvdType.PROTANOMALY: + cvdAxis = CvdAxis.RED; + break; + case CvdType.DEUTERANOMALY: + cvdAxis = CvdAxis.GREEN; + break; + case CvdType.TRITANOMALY: + cvdAxis = CvdAxis.BLUE; + break; + default: + Common.debugPrint('correction: invalid axis: ' + cvdAxis); + throw new Error('Invalid Rotation Axis'); + } + } + + const cvdCorrectionParam = CVD.correctionParams_[cvdAxis]; // TODO(mustaq): Perhaps nuke full-matrix operations after experiment. return cvdCorrectionParam['addendum'].add( cvdCorrectionParam['delta_factor'].scale(delta)); @@ -177,6 +197,7 @@ * Returns the 3x3 matrix to be used for the given settings. * @param {!CvdType} cvdType Type of CVD, either PROTANOMALY or * DEUTERANOMALY or TRITANOMALY. + * @param {!CvdAxis} cvdAxis Axis of correction: RED, GREEN, BLUE or DEFAULT. * @param {number} severity A real number in [0,1] denoting severity. * @param {number} delta A real number in [0,1] denoting color adjustment. * @param {boolean} simulate Whether to simulate the CVD type. @@ -184,7 +205,7 @@ * @return {!Matrix3x3} * @private */ - getEffectiveCvdMatrix_(cvdType, severity, delta, simulate, enable) { + getEffectiveCvdMatrix_(cvdType, cvdAxis, severity, delta, simulate, enable) { if (!enable) { return Matrix3x3.IDENTITY; } @@ -192,7 +213,8 @@ let effectiveMatrix = this.getCvdSimulationMatrix_(cvdType, severity); if (!simulate) { - const cvdCorrectionMatrix = this.getCvdCorrectionMatrix_(cvdType, delta); + const cvdCorrectionMatrix = + this.getCvdCorrectionMatrix_(cvdType, cvdAxis, delta); const tmpProduct = cvdCorrectionMatrix.multiply(effectiveMatrix); effectiveMatrix = @@ -259,7 +281,7 @@ } const effectiveMatrix = this.getEffectiveCvdMatrix_( - this.curType, this.curSeverity, this.curDelta * 2 - 1, + this.curType, this.curAxis, this.curSeverity, this.curDelta * 2 - 1, this.curSimulate, this.curEnable); this.setFilter_(effectiveMatrix); @@ -326,6 +348,14 @@ } } + if (message['axis'] !== undefined) { + const axis = message.axis; + if (this.curAxis !== axis) { + this.curAxis = axis; + changed = true; + } + } + if (changed) { this.update_(); } @@ -355,11 +385,14 @@ * Generate SVG filter for color enhancement based on type and severity using * default color adjustment. * @param {!CvdType} type Type type of color vision defficiency (CVD). + * @param {!CvdAxis} axis Axis of color correction. * @param {number} severity The degree of CVD ranging from 0 for normal * vision to 1 for dichromats. */ - getDefaultCvdCorrectionFilter(type, severity) { - return this.getEffectiveCvdMatrix_(type, severity, 0, false, true); + getDefaultCvdCorrectionFilter(type, axis, severity) { + return this.getEffectiveCvdMatrix_(type, axis, severity, + /* set color shift to default correction (zero shift, simulate = false + * and enable = true) */ 0, false, true); } /**
diff --git a/ui/accessibility/extensions/colorenhancer/src/cvd_type.js b/ui/accessibility/extensions/colorenhancer/src/cvd_type.js index bebd421..913a65c 100644 --- a/ui/accessibility/extensions/colorenhancer/src/cvd_type.js +++ b/ui/accessibility/extensions/colorenhancer/src/cvd_type.js
@@ -12,3 +12,14 @@ /** @typedef {!CvdType|Storage.INVALID_TYPE_PLACEHOLDER} */ let OptionalCvdType; +/** @enum {string} The Cvd Matrix can be pivot across different color axis: + * DEFAULT uses the standard color rotation depending on CVD + * while RED, GREEN, BLUE are used to override. + * */ +const CvdAxis = { + DEFAULT: 'DEFAULT', + RED: 'RED', + GREEN: 'GREEN', + BLUE: 'BLUE', +}; +
diff --git a/ui/accessibility/extensions/colorenhancer/src/popup.html b/ui/accessibility/extensions/colorenhancer/src/popup.html index 65ed2d4..f3d9efd 100644 --- a/ui/accessibility/extensions/colorenhancer/src/popup.html +++ b/ui/accessibility/extensions/colorenhancer/src/popup.html
@@ -36,6 +36,9 @@ <td> <button id="setup" i18n-content="color_enhancer_setup_button"></button> </td> + <td> + <button id="advanced-toggle" i18n-content="color_enhancer_advanced" disabled></button> + </td> </tr> </table> </div> @@ -62,6 +65,30 @@ <input id="severity" type="range" min=0 max=1.0 step=0.1 value="0"> </div> </section> + <section id="step-3" class="advanced"> + <div> + <span i18n-content="color_enhancer_axis"> + </span> + </div> + <div id="row-axis" class="row"> + <label> + <input type="radio" class="axis" id="axis-default" name="CvdAxis" value="DEFAULT"> + <span i18n-content="color_enhancer_axis_default"> </span></input> + </label> + <label> + <input type="radio" class="axis" id="axis-red" name="CvdAxis" value="RED"> + <span i18n-content="color_enhancer_axis_red"> </span></input> + </label> + <label> + <input type="radio" class="axis" id="axis-green" name="CvdAxis" value="GREEN"> + <span i18n-content="color_enhancer_axis_green"> </span></input> + </label> + <label> + <input type="radio" class="axis" id="axis-blue" name="CvdAxis" value="BLUE"> + <span i18n-content="color_enhancer_axis_blue"> </span></input> + </label> + </div> + </section> <div id="setup-button-strip" class="row"> <button id="reset" i18n-content="color_enhancer_reset"></button> <button id="ok" i18n-content="color_enhancer_ok"></button>
diff --git a/ui/accessibility/extensions/colorenhancer/src/popup.js b/ui/accessibility/extensions/colorenhancer/src/popup.js index 5633497..4a22c8b 100644 --- a/ui/accessibility/extensions/colorenhancer/src/popup.js +++ b/ui/accessibility/extensions/colorenhancer/src/popup.js
@@ -9,7 +9,7 @@ /** * Save previous state of setup parameters for use in the event of a * canceled setup. - * @type {{type: !CvdType, severity: number} | undefined} + * @type {{type: !CvdType, axis: !CvdAxis, severity: number} | undefined} */ this.restoreSettings = undefined; @@ -67,6 +67,18 @@ } /** + * Gets the CVD AXIS selected through the radio buttons. + * @return {!CvdAxis} + */ + getCvdAxisSelection() { + const axisButtons = document.querySelectorAll('input[name="CvdAxis"]'); + for (const axis of axisButtons) { + if (axis.checked) + return axis.value; + } + } + + /** * Sets the radio buttons selection to the given CVD type. * @param {!CvdType} cvdType Type of CVD, either PROTANOMALY or * DEUTERANOMALY or TRITANOMALY. @@ -88,6 +100,26 @@ } /** + * Sets the radio buttons selection to the given CVD axis. + * @param {!CvdAxis} cvdAxis Type of Axis, either DEFAULT or + * RED or GREEN or BLUE. + */ + setCvdAxisSelection(axis) { + Common.$('axis-' + axis.toLowerCase()).checked = true; + } + + /** + * Enable/Disable all axis selectors. + * @param {boolean} enable determines if the axis control is enabled. + */ + + updateAxisControls(disable) { + Common.$('step-3').querySelectorAll('.axis').forEach(axis => { + axis.disabled = disable; + }); + } + + /** * Styles controls based on stage of setup. */ updateControls() { @@ -96,25 +128,42 @@ Common.$('enable').disabled = false; Common.$('delta').disabled = false; Common.$('setup').disabled = false; + + // Disable advanced + Common.$('advanced-toggle').disabled = true; } else { // Disable main controls during setup phase. Common.$('enable').disabled = true; Common.$('delta').disabled = true; Common.$('setup').disabled = true; + this.updateAxisControls(true); + + // Enable Advanced Toggle + Common.$('advanced-toggle').disabled = false; if (!this.getCvdTypeSelection()) { // Have not selected a CVD type. Mark Step 1 as active. Common.$('step-1').classList.add('active'); Common.$('step-2').classList.remove('active'); + Common.$('step-3').classList.remove('active'); // Disable "step 2" controls. Common.$('severity').disabled = true; Common.$('reset').disabled = true; + this.updateAxisControls(true); } else { Common.$('step-1').classList.remove('active'); Common.$('step-2').classList.add('active'); // Enable "step 2" controls. Common.$('severity').disabled = false; Common.$('reset').disabled = false; + if (Common.$('step-3').classList.contains('advanced')) { + Common.$('step-3').classList.remove('active'); + this.updateAxisControls(true); + } else { + Common.$('step-2').classList.add('active'); + this.updateAxisControls(false); + } + // Force filter update. this.onSeverityChange(parseFloat(Common.$('severity').value)); } @@ -137,8 +186,10 @@ Common.$('severity').value = Storage.severity; - if (!Common.$('setup-panel').classList.contains('collapsed')) + if (!Common.$('setup-panel').classList.contains('collapsed')) { this.setCvdTypeSelection(Storage.type); + this.setCvdAxisSelection(Storage.axis); + } Common.$('enable').checked = Storage.enable; Common.debugPrint( @@ -175,7 +226,8 @@ this.update(); // Apply filter to popup swatches. const filter = - cvd.getDefaultCvdCorrectionFilter(this.getCvdTypeSelection(), value); + cvd.getDefaultCvdCorrectionFilter(this.getCvdTypeSelection(), + this.getCvdAxisSelection(), value); cvd.injectColorEnhancementFilter(filter); // Force a refresh. window.getComputedStyle(document.documentElement, null); @@ -188,6 +240,7 @@ onTypeChange(value) { Common.debugPrint('onTypeChange: ' + value + ' for ' + this.site); Storage.type = value; + Storage.axis = CvdAxis.DEFAULT; this.update(); Common.$('severity').value = 0; this.updateControls(); @@ -208,6 +261,17 @@ } /** + * Callback for changing color deficiency correction axis. + * @param {string} value Value of checkbox element. + */ + onAxisChange(value) { + Common.debugPrint('onAxisChange: ' + value + ' for ' + this.site); + Storage.axis = value; + this.update(); + this.updateControls(); + } + + /** * Attach event handlers to controls and update the filter config values for * the currently visible tab. */ @@ -224,14 +288,24 @@ // Store current settings in the event of a canceled setup. this.restoreSettings = { type: Storage.type, - severity: Storage.severity + severity: Storage.severity, + axis: Storage.axis }; // Initialize controls based on current settings. this.setCvdTypeSelection(this.restoreSettings.type); + this.setCvdAxisSelection(this.restoreSettings.axis); Common.$('severity').value = this.restoreSettings.severity; this.updateControls(); }; + Common.$('advanced-toggle').onclick = () => { + if (Common.$('step-3').classList.contains('advanced')) + Common.$('step-3').classList.remove('advanced'); + else + Common.$('step-3').classList.add('advanced'); + this.updateControls(); + }; + Common.$('delta').addEventListener('input', function() { window.popup.onDeltaChange(parseFloat(this.value)); }); @@ -242,12 +316,20 @@ window.popup.onEnableChange(this.checked); }); + Common.$('step-3').querySelectorAll('.axis').forEach(axis => { + axis.addEventListener('change', function(event) { + window.popup.onAxisChange(event.target.value); + }); + }); + Common.$('reset').onclick = () => { Storage.severity = 0; Storage.type = Storage.INVALID_TYPE_PLACEHOLDER; Storage.enable = false; + Storage.axis = CvdAxis.DEFAULT; Common.$('severity').value = 0; Common.$('enable').checked = false; + this.setCvdAxisSelection(CvdAxis.DEFAULT); this.setCvdTypeSelection(''); this.updateControls(); cvd.clearColorEnhancementFilter(); @@ -256,6 +338,7 @@ const closeSetup = () => { Common.$('setup-panel').classList.add('collapsed'); + Common.$('advanced-toggle').disabled = true; this.updateControls(); }; @@ -269,9 +352,11 @@ Common.debugPrint( 'restore previous settings: ' + 'type = ' + this.restoreSettings.type + + 'axis = ' + this.restoreSettings.axis + ', severity = ' + this.restoreSettings.severity); Storage.type = this.restoreSettings.type; Storage.severity = this.restoreSettings.severity; + Storage.axis = this.restoreSettings.axis; } };
diff --git a/ui/accessibility/extensions/colorenhancer/src/storage.js b/ui/accessibility/extensions/colorenhancer/src/storage.js index 9bce300..e372f98 100644 --- a/ui/accessibility/extensions/colorenhancer/src/storage.js +++ b/ui/accessibility/extensions/colorenhancer/src/storage.js
@@ -26,6 +26,9 @@ /** @private {boolean} */ this.enable_ = Storage.ENABLE.defaultValue; + + /** @private {!CvdAxis|undefined} */ + this.axis_ = undefined; } // ======= Public methods ======= @@ -50,6 +53,19 @@ static get simulate() { return Storage.instance.simulate_; } /** @return {boolean} */ static get enable() { return Storage.instance.enable_; } + /** @return {!CvdAxis} */ + static get axis() { + // on earlier versions axis was not defined and deutan + // correction used a RED shift. Ensure backwards compatibility + // with legacy behavior + if (Storage.instance.axis_ === undefined) { + if (Storage.instance.type_ === CvdType.DEUTERANOMALY) + return CvdAxis.RED; + else + return CvdAxis.DEFAULT; + } + return Storage.instance.axis_; + } /** * @param {string} site @@ -107,6 +123,12 @@ Storage.instance.store_(Storage.SITE_DELTAS); } + /** @param {!CvdAxis} newCvdAxis */ + static set axis(newCvdAxis) { + Storage.instance.setOrResetValue_(Storage.AXIS, newCvdAxis); + Storage.instance.store_(Storage.AXIS); + } + // ======== Private Methods ======== /** @@ -148,6 +170,7 @@ for (const value of storedValues) { this.setOrResetValue_(value, results[value.key]); } + opt_callback ? opt_callback() : undefined; }); } @@ -253,9 +276,20 @@ listeners: [], }; + /** @const {!Storage.Value} */ + static AXIS = { + key: 'cvd_axis', + defaultValue: 'DEFAULT', + validate: (axis) => Object.values(CvdAxis).includes(axis), + get: () => Storage.instance.axis_, + set: (axis) => Storage.instance.axis_ = axis, + reset: () => Storage.instance.axis_ = Storage.AXIS.defaultValue, + listeners: [], + }; + /** @const {!Array<!Storage.Value>} */ static ALL_VALUES = [ Storage.DELTA, Storage.SITE_DELTAS, Storage.SEVERITY, Storage.TYPE, - Storage.SIMULATE, Storage.ENABLE, + Storage.SIMULATE, Storage.ENABLE, Storage.AXIS, ]; }
diff --git a/ui/accessibility/extensions/colorenhancer/src/storage_test.js b/ui/accessibility/extensions/colorenhancer/src/storage_test.js index edf38c0..3b31776 100644 --- a/ui/accessibility/extensions/colorenhancer/src/storage_test.js +++ b/ui/accessibility/extensions/colorenhancer/src/storage_test.js
@@ -46,6 +46,7 @@ checkFloatValue(0.5, Storage.getSiteDelta('default.com')); checkFloatValue(1.0, Storage.severity); assertEquals(Storage.INVALID_TYPE_PLACEHOLDER, Storage.type); + assertEquals(CvdAxis.DEFAULT, Storage.axis); assertEquals(false, Storage.simulate); assertEquals(false, Storage.enable); }); @@ -75,6 +76,13 @@ assertEquals('string', typeof (storedValue)); assertEquals(CvdType.PROTANOMALY, storedValue); + // Axis + Storage.axis = CvdAxis.RED; + assertEquals(CvdAxis.RED, Storage.axis); + storedValue = MockStorage.local_[Storage.AXIS.key]; + assertEquals('string', typeof (storedValue)); + assertEquals(CvdAxis.RED, storedValue); + // Simulate Storage.simulate = true; assertEquals(true, Storage.simulate); @@ -119,6 +127,12 @@ storedValue = MockStorage.local_[Storage.TYPE.key]; assertEquals(Storage.INVALID_TYPE_PLACEHOLDER, storedValue); + // Axis + Storage.axis = 'PURPLE'; // Axis must be a CvdAxis. + assertEquals(CvdAxis.DEFAULT, Storage.axis); + storedValue = MockStorage.local_[Storage.AXIS.key]; + assertEquals(CvdAxis.DEFAULT, storedValue); + // Simulate Storage.simulate = 7; // Simulate must be a boolean. assertEquals(false, Storage.simulate); @@ -163,6 +177,12 @@ })); Storage.type = CvdType.PROTANOMALY; + Storage.AXIS.listeners.push(this.newCallback(newVal => { + assertEquals(CvdAxis.RED, newVal); + Storage.AXIS.listeners.pop(); + })); + Storage.type = CvdAxis.RED; + Storage.SIMULATE.listeners.push( this.newCallback(newVal => assertEquals(true, newVal))); Storage.simulate = true; @@ -206,6 +226,30 @@ // Check that unset values are at default. checkFloatValue(1.0, Storage.severity); assertEquals(false, Storage.simulate); + assertEquals(CvdAxis.DEFAULT, Storage.axis); + })); +}); + +TEST_F('ColorEnhancerStorageTest', 'LegacyFetch', function() { + // Make sure any values from previous tests are cleared. + MockStorage.local_ = {}; + + Storage.baseDelta = 0.7; + Storage.type = CvdType.DEUTERANOMALY; + Storage.enable = true; + Storage.setSiteDelta('fetch.com', 0.2); + + delete MockStorage.local_[Storage.AXIS.key] + + // Simulate re-starting the extension by creating a new instance. + Storage.initialize(this.newCallback(() => { + checkFloatValue(0.7, Storage.baseDelta); + assertEquals(CvdType.DEUTERANOMALY, Storage.type); + assertEquals(true, Storage.enable); + checkFloatValue(0.2, Storage.getSiteDelta('fetch.com')); + + // Check that Axis uses legacy value + assertEquals(CvdAxis.RED, Storage.axis); })); }); @@ -223,13 +267,21 @@ Storage.SIMULATE.listeners.pop(); })); + Storage.AXIS.listeners.push(this.newCallback((newVal) => { + assertEquals(CvdAxis.RED, newVal); + Storage.AXIS.listeners.pop(); + })); + + MockStorage.callOnChangedListeners({ [Storage.SEVERITY.key]: 0.35, [Storage.SIMULATE.key]: true, + [Storage.AXIS.key]: CvdAxis.RED, }); // Check that the values were set properly, in addition to the callbacks being // called. checkFloatValue(0.35, Storage.severity); assertEquals(true, Storage.simulate); + assertEquals(CvdAxis.RED, Storage.axis); });
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings.grd b/ui/accessibility/extensions/strings/accessibility_extensions_strings.grd index 84148eb5..c7fd9aed 100644 --- a/ui/accessibility/extensions/strings/accessibility_extensions_strings.grd +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings.grd
@@ -318,6 +318,18 @@ <message desc="Choice to enhancing the blue color." name="IDS_COLOR_ENHANCER_TYPE_BLUE"> Blue </message> + <message desc="Choice to correct over red axis." name="IDS_COLOR_ENHANCER_AXIS_RED"> + Red + </message> + <message desc="Choice to correct over green axis." name="IDS_COLOR_ENHANCER_AXIS_GREEN"> + Green + </message> + <message desc="Choice to correct over blue axis." name="IDS_COLOR_ENHANCER_AXIS_BLUE"> + Blue + </message> + <message desc="Choice to correct over default axis." name="IDS_COLOR_ENHANCER_AXIS_DEFAULT"> + Default + </message> <message desc="Title for checkbox that enables the extension." name="IDS_COLOR_ENHANCER_ENABLE"> Enable? </message> @@ -337,9 +349,15 @@ <message desc="Cancel button for the color enhancer setup." name="IDS_COLOR_ENHANCER_CANCEL"> Cancel </message> + <message desc="Advanced button for the color enhancer setup." name="IDS_COLOR_ENHANCER_ADVANCED"> + Advanced + </message> <message desc="Button for the color enhancer popup that opens the Setup part of the popup." name="IDS_COLOR_ENHANCER_SETUP_BUTTON"> Setup </message> + <message desc="Title for radio group which specifies the color axis that will be used by the user. This is an advanced toggle and can override the default setting" name="IDS_COLOR_ENHANCER_AXIS"> + Step 3: Override the color axis for the correction. + </message> <!-- Animation extension -->
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_ADVANCED.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_ADVANCED.png.sha1 new file mode 100644 index 0000000..14e6e2b --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_ADVANCED.png.sha1
@@ -0,0 +1 @@ +70ead8ec1d33b10b3f827820b3a7cf0a215c763f \ No newline at end of file
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS.png.sha1 new file mode 100644 index 0000000..ae4fc9d5 --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS.png.sha1
@@ -0,0 +1 @@ +5cab734c8b1ddda95b42efd823df2dc56a4a9bb1 \ No newline at end of file
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_BLUE.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_BLUE.png.sha1 new file mode 100644 index 0000000..9bd3d5e --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_BLUE.png.sha1
@@ -0,0 +1 @@ +549c2fac192b8c8fdddfbb1e98d5cae2f09840a9 \ No newline at end of file
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_DEFAULT.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_DEFAULT.png.sha1 new file mode 100644 index 0000000..eb1eff2 --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_DEFAULT.png.sha1
@@ -0,0 +1 @@ +21b8c9541ef3d045c1e3b0485240095ce2098c15 \ No newline at end of file
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_GREEN.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_GREEN.png.sha1 new file mode 100644 index 0000000..33ba254 --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_GREEN.png.sha1
@@ -0,0 +1 @@ +fe4a857b5da3e035d878eb9a43bfcfcd456de5b4 \ No newline at end of file
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_RED.png.sha1 b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_RED.png.sha1 new file mode 100644 index 0000000..3a00953 --- /dev/null +++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_grd/IDS_COLOR_ENHANCER_AXIS_RED.png.sha1
@@ -0,0 +1 @@ +8b0522d47ac6902d7a00e527fac025179b99c00c \ No newline at end of file
diff --git a/ui/android/java/res/values/dimens.xml b/ui/android/java/res/values/dimens.xml index 4b116f0..47b912f 100644 --- a/ui/android/java/res/values/dimens.xml +++ b/ui/android/java/res/values/dimens.xml
@@ -60,7 +60,7 @@ <dimen name="divider_height">1dp</dimen> <!-- Drag shadow dimens --> - <dimen name="drag_shadow_min_width">48dp</dimen> + <dimen name="drag_shadow_min_size">48dp</dimen> <!-- Misc --> <dimen name="default_ripple_background_border_size">0dp</dimen>
diff --git a/ui/android/java/src/org/chromium/ui/dragdrop/DragAndDropDelegateImpl.java b/ui/android/java/src/org/chromium/ui/dragdrop/DragAndDropDelegateImpl.java index e37db04..93b200eb 100644 --- a/ui/android/java/src/org/chromium/ui/dragdrop/DragAndDropDelegateImpl.java +++ b/ui/android/java/src/org/chromium/ui/dragdrop/DragAndDropDelegateImpl.java
@@ -15,7 +15,6 @@ import android.os.Build.VERSION_CODES; import android.os.SystemClock; import android.text.TextUtils; -import android.util.DisplayMetrics; import android.util.Pair; import android.view.DragEvent; import android.view.View; @@ -23,10 +22,12 @@ import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; import android.widget.ImageView; +import android.widget.ImageView.ScaleType; import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; +import androidx.annotation.VisibleForTesting; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.content.res.ResourcesCompat; @@ -102,9 +103,11 @@ mIsDragStarted = true; mDragStartSystemElapsedTime = SystemClock.elapsedRealtime(); mDragTargetType = getDragTargetType(dropData); + int windowWidth = containerView.getRootView().getWidth(); + int windowHeight = containerView.getRootView().getHeight(); return ApiHelperForN.startDragAndDrop(containerView, clipdata, - createDragShadowBuilder( - containerView.getContext(), shadowImage, dropData.hasImage()), + createDragShadowBuilder(containerView.getContext(), shadowImage, + dropData.hasImage(), windowWidth, windowHeight), null, buildFlags(dropData)); } @@ -198,8 +201,8 @@ } } - protected View.DragShadowBuilder createDragShadowBuilder( - Context context, Bitmap shadowImage, boolean isImage) { + protected View.DragShadowBuilder createDragShadowBuilder(Context context, Bitmap shadowImage, + boolean isImage, int windowWidth, int windowHeight) { ImageView imageView = new ImageView(context); if (isImage) { // If drag shadow image is an 1*1 image, it is not considered as a valid drag shadow. @@ -210,17 +213,19 @@ AppCompatResources.getDrawable(context, R.drawable.ic_globe_24dp); assert globeIcon != null; - final int minSize = getDragShadowMinWidth(context.getResources()); + final int minSize = getDragShadowMinSize(context.getResources()); mShadowWidth = minSize; mShadowHeight = minSize; imageView.setLayoutParams(new ViewGroup.LayoutParams(minSize, minSize)); imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); imageView.setImageDrawable(globeIcon); } else { - Pair<Integer, Integer> widthHeight = - getWidthHeightForScaleDragShadow(context, shadowImage); + Pair<Integer, Integer> widthHeight = getWidthHeightForScaleDragShadow(context, + shadowImage.getWidth(), shadowImage.getHeight(), windowWidth, windowHeight); mShadowWidth = widthHeight.first; mShadowHeight = widthHeight.second; + imageView.setLayoutParams(new ViewGroup.LayoutParams(mShadowWidth, mShadowHeight)); + imageView.setScaleType(ScaleType.CENTER_CROP); imageView.setImageBitmap(shadowImage); } } else { @@ -234,42 +239,48 @@ } // TODO(crbug.com/1295868): Scale image in C++ before passing into Java. - static Pair<Integer, Integer> getWidthHeightForScaleDragShadow( - Context context, Bitmap shadowImage) { - float width = shadowImage.getWidth(); - float height = shadowImage.getHeight(); - assert width > 0 && height > 0; - + @VisibleForTesting + static Pair<Integer, Integer> getWidthHeightForScaleDragShadow(Context context, + float imageWidth, float imageHeight, int windowWidth, int windowHeight) { Resources resources = context.getResources(); + // Calculate the default scaled width / height. final float resizeRatio = ResourcesCompat.getFloat(resources, R.dimen.drag_shadow_resize_ratio); - width *= resizeRatio; - height *= resizeRatio; + imageWidth *= resizeRatio; + imageHeight *= resizeRatio; - // Scale the image up if it fell short than the min width. - final int minWidthPx = getDragShadowMinWidth(resources); - if (width < minWidthPx) { - float scaleUpRatio = minWidthPx / width; - height *= scaleUpRatio; - width *= scaleUpRatio; - } - - // Scale the image down if it exceeded the max width / height, while keeping its - // weight-to-height ratio. - // Note that this down scale disregard the min width requirement. + // Scale down if the width / height exceeded the max width / height, estimated based on the + // window size, while maintaining the width-to-height ratio. final float maxSizeRatio = ResourcesCompat.getFloat(resources, R.dimen.drag_shadow_max_size_to_window_ratio); - // TODO(https://crbug.com/1297215): Consider switching metrics to the app window. - final DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - final float maxHeightPx = metrics.heightPixels * maxSizeRatio; - final float maxWidthPx = metrics.widthPixels * maxSizeRatio; - if (width > maxWidthPx || height > maxHeightPx) { - final float downScaleRatio = Math.min(maxHeightPx / height, maxWidthPx / width); - width *= downScaleRatio; - height *= downScaleRatio; + + final float maxHeightPx = windowHeight * maxSizeRatio; + final float maxWidthPx = windowWidth * maxSizeRatio; + + if (imageWidth > maxWidthPx || imageHeight > maxHeightPx) { + final float downScaleRatio = + Math.min(maxHeightPx / imageHeight, maxWidthPx / imageWidth); + imageWidth *= downScaleRatio; + imageHeight *= downScaleRatio; } - return new Pair<>(Math.round(width), Math.round(height)); + + // Scale up with respect to the short side if the width or height is smaller than the min + // size. Truncate the long side to stay within the max width / height as applicable. + final int minSizePx = getDragShadowMinSize(resources); + if (imageWidth <= imageHeight && imageWidth < minSizePx) { + float scaleUpRatio = minSizePx / imageWidth; + imageHeight *= scaleUpRatio; + imageWidth *= scaleUpRatio; + imageHeight = Math.min(imageHeight, maxHeightPx); + } else if (imageHeight < minSizePx) { + float scaleUpRatio = minSizePx / imageHeight; + imageHeight *= scaleUpRatio; + imageWidth *= scaleUpRatio; + imageWidth = Math.min(imageWidth, maxWidthPx); + } + + return new Pair<>(Math.round(imageWidth), Math.round(imageHeight)); } private void onDragStarted(DragEvent dragStartEvent) { @@ -322,8 +333,8 @@ } } - private static int getDragShadowMinWidth(Resources resources) { - return resources.getDimensionPixelSize(R.dimen.drag_shadow_min_width); + private static int getDragShadowMinSize(Resources resources) { + return resources.getDimensionPixelSize(R.dimen.drag_shadow_min_size); } /**
diff --git a/ui/android/java/src/org/chromium/ui/permissions/ContextualNotificationPermissionRequester.java b/ui/android/java/src/org/chromium/ui/permissions/ContextualNotificationPermissionRequester.java index 2b783ef..3fbb2f73 100644 --- a/ui/android/java/src/org/chromium/ui/permissions/ContextualNotificationPermissionRequester.java +++ b/ui/android/java/src/org/chromium/ui/permissions/ContextualNotificationPermissionRequester.java
@@ -34,4 +34,14 @@ * permission prompt for notifications. */ public abstract void requestPermissionIfNeeded(); + + /** + * Called to determine whether or not we can request site notification permission from app level + * settings perspective. We shouldn't request site permission if + * (1) For Android versions < T, if app level notifications are disabled. + * (2) For Android versions >= T, if we don't have notification permission and have exhausted + * our permission request attempts. + * @return Whether or not we are allowed to request site notification. + */ + public abstract boolean doesAppLevelSettingsAllowSiteNotifications(); }
diff --git a/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java b/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java index caaa328..6c565082 100644 --- a/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java +++ b/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java
@@ -15,6 +15,7 @@ import android.view.DragEvent; import android.view.View; import android.view.View.DragShadowBuilder; +import android.view.View.MeasureSpec; import android.view.accessibility.AccessibilityManager; import android.widget.ImageView; @@ -31,7 +32,6 @@ import org.robolectric.annotation.Implements; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowAccessibilityManager; -import org.robolectric.shadows.ShadowDisplay; import org.chromium.base.compat.ApiHelperForN; import org.chromium.base.metrics.test.ShadowRecordHistogram; @@ -40,13 +40,15 @@ import org.chromium.url.JUnitTestGURLs; /** - * Unit test for DragAndDropDelegateImpl. Setting the device size to 1000*2000, scaleDensity = 1 for - * the ease of dp / pixel calculation. + * Unit tests for {@link DragAndDropDelegateImpl}. */ @RunWith(BaseRobolectricTestRunner.class) -@Config(shadows = {ShadowDisplay.class, ShadowRecordHistogram.class}, - qualifiers = "w1000dp-h2000dp-mdpi") +@Config(shadows = {ShadowRecordHistogram.class}) public class DragAndDropDelegateImplUnitTest { + /** Using a window size of 1000*600 for the ease of dp / pixel calculation. */ + private static final int WINDOW_WIDTH = 1000; + private static final int WINDOW_HEIGHT = 600; + /** Helper shadow class to make sure #startDragAndDrop is accepted by Android. */ @Implements(ApiHelperForN.class) static class ShadowApiHelperForN { @@ -62,11 +64,18 @@ private Context mContext; private DragAndDropDelegateImpl mDragAndDropDelegateImpl; + private View mContainerView; @Before public void setup() { mContext = ApplicationProvider.getApplicationContext(); mDragAndDropDelegateImpl = new DragAndDropDelegateImpl(); + + mContainerView = new View(mContext); + View rootView = mContainerView.getRootView(); + rootView.measure(MeasureSpec.makeMeasureSpec(WINDOW_WIDTH, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(WINDOW_HEIGHT, MeasureSpec.EXACTLY)); + rootView.layout(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); } @After @@ -78,11 +87,10 @@ @Test public void testStartDragAndDrop_Text() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8); final DropDataAndroid dropData = DropDataAndroid.create("text", null, null, null); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, dropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, dropData); Assert.assertTrue("Drag should be started.", mDragAndDropDelegateImpl.isDragStarted()); Assert.assertEquals("Drag shadow width not match. Should not resize for text.", 100, @@ -91,7 +99,7 @@ mDragAndDropDelegateImpl.getDragShadowHeight()); assertDragTypeNotRecorded("Drag didn't end."); - mDragAndDropDelegateImpl.onDrag(containerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); + mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); Assert.assertFalse("Drag should end.", mDragAndDropDelegateImpl.isDragStarted()); Assert.assertEquals("Drag shadow width should be reset.", 0, @@ -104,12 +112,11 @@ @Test public void testStartDragAndDrop_Image() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8); final DropDataAndroid imageDropData = DropDataAndroid.create("", null, new byte[] {1, 2, 3, 4}, "png"); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, imageDropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, imageDropData); Assert.assertEquals("Drag shadow width not match. Should do resize for image.", 60, mDragAndDropDelegateImpl.getDragShadowWidth()); Assert.assertEquals("Drag shadow height not match. Should do resize for image.", 120, @@ -119,25 +126,20 @@ assertDragTypeNotRecorded("Drag didn't end."); DragEvent dragEnd = mockDragEvent(DragEvent.ACTION_DRAG_ENDED); - mDragAndDropDelegateImpl.onDrag(containerView, dragEnd); + mDragAndDropDelegateImpl.onDrag(mContainerView, dragEnd); Assert.assertNull("Cached Image bytes should be cleaned.", DropDataContentProvider.getImageBytesForTesting()); assertDragTypeRecorded(DragTargetType.IMAGE); assertDragOutsideWebContentHistogramsRecorded(/*dropResult=*/false); } - /** - * Image link dragging is not supported yet. - * TODO(https://crbug.com/1298308): Handle image link dragging. - */ @Test public void testStartDragAndDrop_TextLink() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8); final DropDataAndroid dropData = DropDataAndroid.create( "text", JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL), null, null); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, dropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, dropData); Assert.assertTrue("Drag should start.", mDragAndDropDelegateImpl.isDragStarted()); Assert.assertEquals("Drag shadow width does not match. Should not resize for text link.", @@ -146,7 +148,7 @@ 200, mDragAndDropDelegateImpl.getDragShadowHeight()); assertDragTypeNotRecorded("Drag did not end."); - mDragAndDropDelegateImpl.onDrag(containerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); + mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); Assert.assertFalse("Drag should end.", mDragAndDropDelegateImpl.isDragStarted()); Assert.assertEquals("Drag shadow width should be reset.", 0, @@ -160,12 +162,11 @@ @Test @Config(shadows = {ShadowApiHelperForN.class, ShadowAccessibilityManager.class}) public void testStartDragAndDrop_NotSupportedForA11y() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); final DropDataAndroid dropData = DropDataAndroid.create("text", null, null, null); Assert.assertTrue("Drag and drop should start.", - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, dropData)); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, dropData)); AccessibilityManager a11yManager = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); @@ -174,17 +175,16 @@ shadowA11yManager.setTouchExplorationEnabled(true); Assert.assertFalse("Drag and drop should not start when isTouchExplorationEnabled=true.", - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, dropData)); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, dropData)); } @Test @Config(shadows = {ShadowApiHelperForN.class}) public void testDragImage_ShadowPlaceholder() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); final DropDataAndroid imageDropData = DropDataAndroid.create("", null, new byte[] {1, 2, 3, 4}, "png"); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, imageDropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, imageDropData); Assert.assertNotNull( "sLastDragShadowBuilder is null.", ShadowApiHelperForN.sLastDragShadowBuilder); @@ -198,15 +198,14 @@ @Test public void testDragImage_DragHandled() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8); final DropDataAndroid imageDropData = DropDataAndroid.create("", null, new byte[] {1, 2, 3, 4}, "png"); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, imageDropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, imageDropData); final DragEvent dragEndEvent = mockDragEvent(DragEvent.ACTION_DRAG_ENDED); doReturn(true).when(dragEndEvent).getResult(); - mDragAndDropDelegateImpl.onDrag(containerView, dragEndEvent); + mDragAndDropDelegateImpl.onDrag(mContainerView, dragEndEvent); Assert.assertNotNull("Cached Image bytes should not be cleaned, drag is handled.", DropDataContentProvider.getImageBytesForTesting()); @@ -216,16 +215,15 @@ @Test public void testDragImage_ReceivedDropBeforeDragEnds() { - final View containerView = new View(mContext); final Bitmap shadowImage = Bitmap.createBitmap(100, 200, Bitmap.Config.ALPHA_8); final DropDataAndroid imageDropData = DropDataAndroid.create("", null, new byte[] {1, 2, 3, 4}, "png"); - mDragAndDropDelegateImpl.startDragAndDrop(containerView, shadowImage, imageDropData); + mDragAndDropDelegateImpl.startDragAndDrop(mContainerView, shadowImage, imageDropData); - mDragAndDropDelegateImpl.onDrag(containerView, mockDragEvent(DragEvent.ACTION_DROP)); + mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DROP)); final DragEvent dragEndEvent = mockDragEvent(DragEvent.ACTION_DRAG_ENDED); doReturn(true).when(dragEndEvent).getResult(); - mDragAndDropDelegateImpl.onDrag(containerView, dragEndEvent); + mDragAndDropDelegateImpl.onDrag(mContainerView, dragEndEvent); // Drop on the same view does not lead to recording of drag duration. assertDragTypeNotRecorded("Drag dropped on the same view."); @@ -236,9 +234,8 @@ @Test public void testIgnoreDragStartedElsewhere() { - final View containerView = new View(mContext); - mDragAndDropDelegateImpl.onDrag(containerView, mockDragEvent(DragEvent.ACTION_DROP)); - mDragAndDropDelegateImpl.onDrag(containerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); + mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DROP)); + mDragAndDropDelegateImpl.onDrag(mContainerView, mockDragEvent(DragEvent.ACTION_DRAG_ENDED)); assertDragTypeNotRecorded("Drag dropped on the same view."); assertHistogramRecorded("Android.DragDrop.FromWebContent.DropInWebContent.Duration", false, @@ -256,51 +253,50 @@ /*width=*/82, /*height=*/82, /*expectedWidth=*/49, /*expectedHeight=*/49); doTestResizeShadowImage("Resize 60%", - /*width=*/583, /*height=*/583, - /*expectedWidth=*/350, /*expectedHeight=*/350); - doTestResizeShadowImage("Resize 60% (no min Height)", - /*width=*/100, /*height=*/10, - /*expectedWidth=*/60, /*expectedHeight=*/6); + /*width=*/351, /*height=*/351, + /*expectedWidth=*/210, /*expectedHeight=*/210); } @Test public void testResizeShadowImage_ScaleUpToRatio() { - doTestResizeShadowImage("Scale up to minWidth", + doTestResizeShadowImage("Scale up to min size", /*width=*/1, /*height=*/1, /*expectedWidth=*/48, /*expectedHeight=*/48); - doTestResizeShadowImage("Resize 60%, scale up to minWidth", + doTestResizeShadowImage("Resize 60%, scale up to min size", /*width=*/50, /*height=*/50, /*expectedWidth=*/48, /*expectedHeight=*/48); - doTestResizeShadowImage("Resize 60%, scale up to minWidth", + doTestResizeShadowImage("Resize 60%, scale up to min size", /*width=*/80, /*height=*/80, /*expectedWidth=*/48, /*expectedHeight=*/48); - doTestResizeShadowImage("Resize 60%, scale up to minWidth (no min Height)", + doTestResizeShadowImage("Resize 60%, scale up to min size (shorter height)", /*width=*/50, /*height=*/25, - /*expectedWidth=*/48, /*expectedHeight=*/24); + /*expectedWidth=*/96, /*expectedHeight=*/48); + doTestResizeShadowImage("Resize 60%, scale up to min size (shorter width)", + /*width=*/25, /*height=*/50, + /*expectedWidth=*/48, /*expectedHeight=*/96); } @Test public void testResizeShadowImage_ScaleDownToMax() { doTestResizeShadowImage("Scale down to max width", /*width=*/584, /*height=*/584, - /*expectedWidth=*/350, /*expectedHeight=*/350); + /*expectedWidth=*/210, /*expectedHeight=*/210); doTestResizeShadowImage("Scale 60% and adjust to max width", /*width=*/600, /*height=*/600, - /*expectedWidth=*/350, /*expectedHeight=*/350); + /*expectedWidth=*/210, /*expectedHeight=*/210); - doTestResizeShadowImage("Scale 60% and adjust to max width", - /*width=*/1000, /*height=*/100, - /*expectedWidth=*/350, /*expectedHeight=*/35); - doTestResizeShadowImage("Scale 60% and adjust to max width (no min height)", - /*width=*/1000, /*height=*/100, - /*expectedWidth=*/350, /*expectedHeight=*/35); + doTestResizeShadowImage( + "Scale 60%, adjust to max width, adjust short side (height) to min size, adjust long side to max width", + /*width=*/800, /*height=*/80, + /*expectedWidth=*/350, /*expectedHeight=*/48); + doTestResizeShadowImage( + "Scale 60%, adjust to max width, adjust short side (width) to min size, adjust long side to max height", + /*width=*/80, /*height=*/800, + /*expectedWidth=*/48, /*expectedHeight=*/210); - doTestResizeShadowImage("Scale 60% and adjust to max height", + doTestResizeShadowImage("Scale 60%, adjust long side to max height", /*width=*/150, /*height=*/1500, - /*expectedWidth=*/70, /*expectedHeight=*/700); - doTestResizeShadowImage("Scale 60%, adjust to min width, and adjust to max height", - /*width=*/15, /*height=*/1500, - /*expectedWidth=*/7, /*expectedHeight=*/700); + /*expectedWidth=*/48, /*expectedHeight=*/210); } @Test @@ -338,10 +334,9 @@ private void doTestResizeShadowImage( String testcase, int width, int height, int expectedWidth, int expectedHeight) { - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8); - Pair<Integer, Integer> widthHeight = - DragAndDropDelegateImpl.getWidthHeightForScaleDragShadow(mContext, bitmap); + DragAndDropDelegateImpl.getWidthHeightForScaleDragShadow( + mContext, width, height, WINDOW_WIDTH, WINDOW_HEIGHT); final int actualResizedWidth = widthHeight.first; final int actualResizedHeight = widthHeight.second;
diff --git a/ui/chromeos/styles/cros_colors.json5 b/ui/chromeos/styles/cros_colors.json5 index 25f4f94..d75bd3e6 100644 --- a/ui/chromeos/styles/cros_colors.json5 +++ b/ui/chromeos/styles/cros_colors.json5
@@ -31,6 +31,7 @@ color_secondary: { light: "$google_grey_700", dark: "$google_grey_400", + generate_per_mode: true, }, color_disabled: { light: "$google_grey_600", @@ -109,8 +110,10 @@ debug: "$google_green_400", }, text_color_secondary: { - default: "$color_secondary", + light: "$color_secondary_light", + dark: "$color_secondary_dark", debug: "$google_green_400", + generate_per_mode: true, }, text_color_disabled: "$color_disabled", text_color_prominent: "$color_prominent", @@ -132,8 +135,10 @@ debug: "#ff00ff", }, icon_color_secondary: { - default: "$color_secondary", + light: "$color_secondary_light", + dark: "$color_secondary_dark", debug: "#00ffff", + generate_per_mode: true, }, icon_color_disabled: "$color_disabled", icon_color_prominent: "$color_prominent",
diff --git a/ui/compositor/test/test_compositor_host_android.cc b/ui/compositor/test/test_compositor_host_android.cc index 2ab48ec7..ba4580d 100644 --- a/ui/compositor/test/test_compositor_host_android.cc +++ b/ui/compositor/test/test_compositor_host_android.cc
@@ -8,7 +8,6 @@ #include "base/compiler_specific.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/viz/common/surfaces/local_surface_id.h" #include "ui/compositor/compositor.h" #include "ui/gfx/native_widget_types.h"
diff --git a/ui/compositor/test/test_compositor_host_mac.mm b/ui/compositor/test/test_compositor_host_mac.mm index 51c061de..a498101 100644 --- a/ui/compositor/test/test_compositor_host_mac.mm +++ b/ui/compositor/test/test_compositor_host_mac.mm
@@ -15,7 +15,6 @@ #include "base/compiler_specific.h" #include "base/mac/scoped_nsobject.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/viz/common/surfaces/local_surface_id.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "ui/accelerated_widget_mac/accelerated_widget_mac.h"
diff --git a/ui/compositor/test/test_compositor_host_ozone.cc b/ui/compositor/test/test_compositor_host_ozone.cc index b7e3374..70cd276 100644 --- a/ui/compositor/test/test_compositor_host_ozone.cc +++ b/ui/compositor/test/test_compositor_host_ozone.cc
@@ -11,7 +11,6 @@ #include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "ui/compositor/compositor.h"
diff --git a/ui/compositor/test/test_compositor_host_win.cc b/ui/compositor/test/test_compositor_host_win.cc index e90c5c3..8480755 100644 --- a/ui/compositor/test/test_compositor_host_win.cc +++ b/ui/compositor/test/test_compositor_host_win.cc
@@ -8,7 +8,6 @@ #include "base/compiler_specific.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" #include "ui/compositor/compositor.h" #include "ui/gfx/win/window_impl.h"
diff --git a/ui/events/ozone/evdev/event_thread_evdev.h b/ui/events/ozone/evdev/event_thread_evdev.h index 5c47b50a..ae62e022 100644 --- a/ui/events/ozone/evdev/event_thread_evdev.h +++ b/ui/events/ozone/evdev/event_thread_evdev.h
@@ -8,7 +8,6 @@ #include <memory> #include "base/callback.h" -#include "base/time/time.h" namespace base { class Thread;
diff --git a/ui/gl/child_window_win.h b/ui/gl/child_window_win.h index 1a62000..ede7345 100644 --- a/ui/gl/child_window_win.h +++ b/ui/gl/child_window_win.h
@@ -8,7 +8,6 @@ #include "base/memory/weak_ptr.h" #include "base/task/task_runner.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "ui/gl/gl_export.h" #include <windows.h>
diff --git a/ui/gl/vsync_thread_win.h b/ui/gl/vsync_thread_win.h index 57ac6074..388057a 100644 --- a/ui/gl/vsync_thread_win.h +++ b/ui/gl/vsync_thread_win.h
@@ -11,7 +11,6 @@ #include "base/containers/flat_set.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "ui/gl/gl_export.h" #include "ui/gl/vsync_provider_win.h"
diff --git a/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc b/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc index 4044ccc..811d0da7 100644 --- a/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc +++ b/ui/ozone/platform/drm/gpu/proxy_helpers_unittest.cc
@@ -12,7 +12,6 @@ #include "base/test/task_environment.h" #include "base/threading/thread.h" #include "base/threading/thread_checker_impl.h" -#include "base/time/time.h" #include "testing/gtest/include/gtest/gtest.h" namespace ui {
diff --git a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc index f159a5b..60212980 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
@@ -764,12 +764,11 @@ display::Display::ResetForceDeviceScaleFactorForTesting(); } -// Checks that transform is properly translated to Display orientation. The -// first one is counter-clockwise, and the second is clockwise. +// Checks that output transform is properly translated into Display orientation. +// The first one is counter-clockwise, while the latter is clockwise. TEST_P(WaylandScreenTest, Transform) { - constexpr std::array< - std::pair<wl_output_transform, display::Display::Rotation>, 8> - test_data = {{ + constexpr std::pair<wl_output_transform, display::Display::Rotation> + kTestData[] = { {WL_OUTPUT_TRANSFORM_NORMAL, display::Display::ROTATE_0}, {WL_OUTPUT_TRANSFORM_90, display::Display::ROTATE_270}, {WL_OUTPUT_TRANSFORM_180, display::Display::ROTATE_180}, @@ -779,16 +778,16 @@ {WL_OUTPUT_TRANSFORM_FLIPPED_90, display::Display::ROTATE_0}, {WL_OUTPUT_TRANSFORM_FLIPPED_180, display::Display::ROTATE_0}, {WL_OUTPUT_TRANSFORM_FLIPPED_270, display::Display::ROTATE_0}, - }}; + }; - for (const auto& i : test_data) { - output_->SetTransform(i.first); + for (const auto& [transform, expected_rotation] : kTestData) { + output_->SetTransform(transform); output_->Flush(); Sync(); auto main_display = platform_screen_->GetPrimaryDisplay(); - EXPECT_EQ(main_display.rotation(), i.second); + EXPECT_EQ(main_display.rotation(), expected_rotation); } }
diff --git a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h index 1735698..4dfe8a53 100644 --- a/ui/ozone/platform/wayland/test/test_wayland_server_thread.h +++ b/ui/ozone/platform/wayland/test/test_wayland_server_thread.h
@@ -14,7 +14,6 @@ #include "base/message_loop/message_pump_libevent.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" -#include "base/time/time.h" #include "ui/ozone/platform/wayland/test/global_object.h" #include "ui/ozone/platform/wayland/test/mock_wp_presentation.h" #include "ui/ozone/platform/wayland/test/mock_xdg_shell.h"
diff --git a/ui/views/animation/animation_builder.cc b/ui/views/animation/animation_builder.cc index c920f1c..4467878 100644 --- a/ui/views/animation/animation_builder.cc +++ b/ui/views/animation/animation_builder.cc
@@ -236,13 +236,11 @@ } AnimationSequenceBlock& AnimationBuilder::Once() { - repeating_ = false; - return NewSequence(); + return NewSequence(false); } AnimationSequenceBlock& AnimationBuilder::Repeatedly() { - repeating_ = true; - return NewSequence(); + return NewSequence(true); } void AnimationBuilder::AddLayerAnimationElement( @@ -270,11 +268,11 @@ end_ = std::max(end_, end); } -void AnimationBuilder::TerminateSequence( - base::PassKey<AnimationSequenceBlock>) { +void AnimationBuilder::TerminateSequence(base::PassKey<AnimationSequenceBlock>, + bool repeating) { for (auto& pair : values_) { auto sequence = std::make_unique<ui::LayerAnimationSequence>(); - sequence->set_is_repeating(repeating_); + sequence->set_is_repeating(repeating); if (animation_observer_) sequence->AddObserver(animation_observer_.get()); @@ -328,12 +326,9 @@ GetObserverDeletedCallback() = std::move(deleted_closure); } -AnimationSequenceBlock& AnimationBuilder::NewSequence() { +AnimationSequenceBlock& AnimationBuilder::NewSequence(bool repeating) { // Each sequence should have its own observer. - // `current_sequence_` is set only when `repeating_` is true. - DCHECK(!current_sequence_ || repeating_); - // Ensure to terminate the current sequence block before touching the // animation sequence observer so that the sequence observer is attached to // the layer animation sequence. @@ -352,7 +347,7 @@ end_ = base::TimeDelta(); current_sequence_ = std::make_unique<AnimationSequenceBlock>( - base::PassKey<AnimationBuilder>(), this, base::TimeDelta()); + base::PassKey<AnimationBuilder>(), this, base::TimeDelta(), repeating); return *current_sequence_; }
diff --git a/ui/views/animation/animation_builder.h b/ui/views/animation/animation_builder.h index 235d023..fcf10bf7 100644 --- a/ui/views/animation/animation_builder.h +++ b/ui/views/animation/animation_builder.h
@@ -138,7 +138,7 @@ // Called when the sequence is ended. Converts `values_` to // `layer_animation_sequences_`. - void TerminateSequence(base::PassKey<AnimationSequenceBlock>); + void TerminateSequence(base::PassKey<AnimationSequenceBlock>, bool repeating); // Returns a left value reference to the object held by `current_sequence_`. // Assumes that `current_sequence_` is set. @@ -157,7 +157,7 @@ // Resets data for the current sequence as necessary, creates a new sequence // block and returns the new block's left value reference. - AnimationSequenceBlock& NewSequence(); + AnimationSequenceBlock& NewSequence(bool repeating); // Returns a reference to the observer deleted callback used for testing. static base::RepeatingClosure& GetObserverDeletedCallback(); @@ -173,7 +173,6 @@ absl::optional<ui::LayerAnimator::PreemptionStrategy> preemption_strategy_; // Data for the current sequence. - bool repeating_; base::TimeDelta end_; // Each vector is kept in sorted order. std::map<AnimationKey, std::vector<Value>> values_;
diff --git a/ui/views/animation/animation_sequence_block.cc b/ui/views/animation/animation_sequence_block.cc index 21630c6b..4bd2c13 100644 --- a/ui/views/animation/animation_sequence_block.cc +++ b/ui/views/animation/animation_sequence_block.cc
@@ -29,13 +29,17 @@ AnimationSequenceBlock::AnimationSequenceBlock( base::PassKey<AnimationBuilder> builder_key, AnimationBuilder* owner, - base::TimeDelta start) - : builder_key_(builder_key), owner_(owner), start_(start) {} + base::TimeDelta start, + bool repeating) + : builder_key_(builder_key), + owner_(owner), + start_(start), + repeating_(repeating) {} AnimationSequenceBlock::~AnimationSequenceBlock() { if (!finalized_) { TerminateBlock(); - owner_->TerminateSequence(PassKey()); + owner_->TerminateSequence(PassKey(), repeating_); } } @@ -194,7 +198,7 @@ // this object until the function end. auto old_sequence = owner_->SwapCurrentSequence( PassKey(), std::make_unique<AnimationSequenceBlock>( - builder_key_, owner_, since_sequence_start)); + builder_key_, owner_, since_sequence_start, repeating_)); return owner_->GetCurrentSequence(); }
diff --git a/ui/views/animation/animation_sequence_block.h b/ui/views/animation/animation_sequence_block.h index 32d4ee7..1411b9c 100644 --- a/ui/views/animation/animation_sequence_block.h +++ b/ui/views/animation/animation_sequence_block.h
@@ -43,7 +43,8 @@ public: AnimationSequenceBlock(base::PassKey<AnimationBuilder> builder_key, AnimationBuilder* owner, - base::TimeDelta start); + base::TimeDelta start, + bool repeating); AnimationSequenceBlock(AnimationSequenceBlock&& other) = delete; AnimationSequenceBlock& operator=(AnimationSequenceBlock&& other) = delete; ~AnimationSequenceBlock(); @@ -170,6 +171,9 @@ // done in TerminateBlock(). std::map<AnimationKey, Element> elements_; + // Is this block part of a repeating sequence? + bool repeating_ = false; + // True when this block has been terminated or used to create another block. // At this point, it's an error to use the block further. bool finalized_ = false;
diff --git a/ui/views/layout/flex_layout_types.h b/ui/views/layout/flex_layout_types.h index 8c61bb0..097d8953 100644 --- a/ui/views/layout/flex_layout_types.h +++ b/ui/views/layout/flex_layout_types.h
@@ -58,7 +58,7 @@ }; // Describes a simple rule for how a child view should grow in a layout when -// there is extra size avaialble for that view to occupy. +// there is extra size available for that view to occupy. enum class MaximumFlexSizeRule { kPreferred, // Don't resize above preferred size. kScaleToMaximum, // Allow resize up to the maximum size. @@ -69,24 +69,59 @@ // the available space changes. Flex specifications have three components: // - A |rule| which tells the layout manager how the child view resizes with // available space. -// - A |weight| which specifies how much of the available space is allocated to -// a child view that can flex. The percentage of space allocated is the -// weight divided by the total weight of all views at this order (see below). +// - A |weight| which specifies how much each individual child will deviate +// from its preferred size; larger weights will deviate more either when +// shrinking or growing. The deviation is proportional to the weight divided +// by the total weight of all views at this |order|. // - An |order| which specifies the priority with which available space is -// allocated. All available space is offered to child views at order 1, then -// any remaining space is offered to order 2, and so forth. +// allocated (lower numbers -> higher priority). // -// For example, say there are three child controls in a horizontal layout, each -// of which has a flex rule that allows it to be between 0 and 20 DIPs wide. -// Child A is at order 2 with weight 2, child B is at order 1 with weight 1, and -// child C is at order 2 and weight 1. The parent control is 50 DIPs across and -// has no margins. +// Space allocation works as follows: +// 1. All views are given the smallest possible size that |rule| allows (which +// might be zero.) +// 2. Going by |order|, we attempt to allocate the preferred size of each view. +// 3. If there is insufficient size, the deficit is allocated across all views +// at this |order| whose |rule| allows them to shrink, proportional to +// |weight|. +// 4. Once all orders have been allocated this way, repeat the process by +// |order| allocating any excess space among views whose |rule| allows them +// to exceed their preferred size. // -// All 50 DIPs are offered to child B, since it is first in order. It consumes -// 20 DIPs, its maximum size. Of the remaining 30, 20 are offered to child A and -// 10 are offered to child C, each of which they take - the 2:1 ratio is due to -// the different weights. (Also note that, if there were another child at order -// 3, it would be offered zero DIPs and might choose not to display itself.) +// For example, say there are three child views in a horizontal layout, each +// of which has a flex rule that allows it to be between 10 and 40 DIP with a +// preferred width of 20 DIP. Child A is at order 2 with weight 2, child B is at +// order 1 with weight 1, and child C is at order 2 with weight 1. +// +// At 30 DIP (the parent's minimum size): +// [10][10][10] +// +// At 40 DIP: +// [10][20][10] (B hits its preferred size) +// +// At 48 DIP: +// [12][20][16] (deficit is spread across A and C by weight) +// +// At 57 DIP: +// [18][20][19] +// +// At 60 DIP: +// [20][20][20] (all views at preferred size) +// +// At 80 DIP: +// [20][40][20] (B hits its maximum size) +// +// At 110 DIP: +// [40][40][30] (A scales faster than C) +// +// At 120 DIP (the parent's maximum size): +// [40][40][40] +// +// NOTE(dfried): the behavior of |weight| may seem backwards when views shrink +// below their preferred size, but it works the way it does because: +// (a) It's consistent with BoxLayout, making upgrading to FlexLayout easier. +// (b) It allows smooth scaling across a view's preferred size. +// If this gets too confusing we could add an option to make weights reciprocal +// when allocating deficit. class VIEWS_EXPORT FlexSpecification { public: // Creates a flex specification with the default rule (no flex, always use the
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc index 4b0282059..182a229 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" #include "build/build_config.h" #include "third_party/skia/include/core/SkPath.h" #include "ui/aura/client/aura_constants.h"
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_icon.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_icon.js index e1f42a9..66b69a5 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_icon.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_icon.js
@@ -55,6 +55,7 @@ case deviceType.kGameController: return 'game-controller'; case deviceType.kKeyboard: + case deviceType.kKeyboardMouseCombo: return 'keyboard'; case deviceType.kMouse: return 'mouse';
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js index 6b255bb..d674c06 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_pairing_device_item.js
@@ -186,6 +186,8 @@ return 'bluetoothA11yDeviceTypeGameController'; case deviceType.kKeyboard: return 'bluetoothA11yDeviceTypeKeyboard'; + case deviceType.kKeyboardMouseCombo: + return 'bluetoothA11yDeviceTypeKeyboardMouseCombo'; case deviceType.kMouse: return 'bluetoothA11yDeviceTypeMouse'; case deviceType.kTablet:
diff --git a/weblayer/browser/verdict_cache_manager_factory.cc b/weblayer/browser/verdict_cache_manager_factory.cc index 4ec701b..a6c25bb9 100644 --- a/weblayer/browser/verdict_cache_manager_factory.cc +++ b/weblayer/browser/verdict_cache_manager_factory.cc
@@ -7,6 +7,7 @@ #include "components/keyed_service/content/browser_context_dependency_manager.h" #include "components/safe_browsing/core/browser/verdict_cache_manager.h" #include "content/public/browser/browser_context.h" +#include "weblayer/browser/browser_context_impl.h" #include "weblayer/browser/host_content_settings_map_factory.h" namespace weblayer { @@ -34,9 +35,11 @@ KeyedService* VerdictCacheManagerFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { + BrowserContextImpl* context_impl = static_cast<BrowserContextImpl*>(context); return new safe_browsing::VerdictCacheManager( nullptr /* history service */, - HostContentSettingsMapFactory::GetForBrowserContext(context)); + HostContentSettingsMapFactory::GetForBrowserContext(context), + context_impl->pref_service()); } -} // namespace weblayer \ No newline at end of file +} // namespace weblayer