diff --git a/DEPS b/DEPS index f8f83dc8..2bf04fe9 100644 --- a/DEPS +++ b/DEPS
@@ -299,15 +299,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': '956fd8b14e2205fa33f36de216e6231314e67d03', + 'skia_revision': 'f42bb59753feff1eb831991ad29075150bbec626', # 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': 'd39bd40aa3585340bba5d178b96ec4a7ee597a50', + 'v8_revision': '6cd9d55b3be68f3ba3ad48c83f878a156bc0430a', # 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': 'c1e806dec7a183ef7d85d9345d81dd0c7b1b5e93', + 'angle_revision': '275745ff8b294d025f3dac0eb431998442f600b8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -319,7 +319,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. - 'boringssl_revision': 'c5795a328880eadb879088fc59cd0087edc8dc20', + 'boringssl_revision': '9295969e1dad2c31d0d99481734c1c68dcbc6403', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. @@ -391,7 +391,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': '137e867406255293753ba0fa2f8cd95f80b01771', + 'devtools_frontend_revision': 'c67d1c724ab9dcf466346f2e95b92bd0012982bc', # 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. @@ -523,7 +523,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'compiler_rt_revision': 'a6f7c1ae19c301452a66fdfeceef4d7c47d86107', + 'compiler_rt_revision': '689e2e2268b19ff47d6a7e3a0cedd6d5ac19d0a7', # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. @@ -1508,7 +1508,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'c3f13e04659dc7e088022d2ea2478a036ea41011', + '180ea8ed2b2e73fb52d4201a021d0acd2801c05b', 'condition': 'checkout_android and checkout_src_internal', }, @@ -2548,7 +2548,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '82c60ea0d2b453aded71857c93b9e6a2637da79b', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'dd35b295cd359ba094404218414955f961a0d6ae', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2921,7 +2921,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '5099aef700c439ca6091e33333664fd7fc725a04', + Var('webrtc_git') + '/src.git' + '@' + '447950dc42025d50e9789a022bbed3a0c8a74be0', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -3054,7 +3054,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'Du_qU4LYkmOmYz9fCLtJP-LDwneiTNibWtTfhnIRS6oC', + 'version': 'm6WVRkjanhUmo2Kyb9L7sr65FDgQFOHT7jXABLFoTNAC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4451,7 +4451,7 @@ 'src/chrome/browser/glic/resources/internal': { 'url': Var('chrome_git') + '/chrome/browser/glic/resources/internal.git' + '@' + - '3784a743ccebd82808a50e14e99db28643e95bac', + 'f236f97eebe6c78b5cec74e6c82f7ecabc4cac85', 'condition': 'checkout_src_internal', }, @@ -4707,7 +4707,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '91cadb79a847230f66a14711e00f670580629fbc', + '6d082702c7c77c8dc97cdf1a572a852b53e569df', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/base/android/pre_freeze_background_memory_trimmer.cc b/base/android/pre_freeze_background_memory_trimmer.cc index e01b269..88b6a8ff 100644 --- a/base/android/pre_freeze_background_memory_trimmer.cc +++ b/base/android/pre_freeze_background_memory_trimmer.cc
@@ -50,7 +50,11 @@ // This constant is chosen arbitrarily, to allow time for the background tasks // to finish running BEFORE collecting metrics. -const base::TimeDelta kDelayForMetrics = base::Seconds(2); +constexpr base::TimeDelta kDelayForMetrics = base::Seconds(2); + +// Based on UMA data, >99.5% of the compaction should take < 6s, so 10s should +// be more than enough. +constexpr base::TimeDelta kCompactionTimeout = base::Seconds(10); uint64_t BytesToMiB(uint64_t v) { return v / 1024 / 1024; @@ -508,6 +512,13 @@ } // static +bool PreFreezeBackgroundMemoryTrimmer::TimeoutExceeded() { + base::AutoLock locker(lock()); + return Instance().compaction_last_started_ + kCompactionTimeout <= + base::TimeTicks::Now(); +} + +// static bool PreFreezeBackgroundMemoryTrimmer::ShouldContinueCompaction( base::TimeTicks compaction_triggered_at) { base::AutoLock locker(lock()); @@ -518,6 +529,14 @@ std::unique_ptr<CompactionState> state, scoped_refptr<CompactionMetric> metric) { TRACE_EVENT0("base", "MaybePostCompactionTask"); + // Compaction is taking too long, so cancel it. This happens in practice in + // the field sometimes, according to UMA data. + if (TimeoutExceeded()) { + MaybeCancelCompaction(CompactCancellationReason::kTimeout); + // We do not return here, despite the fact that we will not be doing any + // more compaction, in order to run |FinishCompaction| below. + } + if (ShouldContinueCompaction(*state) && !state->regions_.empty()) { auto task_runner = state->task_runner_; task_runner->PostDelayedTask( @@ -548,11 +567,13 @@ void PreFreezeBackgroundMemoryTrimmer::StartCompaction( std::unique_ptr<CompactionState> state) { - scoped_refptr<CompactionMetric> metric = state->MakeCompactionMetric(); - TRACE_EVENT0("base", "StartCompaction"); - base::trace_event::EmitNamedTrigger("start-self-compaction"); + scoped_refptr<CompactionMetric> metric; { base::AutoLock locker(lock()); + compaction_last_started_ = base::TimeTicks::Now(); + metric = state->MakeCompactionMetric(compaction_last_started_); + TRACE_EVENT0("base", "StartCompaction"); + base::trace_event::EmitNamedTrigger("start-self-compaction"); process_compacted_metadata_.emplace( "PreFreezeBackgroundMemoryTrimmer.ProcessCompacted", /*is_compacted=*/1, base::SampleMetadataScope::kProcess); @@ -603,7 +624,7 @@ if (compaction_last_cancelled_ < compaction_last_triggered_ && compaction_last_finished_ < compaction_last_triggered_) { UmaHistogramEnumeration( - "Memory.RunningOrSelfCompact.Renderer.CancellationReason", + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", cancellation_reason); } compaction_last_finished_ = compaction_last_cancelled_ = @@ -650,10 +671,10 @@ } scoped_refptr<PreFreezeBackgroundMemoryTrimmer::CompactionMetric> -PreFreezeBackgroundMemoryTrimmer::SelfCompactionState::MakeCompactionMetric() - const { - return MakeRefCounted<CompactionMetric>( - "Memory.SelfCompact2.Renderer.", triggered_at_, base::TimeTicks::Now()); +PreFreezeBackgroundMemoryTrimmer::SelfCompactionState::MakeCompactionMetric( + base::TimeTicks started_at) const { + return MakeRefCounted<CompactionMetric>("Memory.SelfCompact2.Renderer.", + triggered_at_, started_at); } PreFreezeBackgroundMemoryTrimmer::RunningCompactionState:: @@ -686,10 +707,10 @@ } scoped_refptr<PreFreezeBackgroundMemoryTrimmer::CompactionMetric> -PreFreezeBackgroundMemoryTrimmer::RunningCompactionState::MakeCompactionMetric() - const { - return MakeRefCounted<CompactionMetric>( - "Memory.RunningCompact.Renderer.", triggered_at_, base::TimeTicks::Now()); +PreFreezeBackgroundMemoryTrimmer::RunningCompactionState::MakeCompactionMetric( + base::TimeTicks started_at) const { + return MakeRefCounted<CompactionMetric>("Memory.RunningCompact.Renderer.", + triggered_at_, started_at); } void PreFreezeBackgroundMemoryTrimmer::CompactionState::MaybeReadProcMaps() {
diff --git a/base/android/pre_freeze_background_memory_trimmer.h b/base/android/pre_freeze_background_memory_trimmer.h index 74ceddf5..d44791b 100644 --- a/base/android/pre_freeze_background_memory_trimmer.h +++ b/base/android/pre_freeze_background_memory_trimmer.h
@@ -41,7 +41,8 @@ enum class CompactCancellationReason { kAppFreezer, kPageResumed, - kMaxValue = kPageResumed + kTimeout, + kMaxValue = kTimeout }; static PreFreezeBackgroundMemoryTrimmer& Instance(); @@ -127,7 +128,7 @@ // If we are currently running self compaction, cancel it. If it was running, // record a metric with the reason for the cancellation. static void MaybeCancelCompaction( - CompactCancellationReason cancellation_reason); + CompactCancellationReason cancellation_reason) LOCKS_EXCLUDED(lock()); static void SetSupportsModernTrimForTesting(bool is_supported); static void ClearMetricsForTesting() LOCKS_EXCLUDED(lock()); @@ -166,7 +167,9 @@ friend class PreFreezeSelfCompactionTestWithParam; FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTestWithParam, Disabled); FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTestWithParam, Cancel); + FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTestWithParam, TimeoutCancel); FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTest, NotCanceled); + FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTest, SimpleCancel); FRIEND_TEST_ALL_PREFIXES(PreFreezeSelfCompactionTest, OnSelfFreezeCancel); // We use our own implementation here, based on |PostCancelableDelayedTask|, @@ -275,7 +278,8 @@ virtual bool IsFeatureEnabled() const = 0; virtual std::string GetMetricName(std::string_view name) const = 0; void MaybeReadProcMaps(); - virtual scoped_refptr<CompactionMetric> MakeCompactionMetric() const = 0; + virtual scoped_refptr<CompactionMetric> MakeCompactionMetric( + base::TimeTicks started_at) const = 0; virtual base::TimeDelta GetDelayAfterPreFreezeTasks() const = 0; scoped_refptr<SequencedTaskRunner> task_runner_; @@ -294,7 +298,8 @@ bool IsFeatureEnabled() const override; base::TimeDelta GetDelayAfterPreFreezeTasks() const override; std::string GetMetricName(std::string_view name) const override; - scoped_refptr<CompactionMetric> MakeCompactionMetric() const override; + scoped_refptr<CompactionMetric> MakeCompactionMetric( + base::TimeTicks started_at) const override; }; class RunningCompactionState final : public CompactionState { @@ -307,7 +312,8 @@ bool IsFeatureEnabled() const override; base::TimeDelta GetDelayAfterPreFreezeTasks() const override; std::string GetMetricName(std::string_view name) const override; - scoped_refptr<CompactionMetric> MakeCompactionMetric() const override; + scoped_refptr<CompactionMetric> MakeCompactionMetric( + base::TimeTicks started_at) const override; }; PreFreezeBackgroundMemoryTrimmer(); @@ -338,6 +344,7 @@ LOCKS_EXCLUDED(lock()); static bool ShouldContinueCompaction(base::TimeTicks compaction_triggered_at) LOCKS_EXCLUDED(lock()); + static bool TimeoutExceeded(); static std::optional<uint64_t> CompactMemory( std::vector<debug::MappedMemoryRegion>* regions, @@ -404,6 +411,10 @@ // When we last triggered self compaction. Used to record metrics. base::TimeTicks compaction_last_triggered_ GUARDED_BY(lock()) = base::TimeTicks::Min(); + // When we last started self compaction. Used to know if we should cancel + // compaction due to it taking too long. + base::TimeTicks compaction_last_started_ GUARDED_BY(lock()) = + base::TimeTicks::Min(); // When we last finished self compaction (either successfully, or from // being cancelled). Used to record metrics. base::TimeTicks compaction_last_finished_ GUARDED_BY(lock()) =
diff --git a/base/android/pre_freeze_background_memory_trimmer_unittest.cc b/base/android/pre_freeze_background_memory_trimmer_unittest.cc index 198380b7..5bf5cdd 100644 --- a/base/android/pre_freeze_background_memory_trimmer_unittest.cc +++ b/base/android/pre_freeze_background_memory_trimmer_unittest.cc
@@ -913,7 +913,7 @@ // This metric is used for both self compaction and running compaction, with // the same prefix for both. histograms_.ExpectTotalCount( - "Memory.RunningOrSelfCompact.Renderer.CancellationReason", 0); + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", 0); // We want the triggered time to be slightly after the last cancelled time; // checks for whether we should cancel depend on this. @@ -957,7 +957,7 @@ EXPECT_EQ(histograms_.GetTotalCountsForPrefix("Memory.RunningCompact").size(), 0); histograms_.ExpectTotalCount( - "Memory.RunningOrSelfCompact.Renderer.CancellationReason", 1); + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", 1); // Still only expect it to be recorded once, because we were not running the // second time we tried to cancel. @@ -965,13 +965,89 @@ PreFreezeBackgroundMemoryTrimmer::CompactCancellationReason:: kPageResumed); histograms_.ExpectTotalCount( - "Memory.RunningOrSelfCompact.Renderer.CancellationReason", 1); + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", 1); for (size_t i = 1; i < 5; i++) { Unmap(addrs[i], i * base::GetPageSize()); } } +TEST_P(PreFreezeSelfCompactionTestWithParam, TimeoutCancel) { + // MADV_PAGEOUT is only supported starting from Linux 5.4. So, on devices + // don't support it, we bail out early. This is a known problem on some 32 + // bit devices. + if (!PreFreezeBackgroundMemoryTrimmer::CompactionIsSupported()) { + GTEST_SKIP() << "No kernel support"; + } + + ASSERT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 0u); + + std::array<void*, 5> addrs; + for (size_t i = 1; i < 5; i++) { + addrs[i] = Map(i * base::GetPageSize()); + ASSERT_NE(addrs[i], MAP_FAILED); + } + + // This metric is used for both self compaction and running compaction, with + // the same prefix for both. + histograms_.ExpectTotalCount( + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", 0); + + const auto triggered_at = base::TimeTicks::Now(); + auto state = GetState(triggered_at); + GetMappedMemoryRegions(&state->regions_); + ASSERT_EQ(state->regions_.size(), 4u); + + { + base::AutoLock locker(PreFreezeBackgroundMemoryTrimmer::lock()); + PreFreezeBackgroundMemoryTrimmer::Instance().compaction_last_triggered_ = + triggered_at; + } + PreFreezeBackgroundMemoryTrimmer::Instance().StartCompaction( + std::move(state)); + + EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1u); + + // We should have 4 sections here, based on the sizes mapped above. + // |StartCompaction| doesn't run right away, but rather schedules a task. + // Because of the cancellation, we expect only three tasks to run. The first + // two should compact memory, the last should be cancelled below when we + // advance the clock. + for (size_t i = 0; i < 1; i++) { + EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1u); + task_environment_.FastForwardBy( + task_environment_.NextMainThreadPendingTaskDelay()); + } + + EXPECT_EQ(task_environment_.GetPendingMainThreadTaskCount(), 1u); + + // Advance the clock here, to simulate a hang. This will not run any tasks. + task_environment_.AdvanceClock(base::Seconds(10)); + + task_environment_.RunUntilIdle(); + + for (size_t i = 1; i < 3; i++) { + size_t len = i * base::GetPageSize(); + EXPECT_EQ(CountResidentPagesInRange(addrs[i], len), i); + Unmap(addrs[i], len); + } + + for (size_t i = 3; i < 5; i++) { + size_t len = i * base::GetPageSize(); + // Compaction is flakey in tests sometimes, so check LE here. + EXPECT_LE(CountResidentPagesInRange(addrs[i], len), i); + Unmap(addrs[i], len); + } + + histograms_.ExpectTotalCount( + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason", 1); + + // Bucket #2 is "Timeout". + EXPECT_THAT(histograms_.GetAllSamples( + "Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason"), + BucketsAre(Bucket(0, 0), Bucket(1, 0), Bucket(2, 1))); +} + TEST_F(PreFreezeSelfCompactionTest, NotCanceled) { // MADV_PAGEOUT is only supported starting from Linux 5.4. So, on devices // don't support it, we bail out early. This is a known problem on some 32
diff --git a/base/containers/map_util.h b/base/containers/map_util.h index fe7d8b1..70ede354e 100644 --- a/base/containers/map_util.h +++ b/base/containers/map_util.h
@@ -20,7 +20,7 @@ // Returns a pointer to the const value associated with the given key if it // exists, or null otherwise. -template <typename Map, typename Key> +template <typename Map, typename Key = Map::key_type> constexpr const internal::MappedType<Map>* FindOrNull(const Map& map, const Key& key) { auto it = map.find(key); @@ -29,7 +29,7 @@ // Returns a pointer to the value associated with the given key if it exists, or // null otherwise. -template <typename Map, typename Key> +template <typename Map, typename Key = Map::key_type> constexpr internal::MappedType<Map>* FindOrNull(Map& map, const Key& key) { auto it = map.find(key); return it != map.end() ? &it->second : nullptr; @@ -42,7 +42,7 @@ // This function does not distinguish between a missing key and a key mapped // to a null value. template <typename Map, - typename Key, + typename Key = Map::key_type, typename MappedElementType = std::pointer_traits<internal::MappedType<Map>>::element_type> constexpr const MappedElementType* FindPtrOrNull(const Map& map, @@ -58,7 +58,7 @@ // This function does not distinguish between a missing key and a key mapped // to a null value. template <typename Map, - typename Key, + typename Key = Map::key_type, typename MappedElementType = std::pointer_traits<internal::MappedType<Map>>::element_type> constexpr MappedElementType* FindPtrOrNull(Map& map, const Key& key) {
diff --git a/base/containers/map_util_unittest.cc b/base/containers/map_util_unittest.cc index f187833a..c743fca 100644 --- a/base/containers/map_util_unittest.cc +++ b/base/containers/map_util_unittest.cc
@@ -36,6 +36,19 @@ EXPECT_THAT(FindOrNull(mapping, kKey), Pointee(Eq(kValue))); EXPECT_EQ(FindOrNull(mapping, kMissingKey), nullptr); + + // The following should be able to infer the type of the key from the map's + // type. + base::flat_map<std::pair<int, std::string>, std::string> pair_mapping; + EXPECT_EQ(FindOrNull(pair_mapping, {3, "foo"}), nullptr); + + // Homogeneous keys are supported. + std::pair<int, std::string> homogeneous_key(3, "bar"); + EXPECT_EQ(FindOrNull(pair_mapping, homogeneous_key), nullptr); + + // Heterogenous keys are supported. + std::pair<int, const char*> heterogenous_key(3, "bar"); + EXPECT_EQ(FindOrNull(pair_mapping, heterogenous_key), nullptr); } TEST(MapUtilTest, FindPtrOrNullForPointers) { @@ -46,6 +59,19 @@ EXPECT_THAT(FindPtrOrNull(mapping, kKey), AllOf(Eq(val.get()), Pointee(Eq(kValue)))); EXPECT_EQ(FindPtrOrNull(mapping, kMissingKey), nullptr); + + // The following should be able to infer the type of the key from the map's + // type. + base::flat_map<std::pair<int, std::string>, std::string*> pair_mapping; + EXPECT_EQ(FindPtrOrNull(pair_mapping, {3, "foo"}), nullptr); + + // Homogeneous keys are supported. + std::pair<int, std::string> homogeneous_key(3, "bar"); + EXPECT_EQ(FindPtrOrNull(pair_mapping, homogeneous_key), nullptr); + + // Heterogenous keys are supported. + std::pair<int, const char*> heterogenous_key(3, "bar"); + EXPECT_EQ(FindPtrOrNull(pair_mapping, heterogenous_key), nullptr); } TEST(MapUtilTest, FindPtrOrNullForPointerLikeValues) {
diff --git a/base/synchronization/condition_variable.h b/base/synchronization/condition_variable.h index 2fecc44b..17144f0 100644 --- a/base/synchronization/condition_variable.h +++ b/base/synchronization/condition_variable.h
@@ -91,11 +91,6 @@ ~ConditionVariable(); -#if BUILDFLAG(IS_APPLE) - // Initializes features for this class. See `base::features::Init()`. - static void InitializeFeatures(); -#endif - // Wait() releases the caller's critical section atomically as it starts to // sleep, and the reacquires it when it is signaled. The wait functions are // susceptible to spurious wakeups. (See usage note 1 for more details.)
diff --git a/base/trace_event/trace_event_impl.h b/base/trace_event/trace_event_impl.h index 64d7059..a5b5efc 100644 --- a/base/trace_event/trace_event_impl.h +++ b/base/trace_event/trace_event_impl.h
@@ -47,9 +47,6 @@ class BASE_EXPORT TraceEvent { public: - // TODO(crbug.com/40599662): Remove once all users have been updated. - using TraceValue = base::trace_event::TraceValue; - TraceEvent(); TraceEvent(PlatformThreadId thread_id,
diff --git a/base/trace_event/traced_value.cc b/base/trace_event/traced_value.cc index f5ace9f..15358de3 100644 --- a/base/trace_event/traced_value.cc +++ b/base/trace_event/traced_value.cc
@@ -276,7 +276,7 @@ } case kTypeBool: { - TraceEvent::TraceValue json_value; + TraceValue json_value; CHECK(it.ReadBool(&json_value.as_bool)); maybe_append_key_name(state_stack[current_state_index], &it, out); json_value.AppendAsJSON(TRACE_VALUE_TYPE_BOOL, out); @@ -287,14 +287,14 @@ int value; CHECK(it.ReadInt(&value)); maybe_append_key_name(state_stack[current_state_index], &it, out); - TraceEvent::TraceValue json_value; + TraceValue json_value; json_value.as_int = value; json_value.AppendAsJSON(TRACE_VALUE_TYPE_INT, out); break; } case kTypeDouble: { - TraceEvent::TraceValue json_value; + TraceValue json_value; CHECK(it.ReadDouble(&json_value.as_double)); maybe_append_key_name(state_stack[current_state_index], &it, out); json_value.AppendAsJSON(TRACE_VALUE_TYPE_DOUBLE, out); @@ -305,7 +305,7 @@ std::string value; CHECK(it.ReadString(&value)); maybe_append_key_name(state_stack[current_state_index], &it, out); - TraceEvent::TraceValue json_value; + TraceValue json_value; json_value.as_string = value.c_str(); json_value.AppendAsJSON(TRACE_VALUE_TYPE_STRING, out); break; @@ -398,7 +398,7 @@ } break; case kTypeDouble: { - TraceEvent::TraceValue trace_value; + TraceValue trace_value; CHECK(it.ReadDouble(&trace_value.as_double)); Value base_value; if (!std::isfinite(trace_value.as_double)) {
diff --git a/build/config/android/build_vars.gni b/build/config/android/build_vars.gni index f394dfc..84f80eb 100644 --- a/build/config/android/build_vars.gni +++ b/build/config/android/build_vars.gni
@@ -18,7 +18,6 @@ android_sdk_platform_version = android_sdk_platform_version android_tool_prefix = rebase_path(android_tool_prefix, root_build_dir) default_min_sdk_version = default_min_sdk_version - final_android_sdk = final_android_sdk if (defined(android_secondary_abi_cpu)) { android_secondary_abi_toolchain =
diff --git a/build/config/android/config.gni b/build/config/android/config.gni index 85f12d7..59374468 100644 --- a/build/config/android/config.gni +++ b/build/config/android/config.gni
@@ -161,11 +161,6 @@ public_android_sdk = true } - # For use downstream when we are building with preview Android SDK - if (!defined(final_android_sdk)) { - final_android_sdk = public_android_sdk - } - if (!defined(default_lint_android_sdk_root)) { # Purposefully repeated so that downstream can change # default_android_sdk_root without changing lint version.
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 0a5e7a1..c0541b8 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -2981,10 +2981,10 @@ # instructions are merged. # See https://crbug.com/415272777. "-mllvm", - "-pick-merged-source-locations" + "-pick-merged-source-locations", ] - rustflags = [ "-Cllvm-args=-pick-merged-source-locations"] + rustflags = [ "-Cllvm-args=-pick-merged-source-locations" ] } else { cflags = [ "/Zi" ] # Produce PDB file, no edit and continue. } @@ -3000,7 +3000,7 @@ configs += [ ":win_pdbaltpath" ] } else { cflags = [] - if (is_mac && enable_dsyms) { + if (is_apple && enable_dsyms) { # If generating dSYMs, specify -fno-standalone-debug. This was # originally specified for https://crbug.com/479841 because dsymutil # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index a2d09d2..8d1533a 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc
@@ -1081,13 +1081,15 @@ for (auto [element_id, _] : raster_source_->GetDisplayItemList()->raster_inducing_scrolls()) { // The transform node has the realized scroll offset and snap amount, - // and should be used for rendering. + // and should be used for rendering. A scroll node without a transform + // node means the scroller is not painted, so it doesn't matter. const auto* scroll_node = scroll_tree.FindNodeFromElementId(element_id); CHECK(scroll_node); - const auto* transform = transform_tree.Node(scroll_node->transform_id); - CHECK(transform); - map[element_id] = - gfx::PointAtOffsetFromOrigin(-transform->to_parent.To2dTranslation()); + if (const auto* transform = + transform_tree.Node(scroll_node->transform_id)) { + map[element_id] = gfx::PointAtOffsetFromOrigin( + -transform->to_parent.To2dTranslation()); + } } } return map;
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 96902c3..b606655c 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -308,26 +308,33 @@ "TestLabel"}, gpu::kNullSurfaceHandle); EXPECT_TRUE(client_shared_image->mailbox().Verify()); - ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); return client_shared_image; } void UploadPixels(gpu::raster::RasterInterface* ri, - const gpu::Mailbox& mailbox, + const scoped_refptr<gpu::ClientSharedImage>& shared_image, const SkImageInfo& info, const SkBitmap& bitmap) { - ri->WritePixels(mailbox, /*dst_x_offset=*/0, /*dst_y_offset=*/0, + auto ri_access = shared_image->BeginRasterAccess( + ri, shared_image->creation_sync_token(), /*readonly=*/false); + ri->WritePixels(shared_image->mailbox(), /*dst_x_offset=*/0, + /*dst_y_offset=*/0, /*texture_target=*/0, SkPixmap(info, bitmap.getPixels(), info.minRowBytes())); EXPECT_EQ(ri->GetError(), static_cast<unsigned>(GL_NO_ERROR)); + gpu::RasterScopedAccess::EndAccess(std::move(ri_access)); } - void UploadPixelsYUV(gpu::raster::RasterInterface* ri, - const gpu::Mailbox& mailbox, - const SkYUVAPixmaps& yuv_pixmap) { - ri->WritePixelsYUV(mailbox, yuv_pixmap); + void UploadPixelsYUV( + gpu::raster::RasterInterface* ri, + const scoped_refptr<gpu::ClientSharedImage>& shared_image, + const SkYUVAPixmaps& yuv_pixmap) { + auto ri_access = shared_image->BeginRasterAccess( + ri, shared_image->creation_sync_token(), /*readonly=*/false); + ri->WritePixelsYUV(shared_image->mailbox(), yuv_pixmap); EXPECT_EQ(ri->GetError(), static_cast<unsigned>(GL_NO_ERROR)); + gpu::RasterScopedAccess::EndAccess(std::move(ri_access)); } // Verifies |actual| matches the expected PNG image. @@ -1348,8 +1355,7 @@ scoped_refptr<gpu::ClientSharedImage> src_client_si = CreateClientSharedImage( ri, sii, options, viz::SinglePlaneFormat::kRGBA_8888); - UploadPixels(ri, src_client_si->mailbox(), expected_bitmap.info(), - expected_bitmap); + UploadPixels(ri, src_client_si, expected_bitmap.info(), expected_bitmap); auto src_paint_image = PaintImageBuilder::WithDefault() @@ -2664,7 +2670,7 @@ SkImageInfo::MakeN32Premul(dest_size.width(), dest_size.height()), expected_pixels.data(), dest_size.width() * sizeof(SkColor)); - UploadPixels(ri, dest_client_si->mailbox(), expected.info(), expected); + UploadPixels(ri, dest_client_si, expected.info(), expected); SkBitmap actual = ReadbackMailbox(ri, dest_client_si->mailbox(), options.resource_size); @@ -2797,7 +2803,7 @@ SkYUVAPixmaps::FromExternalPixmaps(yuv_info, pixmaps); // Upload initial Y+U+V planes and convert to RGB. - UploadPixelsYUV(ri, yuv_client_si->mailbox(), yuv_pixmap); + UploadPixelsYUV(ri, yuv_client_si, yuv_pixmap); ri->CopySharedImage(yuv_client_si->mailbox(), dest_client_si->mailbox(), 0, 0, 0, 0, options.resource_size.width(), @@ -2878,7 +2884,7 @@ SkYUVAPixmaps::FromExternalPixmaps(yuv_info, pixmaps); // Upload initial Y+UV planes and convert to RGB. - UploadPixelsYUV(ri, y_uv_client_si->mailbox(), yuv_pixmap); + UploadPixelsYUV(ri, y_uv_client_si, yuv_pixmap); ri->CopySharedImage(y_uv_client_si->mailbox(), dest_client_si->mailbox(), 0, 0, 0, 0, options.resource_size.width(),
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index b54ad77b0..98e8b65 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -3109,8 +3109,12 @@ auto display_color_spaces = GetDisplayColorSpaces(); for (auto& request : active_tree_->TakeViewTransitionRequests( /*should_set_needs_update_draw_properties=*/true)) { - metadata.transition_directives.push_back(request->ConstructDirective( - view_transition_element_map, display_color_spaces)); + if (resourceless_software_draw_) { + OnCompositorFrameTransitionDirectiveProcessed(request->sequence_id()); + } else { + metadata.transition_directives.push_back(request->ConstructDirective( + view_transition_element_map, display_color_spaces)); + } } } else { // In TreesInViz mode, we call TakeViewTransitionRequest() later in
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 86577456..f0bffc5a 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -513,6 +513,7 @@ "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java", "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarAnimationDelegate.java", "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java", + "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsMediator.java", "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java", "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java", "java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarColorController.java",
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml index b117d6ed..b9fd2588 100644 --- a/chrome/android/features/tab_ui/java/res/values/dimens.xml +++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -162,8 +162,9 @@ <dimen name="tab_group_list_item_small_radius">3dp</dimen> <dimen name="tab_group_list_item_large_radius">24dp</dimen> - <!-- Dimens for tab switcher context menu. --> - <dimen name="tab_switcher_context_menu_max_width">225dp</dimen> + <!-- Dimens for tab grid context menu. --> + <dimen name="tab_grid_context_menu_max_width">225dp</dimen> + <dimen name="tab_grid_context_menu_extended_width">250dp</dimen> <!-- Dimens for archived tabs auto delete promo --> <dimen name="archived_tabs_auto_delete_bottom_sheet_container_dimen">80dp</dimen>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java index ab8b4d7..37b4be0 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinator.java
@@ -203,18 +203,24 @@ @Nullable Tab tab = getTabById(mTabGroupModelFilter::getTabModel, id); if (tab == null) return; + if (ShareUtils.shouldEnableShare(tab)) { + itemList.add( + BrowserUiListMenuUtils.buildMenuListItem( + R.string.share, R.id.share_tab, R.drawable.tab_list_editor_share_icon)); + } + if (mTabGroupModelFilter.getTabGroupCount() == 0) { itemList.add( BrowserUiListMenuUtils.buildMenuListItem( - R.string.menu_add_to_new_group, + R.string.menu_add_tab_to_new_group, R.id.add_to_new_tab_group, R.drawable.ic_widgets)); } else { itemList.add( BrowserUiListMenuUtils.buildMenuListItem( tab.getTabGroupId() == null - ? R.string.add_tab_to_group - : R.string.move_tab_to_group, + ? R.string.menu_add_tab_to_group + : R.string.menu_move_tab_to_group, R.id.add_to_tab_group, R.drawable.ic_widgets)); } @@ -233,12 +239,6 @@ R.drawable.star_outline_24dp)); } - if (ShareUtils.shouldEnableShare(tab)) { - itemList.add( - BrowserUiListMenuUtils.buildMenuListItem( - R.string.share, R.id.share_tab, R.drawable.tab_list_editor_share_icon)); - } - itemList.add( BrowserUiListMenuUtils.buildMenuListItem( R.string.select_tab, R.id.select_tabs, R.drawable.ic_edit_24dp)); @@ -250,7 +250,10 @@ @Override protected int getMenuWidth(int anchorViewWidthPx) { - return getDimensionPixelSize(R.dimen.tab_switcher_context_menu_max_width); + return getDimensionPixelSize( + mTabGroupModelFilter.getTabGroupCount() == 0 + ? R.dimen.tab_grid_context_menu_extended_width + : R.dimen.tab_grid_context_menu_max_width); } @Nullable
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinatorUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinatorUnitTest.java index e153043..631a3013 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinatorUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridContextMenuCoordinatorUnitTest.java
@@ -391,9 +391,9 @@ mCoordinator.buildMenuActionItems(mMenuItemList, TAB_ID); assertEquals(5, mMenuItemList.size()); - assertEquals(R.string.move_tab_to_group, getMenuItemTitleId(0)); - assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(1)); - assertEquals(R.string.share, getMenuItemTitleId(2)); + assertEquals(R.string.share, getMenuItemTitleId(0)); + assertEquals(R.string.menu_move_tab_to_group, getMenuItemTitleId(1)); + assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(2)); assertEquals(R.string.select_tab, getMenuItemTitleId(3)); assertEquals(R.string.close_tab, getMenuItemTitleId(4)); } @@ -406,9 +406,9 @@ mCoordinator.buildMenuActionItems(mMenuItemList, TAB_ID); assertEquals(5, mMenuItemList.size()); - assertEquals(R.string.add_tab_to_group, getMenuItemTitleId(0)); - assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(1)); - assertEquals(R.string.share, getMenuItemTitleId(2)); + assertEquals(R.string.share, getMenuItemTitleId(0)); + assertEquals(R.string.menu_add_tab_to_group, getMenuItemTitleId(1)); + assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(2)); assertEquals(R.string.select_tab, getMenuItemTitleId(3)); assertEquals(R.string.close_tab, getMenuItemTitleId(4)); } @@ -421,9 +421,9 @@ mCoordinator.buildMenuActionItems(mMenuItemList, TAB_ID); assertEquals(5, mMenuItemList.size()); - assertEquals(R.string.menu_add_to_new_group, getMenuItemTitleId(0)); - assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(1)); - assertEquals(R.string.share, getMenuItemTitleId(2)); + assertEquals(R.string.share, getMenuItemTitleId(0)); + assertEquals(R.string.menu_add_tab_to_new_group, getMenuItemTitleId(1)); + assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(2)); assertEquals(R.string.select_tab, getMenuItemTitleId(3)); assertEquals(R.string.close_tab, getMenuItemTitleId(4)); } @@ -438,9 +438,9 @@ mCoordinator.buildMenuActionItems(mMenuItemList, TAB_ID); assertEquals(5, mMenuItemList.size()); - assertEquals(R.string.menu_add_to_new_group, getMenuItemTitleId(0)); - assertEquals(R.string.edit_bookmark, getMenuItemTitleId(1)); - assertEquals(R.string.share, getMenuItemTitleId(2)); + assertEquals(R.string.share, getMenuItemTitleId(0)); + assertEquals(R.string.menu_add_tab_to_new_group, getMenuItemTitleId(1)); + assertEquals(R.string.edit_bookmark, getMenuItemTitleId(2)); assertEquals(R.string.select_tab, getMenuItemTitleId(3)); assertEquals(R.string.close_tab, getMenuItemTitleId(4)); } @@ -453,7 +453,7 @@ mCoordinator.buildMenuActionItems(mMenuItemList, TAB_ID); assertEquals(4, mMenuItemList.size()); - assertEquals(R.string.add_tab_to_group, getMenuItemTitleId(0)); + assertEquals(R.string.menu_add_tab_to_group, getMenuItemTitleId(0)); assertEquals(R.string.add_to_bookmarks, getMenuItemTitleId(1)); assertEquals(R.string.select_tab, getMenuItemTitleId(2)); assertEquals(R.string.close_tab, getMenuItemTitleId(3)); @@ -467,11 +467,23 @@ } @Test - public void testGetMenuWidth() { + public void testGetMenuWidth_withTabGroups() { + when(mTabGroupModelFilter.getTabGroupCount()).thenReturn(1); assertEquals( mActivity .getResources() - .getDimensionPixelSize(R.dimen.tab_switcher_context_menu_max_width), + .getDimensionPixelSize(R.dimen.tab_grid_context_menu_max_width), + // Provide an arbitrary value for anchorViewWidthPx for the test. + mCoordinator.getMenuWidth(/* anchorViewWidthPx= */ 0)); + } + + @Test + public void testGetMenuWidth_noTabGroups() { + when(mTabGroupModelFilter.getTabGroupCount()).thenReturn(0); + assertEquals( + mActivity + .getResources() + .getDimensionPixelSize(R.dimen.tab_grid_context_menu_extended_width), // Provide an arbitrary value for anchorViewWidthPx for the test. mCoordinator.getMenuWidth(/* anchorViewWidthPx= */ 0)); }
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd index 32e622ea..f14a2bc 100644 --- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -989,9 +989,6 @@ </message> <!-- Tab context menu (for individual tabs) --> - <message name="IDS_ADD_TAB_TO_GROUP" desc="Content description for an action which adds a tab to a group."> - Add tab to group - </message> <message name="IDS_SELECT_TAB" desc="Content description for an action which selects a singular tab."> Select tab </message> @@ -1003,9 +1000,6 @@ =1 {Move tab to new window} other {Move tab to another window}} </message> - <message name="IDS_MOVE_TAB_TO_GROUP" desc="Content description for an action which moves a tab to another group."> - Move to group - </message> <!-- Tab Group List Bottom Sheet --> <message name="IDS_TAB_GROUP_LIST_BOTTOM_SHEET_TITLE" desc="Title text for a bottom sheet which is used to add a tab to a tab group.">
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ADD_TAB_TO_GROUP.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ADD_TAB_TO_GROUP.png.sha1 deleted file mode 100644 index 79364f36b..0000000 --- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ADD_TAB_TO_GROUP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -01f73ecad1626c881028b861ba81978f6f17c622 \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_MOVE_TAB_TO_GROUP.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_MOVE_TAB_TO_GROUP.png.sha1 deleted file mode 100644 index 9006cee..0000000 --- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_MOVE_TAB_TO_GROUP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -aa4f87231edd733e3d20fa2473403adc9bf38026 \ No newline at end of file
diff --git a/chrome/android/java/res/layout/custom_tab_menu_button.xml b/chrome/android/java/res/layout/custom_tab_menu_button.xml index 2e21a9c5..1807751 100644 --- a/chrome/android/java/res/layout/custom_tab_menu_button.xml +++ b/chrome/android/java/res/layout/custom_tab_menu_button.xml
@@ -11,7 +11,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/menu_button_wrapper" android:layout_height="match_parent" - android:layout_width="wrap_content"> + android:layout_width="@dimen/toolbar_button_width"> <org.chromium.ui.widget.ChromeImageButton android:id="@+id/menu_button" @@ -20,9 +20,6 @@ android:layout_gravity="center" android:clickable="true" android:focusable="true" - android:layout_width="@dimen/toolbar_button_width" - android:paddingStart="8dp" - android:paddingEnd="16dp" android:contentDescription="@string/accessibility_toolbar_btn_menu" android:tooltipText="@string/accessibility_toolbar_btn_menu" android:background="@null"
diff --git a/chrome/android/java/res/menu/main_menu.xml b/chrome/android/java/res/menu/main_menu.xml index 9a63fa0..e9357d1 100644 --- a/chrome/android/java/res/menu/main_menu.xml +++ b/chrome/android/java/res/menu/main_menu.xml
@@ -47,7 +47,7 @@ android:title="@string/menu_new_incognito_tab" android:icon="@drawable/ic_incognito" /> <item android:id="@+id/add_to_group_menu_id" - android:title="@string/menu_add_to_group" + android:title="@string/menu_add_tab_to_group" android:icon="@drawable/ic_widgets" /> <item android:id="@+id/new_window_menu_id" android:title="@string/menu_new_window"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index d7b605d..7c9583f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -29,6 +29,7 @@ import org.chromium.base.CallbackController; import org.chromium.base.ResettersForTesting; +import org.chromium.base.Token; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.ObservableSupplier; @@ -1009,13 +1010,14 @@ } } - public @StringRes int getAddToGroupMenuItemString() { + public @StringRes int getAddToGroupMenuItemString(@Nullable Token currentTabGroupId) { TabGroupModelFilter filter = mTabModelSelector.getTabGroupModelFilterProvider().getCurrentTabGroupModelFilter(); + if (currentTabGroupId != null) return R.string.menu_move_tab_to_group; if (filter != null) { boolean hasGroups = filter.getTabGroupCount() != 0; - return hasGroups ? R.string.menu_add_to_group : R.string.menu_add_to_new_group; + return hasGroups ? R.string.menu_add_tab_to_group : R.string.menu_add_tab_to_new_group; } - return R.string.menu_add_to_group; + return R.string.menu_add_tab_to_group; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 4bb87ae..04d0cade 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -1744,6 +1744,11 @@ // If a11y is set up, mAccessibilityView needs to hold keyboard focus. // mNodeProvider.requestKeyboardFocusForVirtualView will fail otherwise. if (!mAccessibilityView.hasFocus()) mAccessibilityView.requestFocus(); + // We must manually change the accessibility focus to keep it aligned with the + // input/keyboard focus. We do this before moving the keyboard focus because otherwise + // TalkBack does not honor the request for unknown reasons. + mNodeProvider.sendEventForVirtualView( + mKeyboardFocusIndex, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); mNodeProvider.requestKeyboardFocusForVirtualView(mKeyboardFocusIndex); } else { // If a11y is not set up, CompositorViewHolder needs to hold the keyboard focus so that
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index 20a6386..b01b1e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -33,6 +33,7 @@ import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; +import android.view.animation.Interpolator; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; @@ -122,6 +123,7 @@ import org.chromium.ui.accessibility.AccessibilityState; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.WindowAndroid; +import org.chromium.ui.interpolators.Interpolators; import org.chromium.ui.util.ColorUtils; import org.chromium.ui.util.MotionEventUtils; import org.chromium.ui.util.XrUtils; @@ -162,6 +164,7 @@ private static final int ANIM_TAB_DRAW_X_MS = 250; private static final int ANIM_BUTTONS_FADE_MS = 150; private static final int ANIM_HOVERED_TAB_CONTAINER_FADE_MS = 200; + private static final int NEW_ANIM_TAB_RESIZE_MS = 200; // Visibility Constants private static final float TAB_WIDTH_MEDIUM = 156.f; @@ -1583,14 +1586,16 @@ } private void runTabAddedAnimator(@NonNull List<Animator> animationList, StripLayoutTab tab) { - animationList.add( - CompositorAnimator.ofFloatProperty( - mUpdateHost.getAnimationHandler(), - tab, - StripLayoutTab.Y_OFFSET, - tab.getHeight(), - 0f, - ANIM_TAB_CREATED_MS)); + if (!ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) { + animationList.add( + CompositorAnimator.ofFloatProperty( + mUpdateHost.getAnimationHandler(), + tab, + StripLayoutTab.Y_OFFSET, + tab.getHeight(), + 0f, + ANIM_TAB_CREATED_MS)); + } startAnimations(animationList); } @@ -2669,17 +2674,19 @@ // Removes all dying tabs from TabModel. finishAnimationsAndCloseDyingTabs(allowUndo); - if (runImprovedTabAnimations) { - resizeStripOnTabClose(getTabById(tab.getTabId())); - } else { - mMultiStepTabCloseAnimRunning = false; - mNewTabButtonAnimRunning = false; + if (!ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) { + if (runImprovedTabAnimations) { + resizeStripOnTabClose(getTabById(tab.getTabId())); + } else { + mMultiStepTabCloseAnimRunning = false; + mNewTabButtonAnimRunning = false; - // Resize the tabs appropriately. - computeAndUpdateTabWidth( - /* animate= */ true, - /* deferAnimations= */ false, - /* closedTab= */ null); + // Resize the tabs appropriately. + computeAndUpdateTabWidth( + /* animate= */ true, + /* deferAnimations= */ false, + /* closedTab= */ null); + } } } }; @@ -2699,18 +2706,26 @@ private void runTabRemovalAnimation(StripLayoutTab tab, AnimatorListener listener) { // 1. Setup the close animation. List<Animator> tabClosingAnimators = new ArrayList<>(); - tabClosingAnimators.add( - CompositorAnimator.ofFloatProperty( - mUpdateHost.getAnimationHandler(), - tab, - StripLayoutTab.Y_OFFSET, - tab.getOffsetY(), - tab.getHeight(), - ANIM_TAB_CLOSED_MS)); - - // 2. Start the animation. - mNewTabButtonAnimRunning = true; - mMultiStepTabCloseAnimRunning = true; + if (ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) { + // computeAndUpdateTabWidth handles animating a tab closing. + tabClosingAnimators = + computeAndUpdateTabWidth( + /* animate= */ true, + /* deferAnimations= */ true, + /* closedTab= */ getTabById(tab.getTabId())); + } else { + tabClosingAnimators.add( + CompositorAnimator.ofFloatProperty( + mUpdateHost.getAnimationHandler(), + tab, + StripLayoutTab.Y_OFFSET, + tab.getOffsetY(), + tab.getHeight(), + ANIM_TAB_CLOSED_MS)); + // 2. Start the animation. + mNewTabButtonAnimRunning = true; + mMultiStepTabCloseAnimRunning = true; + } startAnimations(tabClosingAnimators, listener); } @@ -2827,7 +2842,7 @@ bringViewToVisibleArea( view, LayoutManagerImpl.time(), - /* animate= */ !AccessibilityState.isAccessibilityToolPresent()); + /* animate= */ !AccessibilityState.prefersReducedMotion()); mUpdateHost.requestUpdate(); } @@ -3752,6 +3767,7 @@ for (int i = 0; i < mStripTabs.length; i++) { final StripLayoutTab tab = mStripTabs[i]; + if (tab.isDying() && !ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) continue; if (!tab.isClosed() && !tab.isDraggedOffStrip() && !tab.isCollapsed()) numLiveTabs++; } @@ -3802,21 +3818,50 @@ for (int i = 0; i < mStripTabs.length; i++) { StripLayoutTab tab = mStripTabs[i]; if (tab.isClosed()) tab.setWidth(TAB_OVERLAP_WIDTH_DP); - if (tab.isDying() || tab.isCollapsed()) continue; + if ((tab.isDying() && !ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) + || tab.isCollapsed()) { + continue; + } Float cachedTabWidth = mCachedTabWidthSupplier.get(); if (resizeAnimationList != null) { + CompositorAnimator animator; + // Handle animating a tab being closed for TabletTabStripAnimation. + if (tab.isDying()) { + animator = + CompositorAnimator.ofFloatProperty( + mUpdateHost.getAnimationHandler(), + tab, + StripLayoutTab.WIDTH, + tab.getWidth(), + TAB_OVERLAP_WIDTH_DP, + NEW_ANIM_TAB_RESIZE_MS, + Interpolators.STANDARD_DEFAULT_EFFECTS); + resizeAnimationList.add(animator); + continue; + } + if (cachedTabWidth > 0f && tab.getWidth() == cachedTabWidth) { // No need to create an animator to animate to the width we're already at. continue; } - CompositorAnimator animator = + + int duration = ANIM_TAB_RESIZE_MS; + Interpolator interpolator = Interpolators.DECELERATE_INTERPOLATOR; + + if (ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) { + duration = NEW_ANIM_TAB_RESIZE_MS; + interpolator = Interpolators.STANDARD_DEFAULT_EFFECTS; + } + animator = CompositorAnimator.ofFloatProperty( mUpdateHost.getAnimationHandler(), tab, StripLayoutTab.WIDTH, tab.getWidth(), cachedTabWidth, - ANIM_TAB_RESIZE_MS); + duration, + interpolator); + resizeAnimationList.add(animator); } else { mStripTabs[i].setWidth(cachedTabWidth); @@ -3970,10 +4015,16 @@ if (tab.isClosed()) continue; // idealX represents where a tab should be placed in the tab strip. view.setIdealX(startX); - delta = - tab.isDying() - ? getEffectiveTabWidth() - : (tab.getWidth() - TAB_OVERLAP_WIDTH_DP) * tab.getWidthWeight(); + if (ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) { + delta = (tab.getWidth() - TAB_OVERLAP_WIDTH_DP) * tab.getWidthWeight(); + } else { + delta = + tab.isDying() + ? getEffectiveTabWidth() + : (tab.getWidth() - TAB_OVERLAP_WIDTH_DP) + * tab.getWidthWeight(); + } + } else { // Offset to "undo" the tab overlap width as that doesn't apply to non-tab views. // Also applies the desired overlap with the previous tab.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java index 4760014a..1123d0fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java
@@ -15,6 +15,7 @@ import org.chromium.base.MathUtils; import org.chromium.base.Token; import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter; import org.chromium.chrome.browser.tabmodel.TabGroupTitleUtils; @@ -387,4 +388,9 @@ if (view == null) return; view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); } + + public static boolean skipTabEdgePositionCalculation(StripLayoutTab tab) { + return (tab.isDying() && !ChromeFeatureList.sTabletTabStripAnimation.isEnabled()) + || tab.isDraggedOffStrip(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java index ceefa8dc..a2ec6dde 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStacker.java
@@ -55,7 +55,7 @@ float stripWidth) { float rightEdge = stripLeftMargin; for (StripLayoutTab tab : indexOrderedTabs) { - if (tab.isDying() || tab.isDraggedOffStrip()) continue; + if (StripLayoutUtils.skipTabEdgePositionCalculation(tab)) continue; float layoutWidth = (tab.getWidth() - tabOverlapWidth) * tab.getWidthWeight(); rightEdge = Math.max(tab.getDrawX() + layoutWidth, rightEdge); } @@ -72,7 +72,7 @@ float newTabButtonWidth) { float leftEdge = stripWidth - stripRightMargin; for (StripLayoutTab tab : indexOrderedTabs) { - if (tab.isDying() || tab.isDraggedOffStrip()) continue; + if (StripLayoutUtils.skipTabEdgePositionCalculation(tab)) continue; leftEdge = Math.min(tab.getDrawX(), leftEdge); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinator.java index 322945ff..6c32890d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinator.java
@@ -186,7 +186,7 @@ itemList.add( BrowserUiListMenuUtils.buildMenuListItemWithIncognitoBranding( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, R.id.add_to_tab_group, isIncognito, /* enabled= */ true));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java index 67bedf4..762dff19 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
@@ -405,20 +405,16 @@ : null; if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { CustomTabToolbar toolbar = mActivity.findViewById(R.id.toolbar); - toolbar.initializeToolbar( - mActivity, - mIntentDataProvider.get(), - mFeatureOverridesManagerSupplier.get(), - mMinimizeDelegateSupplier.get(), - omniboxParams); mToolbarButtonsCoordinator = new CustomTabToolbarButtonsCoordinator( + mActivity, toolbar, mIntentDataProvider.get(), params -> mToolbarCoordinator.get().onCustomButtonClick(params), mMinimizeDelegateSupplier.get(), - mFeatureOverridesManagerSupplier.get()); - + mFeatureOverridesManagerSupplier.get(), + omniboxParams, + mActivityLifecycleDispatcher); super.initializeToolbar(); mToolbarCoordinator.get().onToolbarInitialized(mToolbarManager); @@ -845,6 +841,11 @@ mWebAppHeaderLayoutCoordinator.destroy(); mWebAppHeaderLayoutCoordinator = null; } + + if (mToolbarButtonsCoordinator != null) { + mToolbarButtonsCoordinator.destroy(); + mToolbarButtonsCoordinator = null; + } } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java index a50dbdd..6aff8ac8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
@@ -348,7 +348,7 @@ mActivity, this::isFullHeight, () -> mStatus, this); toolbar.setHandleStrategy(mHandleStrategy); if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - toolbarButtonsCoordinator.setMinimizeButtonVisible(false); + toolbarButtonsCoordinator.setMinimizeButtonEnabled(false); } else { toolbar.setMinimizeButtonEnabled(false); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java index ded6995..6b305ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabFullSizeStrategy.java
@@ -73,7 +73,7 @@ super.onToolbarInitialized( coordinatorView, toolbar, toolbarCornerRadius, toolbarButtonsCoordinator); if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - toolbarButtonsCoordinator.setMinimizeButtonVisible(true); + toolbarButtonsCoordinator.setMinimizeButtonEnabled(true); } else { toolbar.setMinimizeButtonEnabled(true); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java index 714ac14..dd76b03 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
@@ -171,7 +171,7 @@ } } if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - mToolbarButtonsCoordinator.setMinimizeButtonVisible(false); + mToolbarButtonsCoordinator.setMinimizeButtonEnabled(false); } else { toolbar.setMinimizeButtonEnabled(false); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index 1c509ce..eb1fda76 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -7,10 +7,6 @@ import static androidx.browser.customtabs.CustomTabsIntent.CLOSE_BUTTON_POSITION_END; import static org.chromium.base.MathUtils.interpolate; -import static org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabProfileType.INCOGNITO; -import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CLICK_LISTENER; -import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.DESCRIPTION; -import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.ICON; import static org.chromium.ui.accessibility.KeyboardFocusUtil.setFocusOnFirstFocusableDescendant; import android.animation.Animator; @@ -70,10 +66,7 @@ import org.chromium.base.task.TaskTraits; import org.chromium.chrome.R; import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate; -import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; -import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility; import org.chromium.chrome.browser.customtabs.CustomTabFeatureOverridesManager; -import org.chromium.chrome.browser.customtabs.features.CustomTabDimensionUtils; import org.chromium.chrome.browser.customtabs.features.branding.ToolbarBrandingDelegate; import org.chromium.chrome.browser.customtabs.features.branding.ToolbarBrandingOverlayCoordinator; import org.chromium.chrome.browser.customtabs.features.branding.ToolbarBrandingOverlayProperties; @@ -136,8 +129,6 @@ import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.interpolators.Interpolators; import org.chromium.ui.modaldialog.ModalDialogManager; -import org.chromium.ui.modelutil.PropertyKey; -import org.chromium.ui.modelutil.PropertyListModel; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; @@ -194,32 +185,23 @@ // region CCTToolbarRefactor private int mToolbarWidth; - private BrowserServicesIntentDataProvider mIntentDataProvider; - private CustomTabMinimizeDelegate mMinimizeDelegate; private FrameLayout mCustomButtonsParent; - private PropertyListModel<PropertyModel, PropertyKey> mCustomActionButtonsListModel; - private boolean mIsInMultiWindowMode; + private ImageButton mSideSheetMaximizeButton; - private final int mDefaultButtonWidth = - getResources().getDimensionPixelSize(R.dimen.toolbar_button_width); - private final int mDefaultIconWidth = - getResources().getDimensionPixelSize(R.dimen.toolbar_icon_default_width); - private final int mIconSpacing = - getResources().getDimensionPixelSize(R.dimen.custom_tabs_toolbar_icon_spacing); - - private static final class ButtonPositioningParams { - public int availableWidth; - public int totalStartAlignedButtonWidth; - public int spacingFromLastStartAlignedButton; - public int totalEndAlignedButtonWidth; - public int spacingFromLastEndAlignedButton; + /** Listener interface to be notified when the toolbar is measured with a new width. */ + public interface OnNewWidthMeasuredListener { + void onNewWidthMeasured(int width); } + private @Nullable OnNewWidthMeasuredListener mOnNewWidthMeasuredListener; + public static final class OmniboxParams { /** The {@link SearchActivityClient} instance used to request Omnibox. */ public SearchActivityClient searchClient; + /** The package name of the Custom Tabs embedder. */ public String clientPackageName; + /** A handler for taps on the omnibox, or null if the default handler should be used. */ @Nullable public Consumer<Tab> tapHandler; @@ -284,7 +266,9 @@ mBrandedColorScheme = BrandedColorScheme.APP_DEFAULT; mIncognitoImageView = findViewById(R.id.incognito_cct_logo_image_view); - if (!ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { + if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { + mCustomButtonsParent = findViewById(R.id.action_buttons); + } else { mCustomActionButtons = findViewById(R.id.action_buttons); } mCloseButton = findViewById(R.id.close_button); @@ -305,47 +289,105 @@ mLocationBar.onNativeLibraryReady(); } - /** - * Initialize the toolbar with the data newly available. - * - * @param activity The {@link Activity} that the toolbar is attached to. - * @param intentDataProvider {@link BrowserServicesIntentDataProvider} for accessing CCT intent - * data. - * @param featureOverridesManager {@link CustomTabFeatureOverridesManager} for accessing CCT - * feature overrides. - * @param minimizeDelegate {@link CustomTabMinimizeDelegate} for minimizing the tab. - * @param omniboxParams {@link OmniboxParams}, null if omnibox isn't enabled. - */ - public void initializeToolbar( - Activity activity, - BrowserServicesIntentDataProvider intentDataProvider, - CustomTabFeatureOverridesManager featureOverridesManager, - CustomTabMinimizeDelegate minimizeDelegate, - OmniboxParams omniboxParams) { - assert ChromeFeatureList.sCctToolbarRefactor.isEnabled(); - - mIntentDataProvider = intentDataProvider; - mFeatureOverridesManager = featureOverridesManager; - mMinimizeDelegate = minimizeDelegate; - if (omniboxParams != null) { - setOmniboxParams(omniboxParams); + /** Returns the incognito image view, inflating it first if necessary. */ + ImageView ensureIncognitoImageViewInflated() { + if (mIncognitoImageView != null) { + return mIncognitoImageView; } - calculateToolbarWidthBeforeMeasure(activity, intentDataProvider); - inflateAndPositionToolbarElements(mToolbarWidth); + + ViewStub stub = findViewById(R.id.incognito_icon_stub); + mIncognitoImageView = (ImageView) stub.inflate(); + return mIncognitoImageView; + } + + /** Returns the close button. */ + @Nullable + ImageButton getCloseButton() { + return mCloseButton; + } + + /** Returns the close button, inflating and/or making it visible first if necessary. */ + ImageButton ensureCloseButtonInflated() { + if (mCloseButton != null) { + mCloseButton.setVisibility(VISIBLE); + return mCloseButton; + } + + LayoutInflater.from(getContext()).inflate(R.layout.custom_tab_close_button, this, true); + mCloseButton = findViewById(R.id.close_button); + return mCloseButton; + } + + /** Returns the menu button. */ + @Nullable + MenuButton getMenuButton() { + return mMenuButton; + } + + /** Returns the menu button, inflating and/or making it visible first if necessary. */ + MenuButton ensureMenuButtonInflated() { + if (mMenuButton != null) { + mMenuButton.setVisibility(VISIBLE); + return mMenuButton; + } + + LayoutInflater.from(getContext()).inflate(R.layout.custom_tab_menu_button, this, true); + mMenuButton = findViewById(R.id.menu_button_wrapper); + return mMenuButton; + } + + /** Returns the minimize button. */ + @Nullable + ImageButton getMinimizeButton() { + return mMinimizeButton; + } + + /** Returns the minimize button, inflating and/or making it visible first if necessary. */ + ImageButton ensureMinimizeButtonInflated() { + if (mMinimizeButton != null) { + mMinimizeButton.setVisibility(VISIBLE); + return mMinimizeButton; + } + + LayoutInflater.from(getContext()).inflate(R.layout.custom_tabs_minimize_button, this, true); + mMinimizeButton = findViewById(R.id.custom_tabs_minimize_button); + return mMinimizeButton; + } + + /** Returns the side-sheet maximize button. */ + @Nullable + ImageButton getSideSheetMaximizeButton() { + return mSideSheetMaximizeButton; } /** - * Inflates and positions the buttons and the location bar within the toolbar based on the - * current toolbar width and the current button model. If there isn't enough space for all - * buttons, some buttons may be omitted based on their priority. + * Returns the side-sheet maximize button, inflating and/or making it visible first if + * necessary. */ - void reinflateAndRepositionToolbarElements() { - inflateAndPositionToolbarElements(mToolbarWidth); + ImageButton ensureSideSheetMaximizeButtonInflated() { + if (mSideSheetMaximizeButton != null) { + mSideSheetMaximizeButton.setVisibility(VISIBLE); + return mSideSheetMaximizeButton; + } + + LayoutInflater.from(getContext()) + .inflate(R.layout.custom_tabs_sidepanel_maximize, this, true); + mSideSheetMaximizeButton = findViewById(R.id.custom_tabs_sidepanel_maximize); + return mSideSheetMaximizeButton; } - private void calculateToolbarWidthBeforeMeasure( - Activity activity, BrowserServicesIntentDataProvider intentDataProvider) { - mToolbarWidth = CustomTabDimensionUtils.getInitialWidth(activity, intentDataProvider); + /** Returns the parent view for the custom action buttons. */ + FrameLayout getCustomActionButtonsParent() { + return mCustomButtonsParent; + } + + /** + * Sets an {@link OnNewWidthMeasuredListener}. + * + * @param listener The {@link OnNewWidthMeasuredListener}. A null value clears the listener. + */ + public void setOnNewWidthMeasuredListener(@Nullable OnNewWidthMeasuredListener listener) { + mOnNewWidthMeasuredListener = listener; } @Override @@ -356,235 +398,11 @@ mCustomActionButtons.setVisibility(visibility); } - /** - * Inflates and positions the buttons and the location bar within the toolbar based on the - * provided available width and the current button model. If there isn't enough space for all - * buttons, some buttons may be omitted based on their priority. - * - * <p>This method should be called every time the toolbar width changes. - * - * @param availableWidth The available width of the toolbar in pixels. - */ - private void inflateAndPositionToolbarElements(@Px final int availableWidth) { - LayoutInflater layoutInflater = LayoutInflater.from(getContext()); - int locationBarMinWidth = getLocationBarMinWidth(); - var posParams = new ButtonPositioningParams(); - posParams.availableWidth = availableWidth; - - if (mIntentDataProvider.getCustomTabMode() == INCOGNITO) { - int incognitoIconWidth = - getResources().getDimensionPixelSize(R.dimen.custom_tabs_incognito_icon_width); - locationBarMinWidth += incognitoIconWidth; - - ViewStub stub = findViewById(R.id.incognito_icon_stub); - mIncognitoImageView = (ImageView) stub.inflate(); - } - - posParams.availableWidth -= locationBarMinWidth; - - if (mCloseButton == null && mIntentDataProvider.isCloseButtonEnabled()) { - layoutInflater.inflate(R.layout.custom_tab_close_button, this, true); - mCloseButton = findViewById(R.id.close_button); - mCloseButton.setOnLongClickListener(this); - } - - if (mCloseButton != null) { - boolean isEndPosition = mCloseButtonPosition == CLOSE_BUTTON_POSITION_END; - positionButton(mCloseButton, posParams, mDefaultIconWidth, isEndPosition); - } - - if (mMenuButton == null) { - layoutInflater.inflate(R.layout.custom_tab_menu_button, this, true); - mMenuButton = findViewById(R.id.menu_button_wrapper); - } - - // Now position the menu button. - { - boolean isEndPosition = mCloseButtonPosition != CLOSE_BUTTON_POSITION_END; - positionButton(mMenuButton, posParams, mDefaultIconWidth, isEndPosition); - } - - // Check if we have space for the minimize button. - if (posParams.availableWidth >= mDefaultButtonWidth) { - prepareMinimizeButton(); - - if (mMinimizeButton != null && mMinimizeButton.getVisibility() == VISIBLE) { - // The minimize button is always start aligned. - positionButton(mMinimizeButton, posParams, mDefaultIconWidth, false); - } - } - - View sideSheetMaximizeButton = findViewById(R.id.custom_tabs_sidepanel_maximize); - // Check if we have space for the side-sheet maximize button. - if (sideSheetMaximizeButton != null - && sideSheetMaximizeButton.getVisibility() == VISIBLE - && posParams.availableWidth >= mDefaultButtonWidth) { - positionButton(sideSheetMaximizeButton, posParams, mDefaultIconWidth, true); - } - - // TODO(crbug.com/402213312): We need to think about how this should work with MTB. - mCustomButtonsParent = findViewById(R.id.action_buttons); - // TODO(crbug.com/402213312): Think of how we can optimize this so we don't reinflate all - // buttons any time if we add/remove one. - mCustomButtonsParent.removeAllViews(); - - if (mCustomActionButtonsListModel != null) { - for (var model : mCustomActionButtonsListModel) { - if (!maybeInflateAndPositionCustomButton(model, posParams)) break; - } - } - - positionLocationBar(posParams); - } - - /** - * Positions a button on the toolbar based on given arguments. - * - * @param button The button to be positioned. - * @param posParams A {@link ButtonPositioningParams} tracking the current state of the - * positioning process. It will be modified by this method. - * @param iconWidth The width of the icon within the button. - * @param isEndAligned True if the button is aligned to the end of the toolbar, false if aligned - * to the start. - */ - private void positionButton( - View button, ButtonPositioningParams posParams, int iconWidth, boolean isEndAligned) { - int startPadding; - int endPadding; - // We calculate this button's padding based on the padding of the button that came before. - if (isEndAligned) { - assert posParams.spacingFromLastEndAlignedButton <= mIconSpacing; - // Remaining space to reach mIconSpacing. - endPadding = mIconSpacing - posParams.spacingFromLastEndAlignedButton; - // Remaining space to reach the default button width. If the button will be wider than - // the default width because its icon is wider, make the start padding 0. - startPadding = Math.max(0, mDefaultButtonWidth - iconWidth - endPadding); - posParams.spacingFromLastEndAlignedButton = startPadding; - } else { - assert posParams.spacingFromLastStartAlignedButton <= mIconSpacing; - // Similar to the block above, just start and end padding are reversed. - startPadding = mIconSpacing - posParams.spacingFromLastStartAlignedButton; - endPadding = Math.max(0, mDefaultButtonWidth - iconWidth - startPadding); - posParams.spacingFromLastStartAlignedButton = endPadding; - } - int buttonWidth = iconWidth + startPadding + endPadding; - setHorizontalPadding(button, startPadding, endPadding); - // Adjust the layout gravity based on where the button is aligned, and offset it by - // the total width of the buttons we've previously placed. - setHorizontalLayoutParams( - button, - isEndAligned ? 0 : posParams.totalStartAlignedButtonWidth, - isEndAligned ? posParams.totalEndAlignedButtonWidth : 0, - isEndAligned); - if (isEndAligned) { - // We've placed a button at the end. - posParams.totalEndAlignedButtonWidth += buttonWidth; - } else { - // We've placed a button at the start. - posParams.totalStartAlignedButtonWidth += buttonWidth; - } - posParams.availableWidth -= buttonWidth; - } - - private void setHorizontalLayoutParams( - View view, @Px int startMargin, @Px int endMargin, boolean isEndAligned) { - var lp = (FrameLayout.LayoutParams) view.getLayoutParams(); - lp.setMarginStart(startMargin); - lp.setMarginEnd(endMargin); - int horizontalGravity = isEndAligned ? Gravity.END : Gravity.START; - lp.gravity = Gravity.CENTER_VERTICAL | horizontalGravity; - view.setLayoutParams(lp); - } - private static void setHorizontalPadding(View view, @Px int startPadding, @Px int endPadding) { view.setPaddingRelative( startPadding, view.getPaddingTop(), endPadding, view.getPaddingBottom()); } - @Px - private int getLocationBarMinWidth() { - int locationBarMinWidth = - getResources().getDimensionPixelSize(R.dimen.location_bar_min_url_width); - if (mLocationBar.mOmniboxEnabled) { - locationBarMinWidth += - getResources().getDimensionPixelSize(R.dimen.toolbar_button_width); - } else if (mIntentDataProvider.getTitleVisibilityState() == TitleVisibility.HIDDEN) { - locationBarMinWidth += - getResources().getDimensionPixelSize(R.dimen.custom_tabs_security_icon_width); - } - return locationBarMinWidth; - } - - private void positionLocationBar(ButtonPositioningParams posParams) { - var locationBarLp = ((MarginLayoutParams) mLocationBar.getLayout().getLayoutParams()); - locationBarLp.setMarginStart(posParams.totalStartAlignedButtonWidth); - locationBarLp.setMarginEnd(posParams.totalEndAlignedButtonWidth); - mLocationBar.getLayout().setLayoutParams(locationBarLp); - - var titleUrlLp = ((MarginLayoutParams) mLocationBar.mTitleUrlContainer.getLayoutParams()); - if (mLocationBar.mOmniboxEnabled) { - // TODO(crbug.com/402213312): Revisit this when cleaning up CCTNestedSecurityIcon. - // The security button is static when omnibox is enabled, so offset the url bar for it. - int buttonWidth = getResources().getDimensionPixelSize(R.dimen.toolbar_button_width); - titleUrlLp.leftMargin += buttonWidth; - } - if (mIntentDataProvider.getCustomTabMode() == INCOGNITO) { - int incognitoIconWidth = - getResources().getDimensionPixelSize(R.dimen.custom_tabs_incognito_icon_width); - titleUrlLp.leftMargin += incognitoIconWidth; - } - mLocationBar.mTitleUrlContainer.setLayoutParams(titleUrlLp); - - // Ensure correct spacing between the last start aligned button and the location bar. - int desiredSpace = - getResources() - .getDimensionPixelSize(R.dimen.custom_tabs_location_bar_start_spacing); - int remainingSpace = - Math.max(0, desiredSpace - posParams.spacingFromLastStartAlignedButton); - setHorizontalPadding( - mLocationBar.getLayout(), remainingSpace, mLocationBar.getLayout().getPaddingEnd()); - } - - private boolean maybeInflateAndPositionCustomButton( - PropertyModel model, ButtonPositioningParams posParams) { - Drawable drawable = model.get(ICON); - // The height will be scaled to match spec while keeping the aspect ratio, so get the scaled - // width through that. - int sourceHeight = drawable.getIntrinsicHeight(); - int sourceScaledHeight = getResources().getDimensionPixelSize(R.dimen.toolbar_icon_height); - int sourceWidth = drawable.getIntrinsicWidth(); - int sourceScaledWidth = sourceWidth * sourceScaledHeight / sourceHeight; - - // Remaining space to reach mIconSpacing to make up to the required spacing. - assert posParams.spacingFromLastEndAlignedButton <= mIconSpacing; - int endPadding = mIconSpacing - posParams.spacingFromLastEndAlignedButton; - // Remaining space to reach at least the default button width. If the button will be wider - // than the default width because its icon is wider, make the start padding 0. - int startPadding = Math.max(0, mDefaultButtonWidth - sourceScaledWidth - endPadding); - int buttonWidth = sourceScaledWidth + startPadding + endPadding; - - if (buttonWidth > posParams.availableWidth) return false; - - ImageButton button = - (ImageButton) - LayoutInflater.from(getContext()) - .inflate( - R.layout.custom_tabs_toolbar_button, - mCustomButtonsParent, - false); - button.setOnLongClickListener(this); - button.setOnClickListener(model.get(CLICK_LISTENER)); - - updateCustomActionButtonVisuals(button, drawable, model.get(DESCRIPTION)); - - // Add the view at the beginning of the list. This isn't reflected in how the button is - // positioned; it's only for keeping the index aligned with the params list. - mCustomButtonsParent.addView(button, 0); - positionButton(button, posParams, sourceScaledWidth, /* isEndAligned= */ true); - - return true; - } - @Override protected void setCloseButtonImageResource(Drawable drawable) { mCloseButton.setVisibility(drawable != null ? View.VISIBLE : View.GONE); @@ -594,12 +412,6 @@ } } - // TODO(crbug.com/402213312): Don't expose the model to this view once we MVC-ify things better. - void setCustomActionButtonsListModel(PropertyListModel<PropertyModel, PropertyKey> listModel) { - mCustomActionButtonsListModel = listModel; - inflateAndPositionToolbarElements(mToolbarWidth); - } - @Override protected void setCustomTabCloseClickHandler(OnClickListener listener) { mCloseButton.setOnClickListener(listener); @@ -815,36 +627,6 @@ } /** - * Inflates and prepares the minimize button if it should be enabled. - * - * <p>This is only used when CCTToolbarRefactor is enabled. - */ - private void prepareMinimizeButton() { - if (isInMultiWindowMode() || !mMinimizeButtonEnabled) { - if (mMinimizeButton != null) { - mMinimizeButton.setVisibility(GONE); - } - return; - } - - if (mMinimizeButton != null) { - mMinimizeButton.setVisibility(VISIBLE); - return; - } - - LayoutInflater.from(getContext()).inflate(R.layout.custom_tabs_minimize_button, this, true); - mMinimizeButton = findViewById(R.id.custom_tabs_minimize_button); - mMinimizeButton.setOnClickListener(view -> mMinimizeDelegate.minimize()); - var d = - UiUtils.getTintedDrawable( - getContext(), MinimizedFeatureUtils.getMinimizeIcon(), mTint); - mMinimizeButton.setTag(R.id.custom_tabs_toolbar_tintable, true); - mMinimizeButton.setImageDrawable(d); - updateButtonTint(mMinimizeButton); - mMinimizeButton.setOnLongClickListener(this); - } - - /** * Inflates and prepares the minimize button if it should be enabled, when CCTToolbarRefactor is * disabled. */ @@ -1260,13 +1042,6 @@ mLocationBarModel.notifyTitleChanged(); mLocationBarModel.notifyUrlChanged(); mLocationBarModel.notifyPrimaryColorChanged(); - - if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - if (mIsInMultiWindowMode != isInMultiWindowMode()) { - mIsInMultiWindowMode = isInMultiWindowMode(); - inflateAndPositionToolbarElements(mToolbarWidth); - } - } } @Override @@ -1346,13 +1121,15 @@ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - int measuredWidth = getMeasuredWidth(); - if (measuredWidth > 0 && mToolbarWidth != measuredWidth) { - mToolbarWidth = measuredWidth; - inflateAndPositionToolbarElements(mToolbarWidth); + int measuredWidth = getMeasuredWidth(); + if (measuredWidth > 0 && mToolbarWidth != measuredWidth) { + mToolbarWidth = measuredWidth; + if (mOnNewWidthMeasuredListener != null) { + mOnNewWidthMeasuredListener.onNewWidthMeasured(mToolbarWidth); } + } + if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java index f5cf5e0..3a2dd7d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java
@@ -8,23 +8,30 @@ import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.DESCRIPTION; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.ICON; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.INDIVIDUAL_BUTTON_KEYS; -import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MINIMIZE_BUTTON; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.SIDE_SHEET_MAXIMIZE_BUTTON; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.VISIBLE; +import android.app.Activity; import android.content.Context; +import android.graphics.drawable.Drawable; + +import androidx.browser.customtabs.CustomTabsIntent; import org.chromium.base.Callback; import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; +import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.CustomTabProfileType; +import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider.TitleVisibility; import org.chromium.chrome.browser.browserservices.intents.CustomButtonParams; import org.chromium.chrome.browser.customtabs.CustomTabFeatureOverridesManager; +import org.chromium.chrome.browser.customtabs.features.CustomTabDimensionUtils; import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.CustomTabMinimizeDelegate; -import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.MinimizedFeatureUtils; import org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabSideSheetStrategy.MaximizeButtonCallback; +import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CloseButtonData; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MinimizeButtonData; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.SideSheetMaximizeButtonData; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.ui.modelutil.ListModelChangeProcessor; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyListModel; @@ -38,34 +45,51 @@ PropertyListModel<PropertyModel, PropertyKey>, CustomTabToolbar, PropertyKey> mCustomActionButtonsMcp; private final PropertyModel mModel; - private final CustomTabMinimizeDelegate mMinimizeDelegate; - - /** Whether the minimize button is available for the device and the current configuration. */ - private final boolean mMinimizeButtonAvailable; + private final CustomTabToolbarButtonsMediator mMediator; public CustomTabToolbarButtonsCoordinator( + Activity activity, CustomTabToolbar view, BrowserServicesIntentDataProvider intentDataProvider, Callback<CustomButtonParams> customButtonClickCallback, CustomTabMinimizeDelegate minimizeDelegate, - @Nullable CustomTabFeatureOverridesManager featureOverridesManager) { - CustomTabToolbarButtonsViewBinder viewBinder = new CustomTabToolbarButtonsViewBinder(); + @Nullable CustomTabFeatureOverridesManager featureOverridesManager, + CustomTabToolbar.@Nullable OmniboxParams omniboxParams, + ActivityLifecycleDispatcher lifecycleDispatcher) { var customActionButtons = getCustomActionButtonsModel( - view.getContext(), intentDataProvider, customButtonClickCallback); - mMinimizeButtonAvailable = - MinimizedFeatureUtils.isMinimizedCustomTabAvailable( - view.getContext(), featureOverridesManager) - && MinimizedFeatureUtils.shouldEnableMinimizedCustomTabs( - intentDataProvider); - mMinimizeDelegate = minimizeDelegate; - var minimizeButton = - getMinimizeButtonData( - mMinimizeButtonAvailable && minimizeDelegate != null, minimizeDelegate); + activity, intentDataProvider, customButtonClickCallback); + boolean closeButtonVisible = intentDataProvider.isCloseButtonEnabled(); int closeButtonPosition = intentDataProvider.getCloseButtonPosition(); + + var closeButton = + closeButtonVisible + ? getCloseButtonData( + closeButtonVisible, + intentDataProvider.getCloseButtonDrawable(), + closeButtonPosition) + : new CloseButtonData(); + + int toolbarWidth = CustomTabDimensionUtils.getInitialWidth(activity, intentDataProvider); + boolean omniboxEnabled = omniboxParams != null; + boolean titleVisible = + intentDataProvider.getTitleVisibilityState() == TitleVisibility.VISIBLE; + boolean isIncognito = + intentDataProvider.getCustomTabMode() == CustomTabProfileType.INCOGNITO; mModel = CustomTabToolbarButtonsProperties.create( - customActionButtons, minimizeButton, closeButtonPosition); + /* customActionButtonsVisible= */ true, + customActionButtons, + // We will fill in the actual data in the mediator. + new MinimizeButtonData(), + closeButton, + // TODO(crbug.com/402213312): Coordinate with MenuButtonCoordinator. + /* menuButtonVisible= */ true, + toolbarWidth, + omniboxEnabled, + titleVisible, + isIncognito); + CustomTabToolbarButtonsViewBinder viewBinder = new CustomTabToolbarButtonsViewBinder(); PropertyModelChangeProcessor.create(mModel, view, viewBinder); mCustomActionButtonsMcp = new ListModelChangeProcessor<>( @@ -74,6 +98,19 @@ viewBinder); mModel.get(CustomTabToolbarButtonsProperties.CUSTOM_ACTION_BUTTONS) .addObserver(mCustomActionButtonsMcp); + mMediator = + new CustomTabToolbarButtonsMediator( + mModel, + activity, + minimizeDelegate, + intentDataProvider, + featureOverridesManager, + lifecycleDispatcher); + view.setOnNewWidthMeasuredListener(mMediator); + } + + public void destroy() { + mMediator.destroy(); } /** @@ -96,11 +133,9 @@ mModel.set(SIDE_SHEET_MAXIMIZE_BUTTON, buttonData); } - public void setMinimizeButtonVisible(boolean visible) { + public void setMinimizeButtonEnabled(boolean enabled) { assert ChromeFeatureList.sCctToolbarRefactor.isEnabled(); - mModel.set( - MINIMIZE_BUTTON, - getMinimizeButtonData(mMinimizeButtonAvailable && visible, mMinimizeDelegate)); + mMediator.setMinimizeButtonEnabled(enabled); } static PropertyListModel<PropertyModel, PropertyKey> getCustomActionButtonsModel( @@ -124,12 +159,10 @@ return listModel; } - private static MinimizeButtonData getMinimizeButtonData( - boolean visible, CustomTabMinimizeDelegate minimizeDelegate) { - return new MinimizeButtonData( - visible, - v -> { - if (minimizeDelegate != null) minimizeDelegate.minimize(); - }); + private static CloseButtonData getCloseButtonData( + boolean visible, + Drawable icon, + @CustomTabsIntent.CloseButtonPosition int closeButtonPosition) { + return new CloseButtonData(visible, icon, closeButtonPosition); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsMediator.java new file mode 100644 index 0000000..8cb77e5 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsMediator.java
@@ -0,0 +1,97 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.customtabs.features.toolbar; + +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MINIMIZE_BUTTON; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.TOOLBAR_WIDTH; + +import android.app.Activity; +import android.content.res.Configuration; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.chrome.browser.browserservices.intents.BrowserServicesIntentDataProvider; +import org.chromium.chrome.browser.customtabs.CustomTabFeatureOverridesManager; +import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.CustomTabMinimizeDelegate; +import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.MinimizedFeatureUtils; +import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar.OnNewWidthMeasuredListener; +import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MinimizeButtonData; +import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; +import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver; +import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; +import org.chromium.ui.modelutil.PropertyModel; + +@NullMarked +class CustomTabToolbarButtonsMediator + implements OnNewWidthMeasuredListener, ConfigurationChangedObserver { + private final PropertyModel mModel; + private final Activity mActivity; + private final CustomTabMinimizeDelegate mMinimizeDelegate; + private final ActivityLifecycleDispatcher mLifecycleDispatcher; + + /** Whether the minimize button is available for the device and the current configuration. */ + private final boolean mMinimizeButtonAvailable; + + private boolean mMinimizeButtonEnabled; + + CustomTabToolbarButtonsMediator( + PropertyModel model, + Activity activity, + CustomTabMinimizeDelegate minimizeDelegate, + BrowserServicesIntentDataProvider intentDataProvider, + CustomTabFeatureOverridesManager featureOverridesManager, + ActivityLifecycleDispatcher lifecycleDispatcher) { + mModel = model; + mActivity = activity; + mMinimizeButtonAvailable = + getMinimizeButtonAvailable( + activity, minimizeDelegate, intentDataProvider, featureOverridesManager); + mMinimizeDelegate = minimizeDelegate; + mLifecycleDispatcher = lifecycleDispatcher; + mLifecycleDispatcher.register(this); + mMinimizeButtonEnabled = true; + + // Set the initial real minimize button data. + mModel.set(MINIMIZE_BUTTON, getMinimizeButtonData()); + } + + public void destroy() { + mLifecycleDispatcher.unregister(this); + } + + @Override + public void onNewWidthMeasured(int width) { + mModel.set(TOOLBAR_WIDTH, width); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + mModel.set(MINIMIZE_BUTTON, getMinimizeButtonData()); + } + + void setMinimizeButtonEnabled(boolean enabled) { + mMinimizeButtonEnabled = enabled; + mModel.set(MINIMIZE_BUTTON, getMinimizeButtonData()); + } + + private MinimizeButtonData getMinimizeButtonData() { + boolean isMultiWindow = MultiWindowUtils.getInstance().isInMultiWindowMode(mActivity); + return new MinimizeButtonData( + mMinimizeButtonAvailable && mMinimizeButtonEnabled && !isMultiWindow, + v -> { + if (mMinimizeDelegate != null) mMinimizeDelegate.minimize(); + }); + } + + private static boolean getMinimizeButtonAvailable( + Activity activity, + CustomTabMinimizeDelegate minimizeDelegate, + BrowserServicesIntentDataProvider intentDataProvider, + CustomTabFeatureOverridesManager featureOverridesManager) { + return MinimizedFeatureUtils.isMinimizedCustomTabAvailable( + activity, featureOverridesManager) + && MinimizedFeatureUtils.shouldEnableMinimizedCustomTabs(intentDataProvider) + && minimizeDelegate != null; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java index 8032b43a..be09c4e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java
@@ -4,18 +4,22 @@ package org.chromium.chrome.browser.customtabs.features.toolbar; +import static androidx.browser.customtabs.CustomTabsIntent.CLOSE_BUTTON_POSITION_DEFAULT; + import android.graphics.drawable.Drawable; import android.view.View.OnClickListener; +import androidx.annotation.Px; import androidx.browser.customtabs.CustomTabsIntent.CloseButtonPosition; import org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabSideSheetStrategy.MaximizeButtonCallback; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyListModel; import org.chromium.ui.modelutil.PropertyModel; -import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.ReadableBooleanPropertyKey; import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; public class CustomTabToolbarButtonsProperties { @@ -38,6 +42,9 @@ VISIBLE, ICON, CLICK_LISTENER, DESCRIPTION }; + public static final WritableBooleanPropertyKey CUSTOM_ACTION_BUTTONS_VISIBLE = + new WritableBooleanPropertyKey(); + public static final ReadableObjectPropertyKey<PropertyListModel<PropertyModel, PropertyKey>> CUSTOM_ACTION_BUTTONS = new ReadableObjectPropertyKey<>(); @@ -59,7 +66,7 @@ } /** Default constructor to hide the button. */ - public SideSheetMaximizeButtonData() { + SideSheetMaximizeButtonData() { this(false, false, () -> false); } } @@ -75,32 +82,96 @@ /** The {@link OnClickListener} to notify of the click events. */ public final OnClickListener clickListener; + // TODO: Maybe add default constr for not visible MinimizeButtonData(boolean visible, OnClickListener clickListener) { this.visible = visible; this.clickListener = clickListener; } + + /** Default constructor to hide the button. */ + MinimizeButtonData() { + this(false, v -> {}); + } } /** Property key for the minimize button. */ public static final WritableObjectPropertyKey<MinimizeButtonData> MINIMIZE_BUTTON = new WritableObjectPropertyKey<>(); - /** Property key for the close button position. See {@link CloseButtonPosition}. */ - public static final ReadableIntPropertyKey CLOSE_BUTTON_POSITION = new ReadableIntPropertyKey(); + public static class CloseButtonData { + /** Whether the close button is visible. */ + public final boolean visible; + + /** The close button icon. */ + public final Drawable icon; + + /** The close button position. See {@link CloseButtonPosition}. */ + public final @CloseButtonPosition int position; + + // TODO: Maybe add default constr for not visible + CloseButtonData(boolean visible, Drawable icon, @CloseButtonPosition int position) { + this.visible = visible; + this.icon = icon; + this.position = position; + } + + CloseButtonData() { + this(false, null, CLOSE_BUTTON_POSITION_DEFAULT); + } + } + + /** Property key for the close button. */ + public static final ReadableObjectPropertyKey<CloseButtonData> CLOSE_BUTTON = + new ReadableObjectPropertyKey<>(); + + /** Property key for whether the menu button is visible. */ + public static final WritableBooleanPropertyKey MENU_BUTTON_VISIBLE = + new WritableBooleanPropertyKey(); + + /** Property key for the toolbar width. */ + public static final WritableIntPropertyKey TOOLBAR_WIDTH = new WritableIntPropertyKey(); + + /** Property key for whether the omnibox is enabled. */ + public static final ReadableBooleanPropertyKey OMNIBOX_ENABLED = + new ReadableBooleanPropertyKey(); + + /** Property key for whether the title is visible. */ + public static final ReadableBooleanPropertyKey TITLE_VISIBLE = new ReadableBooleanPropertyKey(); + + /** Property key for whether the CCT is incognito. */ + public static final ReadableBooleanPropertyKey IS_INCOGNITO = new ReadableBooleanPropertyKey(); public static PropertyModel create( + boolean customActionButtonsVisible, PropertyListModel<PropertyModel, PropertyKey> customActionButtons, MinimizeButtonData minimizeButtonData, - @CloseButtonPosition int closeButtonPosition) { + CloseButtonData closeButton, + boolean menuButtonVisible, + @Px int toolbarWidth, + boolean omniboxEnabled, + boolean titleVisible, + boolean isIncognito) { return new PropertyModel.Builder( + CUSTOM_ACTION_BUTTONS_VISIBLE, CUSTOM_ACTION_BUTTONS, SIDE_SHEET_MAXIMIZE_BUTTON, MINIMIZE_BUTTON, - CLOSE_BUTTON_POSITION) + CLOSE_BUTTON, + MENU_BUTTON_VISIBLE, + TOOLBAR_WIDTH, + OMNIBOX_ENABLED, + TITLE_VISIBLE, + IS_INCOGNITO) + .with(CUSTOM_ACTION_BUTTONS_VISIBLE, customActionButtonsVisible) .with(CUSTOM_ACTION_BUTTONS, customActionButtons) .with(SIDE_SHEET_MAXIMIZE_BUTTON, new SideSheetMaximizeButtonData()) .with(MINIMIZE_BUTTON, minimizeButtonData) - .with(CLOSE_BUTTON_POSITION, closeButtonPosition) + .with(CLOSE_BUTTON, closeButton) + .with(MENU_BUTTON_VISIBLE, menuButtonVisible) + .with(TOOLBAR_WIDTH, toolbarWidth) + .with(OMNIBOX_ENABLED, omniboxEnabled) + .with(TITLE_VISIBLE, titleVisible) + .with(IS_INCOGNITO, isIncognito) .build(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java index 1ee9a23..108cacb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java
@@ -4,20 +4,38 @@ package org.chromium.chrome.browser.customtabs.features.toolbar; -import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CLOSE_BUTTON_POSITION; +import static androidx.browser.customtabs.CustomTabsIntent.CLOSE_BUTTON_POSITION_END; + +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CLICK_LISTENER; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CLOSE_BUTTON; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CUSTOM_ACTION_BUTTONS; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CUSTOM_ACTION_BUTTONS_VISIBLE; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.DESCRIPTION; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.ICON; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.IS_INCOGNITO; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MENU_BUTTON_VISIBLE; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.MINIMIZE_BUTTON; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.OMNIBOX_ENABLED; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.SIDE_SHEET_MAXIMIZE_BUTTON; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.TITLE_VISIBLE; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.TOOLBAR_WIDTH; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.support.annotation.DrawableRes; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.ImageButton; +import androidx.annotation.Px; + import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; +import org.chromium.chrome.browser.customtabs.features.minimizedcustomtab.MinimizedFeatureUtils; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.SideSheetMaximizeButtonData; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.UiUtils; @@ -34,24 +52,17 @@ PropertyListModel<PropertyModel, PropertyKey>, CustomTabToolbar, PropertyKey> { + private static final class ButtonPositioningParams { + public int availableWidth; + public int totalStartAlignedButtonWidth; + public int spacingFromLastStartAlignedButton; + public int totalEndAlignedButtonWidth; + public int spacingFromLastEndAlignedButton; + } + @Override public void bind(PropertyModel model, CustomTabToolbar view, PropertyKey propertyKey) { - if (propertyKey == CUSTOM_ACTION_BUTTONS) { - view.setCustomActionButtonsListModel(model.get(CUSTOM_ACTION_BUTTONS)); - } else if (propertyKey == SIDE_SHEET_MAXIMIZE_BUTTON) { - prepareSideSheetMaximizeButton(view, model.get(SIDE_SHEET_MAXIMIZE_BUTTON)); - view.reinflateAndRepositionToolbarElements(); - } else if (propertyKey == MINIMIZE_BUTTON) { - view.setMinimizeButtonEnabled(model.get(MINIMIZE_BUTTON).visible); - view.reinflateAndRepositionToolbarElements(); - View minimizeButton = view.findViewById(R.id.custom_tabs_minimize_button); - if (minimizeButton != null) { - minimizeButton.setOnClickListener(model.get(MINIMIZE_BUTTON).clickListener); - } - } else if (propertyKey == CLOSE_BUTTON_POSITION) { - view.setCloseButtonPosition(model.get(CLOSE_BUTTON_POSITION)); - view.reinflateAndRepositionToolbarElements(); - } + inflateAndPositionToolbarElements(view, model); } @Override @@ -60,7 +71,7 @@ CustomTabToolbar view, int index, int count) { - view.reinflateAndRepositionToolbarElements(); + inflateAndPositionToolbarElements(view, (PropertyModel) view.getTag(R.id.view_model)); } @Override @@ -69,7 +80,7 @@ CustomTabToolbar view, int index, int count) { - view.reinflateAndRepositionToolbarElements(); + inflateAndPositionToolbarElements(view, (PropertyModel) view.getTag(R.id.view_model)); } @Override @@ -86,6 +97,331 @@ } } + /** + * Inflates and positions the buttons and the location bar within the toolbar based on the + * provided available width and the current button model. If there isn't enough space for all + * buttons, some buttons may be omitted based on their priority. + * + * <p>This method should be called every time the toolbar width changes. + * + * @param view The {@link CustomTabToolbar} that hosts the buttons. + * @param model The {@link PropertyModel} containing the needed properties. + */ + private static void inflateAndPositionToolbarElements( + CustomTabToolbar view, PropertyModel model) { + var resources = view.getResources(); + int defaultButtonWidth = resources.getDimensionPixelSize(R.dimen.toolbar_button_width); + int defaultIconWidth = resources.getDimensionPixelSize(R.dimen.toolbar_icon_default_width); + int iconSpacing = resources.getDimensionPixelSize(R.dimen.custom_tabs_toolbar_icon_spacing); + int availableWidth = model.get(TOOLBAR_WIDTH); + int locationBarMinWidth = + getLocationBarMinWidth( + view.getResources(), model.get(OMNIBOX_ENABLED), model.get(TITLE_VISIBLE)); + var posParams = new ButtonPositioningParams(); + posParams.availableWidth = availableWidth; + + if (model.get(IS_INCOGNITO)) { + int incognitoIconWidth = + resources.getDimensionPixelSize(R.dimen.custom_tabs_incognito_icon_width); + locationBarMinWidth += incognitoIconWidth; + + view.ensureIncognitoImageViewInflated(); + } + + posParams.availableWidth -= locationBarMinWidth; + + if (view.getCloseButton() == null && model.get(CLOSE_BUTTON).visible) { + var closeButton = view.ensureCloseButtonInflated(); + closeButton.setImageDrawable(model.get(CLOSE_BUTTON).icon); + closeButton.setOnLongClickListener(view); + } + + var closeButton = view.getCloseButton(); + if (closeButton != null) { + boolean isEndPosition = model.get(CLOSE_BUTTON).position == CLOSE_BUTTON_POSITION_END; + positionButton( + closeButton, + posParams, + defaultButtonWidth, + iconSpacing, + defaultIconWidth, + isEndPosition); + } + + if (view.getMenuButton() == null && model.get(MENU_BUTTON_VISIBLE)) { + view.ensureMenuButtonInflated(); + } + + var menuButton = view.getMenuButton(); + if (menuButton != null) { + boolean isEndPosition = model.get(CLOSE_BUTTON).position != CLOSE_BUTTON_POSITION_END; + positionButton( + menuButton, + posParams, + defaultButtonWidth, + iconSpacing, + defaultIconWidth, + isEndPosition); + } + + var minimizeButtonData = model.get(MINIMIZE_BUTTON); + // Check if we have space for the minimize button and we should be showing it. + if (posParams.availableWidth >= defaultButtonWidth && minimizeButtonData.visible) { + var minimizeButton = view.ensureMinimizeButtonInflated(); + minimizeButton.setOnClickListener(minimizeButtonData.clickListener); + Context context = view.getContext(); + var d = + UiUtils.getTintedDrawable( + context, + MinimizedFeatureUtils.getMinimizeIcon(), + ChromeColors.getPrimaryIconTint(context, model.get(IS_INCOGNITO))); + minimizeButton.setTag(R.id.custom_tabs_toolbar_tintable, true); + minimizeButton.setImageDrawable(d); + minimizeButton.setOnLongClickListener(view); + + // The minimize button is always start aligned. + positionButton( + minimizeButton, + posParams, + defaultButtonWidth, + iconSpacing, + defaultIconWidth, + /* isEndAligned= */ false); + } else if (view.getMinimizeButton() != null) { + view.getMinimizeButton().setVisibility(View.GONE); + } + + // TODO(crbug.com/402213312): We need to think about how this should work with MTB. + FrameLayout customActionButtons = view.getCustomActionButtonsParent(); + // TODO(crbug.com/402213312): Think of how we can optimize this so we don't reinflate all + // buttons any time if we add/remove one. + customActionButtons.removeAllViews(); + + if (model.get(CUSTOM_ACTION_BUTTONS_VISIBLE)) { + var models = model.get(CUSTOM_ACTION_BUTTONS); + for (var actionButtonModel : models) { + if (!maybeInflateAndPositionCustomButton( + view, actionButtonModel, posParams, defaultButtonWidth, iconSpacing)) { + break; + } + } + } + + // Check if we have space for the side-sheet maximize button we should be showing it. + if (posParams.availableWidth >= defaultButtonWidth + && model.get(SIDE_SHEET_MAXIMIZE_BUTTON).visible) { + view.ensureSideSheetMaximizeButtonInflated(); + var sideSheetMaximizeButtonData = model.get(SIDE_SHEET_MAXIMIZE_BUTTON); + prepareSideSheetMaximizeButton(view, sideSheetMaximizeButtonData); + + // The maximize button is currently end aligned. + positionButton( + view.getSideSheetMaximizeButton(), + posParams, + defaultButtonWidth, + iconSpacing, + defaultIconWidth, + /* isEndAligned= */ true); + } else if (view.getSideSheetMaximizeButton() != null) { + view.getSideSheetMaximizeButton().setVisibility(View.GONE); + } + + positionLocationBar(view, model, posParams); + } + + /** + * Positions a button on the toolbar based on given arguments. + * + * @param button The button to be positioned. + * @param posParams A {@link ButtonPositioningParams} tracking the current state of the + * positioning process. It will be modified by this method. + * @param defaultButtonWidth The default width of a toolbar button. + * @param iconSpacing The spacing between two adjacent icons. + * @param iconWidth The width of the icon within the button. + * @param isEndAligned True if the button is aligned to the end of the toolbar, false if aligned + * to the start. + */ + private static void positionButton( + View button, + ButtonPositioningParams posParams, + @Px int defaultButtonWidth, + @Px int iconSpacing, + int iconWidth, + boolean isEndAligned) { + int startPadding; + int endPadding; + // We calculate this button's padding based on the padding of the button that came before. + if (isEndAligned) { + assert posParams.spacingFromLastEndAlignedButton <= iconSpacing; + // Remaining space to reach iconSpacing. + endPadding = iconSpacing - posParams.spacingFromLastEndAlignedButton; + // Remaining space to reach the default button width. If the button will be wider than + // the default width because its icon is wider, make the start padding 0. + startPadding = Math.max(0, defaultButtonWidth - iconWidth - endPadding); + posParams.spacingFromLastEndAlignedButton = startPadding; + } else { + assert posParams.spacingFromLastStartAlignedButton <= iconSpacing; + // Similar to the block above, just start and end padding are reversed. + startPadding = iconSpacing - posParams.spacingFromLastStartAlignedButton; + endPadding = Math.max(0, defaultButtonWidth - iconWidth - startPadding); + posParams.spacingFromLastStartAlignedButton = endPadding; + } + int buttonWidth = iconWidth + startPadding + endPadding; + setHorizontalPadding(button, startPadding, endPadding); + // Adjust the layout gravity based on where the button is aligned, and offset it by + // the total width of the buttons we've previously placed. + setHorizontalLayoutParams( + button, + isEndAligned ? 0 : posParams.totalStartAlignedButtonWidth, + isEndAligned ? posParams.totalEndAlignedButtonWidth : 0, + isEndAligned); + if (isEndAligned) { + // We've placed a button at the end. + posParams.totalEndAlignedButtonWidth += buttonWidth; + } else { + // We've placed a button at the start. + posParams.totalStartAlignedButtonWidth += buttonWidth; + } + posParams.availableWidth -= buttonWidth; + } + + /** + * Positions a custom action button on the toolbar based on given arguments. + * + * @param view The {@link CustomTabToolbar} that hosts the buttons. + * @param model The custom action button {@link PropertyModel} containing the needed properties. + * @param posParams A {@link ButtonPositioningParams} tracking the current state of the + * positioning process. It will be modified by this method. + * @param defaultButtonWidth The default width of a toolbar button. + * @param iconSpacing The spacing between two adjacent icons. + */ + private static boolean maybeInflateAndPositionCustomButton( + CustomTabToolbar view, + PropertyModel model, + ButtonPositioningParams posParams, + @Px int defaultButtonWidth, + @Px int iconSpacing) { + Drawable drawable = model.get(ICON); + Resources resources = view.getResources(); + // The height will be scaled to match spec while keeping the aspect ratio, so get the scaled + // width through that. + int sourceHeight = drawable.getIntrinsicHeight(); + int sourceScaledHeight = resources.getDimensionPixelSize(R.dimen.toolbar_icon_height); + int sourceWidth = drawable.getIntrinsicWidth(); + int sourceScaledWidth = sourceWidth * sourceScaledHeight / sourceHeight; + + // Remaining space to reach iconSpacing to make up to the required spacing. + assert posParams.spacingFromLastEndAlignedButton <= iconSpacing; + int endPadding = iconSpacing - posParams.spacingFromLastEndAlignedButton; + // Remaining space to reach at least the default button width. If the button will be wider + // than the default width because its icon is wider, make the start padding 0. + int startPadding = Math.max(0, defaultButtonWidth - sourceScaledWidth - endPadding); + int buttonWidth = sourceScaledWidth + startPadding + endPadding; + + if (buttonWidth > posParams.availableWidth) return false; + + ImageButton button = + (ImageButton) + LayoutInflater.from(view.getContext()) + .inflate( + R.layout.custom_tabs_toolbar_button, + view.getCustomActionButtonsParent(), + false); + button.setOnLongClickListener(view); + button.setOnClickListener(model.get(CLICK_LISTENER)); + button.setContentDescription(model.get(DESCRIPTION)); + + int minPadding = resources.getDimensionPixelSize(R.dimen.min_toolbar_icon_side_padding); + + int sidePadding = Math.max((2 * sourceScaledHeight - sourceScaledWidth) / 2, minPadding); + int topPadding = button.getPaddingTop(); + int bottomPadding = button.getPaddingBottom(); + button.setPadding(sidePadding, topPadding, sidePadding, bottomPadding); + button.setImageDrawable(drawable); + + // Add the view at the beginning of the list. This isn't reflected in how the button is + // positioned; it's only for keeping the index aligned with the params list. + view.getCustomActionButtonsParent().addView(button, 0); + positionButton( + button, + posParams, + defaultButtonWidth, + iconSpacing, + sourceScaledWidth, + /* isEndAligned= */ true); + + return true; + } + + /** + * Positions the location bar on the toolbar based on given arguments. + * + * @param view The {@link CustomTabToolbar} that hosts the buttons. + * @param model The custom action button {@link PropertyModel} containing the needed properties. + * @param posParams A {@link ButtonPositioningParams} tracking the current state of the + * positioning process. It will be modified by this method. + */ + private static void positionLocationBar( + CustomTabToolbar view, PropertyModel model, ButtonPositioningParams posParams) { + var locationBar = view.findViewById(R.id.location_bar_frame_layout); + Resources resources = view.getResources(); + var locationBarLp = ((ViewGroup.MarginLayoutParams) locationBar.getLayoutParams()); + locationBarLp.setMarginStart(posParams.totalStartAlignedButtonWidth); + locationBarLp.setMarginEnd(posParams.totalEndAlignedButtonWidth); + locationBar.setLayoutParams(locationBarLp); + + var titleUrlContainer = view.findViewById(R.id.title_url_container); + var titleUrlLp = ((ViewGroup.MarginLayoutParams) titleUrlContainer.getLayoutParams()); + if (model.get(OMNIBOX_ENABLED)) { + // TODO(crbug.com/402213312): Revisit this when cleaning up CCTNestedSecurityIcon. + // The security button is static when omnibox is enabled, so offset the url bar for it. + int buttonWidth = resources.getDimensionPixelSize(R.dimen.toolbar_button_width); + titleUrlLp.leftMargin += buttonWidth; + } + if (model.get(IS_INCOGNITO)) { + int incognitoIconWidth = + resources.getDimensionPixelSize(R.dimen.custom_tabs_incognito_icon_width); + titleUrlLp.leftMargin += incognitoIconWidth; + } + titleUrlContainer.setLayoutParams(titleUrlLp); + + // Ensure correct spacing between the last start aligned button and the location bar. + int desiredSpace = + resources.getDimensionPixelSize(R.dimen.custom_tabs_location_bar_start_spacing); + int remainingSpace = + Math.max(0, desiredSpace - posParams.spacingFromLastStartAlignedButton); + setHorizontalPadding(locationBar, remainingSpace, locationBar.getPaddingEnd()); + } + + private static void setHorizontalPadding(View view, @Px int startPadding, @Px int endPadding) { + view.setPaddingRelative( + startPadding, view.getPaddingTop(), endPadding, view.getPaddingBottom()); + } + + private static void setHorizontalLayoutParams( + View view, @Px int startMargin, @Px int endMargin, boolean isEndAligned) { + var lp = (FrameLayout.LayoutParams) view.getLayoutParams(); + lp.setMarginStart(startMargin); + lp.setMarginEnd(endMargin); + int horizontalGravity = isEndAligned ? Gravity.END : Gravity.START; + lp.gravity = Gravity.CENTER_VERTICAL | horizontalGravity; + view.setLayoutParams(lp); + } + + @Px + private static int getLocationBarMinWidth( + Resources resources, boolean omniboxEnabled, boolean titleVisible) { + int locationBarMinWidth = + resources.getDimensionPixelSize(R.dimen.location_bar_min_url_width); + if (omniboxEnabled) { + locationBarMinWidth += resources.getDimensionPixelSize(R.dimen.toolbar_button_width); + } else if (!titleVisible) { + locationBarMinWidth += + resources.getDimensionPixelSize(R.dimen.custom_tabs_security_icon_width); + } + return locationBarMinWidth; + } + private static void prepareSideSheetMaximizeButton( CustomTabToolbar view, SideSheetMaximizeButtonData data) { ImageButton button = view.findViewById(R.id.custom_tabs_sidepanel_maximize);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java index 2bd4a8b..a75ac75 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java
@@ -78,7 +78,7 @@ int MAX_VALUE = 7; } - // LINT.ThenChange(/tools/metrics/histograms/enums.xml:PrivacySandboxSurveyTypesEnums) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxSurveyTypesEnums) // LINT.IfChange(PrivacySandboxCctAdsNoticeSurveyFailures) /** Represents the possible failures when attempting to surface a CCT ads notice survey. */ @@ -115,7 +115,7 @@ int MAX_VALUE = INVALID_ROW_CONTROL_SURVEY_CONFIG; } - // LINT.ThenChange(/tools/metrics/histograms/enums.xml:PrivacySandboxCctAdsNoticeSurveyFailures) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxCctAdsNoticeSurveyFailures) // Maps {@link PrivacySandboxSurveyType} to their survey triggerid. private static final Map<Integer, String> sSurveyTriggers =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java index f2d9304..cc776153 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -284,7 +284,9 @@ menu.findItem(R.id.add_to_group_menu_id) .setVisible(ChromeFeatureList.sTabGroupParityBottomSheetAndroid.isEnabled()) - .setTitle(getAddToGroupMenuItemString()); + .setTitle( + getAddToGroupMenuItemString( + currentTab != null ? currentTab.getTabGroupId() : null)); // Enable image descriptions if touch exploration is currently enabled, but not on the // native NTP.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 0d42c3c..1bb7dca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -24,6 +24,7 @@ import android.view.View.OnLayoutChangeListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; import android.view.ViewStub; import androidx.activity.BackEventCompat; @@ -370,6 +371,7 @@ private @Nullable StripLayoutHelperManager mStripLayoutHelperManager; private @Nullable MiniOriginBarController mMiniOriginBarController; + private @Nullable ToolbarPositionController mToolbarPositionController; private @Nullable UndoBarThrottle mUndoBarThrottle; private CustomTabCount mCustomTabCount; @@ -1622,7 +1624,11 @@ if (extensionToolbarStub != null) { mExtensionToolbarManager = ExtensionToolbarManager.maybeCreate( - mActivity, extensionToolbarStub, profileSupplier, tabProvider); + mActivity, + extensionToolbarStub, + profileSupplier, + tabProvider, + browsingModeThemeColorProvider); } TraceEvent.end("ToolbarManager.ToolbarManager"); @@ -1672,23 +1678,27 @@ mControlContainer.getView()); ObservableSupplierImpl<Integer> controlContainerTranslationSupplier = new ObservableSupplierImpl<>(0); - new ToolbarPositionController( - mBrowserControlsSizer, - ContextUtils.getAppSharedPreferences(), - mIsNtpShowingSupplier, - mIsTabSwitcherFinishedShowingSupplier, - mOmniboxFocusStateSupplier, - mFormFieldFocusedSupplier, - mFindInPageShowingSupplier, - keyboardAccessoryStateSupplier, - mWindowAndroid.getKeyboardDelegate(), - mControlContainer, - mBottomControlsStacker, - mBottomToolbarControlsOffsetSupplier, - mProgressBarContainer, - controlContainerTranslationSupplier, - new Handler(Looper.getMainLooper()), - mActivity); + ObservableSupplierImpl<Integer> controlContainerHeightSupplier = + new ObservableSupplierImpl<>(LayoutParams.WRAP_CONTENT); + mToolbarPositionController = + new ToolbarPositionController( + mBrowserControlsSizer, + ContextUtils.getAppSharedPreferences(), + mIsNtpShowingSupplier, + mIsTabSwitcherFinishedShowingSupplier, + mOmniboxFocusStateSupplier, + mFormFieldFocusedSupplier, + mFindInPageShowingSupplier, + keyboardAccessoryStateSupplier, + mWindowAndroid.getKeyboardDelegate(), + mControlContainer, + mBottomControlsStacker, + mBottomToolbarControlsOffsetSupplier, + mProgressBarContainer, + controlContainerTranslationSupplier, + controlContainerHeightSupplier, + new Handler(Looper.getMainLooper()), + mActivity); if (ChromeFeatureList.sMiniOriginBar.isEnabled()) { mMiniOriginBarController = new MiniOriginBarController( @@ -1701,6 +1711,7 @@ mBrowserControlsSizer, mWindowAndroid.getInsetObserver(), controlContainerTranslationSupplier, + controlContainerHeightSupplier, keyboardAccessoryStateSupplier.getIsSheetShowingSupplier()); } } @@ -2386,6 +2397,11 @@ mDesktopWindowStateManager.removeObserver(mControlContainer); } + if (mToolbarPositionController != null) { + mToolbarPositionController.destroy(); + mToolbarPositionController = null; + } + if (mMiniOriginBarController != null) { mMiniOriginBarController.destroy(); mMiniOriginBarController = null;
diff --git a/chrome/android/javatests/BUILD.gn b/chrome/android/javatests/BUILD.gn index 380762e9..cb95919 100644 --- a/chrome/android/javatests/BUILD.gn +++ b/chrome/android/javatests/BUILD.gn
@@ -297,6 +297,7 @@ "//components/embedder_support/android:simple_factory_key_java", "//components/embedder_support/android:util_java", "//components/embedder_support/android:web_contents_delegate_java", + "//components/enterprise/connectors/core:connectors_java_enums", "//components/external_intents/android:java", "//components/external_intents/android:test_support_java", "//components/externalauth/android:java", @@ -955,6 +956,7 @@ resources_package = "org.chromium.chrome.test" sources = [ + "src/org/chromium/chrome/browser/password_manager/EnterpriseReportingIntegrationTest.java", "src/org/chromium/chrome/browser/password_manager/PasswordCheckupIntegrationTest.java", "src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogTest.java", "src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java index 09fabb5..8054b06 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java
@@ -52,7 +52,7 @@ @Rule public final ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(1) + .setRevision(2) .setDescription("App menu") .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_APP_MENU) .build();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/EnterpriseReportingIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/EnterpriseReportingIntegrationTest.java new file mode 100644 index 0000000..4bacdd0 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/EnterpriseReportingIntegrationTest.java
@@ -0,0 +1,161 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.password_manager; + +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeTrue; + +import androidx.test.filters.LargeTest; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.AndroidInfo; +import org.chromium.base.CommandLine; +import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Features.EnableFeatures; +import org.chromium.base.test.util.HistogramWatcher; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.policy.CloudManagementSharedPreferences; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.transit.ChromeTransitTestRules; +import org.chromium.chrome.test.transit.FreshCtaTransitTestRule; +import org.chromium.chrome.test.transit.page.WebPageStation; +import org.chromium.components.enterprise.connectors.EnterpriseReportingEventType; +import org.chromium.content_public.browser.WebContents; +import org.chromium.content_public.browser.test.util.DOMUtils; +import org.chromium.net.test.util.TestWebServer; + +import java.util.concurrent.TimeoutException; + +/** Test that password-related events are reported to an enterprise connector. */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ + ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, + "enable-chrome-browser-cloud-management", +}) +@EnableFeatures("EnterpriseSecurityEventReportingOnAndroid") +@Batch(Batch.PER_CLASS) +public class EnterpriseReportingIntegrationTest { + @Rule + public FreshCtaTransitTestRule mActivityTestRule = + ChromeTransitTestRules.freshChromeTabbedActivityRule(); + + private TestWebServer mReportingServer; + + private static final String PASSWORD_FORM_URL = + "/chrome/test/data/password/simple_password.html"; + private static final String USERNAME_FIELD_ID = "username_field"; + private static final String PASSWORD_NODE_ID = "password_field"; + private static final String USERNAME_TEXT = "username@domain.com"; + private static final String PASSWORD_TEXT = "password"; + private static final String NEW_PASSWORD_TEXT = "new password"; + private static final String SUBMIT_BUTTON_ID = "input_submit_button"; + + private static final String FAKE_GOOGLE_API_KEY = "fake-google-api-key"; + private static final String FAKE_DM_TOKEN = "fake-dm-token"; + + private static final String REPORTING_ENDPOINT = "/?key=" + FAKE_GOOGLE_API_KEY; + private static final String REPORTING_POLICY_NAME = "OnSecurityEventEnterpriseConnector"; + private static final String REPORTING_SUCCESS_HISTOGRAM = + "Enterprise.ReportingEventUploadSuccess"; + private static final String REPORTING_FAILURE_HISTOGRAM = + "Enterprise.ReportingEventUploadFailure"; + + @Before + public void setUp() throws Exception { + mReportingServer = TestWebServer.start(); + // For simplicity, omit the `UploadEventsResponse` response, which the client doesn't look + // at. + mReportingServer.setEmptyResponse(REPORTING_ENDPOINT); + + // For authenticating to the fake reporting server. + CloudManagementSharedPreferences.saveDmToken(FAKE_DM_TOKEN); + + CommandLine command_line = CommandLine.getInstance(); + command_line.appendSwitchWithValue("realtime-reporting-url", mReportingServer.getBaseUrl()); + command_line.appendSwitchWithValue("gaia-config-contents", buildGaiaConfig().toString()); + // Stop the browser from trying to talk to the real DM server. The command line will set the + // policy needed, so a 404 will suffice. + command_line.appendSwitchWithValue( + "device-management-url", mReportingServer.getBaseUrl() + "does-not-exist"); + } + + @After + public void tearDown() { + mReportingServer.shutdown(); + } + + private JSONObject buildGaiaConfig() throws JSONException { + var apiKeys = new JSONObject().put("GOOGLE_API_KEY", FAKE_GOOGLE_API_KEY); + return new JSONObject().put("api_keys", apiKeys); + } + + private JSONObject buildSecurityEventReportingPolicy(String eventName) throws JSONException { + var eventDetails = new JSONObject().put("name", eventName).append("url_patterns", "*"); + return new JSONObject() + .append("enabled_event_names", eventName) + .append("enabled_opt_in_events", eventDetails) + .put("service_provider", "google"); + } + + /** Build a histogram watcher that expects one successfully uploaded report and no failures. */ + private HistogramWatcher buildReportUploadWatcher(@EnterpriseReportingEventType int eventType) { + return HistogramWatcher.newBuilder() + .expectIntRecord(REPORTING_SUCCESS_HISTOGRAM, eventType) + .expectNoRecords(REPORTING_FAILURE_HISTOGRAM) + .build(); + } + + /** Parse the last security event report received, if any. */ + private JSONObject parseLastReport() throws JSONException { + TestWebServer.HTTPRequest request = mReportingServer.getLastRequest(REPORTING_ENDPOINT); + if (request == null) { + return null; + } + var body = new String(request.getBody()); + return new JSONObject(body); + } + + @Test + @LargeTest + public void testLoginEventReported() throws JSONException, TimeoutException { + assumeTrue("Can set policy from command line", AndroidInfo.isDebugAndroid()); + + var policyMap = new JSONObject(); + policyMap.append(REPORTING_POLICY_NAME, buildSecurityEventReportingPolicy("loginEvent")); + CommandLine.getInstance().appendSwitchWithValue("policy", policyMap.toString()); + HistogramWatcher watcher = + buildReportUploadWatcher(EnterpriseReportingEventType.LOGIN_EVENT); + + WebPageStation page = mActivityTestRule.startOnTestServerUrl(PASSWORD_FORM_URL); + WebContents webContents = page.webContentsElement.get(); + DOMUtils.enterInputIntoTextField(webContents, USERNAME_FIELD_ID, USERNAME_TEXT); + DOMUtils.enterInputIntoTextField(webContents, PASSWORD_NODE_ID, PASSWORD_TEXT); + DOMUtils.clickNodeWithJavaScript(webContents, SUBMIT_BUTTON_ID); + watcher.pollInstrumentationThreadUntilSatisfied(); + + JSONObject report = parseLastReport(); + assertNotNull(report); + assertEquals("Android", report.getJSONObject("device").getString("osPlatform")); + var events = report.getJSONArray("events"); + assertEquals(1, events.length()); + var eventDetails = events.getJSONObject(0).getJSONObject("loginEvent"); + assertEquals( + mActivityTestRule.getTestServer().getURL(PASSWORD_FORM_URL), + eventDetails.getString("url")); + // The username portion of the login will be masked, but the domain part shouldn't be. + assertThat(eventDetails.getString("loginUserName"), endsWith("@domain.com")); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index 3525c92..dbeb528 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -222,6 +222,7 @@ private final TestTabModel mModel = spy(new TestTabModel()); private StripLayoutHelper mStripLayoutHelper; private boolean mIncognito; + private static final int NEW_ANIM_TAB_RESIZE_MS = 200; private static final String[] TEST_TAB_TITLES = {"Tab 1", "Tab 2", "Tab 3", "", null}; private static final String EXPECTED_NO_MARGIN = "The tab should not have a trailing margin."; private static final String EXPECTED_TAB = "The view should be a tab."; @@ -6239,6 +6240,59 @@ /* expectedScrollDelta= */ StripLayoutHelper.SCROLL_SPEED_FACTOR); } + @Test + @EnableFeatures({ChromeFeatureList.TABLET_TAB_STRIP_ANIMATION}) + public void testTabCreated_HorizontalAnimation() { + // Initialize with default amount of tabs. Clear any animations. + initializeTest(false, false, 3); + mStripLayoutHelper.finishAnimationsAndPushTabUpdates(); + assertNull( + "Animation should not be running.", + mStripLayoutHelper.getRunningAnimatorForTesting()); + + // Act: Create new tab in model and trigger update in tab strip. + mModel.addTab("new tab"); + mStripLayoutHelper.tabCreated(TIMESTAMP, 5, 3, true, false, false); + } + + @Test + @EnableFeatures({ChromeFeatureList.TABLET_TAB_STRIP_ANIMATION}) + public void testTabClosing_NoTabResize_HorizontalAnimation() { + // Arrange + int tabCount = 10; + initializeTest(false, false, 9, tabCount); + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabsForTesting(); + mStripLayoutHelper.onSizeChanged( + SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP, PADDING_LEFT, PADDING_RIGHT, 0f); + setupForAnimations(); + + mStripLayoutHelper.updateLayout(TIMESTAMP); + + // Act: Call on close tab button handler. + mStripLayoutHelper.handleCloseButtonClick( + tabs[9], MotionEventUtils.MOTION_EVENT_BUTTON_NONE); + + // Assert: One set of animations started. + assertFalse( + "MultiStepAnimations should not have started.", + mStripLayoutHelper.isMultiStepCloseAnimationsRunningForTesting()); + + // Act: End the tab closing animations to apply final values. + Animator runningAnimator = mStripLayoutHelper.getRunningAnimatorForTesting(); + assertNotNull(runningAnimator); + runningAnimator.end(); + + // Assert: Tab is closed. + int expectedTabCount = 9; + assertEquals( + "Unexpected tabs count", + expectedTabCount, + mStripLayoutHelper.getStripLayoutTabsForTesting().length); + + // Assert: There should only be one set of animations. + assertFalse(mStripLayoutHelper.getRunningAnimatorForTesting().isRunning()); + } + /** * Tests {@link StripLayoutHelper#onScroll(float, float)} *
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinatorUnitTest.java index e7639f6..d33b445 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/TabContextMenuCoordinatorUnitTest.java
@@ -175,7 +175,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group, @@ -218,7 +218,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group, @@ -261,7 +261,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group, @@ -303,7 +303,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group, @@ -334,7 +334,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group, @@ -371,7 +371,7 @@ // List item 1 assertEquals( - R.string.add_tab_to_group, + R.string.menu_add_tab_to_group, modelList.get(0).model.get(ListMenuItemProperties.TITLE_ID)); assertEquals( R.id.add_to_tab_group,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java index d402ac4..fb2f395e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
@@ -33,7 +33,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.View.MeasureSpec; -import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.ImageButton; @@ -200,23 +199,7 @@ null, null); - if (ChromeFeatureList.sCctToolbarRefactor.isEnabled()) { - mToolbar.initializeToolbar( - mActivity, - mIntentDataProvider, - mFeatureOverridesManager, - mMinimizeDelegate, - null); - var model = - CustomTabToolbarButtonsCoordinator.getCustomActionButtonsModel( - mActivity, mIntentDataProvider, params -> {}); - mToolbar.setCustomActionButtonsListModel(model); - // Minimize button is enabled by default. - mToolbar.setMinimizeButtonEnabled(true); - mToolbar.reinflateAndRepositionToolbarElements(); - } else { - mToolbar.setFeatureOverridesManager(mFeatureOverridesManager); - } + mToolbar.setFeatureOverridesManager(mFeatureOverridesManager); mLocationBar = (CustomTabLocationBar) @@ -636,30 +619,25 @@ @Test @EnableFeatures({ChromeFeatureList.CCT_TOOLBAR_REFACTOR}) - @Config(qualifiers = "w200dp") - public void testLayoutForWidth_200dp() { - View closeButton = mToolbar.findViewById(R.id.close_button); - View menuButton = mToolbar.findViewById(R.id.menu_button_wrapper); - View minimizeButton = mToolbar.findViewById(R.id.custom_tabs_minimize_button); - ViewGroup actionButtons = mToolbar.findViewById(R.id.action_buttons); - assertNotNull(closeButton); - assertNotNull(menuButton); - assertNull(minimizeButton); - assertEquals(0, actionButtons.getChildCount()); - } + public void testInflatesButtons() { + assertNull(mToolbar.getMenuButton()); + assertNotNull(mToolbar.ensureMenuButtonInflated()); + assertEquals(View.VISIBLE, mToolbar.getMenuButton().getVisibility()); - @Test - @EnableFeatures({ChromeFeatureList.CCT_TOOLBAR_REFACTOR}) - @Config(qualifiers = "w400dp") - public void testLayoutForWidth_400dp() { - View closeButton = mToolbar.findViewById(R.id.close_button); - View menuButton = mToolbar.findViewById(R.id.menu_button_wrapper); - View minimizeButton = mToolbar.findViewById(R.id.custom_tabs_minimize_button); - ViewGroup actionButtons = mToolbar.findViewById(R.id.action_buttons); - assertNotNull(closeButton); - assertNotNull(menuButton); - assertNotNull(minimizeButton); - assertEquals(1, actionButtons.getChildCount()); + assertNull(mToolbar.getCloseButton()); + assertNotNull(mToolbar.ensureCloseButtonInflated()); + assertEquals(View.VISIBLE, mToolbar.getCloseButton().getVisibility()); + + assertNull(mToolbar.getMinimizeButton()); + assertNotNull(mToolbar.ensureMinimizeButtonInflated()); + assertEquals(View.VISIBLE, mToolbar.getMinimizeButton().getVisibility()); + + assertNull(mToolbar.getSideSheetMaximizeButton()); + assertNotNull(mToolbar.ensureSideSheetMaximizeButtonInflated()); + assertEquals(View.VISIBLE, mToolbar.getSideSheetMaximizeButton().getVisibility()); + + var incognitoImageView = mToolbar.ensureIncognitoImageViewInflated(); + assertEquals(View.VISIBLE, incognitoImageView.getVisibility()); } private void assertUrlAndTitleVisible(boolean titleVisible, boolean urlVisible) {
diff --git a/chrome/app/certificate_manager.grdp b/chrome/app/certificate_manager.grdp index 65bff99f..23a87c654 100644 --- a/chrome/app/certificate_manager.grdp +++ b/chrome/app/certificate_manager.grdp
@@ -222,4 +222,76 @@ Copy certificate hash for <ph name="CERT_NAME">$1<ex>GTS Root R2</ex></ph> </message> </if> + + <if expr="is_chromeos"> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER" desc="Header that lists the certificate provisioning processes."> + Certificates are being provisioned for these certificate profiles + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH" desc="Text on the button to refresh the status of a certificate provisioning process."> + Refresh + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET" desc="Text on the button to reset a certificate provisioning process."> + Reset + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS" desc="Text on the button to show debug details about a certificate provisioning process and title of the dialog that shows the details."> + Details + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED" desc="Text on the button to show advanced entries on the certificate provisioning details dialog."> + Advanced + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR" desc="Status description of a certificate provisioning process when the client is preparing the Certificate signing request (CSR) "> + Preparing certificate signing request + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING" desc="Status description of a certificate provisioning process when the client is waiting for the server to aid in preparation of the Certificate signing request (CSR)"> + Preparing certificate signing request (waiting on server) + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA" desc="Status description of a certificate provisioning process when the client is waiting for a certificate to be issued"> + Waiting for the CA to issue a certificate + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS" desc="Status description of a certificate provisioning process that has succeeded"> + Success + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE" desc="Status description of a certificate provisioning process that has failed"> + Failure + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED" desc="Status description of a certificate provisioning process that has been canceled"> + Canceled + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION" desc="Status description of a certificate provisioning process that is waiting for the next operation"> + Waiting for the next operation + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Authorize instruction"> + <ph name="AUTHORIZE_INSTRUCTION_NAME">"Authorize"</ph> instruction received + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Sign Data instruction"> + <ph name="PROOF_OF_POSSESSION_INSTRUCTION_NAME">"Proof of Possession"</ph> instruction received + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Import Certificate instruction"> + <ph name="IMPORT_CERTIFICATE__INSTRUCTION_NAME">"Import Certificate"</ph> instruction received + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID" desc="Label of the field that displays the id of a certificate provisioning process"> + Process ID + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME" desc="Label of the field that displays the human-readable client certificate profile name of a certificate provisioning process"> + Certificate Profile Name + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID" desc="Label of the field that displays the internal ID of the client certificate profile of a certificate provisioning process"> + Certificate Profile ID + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS" desc="Label of the field that displays certificate provisioning status"> + Status + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID" desc="Label of the field that displays certificate provisioning status id, which is a number (e.g. 6)"> + Status Id + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE" desc="Label of the field that displays when a certificate provisioning process had the last update"> + Last Update + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS" desc="Label of the field that is displayed when a certificate provisioning process last update was unsuccessful"> + Last Unsuccessful Update + </message> + <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE" desc="Status description of a certificate provisioning process that has failed while contacting the DMServer"> + Connection to Device Management Server failed with status '<ph name="STATUS_TEXT">$1<ex>Temporary server error</ex></ph>' at <ph name="FAILURE_TIME">$2<ex>Mon, 14 Mar 2022 17:35:00 GMT</ex></ph> + </message> + </if> </grit-part>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA.png.sha1 b/chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA.png.sha1 rename to chrome/app/certificate_manager_grdp/IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA.png.sha1
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index aa807fb6..82f18d52 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -2168,9 +2168,15 @@ <message name="IDS_FRE_DEFAULT_BROWSER_TITLE" desc="Title for the page that prompts user to set Chromium as their default browser in the first run experience."> Set Chromium as your default browser </message> + <message name="IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE" desc="Title for the page that prompts user to set Chromium as their default browser and pin to taskbar in the first run experience."> + Use Chromium by default and get it pinned + </message> <message name="IDS_FRE_DEFAULT_BROWSER_SUBTITLE_NEW" desc="Subtitle for the page that prompts user to set Chromium as their default browser in the first run experience."> Use Chromium anytime you click links in messages, documents, and other apps </message> + <message name="IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE" desc="Subtitle for the page that prompts user to set Chromium as their default browser and pin to taskbar in the first run experience."> + Open links in Chromium from any app. Plus for easy access, it gets pinned to your taskbar. + </message> <message name="IDS_FRE_DEFAULT_BROWSER_ILLUSTRATION_ALT_TEXT" desc="Alt text for the illustration in the page that prompts user to set Chromium as their default browser."> Chromium logo inside a computer screen. </message>
diff --git a/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1 new file mode 100644 index 0000000..b15075a --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +64015d0334a60ec15ebc4bb6218edb80b93860fa \ No newline at end of file
diff --git a/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1 new file mode 100644 index 0000000..b15075a --- /dev/null +++ b/chrome/app/chromium_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1
@@ -0,0 +1 @@ +64015d0334a60ec15ebc4bb6218edb80b93860fa \ No newline at end of file
diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp index d0df64b9..7da108b9 100644 --- a/chrome/app/extensions_strings.grdp +++ b/chrome/app/extensions_strings.grdp
@@ -716,4 +716,28 @@ The only way to undo this is to re-install <ph name="IDS_SHORT_PRODUCT_OS_NAME">$1<ex>ChromeOS</ex></ph> </message> </if> +<if expr="enable_extensions"> + <!-- Extensions Zero State Promo IPH --> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_HEADER" desc="Header of the extensions zero state in-product help promo."> + Supercharge your browser with extensions and themes + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_CHIPS_IPH_DESCRIPTION" desc="An one line description for the extensions zero state in-product-help promo."> + Extensions are add-ons for Chrome that can help you do more + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_SHOPPING_CATEGORY_LABEL" desc="Label for the button that opens the Chrome Web Store shopping category page."> + Find coupons + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_WRITING_HELP_COLLECTION_LABEL" desc="Label for the button that opens the Chrome Web Store writing help collection page."> + Help me write + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LABEL" desc="Label for the button that opens the Chrome Web Store producitivty category page."> + Boost productivity + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LABEL" desc="Label for the button that opens the Chrome Web Store ai productivity collection page."> + Enhance with AI + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TITLE" desc="Title attribute for the button that dismisses the extensions zero state in-product-help promo."> + Close + </message> +</if> </grit-part>
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_CHIPS_IPH_DESCRIPTION.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_CHIPS_IPH_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..d69d32a --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_CHIPS_IPH_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +4818ce9e6fa13c519cad16e17c4d55a896aa4b44 \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LABEL.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LABEL.png.sha1 new file mode 100644 index 0000000..34a4bc72 --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LABEL.png.sha1
@@ -0,0 +1 @@ +62c3bceece6198451d57a27591a3fccf16f9b81f \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TITLE.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TITLE.png.sha1 new file mode 100644 index 0000000..80105c4 --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TITLE.png.sha1
@@ -0,0 +1 @@ +94d587287f7fc506b2fda71a65522e74867e299e \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_HEADER.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_HEADER.png.sha1 new file mode 100644 index 0000000..f04d844c --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_HEADER.png.sha1
@@ -0,0 +1 @@ +7516a5052a6d47d5d86835c5cdbb1f39d9419da4 \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LABEL.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LABEL.png.sha1 new file mode 100644 index 0000000..646cd83 --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LABEL.png.sha1
@@ -0,0 +1 @@ +0ef5ffdea04898b79f8649ccf890341e77c419ad \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_SHOPPING_CATEGORY_LABEL.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_SHOPPING_CATEGORY_LABEL.png.sha1 new file mode 100644 index 0000000..a86980bf --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_SHOPPING_CATEGORY_LABEL.png.sha1
@@ -0,0 +1 @@ +1f3341b7b80ed8db1b89aac113efb0aa23537a37 \ No newline at end of file
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WRITING_HELP_COLLECTION_LABEL.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WRITING_HELP_COLLECTION_LABEL.png.sha1 new file mode 100644 index 0000000..e4cce7cf --- /dev/null +++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WRITING_HELP_COLLECTION_LABEL.png.sha1
@@ -0,0 +1 @@ +5683049157253ab0e3552f79508f636272b54c3c \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 3fc773a..2c783b8 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10239,6 +10239,15 @@ =1 {To manage it, open Extensions} other {To manage them, open Extensions}} </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_PROMO_IPH_TITLE" desc="Title text shown on the promotional UI appearing when the user has no extensions installed."> + Enhance your browser with extensions + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_DESCRIPTION" desc="Body text shown on the promotional UI appearing when the user has no extensions installed."> + Extensions are add-ons to Chrome that can help you stay organized, simplify tasks, and customize your browsing + </message> + <message name="IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_ACCEPT" desc="Text on the custom action button that opens a new tab to the Chrome Web Store."> + Discover extensions + </message> <message name="IDS_GLOBAL_MEDIA_CONTROLS_PROMO" desc="Text shown on promotional UI appearing next to the global media controls toolbar button."> New! Control your music, videos, and more. </message>
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_ACCEPT.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_ACCEPT.png.sha1 new file mode 100644 index 0000000..67328d9d --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_ACCEPT.png.sha1
@@ -0,0 +1 @@ +80f158eecd8799a67e39d3fc91d5bd7fca46c6b4 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..4c1ee4fa --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +c073f3c03f140ac45cd37b0adb76d6f746ac668a \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_IPH_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_IPH_TITLE.png.sha1 new file mode 100644 index 0000000..cd27ce4 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_ZERO_STATE_PROMO_IPH_TITLE.png.sha1
@@ -0,0 +1 @@ +4489e7f60714d6a660f938a450604056699faa49 \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 5eab363..9fda1292 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -2193,9 +2193,15 @@ <message name="IDS_FRE_DEFAULT_BROWSER_TITLE" desc="Title for the page that prompts user to set Chrome as their default browser in the first run experience."> Set Chrome as your default browser </message> + <message name="IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE" desc="Title for the page that prompts user to set Chromium as their default browser and pin to taskbar in the first run experience."> + Use Chrome by default and get it pinned + </message> <message name="IDS_FRE_DEFAULT_BROWSER_SUBTITLE_NEW" desc="Subtitle for the page that prompts user to set Chrome as their default browser in the first run experience."> Use Chrome anytime you click links in messages, documents, and other apps </message> + <message name="IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE" desc="Subtitle for the page that prompts user to set Chrome as their default browser in the first run experience."> + Open links in Chrome from any app. Plus for easy access, it gets pinned to your taskbar. + </message> <message name="IDS_FRE_DEFAULT_BROWSER_ILLUSTRATION_ALT_TEXT" desc="Alt text for the illustration in the page that prompts user to set Chrome as their default browser."> Chrome logo inside a computer screen. </message>
diff --git a/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1 new file mode 100644 index 0000000..1081651 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +aceaf41eadd0fdb841395af496c0a72c6975acf4 \ No newline at end of file
diff --git a/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1 new file mode 100644 index 0000000..1081651 --- /dev/null +++ b/chrome/app/google_chrome_strings_grd/IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE.png.sha1
@@ -0,0 +1 @@ +aceaf41eadd0fdb841395af496c0a72c6975acf4 \ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index c64ff4c..6dfe27d5 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -728,260 +728,6 @@ </message> </if> - <if expr="use_nss_certs"> - <!-- Certificate Manager Page --> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES" desc="Label for the your certificates tab in certificate manager."> - Your certificates - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_EXPAND_ACCESSIBILITY_LABEL" desc="Label for the button that toggles showing the certificates that are installed for a particular organization. Only visible by screen reader software."> - Show certificates for organization - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES_DESCRIPTION" desc="Label for your certificates subtitle tab in certificate manager."> - You have certificates from these organizations that identify you - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS" desc="Label for the servers tab in certificate manager."> - Servers - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS_DESCRIPTION" desc="Label for servers subtitle tab in certificate manager."> - You have certificates on file that identify these servers - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_NO_CERTIFICATES" desc="Message displayed by the certificate manager, indicating that there are no certificates for a given certificate category."> - You have no certificates in this category - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES" desc="Label for the authorities tab in certificate manager."> - Authorities - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES_DESCRIPTION" desc="Label for authorities subtitle tab in certificate manager."> - You have certificates on file that identify these certificate authorities - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_VIEW" desc="Label for view button in certificate manager."> - View - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT" desc="Label for import button in certificate manager."> - Import - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_AND_BIND" desc="Label for import and bind button in certificate manager."> - Import and Bind - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_EXPORT" desc="Label for export button in certificate manager."> - Export - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS" desc="Label for the others tab in certificate manager."> - Others - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS_DESCRIPTION" desc="Label for others subtitle tab in certificate manager."> - You have certificates on file that do not fit in any of the other categories - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_USAGE_SSL_CLIENT" desc="The description of a certificate that is verified for use as an SSL client"> - SSL Client Certificate - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_UNTRUSTED" desc="This text is displayed next to untrusted certificates in a red box."> - Untrusted - </message> - - <!-- Certificate Manager Page, edit certificate authority trust dialog--> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE" desc="Title of the certificate manager edit trust dialog"> - Certificate authority - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION" desc="Line displayed in certificate manager edit trust dialog before the checkboxes for editing certificate trust flags"> - Trust settings - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION" desc="Description in dialog for editing Certification Authority trust flags"> - The certificate "<ph name="CERTIFICATE_NAME">$1<ex>Verisign Class 1 Public Primary Certification Authority</ex></ph>" represents a Certification Authority - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL" desc="Description in Certification Authority trust dialog for the SSL trust checkbox."> - Trust this certificate for identifying websites - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL" desc="Description in Certification Authority trust dialog for the Email trust checkbox."> - Trust this certificate for identifying email users - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN" desc="Description in Certification Authority trust dialog for the Code Signing trust checkbox."> - Trust this certificate for identifying software makers - </message> - - <!-- Certificate Manager Page, delete certificate confirmation dialog --> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_TITLE" desc="Title of a certificate manager dialog for confirming deletion of a user certificate"> - Delete "<ph name="CERTIFICATE_NAME">$1<ex>VeriSign Browser Certificate</ex></ph>"? - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_DESCRIPTION" desc="Description of impact of deleting a user certificate"> - If you delete one of your own certificates, you can no longer use it to identify yourself. - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_TITLE" desc="Title of a certificate manager dialog for confirming deletion of a server certificate"> - Delete server certificate "<ph name="CERTIFICATE_NAME">$1<ex>www.example.com</ex></ph>"? - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_DESCRIPTION" desc="Description of impact of deleting a user certificate"> - If you delete a server certificate, you restore the usual security checks for that server and require it uses a valid certificate. - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_TITLE" desc="Title of a certificate manager dialog for confirming deletion of a certification authority certificate"> - Delete CA certificate "<ph name="CERTIFICATE_NAME">$1<ex>Verisign Class 1 Public Primary Certification Authority</ex></ph>"? - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_DESCRIPTION" desc="Description of impact of deleting a user certificate"> - If you delete a Certification Authority (CA) certificate, your browser will no longer trust any certificates issued by that CA. - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_OTHER_TITLE" desc="Title of a certificate manager dialog for confirming deletion of a certificate of other type"> - Delete certificate "<ph name="CERTIFICATE_NAME">$1<ex>Example Certificate</ex></ph>"? - </message> - - <!-- Certificate Manager Page, encrypt/decrypt password dialogs --> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_TITLE" desc="Description of password prompt in certificate manager for exporting a personal certificate"> - Please enter a password to encrypt this certificate - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DECRYPT_PASSWORD_TITLE" desc="Description of password prompt in certificate manager for restoring a personal certificate"> - Enter your certificate password - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_DESCRIPTION" desc="Text in password prompt of certificate manager for exporting a personal certificate, reminding user that if they forget the password they're screwed."> - The password you choose will be required to restore this certificate later. Please record it in a safe location. - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PASSWORD" desc="The label of the password field in the certificate manager for restoring or exporting a personal certificate"> - Password - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CONFIRM_PASSWORD" desc="The label of the field in the certificate manager for re-entering the password when exporting a certificate"> - Confirm password - </message> - - <!-- Certificate Manager Page, error dialog --> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_BAD_PASSWORD" desc="The text in the error dialog for entering an incorrect password when importing an encrypted certificate file."> - Incorrect password - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CA_IMPORT_ERROR_TITLE" desc="The title in the error dialog for Certification Authority file import errors."> - Certification Authority Import Error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_CERT_PARSE_ERROR" desc="The message in the certificate manager error dialog for importing invalid certificate files."> - Unable to parse file - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CERT_ERROR_TITLE" desc="The title in the error dialog for certificate delete errors."> - Certificate Deletion Error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_CERT_ALREADY_EXISTS" desc="The error message when trying to import certificate which already exists."> - Certificate already exists - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_NOT_CA" desc="The error message when trying to import certificate authorities and a certificate is not a certification authority"> - Not a Certification Authority - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ALL_NOT_IMPORTED" desc="The header in certificate manager error dialog for list of certificates that could not be imported, when none were successfully imported."> - The file contained multiple certificates, none of which were imported: - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_TITLE" desc="The title in the error dialog for certificate file import errors."> - Certificate Import Error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_INVALID_FILE" desc="The message in the error dialog for corrupt certificate files."> - Invalid or corrupt file - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_INVALID_MAC" desc="The message in the error dialog for certificate files with invalid MAC."> - Incorrect password or corrupt file - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_MISSING_KEY" desc="The message in the error dialog for certificates without a local private key."> - The Private Key for this Client Certificate is missing or invalid - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_SINGLE_NOT_IMPORTED" desc="The header in certificate manager error dialog for single certificates that could not be imported."> - The file contained one certificate, which was not imported: - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_SOME_NOT_IMPORTED" desc="The header in certificate manager error dialog for list of certificates that could not be imported, even though others were."> - The file contained multiple certificates, some of which were not imported: - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_UNSUPPORTED" desc="The message in the error dialog for unsupported certificate files."> - File uses unsupported features - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PKCS12_EXPORT_ERROR_TITLE" desc="The title in the error dialog for PKCS #12 file export errors."> - PKCS #12 Export Error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PKCS12_FILES" desc="The label in the file selector dialog for PKCS #12 file type."> - PKCS #12 Files - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_READ_ERROR_FORMAT" desc="The text in the error dialog for certificate file read errors."> - There was an error while trying to read the file: <ph name="ERROR_TEXT">$1<ex>File not found.</ex></ph>. - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_FORMAT" desc="The format of per-certificate error messages in import failure dialog"> - <ph name="CERTIFICATE_NAME">$1<ex>www.example.com</ex></ph>: <ph name="ERROR">$2<ex>Not a Certification Authority</ex></ph> - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_SERVER_IMPORT_ERROR_TITLE" desc="The title in the error dialog for Certification Authority file import errors."> - Server Certificate Import Error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_SET_TRUST_ERROR_TITLE" desc="The title in the error dialog for certificate trust editing errors."> - Error Setting Certificate Trust - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_NOT_ALLOWED" desc="The text in the error dialog for policy restriction errors."> - Action is disabled by your administrator - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR" desc="The text in the error dialog when an unknown error occurs during an operation on the certificate database."> - Unknown error - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_WRITE_ERROR_FORMAT" desc="The text in the error dialog for PKCS #12 file write errors."> - There was an error while trying to write the file: <ph name="ERROR_TEXT">$1<ex>Permission denied.</ex></ph>. - </message> - <if expr="is_chromeos"> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER" desc="Header that lists the certificate provisioning processes."> - Certificates are being provisioned for these certificate profiles - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH" desc="Text on the button to refresh the status of a certificate provisioning process."> - Refresh - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET" desc="Text on the button to reset a certificate provisioning process."> - Reset - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS" desc="Text on the button to show debug details about a certificate provisioning process and title of the dialog that shows the details."> - Details - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED" desc="Text on the button to show advanced entries on the certificate provisioning details dialog."> - Advanced - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR" desc="Status description of a certificate provisioning process when the client is preparing the Certificate signing request (CSR) "> - Preparing certificate signing request - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PREPARING_CSR_WAITING" desc="Status description of a certificate provisioning process when the client is waiting for the server to aid in preparation of the Certificate signing request (CSR)"> - Preparing certificate signing request (waiting on server) - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_WAITING_FOR_CA" desc="Status description of a certificate provisioning process when the client is waiting for a certificate to be issued"> - Waiting for the CA to issue a certificate - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_SUCCESS" desc="Status description of a certificate provisioning process that has succeeded"> - Success - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_FAILURE" desc="Status description of a certificate provisioning process that has failed"> - Failure - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_CANCELED" desc="Status description of a certificate provisioning process that has been canceled"> - Canceled - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_READY_FOR_NEXT_OPERATION" desc="Status description of a certificate provisioning process that is waiting for the next operation"> - Waiting for the next operation - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_AUTHORIZE_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Authorize instruction"> - <ph name="AUTHORIZE_INSTRUCTION_NAME">"Authorize"</ph> instruction received - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_PROOF_OF_POSSESSION_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Sign Data instruction"> - <ph name="PROOF_OF_POSSESSION_INSTRUCTION_NAME">"Proof of Possession"</ph> instruction received - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_IMPORT_CERTIFICATE_INSTRUCTION_RECEIVED" desc="Status description of a certificate provisioning process that has received a Import Certificate instruction"> - <ph name="IMPORT_CERTIFICATE__INSTRUCTION_NAME">"Import Certificate"</ph> instruction received - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID" desc="Label of the field that displays the id of a certificate provisioning process"> - Process ID - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME" desc="Label of the field that displays the human-readable client certificate profile name of a certificate provisioning process"> - Certificate Profile Name - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID" desc="Label of the field that displays the internal ID of the client certificate profile of a certificate provisioning process"> - Certificate Profile ID - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS" desc="Label of the field that displays certificate provisioning status"> - Status - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID" desc="Label of the field that displays certificate provisioning status id, which is a number (e.g. 6)"> - Status Id - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE" desc="Label of the field that displays when a certificate provisioning process had the last update"> - Last Update - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS" desc="Label of the field that is displayed when a certificate provisioning process last update was unsuccessful"> - Last Unsuccessful Update - </message> - <message name="IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DMSERVER_ERROR_MESSAGE" desc="Status description of a certificate provisioning process that has failed while contacting the DMServer"> - Connection to Device Management Server failed with status '<ph name="STATUS_TEXT">$1<ex>Temporary server error</ex></ph>' at <ph name="FAILURE_TIME">$2<ex>Mon, 14 Mar 2022 17:35:00 GMT</ex></ph> - </message> - </if> - </if> - <!-- Delete Browsing Data --> <message name="IDS_SETTINGS_CLEAR_PERIOD_TITLE" desc="Label of the dropdown that selects the time range for which browsing data will be deleted."> Time range
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 62d8b77..f6710eb 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2608,6 +2608,7 @@ deps += [ "//chrome/browser/win/installer_downloader:controller", "//chrome/browser/win/installer_downloader:infobar", + "//chrome/browser/win/installer_downloader:infobar_impl", ] } @@ -7708,6 +7709,7 @@ "//chrome/browser/controlled_frame", "//chrome/browser/extensions", "//chrome/browser/ui/tabs:tab_strip_model_observer", + "//chrome/browser/ui/webui/extensions_zero_state_promo:mojo_bindings", "//ui/base/mojom:ui_base_types", ] @@ -8289,8 +8291,6 @@ if (use_nss_certs) { sources += [ - "certificate_manager_model.cc", - "certificate_manager_model.h", "net/nss_service.cc", "net/nss_service.h", "net/nss_service_factory.cc", @@ -8746,8 +8746,10 @@ ] } if (is_win || is_mac || is_linux || is_chromeos) { - public_deps += - [ "//chrome/browser/ui/webui/connectors_internals:mojo_bindings" ] + public_deps += [ + "//chrome/browser/ui/webui/connectors_internals:mojo_bindings", + "//ui/webui/resources/cr_components/help_bubble:mojo_bindings", + ] } if (safe_browsing_mode == 1) { public_deps += [ "//chrome/browser/ui/webui/reset_password:mojo_bindings" ]
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index b6111b43..30946bfa 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -668,10 +668,4 @@ "shared_storage_browsertest.cc": [ "+components/services/storage/shared_storage/shared_storage_manager.h", ], - "certificate_manager_model.cc": [ - "+chromeos/ash/components/kcer", - ], - "certificate_manager_model_unittest.cc": [ - "+chromeos/ash/components/kcer/extra_instances.h", - ], }
diff --git a/chrome/browser/OWNERS b/chrome/browser/OWNERS index d0d86445..bc623e74 100644 --- a/chrome/browser/OWNERS +++ b/chrome/browser/OWNERS
@@ -29,8 +29,6 @@ per-file browser_navigator_browsertest.*=file://content/OWNERS -per-file certificate_manager_model*=mattm@chromium.org - per-file chrome_content_browser_client.cc=* per-file chrome_content_browser_client.h=* per-file chrome_content_browser_client_browsertest.cc=*
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 7391339..745c2f5f 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -12526,6 +12526,15 @@ FEATURE_VALUE_TYPE(omnibox::kEnableSiteSearchAllowUserOverridePolicy)}, #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || // BUILDFLAG(IS_CHROME_OS) + // TODO(crbug.com/40680264): Remove this flag after regression investigation + // is finished. + { + "new-content-for-checkerboarded-scrolls", + flag_descriptions::kNewContentForCheckerboardedScrollsName, + flag_descriptions::kNewContentForCheckerboardedScrollsDescription, + kOsAll, + FEATURE_VALUE_TYPE(features::kNewContentForCheckerboardedScrolls), + }, {"autofill-enable-multiple-request-in-virtual-card-downstream-enrollment", flag_descriptions::
diff --git a/chrome/browser/apps/app_service/publishers/chrome_app_deprecation.cc b/chrome/browser/apps/app_service/publishers/chrome_app_deprecation.cc index aa70cf75..d536126 100644 --- a/chrome/browser/apps/app_service/publishers/chrome_app_deprecation.cc +++ b/chrome/browser/apps/app_service/publishers/chrome_app_deprecation.cc
@@ -60,104 +60,104 @@ "geopjmggmojbcnjlkcnfbgdniomaioif", "gfajignjkjbleogeegcgjimnkooihmdm", "ggaabodlngcnbdcpkfacegoacchkalmn", "ggddmkhlbkollcjopbnkbbhnikncfena", "gjenjmcioeobmpllaeopaoibabhgcohi", "glcdffonolecglhbodpaeijkhgdfkbon", - "gnddkmpjjjcimefninepfmmddpgaaado", "gnogkjfeajjnafijfmffnkgenhnkdnfp", - "gpgnoonhefbmngkiafpedbligiiekfcp", "haiffjcadagjlijoggckpgfnoeiflnem", - "hanegekdenjamflmdgcbjlobfkijeblp", "hclmbafbgpncekjmadbbcpekilflmkfg", - "hgdemhjioannjiccnfgmllghllhpncpm", "hginjgofkfbdfpkjcchdklbkkdbigpna", - "hhcgnlnhaapiekdelngjichnccjfkbnc", "hkmlofdlheebfpgfcmgbdjddnoniccno", - "hmpdelcfcndndcoldocpdmakeabbihgb", "hnlanngibjpmdolooednhkedmfbdbmhc", - "hpdnjcbgolagabfgcgjpicbknmgefakl", "hplnogolijklhfbbfogccgickedplpeo", - "iedihkacboebiliakaicmedjmajmjiep", "ighapdcohmkppihdjdejlbkolhbgnlfm", - "ihlmfpkjommgamcgofmdmojpeolimlfe", "iiaffmacblgjekhogmghdjfflchkjmmg", - "iilndnicahkogiklibnnibmmeikacnfo", "iinmojhiolplpndeijdkfoghkokbfadb", - "iiopclfeneoimifgocjnhcjpjgaojhho", "ijdoledcajbpfbkiafmmimjhmkmdppjo", - "ikgemedabaijdochaempgdpfebllgfcc", "iknkgipmikbpldmppngljbedofgmanfm", - "inaonhfifmcnldmdnlbnfpikjndebkbj", "jfhndkehlkceadabhedbcclclbclhnbh", - "jgafcpolgeedpieaadaeeaoanackiina", "jglaiblkoeelgfdabnhpcpdnodjonclf", - "jjkgijommndbjlekbalbbiiidnigcgfl", "jjlhmikmcgmheddmlfeckndcedkmcpng", - "jjnejapcbafplbdkbombhmmjnafplkon", "jjoncgfekjbknjfejfonaochdpdedbka", - "jnnkgopblccifpnkfpfkmdafjebjlhcc", "jnojnnofimbdpeihiddafgagckdlnlpe", - "jpmngkkdajjfkdknhbifjbglkckbklee", "kahkblckpdgogkogmfhfnldpjhdpfiia", - "kdbdkbbfhghbggpjmpapmobihghkdmkh", "kdndmepchimlohdcdkokdddpbnniijoa", - "kenkpdjcfppbccchillfdjkjnejjgand", "kflikliicodcopdhibchdfaninnhbalf", - "kfllildicglifipmhpnlmpfbkdponghk", "khpfeaanjngmcnplbdlpegiifgpfgdco", - "khplkoflcklpnlofodhlnjeiodbmejoe", "kjceddihhogmglodncbmpembbclhnpda", - "kljahdaehfmgddhnibkikcjfppjcjjcn", "kmfbmibhlikajdfjbddlolmdkkbiephg", - "lbfgjakkeeccemhonnolnmglmfmccaag", "lemoeliioheohdcoogohonkamhloahbb", - "likeoemlchnioaoaklldmcnilhhpjamo", "lknebpkncfibkhjkimejlgppnjgemobn", - "lmhpnmjggoibofacnookchiemlihmjdd", "lnnghenlbgaeloipgjlafjhlccipbpnm", - "maegcedffmoidlccpjahiglkaacbncnn", "mclaaifjbcglkbdhdkaamamplpjoabih", - "mdmkkicfmmkgmpkmkdikhlbggogpicma", "medpmkohocjidlghgmnnkpfigfpddaok", - "mhbelemjphdecdagmmengimkkiefmcej", "mhfhafklkbgalhbdihiccegaldefdigp", - "mhjpnpdhahbahbjedoihlganncneknfo", "millmignkmpaolllendlllaibmeehohd", - "mkjgggeeejocddadcegdhcchhmemokcn", "mndakpenoffnhdmpcpnajekhpbonggeo", - "mpjaajdhcmmkeikfdgffdpdjncdnmhmk", "ncjnakhgkcldedboafigaailhldnellf", - "ndlolfeihajiaklmehdnajjoblphkppd", "nenolmmehjhaggnamcglapjjdofcojao", - "nghoaommfphpdlipedlebgcnmphedhdb", "ngiaihbicdcdflfkhilnaaeobnchggkk", - "nhebofpemjfflnkmaneaopjickpliokk", "njofdhegeeccijokfiijflbfajgjclch", - "oanbapfpojpdpjppgcmdhcjehacnccbm", "ocnncjgbkiomppnchhbmmcpblifejpco", - "odcalbcbcmnepllckjhdndgmolpnddjo", "oefoedhdllfdpfpjhhccdiglflemnfdb", - "oflckobdemeldmjddmlbaiaookhhcngo", "ofmlpkdeaopippomdfamngkpnbagkdem", - "ogmfbebknnapidhhefcdgmoafjeblnjo", "okaiidkcbkpimeiebofglgpobdafmmeb", - "ondpjadajoodngapikdebdcnjcjkeecc", "opalidednimmhdfbcpdmoihhpkahgkak", - "pdgbdkbnajhamggjjlhlapedeolflpgm", "pdpgalakpabfiiadeiimoolhemoleaeg", - "pgolnnkmmlpbnhfcfbephcnkooejbcep", "pifpopligmljinioeacaccciabhbbpjo", - "plhmjahmpikllpphfaoopdhnkbpffccm", "pnclfbefcgmenbbbpljbhbdacgkgkjlh", - "ppkfnjlimknmjoaemnpidmdlfchhehel"}); + "gnddkmpjjjcimefninepfmmddpgaaado", "gngadipbljmmcgcjjflidckpbgebnhod", + "gnogkjfeajjnafijfmffnkgenhnkdnfp", "gpgnoonhefbmngkiafpedbligiiekfcp", + "haiffjcadagjlijoggckpgfnoeiflnem", "hanegekdenjamflmdgcbjlobfkijeblp", + "hclmbafbgpncekjmadbbcpekilflmkfg", "hgdemhjioannjiccnfgmllghllhpncpm", + "hginjgofkfbdfpkjcchdklbkkdbigpna", "hhcgnlnhaapiekdelngjichnccjfkbnc", + "hkmlofdlheebfpgfcmgbdjddnoniccno", "hmpdelcfcndndcoldocpdmakeabbihgb", + "hnlanngibjpmdolooednhkedmfbdbmhc", "hpdnjcbgolagabfgcgjpicbknmgefakl", + "hplnogolijklhfbbfogccgickedplpeo", "iedihkacboebiliakaicmedjmajmjiep", + "ighapdcohmkppihdjdejlbkolhbgnlfm", "ihlmfpkjommgamcgofmdmojpeolimlfe", + "iiaffmacblgjekhogmghdjfflchkjmmg", "iilndnicahkogiklibnnibmmeikacnfo", + "iinmojhiolplpndeijdkfoghkokbfadb", "iiopclfeneoimifgocjnhcjpjgaojhho", + "ijdoledcajbpfbkiafmmimjhmkmdppjo", "ikgemedabaijdochaempgdpfebllgfcc", + "iknkgipmikbpldmppngljbedofgmanfm", "inaonhfifmcnldmdnlbnfpikjndebkbj", + "jfhndkehlkceadabhedbcclclbclhnbh", "jgafcpolgeedpieaadaeeaoanackiina", + "jglaiblkoeelgfdabnhpcpdnodjonclf", "jjkgijommndbjlekbalbbiiidnigcgfl", + "jjlhmikmcgmheddmlfeckndcedkmcpng", "jjnejapcbafplbdkbombhmmjnafplkon", + "jjoncgfekjbknjfejfonaochdpdedbka", "jnnkgopblccifpnkfpfkmdafjebjlhcc", + "jnojnnofimbdpeihiddafgagckdlnlpe", "jpmngkkdajjfkdknhbifjbglkckbklee", + "kahkblckpdgogkogmfhfnldpjhdpfiia", "kdbdkbbfhghbggpjmpapmobihghkdmkh", + "kdndmepchimlohdcdkokdddpbnniijoa", "kenkpdjcfppbccchillfdjkjnejjgand", + "kflikliicodcopdhibchdfaninnhbalf", "kfllildicglifipmhpnlmpfbkdponghk", + "khpfeaanjngmcnplbdlpegiifgpfgdco", "khplkoflcklpnlofodhlnjeiodbmejoe", + "kjceddihhogmglodncbmpembbclhnpda", "kljahdaehfmgddhnibkikcjfppjcjjcn", + "kmfbmibhlikajdfjbddlolmdkkbiephg", "lbfgjakkeeccemhonnolnmglmfmccaag", + "lemoeliioheohdcoogohonkamhloahbb", "likeoemlchnioaoaklldmcnilhhpjamo", + "lknebpkncfibkhjkimejlgppnjgemobn", "lmhpnmjggoibofacnookchiemlihmjdd", + "lnnghenlbgaeloipgjlafjhlccipbpnm", "maegcedffmoidlccpjahiglkaacbncnn", + "mclaaifjbcglkbdhdkaamamplpjoabih", "mdmkkicfmmkgmpkmkdikhlbggogpicma", + "medpmkohocjidlghgmnnkpfigfpddaok", "mhbelemjphdecdagmmengimkkiefmcej", + "mhfhafklkbgalhbdihiccegaldefdigp", "mhjpnpdhahbahbjedoihlganncneknfo", + "millmignkmpaolllendlllaibmeehohd", "mkjgggeeejocddadcegdhcchhmemokcn", + "mndakpenoffnhdmpcpnajekhpbonggeo", "mpjaajdhcmmkeikfdgffdpdjncdnmhmk", + "ncjnakhgkcldedboafigaailhldnellf", "ndlolfeihajiaklmehdnajjoblphkppd", + "nenolmmehjhaggnamcglapjjdofcojao", "nghoaommfphpdlipedlebgcnmphedhdb", + "ngiaihbicdcdflfkhilnaaeobnchggkk", "nhebofpemjfflnkmaneaopjickpliokk", + "njofdhegeeccijokfiijflbfajgjclch", "oanbapfpojpdpjppgcmdhcjehacnccbm", + "ocnncjgbkiomppnchhbmmcpblifejpco", "odcalbcbcmnepllckjhdndgmolpnddjo", + "oefoedhdllfdpfpjhhccdiglflemnfdb", "oflckobdemeldmjddmlbaiaookhhcngo", + "ofmlpkdeaopippomdfamngkpnbagkdem", "ogmfbebknnapidhhefcdgmoafjeblnjo", + "okaiidkcbkpimeiebofglgpobdafmmeb", "ondpjadajoodngapikdebdcnjcjkeecc", + "opalidednimmhdfbcpdmoihhpkahgkak", "pdgbdkbnajhamggjjlhlapedeolflpgm", + "pdpgalakpabfiiadeiimoolhemoleaeg", "pgolnnkmmlpbnhfcfbephcnkooejbcep", + "pifpopligmljinioeacaccciabhbbpjo", "plhmjahmpikllpphfaoopdhnkbpffccm", + "pnclfbefcgmenbbbpljbhbdacgkgkjlh", "ppkfnjlimknmjoaemnpidmdlfchhehel"}); constexpr auto kUserInstalledAllowlist = base::flat_set<std::string_view>(); -constexpr auto kKioskSessionAllowlist = - base::MakeFixedFlatSet<std::string_view>( - {"adbijfidmjidmkkpiglnfkflcoblkfmn", "adpfhflbokfdhnfakijgjkpkjegncbpl", - "agkggapglfgffelalcfgbjmhkaljnbmn", "alhlkpgheiefedomljbenmkpconkffhk", - "amdpebpoiccejfcnocgebkidfmkcdfei", "aoebmljacknghkklaholjkflllbghhnj", - "bgldcjbajnkfkephalfogfgklkgjnjeo", "bhcnmihmgdljpnnoobnbdmdjhmfgcpio", - "bloholppicibpgbagaebcaagiikicjbn", "cafpcfibibiomlehdnmabchhekeifbgb", - "cdomppfkcljjopjijjdchhjfioljaeph", "cgihdamofndnjjlglmcaabdafhmoconf", - "ckmkndfplnldgohnnkhmeokbmedpdbjl", "clbgknjcblogheibmcbbdlpkollmgofh", - "cmhiajbopgbagidplpiaclnpglmhbhka", "cpbpbhkfonocjjamhjeabdihibkoajlc", - "dakemaookmhkdfgcgebakflmhgdhille", "dakmgckkclepfbfeldlgenikiobflcne", - "ddhhodggehedggajomidnmgchfnbeold", "dfjigmapgofdlgieniibjdcddlaafick", - "dinalfjmfmjkdnkgbbjncgchmghijpgl", "ealpglkmnpenllgjjgdojoemohidefdm", - "edhlcbaemfhpoblalbdgeegmaddjdcae", "edpaojhfdnnebhmmhdlpnpomoaopfjod", - "efdahhfldoeikfglgolhibmdidbnpneo", "emlbcjpcbepfnhpkiidenlnfdjbghmpg", - "fammfnbkkollpklfkachppebochgakjg", "fcichhfeoaikaoldkncmggipmpcbgffg", - "fdlpibjfnlhnmeckjjhfiejfdghkmkdm", "gbecpjnejcnafnkgfciepngjcndodann", - "gbgncgdjjnelalecmmkimnlgfpmbihog", "gcefeoeohcoeoofmehgjfipjiepodlhg", - "gdehbmmmjkddbonbmknngoigkleicpec", "genfdmkliekafjhadcpnhefgicceohhd", - "gmdgbdlpbnhiogedlhmdiceocbgcbpgi", "gobhocmdcdpfebockbogdfhnebgmemnf", - "hadonmdpeimgfpmmmeldbmjiknnbfdhk", "hbcogfhdhehbfnedbbboiiddpkkjjnio", - "hbfbekdejbpmnpilhdnfokjehnianfeb", "hblfbmjdaalalhifaajnnodlkiloengc", - "hchdcamjekgapahefjapegmaapggeafe", "hebfpdlglfmneladiogocbflmbjneeoh", - "hgkaljnpgngpcgnaonmbdgaolefknaaj", "hhbmmipodfklmbmiaegcbmbfmmfbngnf", - "hjbkdjhfdcinjcljfbealemkioalnfao", "ibboejlnnenbhpjfpgoglholgpdjjeff", - "icfpencnfmadodjpbbdipkkkljmamine", "iflkfmkmpafjfdkkokpkjpjmiogkdjjl", - "igknghlgndjihblholjbbhjbcfilkilb", "ilehifjdadbblbcnciiggmcbmobkikcb", - "jamdkebjilnlfjndffcnekbipcfkhmem", "jcgamccimilnfjpbkbadommjcaplmfod", - "jefdfinffojbalcgpkigjjijghmllgil", "jiecdjmgkgmgmbonhifblhfaaecnomcj", - "jifdnnnegbhoagepoobbmajnpkmcbjig", "jjlmjgfhdijljijikefhmgmhbchnkmnm", - "jmiabaaccndlngedakcjbpbgokhgcpfd", "jnlegeoomaehdodfmpmlflpjapebjjjl", - "jnlhnplbndpohngdfjhmdinlpofclhdp", "kacodfanpfkedlelnagnbgfbaabjfddn", - "kbkcdgjhbdlplagmlcpafgamnapneoba", "kcdfcljkllboedjeoaicmmabopnnaoaa", - "kdffphekpginklcnoefcelkjclbjnbmi", "kedeaijhpgoggdafoabafeldkoolemig", - "kgoklcfigmpofpbkdglgbhfgpjdjgppl", "kjbdapadhmcgplddmcggjkhacdnpjmod", - "kpjcmnnhdgonbhjnfhebgapnkicknmpp", "lfemdemifjedlccfbhpocnicmjlcgmce", - "lgpjgoglfmjggeggfelogaboagbcaklg", "lmdoekjmofbfghllkonahbfdcckmgjlf", - "lnokaenamkoojjbhehhpggplknlbejmi", "mbkamiddebohpehiafofidepfffpffln", - "mfejnceblfpkdodajfohmjimcbipnhhh", "mfgkakkfpnhfmnipnbehiglkjijancnk", - "mhboapffkffmmcggindghkakhdhmjcje", "mhdohnfjdghnpjmhnlodibcnjlaeinap", - "mkgbgfehlfaioaejpaedngdohcpdpbpd", "nanoidlkencgghkphophigbmnohnbbcb", - "nclhjadnjgfjocbnfmlcfnagnieialof", "nddaogoljagaikdogplnajkdggkfmgei", - "ngpbnegpinocjhpnppjeppllflpgafkk", "nhlaojpmboioihghmmdbhgcbjgmcicdk", - "nickmpjdfebcopckkfjmflblnmijbiom", "nloplhgjobaomjdppnbcdjfgbefifbdo", - "obgbgecgadcagmhnanalmklenjajimld", "oblnbnkmblikfegpcngkcbppphcenhjj", - "ocljbfllcpgnlnnaommbmaphaagjmkmj", "odjaaghiehpobimgdjjfofmablbaleem", - "ofaokfiblaffkgcapcilcehdhlidehcd", "olaaocfpicpjiocmoklnbfpdlbglbadp", - "omkghcboodpimaoimdkmigofhjcpmpeb", "omlplbdgdcpaaknjnkodikcklbkhefoh", - "oopdabjckchhklpldcdjllmedcdnbdio", "pjdhfcpflabeafmgdpgdfdejbhkdcgja", - "pjicdfmcmiihceiefbmioikgkcicochj", "plebdlehcdhfkmidnmfpolcifjngmdck", - "pmcgpdpmlgkeociebbpdbppimbeheoli"}); +constexpr auto kKioskSessionAllowlist = base::MakeFixedFlatSet< + std::string_view>( + {"adbijfidmjidmkkpiglnfkflcoblkfmn", "adpfhflbokfdhnfakijgjkpkjegncbpl", + "agkggapglfgffelalcfgbjmhkaljnbmn", "alaoimaeafbgfglpffgcidfgbjnekifp", + "alhlkpgheiefedomljbenmkpconkffhk", "amdpebpoiccejfcnocgebkidfmkcdfei", + "aoebmljacknghkklaholjkflllbghhnj", "bgldcjbajnkfkephalfogfgklkgjnjeo", + "bhcnmihmgdljpnnoobnbdmdjhmfgcpio", "bloholppicibpgbagaebcaagiikicjbn", + "cafpcfibibiomlehdnmabchhekeifbgb", "cdomppfkcljjopjijjdchhjfioljaeph", + "cgihdamofndnjjlglmcaabdafhmoconf", "ckmkndfplnldgohnnkhmeokbmedpdbjl", + "clbgknjcblogheibmcbbdlpkollmgofh", "cmhiajbopgbagidplpiaclnpglmhbhka", + "cpbpbhkfonocjjamhjeabdihibkoajlc", "dakemaookmhkdfgcgebakflmhgdhille", + "dakmgckkclepfbfeldlgenikiobflcne", "ddhhodggehedggajomidnmgchfnbeold", + "dfjigmapgofdlgieniibjdcddlaafick", "dinalfjmfmjkdnkgbbjncgchmghijpgl", + "ealpglkmnpenllgjjgdojoemohidefdm", "edhlcbaemfhpoblalbdgeegmaddjdcae", + "edpaojhfdnnebhmmhdlpnpomoaopfjod", "efdahhfldoeikfglgolhibmdidbnpneo", + "emlbcjpcbepfnhpkiidenlnfdjbghmpg", "fammfnbkkollpklfkachppebochgakjg", + "fcichhfeoaikaoldkncmggipmpcbgffg", "fdlpibjfnlhnmeckjjhfiejfdghkmkdm", + "gbecpjnejcnafnkgfciepngjcndodann", "gbgncgdjjnelalecmmkimnlgfpmbihog", + "gcefeoeohcoeoofmehgjfipjiepodlhg", "gdehbmmmjkddbonbmknngoigkleicpec", + "genfdmkliekafjhadcpnhefgicceohhd", "gmdgbdlpbnhiogedlhmdiceocbgcbpgi", + "gobhocmdcdpfebockbogdfhnebgmemnf", "hadonmdpeimgfpmmmeldbmjiknnbfdhk", + "hbcogfhdhehbfnedbbboiiddpkkjjnio", "hbfbekdejbpmnpilhdnfokjehnianfeb", + "hblfbmjdaalalhifaajnnodlkiloengc", "hchdcamjekgapahefjapegmaapggeafe", + "hebfpdlglfmneladiogocbflmbjneeoh", "hgkaljnpgngpcgnaonmbdgaolefknaaj", + "hhbmmipodfklmbmiaegcbmbfmmfbngnf", "hjbkdjhfdcinjcljfbealemkioalnfao", + "ibboejlnnenbhpjfpgoglholgpdjjeff", "icfpencnfmadodjpbbdipkkkljmamine", + "iflkfmkmpafjfdkkokpkjpjmiogkdjjl", "igknghlgndjihblholjbbhjbcfilkilb", + "ilehifjdadbblbcnciiggmcbmobkikcb", "jamdkebjilnlfjndffcnekbipcfkhmem", + "jcgamccimilnfjpbkbadommjcaplmfod", "jefdfinffojbalcgpkigjjijghmllgil", + "jiecdjmgkgmgmbonhifblhfaaecnomcj", "jifdnnnegbhoagepoobbmajnpkmcbjig", + "jjlmjgfhdijljijikefhmgmhbchnkmnm", "jmiabaaccndlngedakcjbpbgokhgcpfd", + "jnlegeoomaehdodfmpmlflpjapebjjjl", "jnlhnplbndpohngdfjhmdinlpofclhdp", + "kacodfanpfkedlelnagnbgfbaabjfddn", "kbkcdgjhbdlplagmlcpafgamnapneoba", + "kcdfcljkllboedjeoaicmmabopnnaoaa", "kdffphekpginklcnoefcelkjclbjnbmi", + "kedeaijhpgoggdafoabafeldkoolemig", "kgoklcfigmpofpbkdglgbhfgpjdjgppl", + "kjbdapadhmcgplddmcggjkhacdnpjmod", "kpjcmnnhdgonbhjnfhebgapnkicknmpp", + "lfemdemifjedlccfbhpocnicmjlcgmce", "lgpjgoglfmjggeggfelogaboagbcaklg", + "lmdoekjmofbfghllkonahbfdcckmgjlf", "lnokaenamkoojjbhehhpggplknlbejmi", + "mbkamiddebohpehiafofidepfffpffln", "mfejnceblfpkdodajfohmjimcbipnhhh", + "mfgkakkfpnhfmnipnbehiglkjijancnk", "mhboapffkffmmcggindghkakhdhmjcje", + "mhdohnfjdghnpjmhnlodibcnjlaeinap", "mkgbgfehlfaioaejpaedngdohcpdpbpd", + "nanoidlkencgghkphophigbmnohnbbcb", "nclhjadnjgfjocbnfmlcfnagnieialof", + "nddaogoljagaikdogplnajkdggkfmgei", "ngpbnegpinocjhpnppjeppllflpgafkk", + "nhlaojpmboioihghmmdbhgcbjgmcicdk", "nickmpjdfebcopckkfjmflblnmijbiom", + "nloplhgjobaomjdppnbcdjfgbefifbdo", "obgbgecgadcagmhnanalmklenjajimld", + "oblnbnkmblikfegpcngkcbppphcenhjj", "ocljbfllcpgnlnnaommbmaphaagjmkmj", + "odjaaghiehpobimgdjjfofmablbaleem", "ofaokfiblaffkgcapcilcehdhlidehcd", + "olaaocfpicpjiocmoklnbfpdlbglbadp", "omkghcboodpimaoimdkmigofhjcpmpeb", + "omlplbdgdcpaaknjnkodikcklbkhefoh", "oopdabjckchhklpldcdjllmedcdnbdio", + "pjdhfcpflabeafmgdpgdfdejbhkdcgja", "pjicdfmcmiihceiefbmioikgkcicochj", + "plebdlehcdhfkmidnmfpolcifjngmdck", "pmcgpdpmlgkeociebbpdbppimbeheoli"}); // Add only allowlisted test app ids. constexpr auto kTestAllowlist = {
diff --git a/chrome/browser/apps/platform_apps/api/BUILD.gn b/chrome/browser/apps/platform_apps/api/BUILD.gn index 56b96ec3..5cb74a1 100644 --- a/chrome/browser/apps/platform_apps/api/BUILD.gn +++ b/chrome/browser/apps/platform_apps/api/BUILD.gn
@@ -28,8 +28,6 @@ "browser/browser_api.h", "browser_context_keyed_service_factories.cc", "browser_context_keyed_service_factories.h", - "deprecation_features.cc", - "deprecation_features.h", "media_galleries/blob_data_source_factory.cc", "media_galleries/blob_data_source_factory.h", "media_galleries/media_galleries_api.cc",
diff --git a/chrome/browser/apps/platform_apps/api/deprecation_features.cc b/chrome/browser/apps/platform_apps/api/deprecation_features.cc deleted file mode 100644 index 3c3819fd..0000000 --- a/chrome/browser/apps/platform_apps/api/deprecation_features.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/apps/platform_apps/api/deprecation_features.h" - -namespace chrome_apps::features { - -// Deprecates the Media Galleries Chrome App APIs. -BASE_FEATURE(kDeprecateMediaGalleriesApis, - "DeprecateMediaGalleriesApis", - base::FEATURE_DISABLED_BY_DEFAULT); - -} // namespace chrome_apps::features
diff --git a/chrome/browser/apps/platform_apps/api/deprecation_features.h b/chrome/browser/apps/platform_apps/api/deprecation_features.h deleted file mode 100644 index 0bf69230..0000000 --- a/chrome/browser/apps/platform_apps/api/deprecation_features.h +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_APPS_PLATFORM_APPS_API_DEPRECATION_FEATURES_H_ -#define CHROME_BROWSER_APPS_PLATFORM_APPS_API_DEPRECATION_FEATURES_H_ - -#include "base/feature_list.h" - -namespace chrome_apps::features { - -BASE_DECLARE_FEATURE(kDeprecateMediaGalleriesApis); - -} // namespace chrome_apps::features - -#endif // CHROME_BROWSER_APPS_PLATFORM_APPS_API_DEPRECATION_FEATURES_H_
diff --git a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc index 8d8c0734..add7a93 100644 --- a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc +++ b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
@@ -24,7 +24,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "chrome/browser/apps/platform_apps/api/deprecation_features.h" #include "chrome/browser/apps/platform_apps/api/media_galleries/blob_data_source_factory.h" #include "chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api_util.h" #include "chrome/browser/browser_process.h" @@ -96,8 +95,6 @@ const char kInvalidGalleryId[] = "-1"; -const char kDeprecatedError[] = - "Media Galleries API is deprecated on this platform."; const char kNoRenderFrameOrRenderProcessError[] = "No render frame or render process."; const char kNoWebContentsError[] = "Could not find web contents."; @@ -386,9 +383,6 @@ ExtensionFunction::ResponseAction MediaGalleriesGetMediaFileSystemsFunction::Run() { - if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis)) - return RespondNow(Error(kDeprecatedError)); - std::optional<GetMediaFileSystems::Params> params( GetMediaFileSystems::Params::Create(args())); EXTENSION_FUNCTION_VALIDATE(params); @@ -506,9 +500,6 @@ ExtensionFunction::ResponseAction MediaGalleriesAddUserSelectedFolderFunction::Run() { - if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis)) - return RespondNow(Error(kDeprecatedError)); - std::string error; const bool result = Setup(Profile::FromBrowserContext(browser_context()), &error, @@ -617,9 +608,6 @@ default; ExtensionFunction::ResponseAction MediaGalleriesGetMetadataFunction::Run() { - if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis)) - return RespondNow(Error(kDeprecatedError)); - EXTENSION_FUNCTION_VALIDATE(args().size() >= 1); EXTENSION_FUNCTION_VALIDATE(args()[0].is_string()); const std::string& blob_uuid = args()[0].GetString(); @@ -777,9 +765,6 @@ ExtensionFunction::ResponseAction MediaGalleriesAddGalleryWatchFunction::Run() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis)) - return RespondNow(Error(kDeprecatedError)); - Profile* profile = Profile::FromBrowserContext(browser_context()); DCHECK(profile); @@ -856,9 +841,6 @@ MediaGalleriesRemoveGalleryWatchFunction::Run() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (base::FeatureList::IsEnabled(features::kDeprecateMediaGalleriesApis)) - return RespondNow(Error(kDeprecatedError)); - if (!render_frame_host() || !render_frame_host()->GetProcess()) return RespondNow(Error(kNoRenderFrameOrRenderProcessError));
diff --git a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc index 97e33f26..5b16e4d 100644 --- a/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc +++ b/chrome/browser/ash/login/challenge_response_auth_keys_loader_browsertest.cc
@@ -35,12 +35,12 @@ constexpr char kUserEmail[] = "testuser@example.com"; -Profile* GetProfile() { +Profile* GetOriginalProfile() { return ProfileHelper::GetSigninProfile()->GetOriginalProfile(); } extensions::ProcessManager* GetProcessManager() { - return extensions::ProcessManager::Get(GetProfile()); + return extensions::ProcessManager::Get(GetOriginalProfile()); } } // namespace @@ -65,7 +65,7 @@ base::TimeDelta::Max()); extension_force_install_mixin_.InitWithDeviceStateMixin( - GetProfile(), &device_state_mixin_); + GetOriginalProfile(), &device_state_mixin_); // Register the ChallengeResponseKey for the user. user_manager::KnownUser(g_browser_process->local_state()) @@ -112,7 +112,8 @@ void InstallExtension(bool wait_on_extension_loaded) { test_certificate_provider_extension_mixin_.ForceInstall( - GetProfile(), /*wait_on_extension_loaded=*/wait_on_extension_loaded, + GetOriginalProfile(), + /*wait_on_extension_loaded=*/wait_on_extension_loaded, /*immediately_provide_certificates=*/wait_on_extension_loaded); }
diff --git a/chrome/browser/browser_controls/android/BUILD.gn b/chrome/browser/browser_controls/android/BUILD.gn index ee22c9c..377c52c 100644 --- a/chrome/browser/browser_controls/android/BUILD.gn +++ b/chrome/browser/browser_controls/android/BUILD.gn
@@ -15,6 +15,8 @@ "java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsUtils.java", "java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsVisibilityManager.java", "java/src/org/chromium/chrome/browser/browser_controls/BrowserStateBrowserControlsVisibilityDelegate.java", + "java/src/org/chromium/chrome/browser/browser_controls/TopControlLayer.java", + "java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java", ] deps = [
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlLayer.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlLayer.java new file mode 100644 index 0000000..e9007e2a --- /dev/null +++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlLayer.java
@@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.browser_controls; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.chrome.browser.browser_controls.TopControlsStacker.TopControlType; +import org.chromium.chrome.browser.browser_controls.TopControlsStacker.TopControlVisibility; + +/** Interface definition for any View registering itself as a top control. */ +@NullMarked +public interface TopControlLayer { + /** Return the type of the layer. This should not change once the layer is created. */ + @TopControlType + int getTopControlType(); + + /** Return the current height of the layer. */ + int getHeight(); + + /** Whether the layer is visible in the UI. */ + @TopControlVisibility + int getTopControlVisibility(); + + /** + * Return if the layer should contribute to the total height, which a view may not if it draws + * over other views, for example the progress bar. + */ + boolean contributesToTotalHeight(); +}
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java new file mode 100644 index 0000000..6c0b52d --- /dev/null +++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java
@@ -0,0 +1,83 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.browser_controls; + +import androidx.annotation.IntDef; + +import org.chromium.build.annotations.NullMarked; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.HashMap; +import java.util.Map; + +/** + * Coordinator class for UI layers in the top browser controls. This class manages the relative + * y-axis position for every registered top control layer. + */ +@NullMarked +public class TopControlsStacker implements BrowserControlsStateProvider.Observer { + private static final String TAG = "TopControlsStacker"; + + /** Enums that defines the types of top controls. */ + @Target(ElementType.TYPE_USE) + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + TopControlType.STATUS_INDICATOR, + TopControlType.TABSTRIP, + TopControlType.TOOLBAR, + TopControlType.BOOKMARK_BAR, + TopControlType.HAIRLINE, + TopControlType.PROGRESS_BAR, + }) + public @interface TopControlType { + int STATUS_INDICATOR = 0; + int TABSTRIP = 1; + int TOOLBAR = 2; + int BOOKMARK_BAR = 3; + int HAIRLINE = 4; + int PROGRESS_BAR = 5; + } + + /** Enum that defines the possible visibilities of a top control. */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({ + TopControlVisibility.VISIBLE, + TopControlVisibility.HIDDEN, + }) + public @interface TopControlVisibility { + int VISIBLE = 0; + int HIDDEN = 1; + } + + // All controls are stored in a Map and we should only have one of each control type. + private final Map<@TopControlType Integer, TopControlLayer> mControls; + + public TopControlsStacker() { + mControls = new HashMap<>(); + } + + /** + * Adds a new control layer to the list of active top controls. + * + * @param newControl TopControlLayer to add to the active controls. + */ + public void addControl(TopControlLayer newControl) { + assert mControls.get(newControl.getTopControlType()) == null + : "Trying to add a duplicate control type."; + mControls.put(newControl.getTopControlType(), newControl); + } + + /** + * Removes a control layer from the list of active top controls. + * + * @param control The TopControlLayer to remove from the active controls. + */ + public void removeControl(TopControlLayer control) { + mControls.remove(control.getTopControlType()); + } +}
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 54b4eab..a5415d8e 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -234,7 +234,6 @@ <part file="ui/views/webid/resources/webid_resources.grdp" /> </if> <if expr="chrome_root_store_cert_management_ui"> - <include name="IDR_CERT_MANAGER_DIALOG_HTML" file="resources\certificate_manager\certificate_manager_dialog.html" type="BINDATA" /> <include name="IDR_CERT_MANAGER_DIALOG_V2_HTML" file="resources\certificate_manager\certificate_manager_dialog_v2.html" type="BINDATA" /> </if> </includes>
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc deleted file mode 100644 index c125041..0000000 --- a/chrome/browser/certificate_manager_model.cc +++ /dev/null
@@ -1,822 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/certificate_manager_model.h" - -#include <utility> - -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/i18n/time_formatting.h" -#include "base/logging.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/scoped_observation.h" -#include "base/sequence_checker.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/bind_post_task.h" -#include "base/task/sequenced_task_runner.h" -#include "build/build_config.h" -#include "chrome/browser/net/nss_service.h" -#include "chrome/browser/net/nss_service_factory.h" -#include "chrome/browser/net/system_network_context_manager.h" -#include "chrome/browser/ui/crypto_module_password_dialog_nss.h" -#include "chrome/common/net/x509_certificate_model_nss.h" -#include "chrome/grit/generated_resources.h" -#include "content/public/browser/browser_context.h" -#include "content/public/browser/browser_task_traits.h" -#include "content/public/browser/browser_thread.h" -#include "content/public/browser/resource_context.h" -#include "crypto/scoped_nss_types.h" -#include "net/base/net_errors.h" -#include "net/cert/cert_database.h" -#include "net/cert/nss_cert_database.h" -#include "net/cert/x509_certificate.h" -#include "net/cert/x509_util_nss.h" -#include "net/net_buildflags.h" -#include "ui/base/l10n/l10n_util.h" - -#if BUILDFLAG(IS_CHROMEOS) -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/certificate_provider/certificate_provider.h" -#include "chrome/browser/certificate_provider/certificate_provider_service.h" -#include "chrome/browser/certificate_provider/certificate_provider_service_factory.h" -#include "chrome/browser/policy/networking/user_network_configuration_updater.h" -#include "chrome/browser/policy/networking/user_network_configuration_updater_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chromeos/ash/components/network/policy_certificate_provider.h" -#include "chromeos/constants/chromeos_features.h" -#include "chrome/browser/ash/kcer/kcer_factory_ash.h" -#include "chrome/browser/policy/networking/user_network_configuration_updater_ash.h" -#include "chromeos/ash/components/kcer/kcer.h" -#include "chromeos/ash/components/kcer/kcer_histograms.h" -#include "chromeos/components/onc/certificate_scope.h" -#endif // BUILDFLAG(IS_CHROMEOS) - -using content::BrowserThread; - -// CertificateManagerModel is created on the UI thread. It needs a -// NSSCertDatabase handle (and on ChromeOS it needs to get the TPM status) which -// needs to be done on the IO thread. -// -// The initialization flow is roughly: -// -// UI thread IO Thread -// -// CertificateManagerModel::Create -// \--------------------------------------v -// CertificateManagerModel::GetCertDBOnIOThread -// | -// NssCertDatabaseGetter -// | -// CertificateManagerModel::DidGetCertDBOnIOThread -// v--------------------------------------/ -// CertificateManagerModel::DidGetCertDBOnUIThread -// | -// new CertificateManagerModel -// | -// callback - -namespace { - -std::string GetCertificateOrg(CERTCertificate* cert) { - std::string org = - x509_certificate_model::GetSubjectOrgName(cert, std::string()); - if (org.empty()) - org = x509_certificate_model::GetSubjectDisplayName(cert); - - return org; -} - -#if BUILDFLAG(IS_CHROMEOS) -// Log message for an operation that can not be performed on a certificate of a -// given source. -constexpr char kOperationNotPermitted[] = - "Operation not permitted on a certificate. Source: "; -#endif // BUILDFLAG(IS_CHROMEOS) - -} // namespace - -// A source of certificates that should be displayed on the certificate manager -// UI. Currently, a CertsSource yields CertInfo objects. Each CertInfo contains -// a NSS ScopedCERTCertificate. -class CertificateManagerModel::CertsSource { - public: - // |certs_source_updated_callback| will be invoked when the list of - // certificates provided by this CertsSource changes. - explicit CertsSource(base::RepeatingClosure certs_source_updated_callback) - : certs_source_updated_callback_(certs_source_updated_callback) {} - - CertsSource(const CertsSource&) = delete; - CertsSource& operator=(const CertsSource&) = delete; - - virtual ~CertsSource() = default; - - // Returns the CertInfos provided by this CertsSource. - const std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>>& - cert_infos() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return cert_infos_; - } - - // Returns true if |cert| is in this CertsSource's certificate list. - bool HasCert(CERTCertificate* cert) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - for (const auto& cert_info : cert_infos_) { - if (cert_info->cert() == cert) - return true; - } - return false; - } - - // Triggers a refresh of this CertsSource. When done, the - // |certs_source_updated_callback| passed to the constructor will be invoked. - virtual void Refresh() = 0; - - // If any CertsSource's |IsHoldBackUpdates| is returning true, the - // CertificateManagerModel will not notify its Observer about updates. - bool IsHoldBackUpdates() const { return hold_back_updates_; } - - // Set trust values for certificate. - // |trust_bits| should be a bit field of TRUST* values from NSSCertDatabase. - // Returns true on success or false on failure. - virtual bool SetCertTrust(CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits) = 0; - - // Remove the cert from the cert database. - virtual void RemoveFromDatabase( - net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool /*success*/)> callback) = 0; - - protected: - // To be called by subclasses to set the CertInfo list provided by this - // CertsSource. If this CertsSource is signalling that updates should be held - // back (|SetHoldBackUpdates(true)|, this will be set to false. The - // |certs_source_updated_callback| passed to the constructor will be invoked. - void SetCertInfos( - std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>> - cert_infos) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - cert_infos_.swap(cert_infos); - SetHoldBackUpdates(false); - certs_source_updated_callback_.Run(); - } - - // Signal to |CertificateManagerModel| that updates to its Observer should be - // held back. This will be automatically taken back on |SetCertInfos|. - // This should only be used by |CertsSource|s that provide their list of - // certificates asynchronously but expect their certificate listing to be - // fast. - void SetHoldBackUpdates(bool hold_back_updates) { - hold_back_updates_ = hold_back_updates; - } - - // Used to verify that the constructor, and accessing |cert_infos_| are - // performed on the same sequence. Offered to subclasses so they can also - // check that they're being called on a valid sequence. - SEQUENCE_CHECKER(sequence_checker_); - - private: - // Cached CertInfos provided by this CertsSource. - std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>> cert_infos_; - - // Invoked when the list of certificates provided by this CertsSource has - // changed. - base::RepeatingClosure certs_source_updated_callback_; - - // If true, the CertificateManagerModel should be holding back update - // notifications. - bool hold_back_updates_ = false; -}; - -namespace { -// Provides certificates enumerable from a NSSCertDatabase. -class CertsSourcePlatformNSS : public CertificateManagerModel::CertsSource, - net::CertDatabase::Observer { - public: - CertsSourcePlatformNSS(base::RepeatingClosure certs_source_updated_callback, - net::NSSCertDatabase* nss_cert_database) - : CertsSource(certs_source_updated_callback), - cert_db_(nss_cert_database) { - // Observe CertDatabase changes to refresh when it's updated. - cert_database_observation_.Observe(net::CertDatabase::GetInstance()); - } - - CertsSourcePlatformNSS(const CertsSourcePlatformNSS&) = delete; - CertsSourcePlatformNSS& operator=(const CertsSourcePlatformNSS&) = delete; - - ~CertsSourcePlatformNSS() override = default; - - // net::CertDatabase::Observer - void OnTrustStoreChanged() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - Refresh(); - } - void OnClientCertStoreChanged() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - Refresh(); - } - - void Refresh() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - SetHoldBackUpdates(true); - DVLOG(1) << "refresh started"; - std::vector<crypto::ScopedPK11Slot> modules; - cert_db_->ListModules(&modules, false); - DVLOG(1) << "refresh waiting for unlocking..."; - chrome::UnlockSlotsIfNecessary( - std::move(modules), kCryptoModulePasswordListCerts, - net::HostPortPair(), // unused. - nullptr, // TODO(mattm): supply parent window. - base::BindOnce(&CertsSourcePlatformNSS::RefreshSlotsUnlocked, - weak_ptr_factory_.GetWeakPtr())); - } - - bool SetCertTrust(CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits) override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return cert_db_->SetCertTrust(cert, type, trust_bits); - } - - void RemoveFromDatabase(net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool)> callback) override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - auto callback_and_runner = - base::BindPostTaskToCurrentDefault(std::move(callback)); - - // Passing Unretained(cert_db_) is safe because the corresponding profile - // should be alive during this call and therefore the deletion task for the - // database can only be scheduled on the IO thread after this task. - content::GetIOThreadTaskRunner({})->PostTask( - FROM_HERE, base::BindOnce(&net::NSSCertDatabase::DeleteCertAndKeyAsync, - base::Unretained(cert_db_), std::move(cert), - std::move(callback_and_runner))); - } - - private: - void RefreshSlotsUnlocked() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DVLOG(1) << "refresh listing certs..."; - cert_db_->ListCertsInfo(base::BindOnce(&CertsSourcePlatformNSS::DidGetCerts, - weak_ptr_factory_.GetWeakPtr()), -#if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) - net::NSSCertDatabase::NSSRootsHandling::kExclude -#else - net::NSSCertDatabase::NSSRootsHandling::kInclude -#endif - ); - } - - void DidGetCerts(net::NSSCertDatabase::CertInfoList cert_info_list) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DVLOG(1) << "refresh finished for platform provided certificates"; - - std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>> cert_infos; - cert_infos.reserve(cert_info_list.size()); - - for (auto& cert_info : cert_info_list) { - net::CertType type = - x509_certificate_model::GetType(cert_info.cert.get()); - bool can_be_deleted = !cert_info.on_read_only_slot; - bool hardware_backed = cert_info.hardware_backed; - std::u16string name = GetName(cert_info.cert.get(), hardware_backed); - - cert_infos.push_back(std::make_unique<CertificateManagerModel::CertInfo>( - /*cert=*/std::move(cert_info.cert), type, name, can_be_deleted, - /*untrusted=*/cert_info.untrusted, - /*source=*/CertificateManagerModel::CertInfo::Source::kPlatform, - /*web_trust_anchor=*/cert_info.web_trust_anchor, hardware_backed, - /*device_wide=*/cert_info.device_wide)); - } - - SetCertInfos(std::move(cert_infos)); - } - - static std::u16string GetName(CERTCertificate* cert, - bool is_hardware_backed) { - std::u16string name = - base::UTF8ToUTF16(x509_certificate_model::GetCertNameOrNickname(cert)); - if (is_hardware_backed) { - name = l10n_util::GetStringFUTF16( - IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT, name, - l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED)); - } - return name; - } - - // The source NSSCertDatabase used for listing certificates. - raw_ptr<net::NSSCertDatabase> cert_db_; - - // ScopedObservation to keep track of the observer for net::CertDatabase. - base::ScopedObservation<net::CertDatabase, net::CertDatabase::Observer> - cert_database_observation_{this}; - - base::WeakPtrFactory<CertsSourcePlatformNSS> weak_ptr_factory_{this}; -}; - -#if BUILDFLAG(IS_CHROMEOS) -// Provides certificates installed through enterprise policy. -class CertsSourcePolicy : public CertificateManagerModel::CertsSource, - ash::PolicyCertificateProvider::Observer { - public: - // Defines which policy-provided certificates this CertsSourcePolicy instance - // should yield. - enum class Mode { - // Only certificates which are installed by enterprise policy, but not Web - // trusted. - kPolicyCertsWithoutWebTrust, - // Only certificates which are installed by enterprise policy and Web - // trusted. - kPolicyCertsWithWebTrust - }; - - CertsSourcePolicy(base::RepeatingClosure certs_source_updated_callback, - ash::PolicyCertificateProvider* policy_certs_provider, - Mode mode) - : CertsSource(certs_source_updated_callback), - policy_certs_provider_(policy_certs_provider), - mode_(mode) { - policy_certs_provider_->AddPolicyProvidedCertsObserver(this); - } - - CertsSourcePolicy(const CertsSourcePolicy&) = delete; - CertsSourcePolicy& operator=(const CertsSourcePolicy&) = delete; - - ~CertsSourcePolicy() override { - policy_certs_provider_->RemovePolicyProvidedCertsObserver(this); - } - - // ash::PolicyCertificateProvider::Observer - void OnPolicyProvidedCertsChanged() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - Refresh(); - } - - void Refresh() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - switch (mode_) { - case Mode::kPolicyCertsWithoutWebTrust: - RefreshImpl(policy_certs_provider_->GetCertificatesWithoutWebTrust( - chromeos::onc::CertificateScope::Default()), - false /* policy_web_trusted */); - break; - case Mode::kPolicyCertsWithWebTrust: - RefreshImpl(policy_certs_provider_->GetWebTrustedCertificates( - chromeos::onc::CertificateScope::Default()), - true /* policy_web_trusted */); - break; - default: - NOTREACHED(); - } - } - - bool SetCertTrust(CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits) override { - // Trust of policy-provided certificates can not be changed. - LOG(WARNING) << kOperationNotPermitted << "Policy"; - return false; - } - - void RemoveFromDatabase(net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool)> callback) override { - // Policy-provided certificates can not be deleted. - LOG(WARNING) << kOperationNotPermitted << "Policy"; - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), false)); - } - - private: - void RefreshImpl(const net::CertificateList& certificates, - bool policy_web_trusted) { - std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>> cert_infos; - cert_infos.reserve(certificates.size()); - - for (const auto& policy_cert : certificates) { - net::ScopedCERTCertificate nss_cert( - net::x509_util::CreateCERTCertificateFromX509Certificate( - policy_cert.get())); - if (!nss_cert) - continue; - - net::CertType type = x509_certificate_model::GetType(nss_cert.get()); - std::u16string cert_name = base::UTF8ToUTF16( - x509_certificate_model::GetCertNameOrNickname(nss_cert.get())); - cert_infos.push_back(std::make_unique<CertificateManagerModel::CertInfo>( - std::move(nss_cert), type, std::move(cert_name), - false /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kPolicy, - policy_web_trusted /* web_trust_anchor */, - false /* hardware_backed */, false /* device_wide */)); - } - - SetCertInfos(std::move(cert_infos)); - } - - raw_ptr<ash::PolicyCertificateProvider> policy_certs_provider_; - Mode mode_; -}; - -// Provides certificates made available by extensions through the -// chrome.certificateProvider API. -class CertsSourceExtensions : public CertificateManagerModel::CertsSource { - public: - CertsSourceExtensions(base::RepeatingClosure certs_source_updated_callback, - std::unique_ptr<chromeos::CertificateProvider> - certificate_provider_service) - : CertsSource(certs_source_updated_callback), - certificate_provider_service_(std::move(certificate_provider_service)) { - } - - CertsSourceExtensions(const CertsSourceExtensions&) = delete; - CertsSourceExtensions& operator=(const CertsSourceExtensions&) = delete; - - void Refresh() override { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - certificate_provider_service_->GetCertificates(base::BindOnce( - &CertsSourceExtensions::DidGetCerts, weak_ptr_factory_.GetWeakPtr())); - } - - bool SetCertTrust(CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits) override { - // Extension-provided certificates are user certificates; changing trust - // does not make sense here. - LOG(WARNING) << kOperationNotPermitted << "Extension"; - return false; - } - - void RemoveFromDatabase(net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool)> callback) override { - // Extension-provided certificates can not be deleted. - LOG(WARNING) << kOperationNotPermitted << "Extension"; - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), false)); - } - - private: - void DidGetCerts(net::ClientCertIdentityList cert_identities) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - std::vector<std::unique_ptr<CertificateManagerModel::CertInfo>> cert_infos; - - cert_infos.reserve(cert_identities.size()); - for (const auto& identity : cert_identities) { - net::ScopedCERTCertificate nss_cert( - net::x509_util::CreateCERTCertificateFromX509Certificate( - identity->certificate())); - if (!nss_cert) - continue; - - std::u16string cert_name = base::UTF8ToUTF16( - x509_certificate_model::GetCertNameOrNickname(nss_cert.get())); - std::u16string display_name = l10n_util::GetStringFUTF16( - IDS_CERT_MANAGER_EXTENSION_PROVIDED_FORMAT, std::move(cert_name)); - - cert_infos.push_back(std::make_unique<CertificateManagerModel::CertInfo>( - std::move(nss_cert), net::CertType::USER_CERT /* type */, - display_name, false /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - false /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */)); - } - - SetCertInfos(std::move(cert_infos)); - } - - std::unique_ptr<chromeos::CertificateProvider> certificate_provider_service_; - - base::WeakPtrFactory<CertsSourceExtensions> weak_ptr_factory_{this}; -}; - -void RecordImportFromPKCS12KcerResult( - int nss_import_result, - base::OnceCallback<void(int nss_import_result)> callback, - base::expected<void, kcer::Error> kcer_import_result) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - if (kcer_import_result.has_value()) { - kcer::RecordPkcs12MigrationUmaEvent( - kcer::Pkcs12MigrationUmaEvent::kPkcs12ImportKcerSuccess); - } else { - kcer::RecordPkcs12MigrationUmaEvent( - kcer::Pkcs12MigrationUmaEvent::kPkcs12ImportKcerFailed); - kcer::RecordKcerError(kcer_import_result.error()); - } - - // Just return the nss_import_result. Kcer will attempt to import only if NSS - // succeeds and even if Kcer fails, the cert should be usable. - return std::move(callback).Run(nss_import_result); -} - -#endif // BUILDFLAG(IS_CHROMEOS) - -} // namespace - -CertificateManagerModel::CertInfo::CertInfo(net::ScopedCERTCertificate cert, - net::CertType type, - std::u16string name, - bool can_be_deleted, - bool untrusted, - Source source, - bool web_trust_anchor, - bool hardware_backed, - bool device_wide) - : cert_(std::move(cert)), - type_(type), - name_(std::move(name)), - can_be_deleted_(can_be_deleted), - untrusted_(untrusted), - source_(source), - web_trust_anchor_(web_trust_anchor), - hardware_backed_(hardware_backed), - device_wide_(device_wide) {} - -CertificateManagerModel::CertInfo::~CertInfo() = default; - -// static -std::unique_ptr<CertificateManagerModel::CertInfo> -CertificateManagerModel::CertInfo::Clone(const CertInfo* cert_info) { - return std::make_unique<CertInfo>( - net::x509_util::DupCERTCertificate(cert_info->cert()), cert_info->type(), - cert_info->name(), cert_info->can_be_deleted(), cert_info->untrusted(), - cert_info->source(), cert_info->web_trust_anchor(), - cert_info->hardware_backed(), cert_info->device_wide()); -} - -CertificateManagerModel::Params::Params() = default; -CertificateManagerModel::Params::~Params() = default; -CertificateManagerModel::Params::Params(Params&& other) = default; - -// static -void CertificateManagerModel::Create( - content::BrowserContext* browser_context, - CertificateManagerModel::Observer* observer, - CreationCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - std::unique_ptr<Params> params = std::make_unique<Params>(); -#if BUILDFLAG(IS_CHROMEOS) - params->policy_certs_provider = - policy::UserNetworkConfigurationUpdaterFactory::GetForBrowserContext( - browser_context); - - chromeos::CertificateProviderService* certificate_provider_service = - chromeos::CertificateProviderServiceFactory::GetForBrowserContext( - browser_context); - params->extension_certificate_provider = - certificate_provider_service->CreateCertificateProvider(); - params->kcer = kcer::KcerFactoryAsh::GetKcer( - Profile::FromBrowserContext(browser_context)); -#endif - - content::GetIOThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce(&CertificateManagerModel::GetCertDBOnIOThread, - std::move(params), - NssServiceFactory::GetForContext(browser_context) - ->CreateNSSCertDatabaseGetterForIOThread(), - observer, std::move(callback))); -} - -CertificateManagerModel::CertificateManagerModel( - std::unique_ptr<Params> params, - Observer* observer, - net::NSSCertDatabase* nss_cert_database) - : cert_db_(nss_cert_database), observer_(observer) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - // Fill |certs_sources_|. Note that the order matters. Higher priority - // CertsSources must come first. - - base::RepeatingClosure certs_source_updated_callback = base::BindRepeating( - &CertificateManagerModel::OnCertsSourceUpdated, base::Unretained(this)); - -#if BUILDFLAG(IS_CHROMEOS) - // Certificates installed and web trusted by enterprise policy is the highest - // priority CertsSource. - // UserNetworkConfigurationUpdater is only available for the primary user's - // profile. - if (params->policy_certs_provider) { - certs_sources_.push_back(std::make_unique<CertsSourcePolicy>( - certs_source_updated_callback, params->policy_certs_provider, - CertsSourcePolicy::Mode::kPolicyCertsWithWebTrust)); - } - kcer_ = params->kcer; -#endif - - // Add the main NSS DB based CertsSource. - certs_sources_.push_back(std::make_unique<CertsSourcePlatformNSS>( - certs_source_updated_callback, nss_cert_database)); - -#if BUILDFLAG(IS_CHROMEOS) - // Certificates installed by enterprise policy without web trust are lower - // priority than the main NSS DB based CertsSource. - // Rationale: The user should be able to add trust to policy-provided - // certificates by re-importing them and modifying their trust settings. - if (params->policy_certs_provider) { - certs_sources_.push_back(std::make_unique<CertsSourcePolicy>( - certs_source_updated_callback, params->policy_certs_provider, - CertsSourcePolicy::Mode::kPolicyCertsWithoutWebTrust)); - } - - // Extensions is the lowest priority CertsSource. - if (params->extension_certificate_provider) { - certs_sources_.push_back(std::make_unique<CertsSourceExtensions>( - certs_source_updated_callback, - std::move(params->extension_certificate_provider))); - } -#endif -} - -CertificateManagerModel::~CertificateManagerModel() = default; - -void CertificateManagerModel::OnCertsSourceUpdated() { - if (hold_back_updates_) - return; - for (const auto& certs_source : certs_sources_) { - if (certs_source->IsHoldBackUpdates()) { - return; - } - } - - observer_->CertificatesRefreshed(); -} - -CertificateManagerModel::CertsSource* -CertificateManagerModel::FindCertsSourceForCert(CERTCertificate* cert) { - for (auto& certs_source : certs_sources_) { - if (certs_source->HasCert(cert)) - return certs_source.get(); - } - return nullptr; -} - -void CertificateManagerModel::Refresh() { - hold_back_updates_ = true; - - for (auto& certs_source : certs_sources_) - certs_source->Refresh(); - - hold_back_updates_ = false; - OnCertsSourceUpdated(); -} - -void CertificateManagerModel::FilterAndBuildOrgGroupingMap( - net::CertType filter_type, - CertificateManagerModel::OrgGroupingMap* out_org_grouping_map) const { - std::map<CERTCertificate*, std::unique_ptr<CertInfo>> cert_info_map; - for (const auto& certs_source : certs_sources_) { - for (const auto& cert_info : certs_source->cert_infos()) { - if (cert_info->type() != filter_type) - continue; - - if (cert_info_map.find(cert_info->cert()) == cert_info_map.end()) - cert_info_map[cert_info->cert()] = CertInfo::Clone(cert_info.get()); - } - } - - for (auto& cert_info_kv : cert_info_map) { - std::string org = GetCertificateOrg(cert_info_kv.second->cert()); - (*out_org_grouping_map)[org].push_back(std::move(cert_info_kv.second)); - } -} - -void CertificateManagerModel::ImportFromPKCS12( - PK11SlotInfo* slot_info, - const std::string& data, - const std::u16string& password, - bool is_extractable, - base::OnceCallback<void(int nss_import_result)> callback) { - int nss_import_result = cert_db_->ImportFromPKCS12(slot_info, data, password, - is_extractable, nullptr); - -#if BUILDFLAG(IS_CHROMEOS) - if (nss_import_result == net::OK) { - kcer::RecordPkcs12MigrationUmaEvent( - kcer::Pkcs12MigrationUmaEvent::kPkcs12ImportNssSuccess); - } else { - kcer::RecordPkcs12MigrationUmaEvent( - kcer::Pkcs12MigrationUmaEvent::kPkcs12ImportNssFailed); - } - - // `is_extractable` == true indicates that the cert came from the "Import" - // button. By default it's imported into the software NSS database (aka public - // slot). With the experiment enabled it should also be imported into Chaps. - // `is_extractable` == false means that the cert came from the "Import and - // Bind" button and it's import into Chaps by default. - if ((nss_import_result == net::OK) && is_extractable && - chromeos::features::IsPkcs12ToChapsDualWriteEnabled()) { - // Record the dual-write event. Even if the import fails, it's theoretically - // possible that some related objects are still created and would need to be - // deleted in case of a rollback. - kcer::KcerFactoryAsh::RecordPkcs12CertDualWritten(); - std::string u8_password = base::UTF16ToUTF8(password); - return kcer_->ImportPkcs12Cert( - kcer::Token::kUser, - kcer::Pkcs12Blob(std::vector<uint8_t>(data.begin(), data.end())), - std::move(u8_password), - /*hardware_backed=*/!is_extractable, /*mark_as_migrated=*/true, - base::BindOnce(&RecordImportFromPKCS12KcerResult, nss_import_result, - std::move(callback))); - } -#endif // BUILDFLAG(IS_CHROMEOS) - - return std::move(callback).Run(nss_import_result); -} - -int CertificateManagerModel::ImportUserCert(const std::string& data) { - return cert_db_->ImportUserCert(data); -} - -bool CertificateManagerModel::ImportCACerts( - const net::ScopedCERTCertificateList& certificates, - net::NSSCertDatabase::TrustBits trust_bits, - net::NSSCertDatabase::ImportCertFailureList* not_imported) { - return cert_db_->ImportCACerts(certificates, trust_bits, not_imported); -} - -bool CertificateManagerModel::ImportServerCert( - const net::ScopedCERTCertificateList& certificates, - net::NSSCertDatabase::TrustBits trust_bits, - net::NSSCertDatabase::ImportCertFailureList* not_imported) { - const size_t num_certs = certificates.size(); - bool result = - cert_db_->ImportServerCert(certificates, trust_bits, not_imported); - if (result && not_imported->size() != num_certs) - Refresh(); - return result; -} - -bool CertificateManagerModel::SetCertTrust( - CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits) { - CertsSource* certs_source = FindCertsSourceForCert(cert); - if (!certs_source) - return false; - return certs_source->SetCertTrust(cert, type, trust_bits); -} - -void CertificateManagerModel::RemoveFromDatabase( - net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool)> callback) { - CertsSource* certs_source = FindCertsSourceForCert(cert.get()); - if (!certs_source) { - base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), false)); - return; - } - return certs_source->RemoveFromDatabase(std::move(cert), std::move(callback)); -} - -// static -void CertificateManagerModel::DidGetCertDBOnUIThread( - std::unique_ptr<Params> params, - CertificateManagerModel::Observer* observer, - CreationCallback callback, - net::NSSCertDatabase* cert_db) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - - std::unique_ptr<CertificateManagerModel> model = - std::make_unique<CertificateManagerModel>(std::move(params), observer, - cert_db); - std::move(callback).Run(std::move(model)); -} - -// static -void CertificateManagerModel::DidGetCertDBOnIOThread( - std::unique_ptr<Params> params, - CertificateManagerModel::Observer* observer, - CreationCallback callback, - net::NSSCertDatabase* cert_db) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - content::GetUIThreadTaskRunner({})->PostTask( - FROM_HERE, - base::BindOnce(&CertificateManagerModel::DidGetCertDBOnUIThread, - std::move(params), observer, std::move(callback), - cert_db)); -} - -// static -void CertificateManagerModel::GetCertDBOnIOThread( - std::unique_ptr<Params> params, - NssCertDatabaseGetter database_getter, - CertificateManagerModel::Observer* observer, - CreationCallback callback) { - DCHECK_CURRENTLY_ON(BrowserThread::IO); - - auto split_callback = base::SplitOnceCallback( - base::BindOnce(&CertificateManagerModel::DidGetCertDBOnIOThread, - std::move(params), observer, std::move(callback))); - - net::NSSCertDatabase* cert_db = - std::move(database_getter).Run(std::move(split_callback.first)); - // If the NSS database was already available, |cert_db| is non-null and - // |did_get_cert_db_callback| has not been called. Call it explicitly. - if (cert_db) - std::move(split_callback.second).Run(cert_db); -}
diff --git a/chrome/browser/certificate_manager_model.h b/chrome/browser/certificate_manager_model.h deleted file mode 100644 index 182fcc7..0000000 --- a/chrome/browser/certificate_manager_model.h +++ /dev/null
@@ -1,301 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_CERTIFICATE_MANAGER_MODEL_H_ -#define CHROME_BROWSER_CERTIFICATE_MANAGER_MODEL_H_ - -#include <map> -#include <memory> -#include <string> - -#include "base/functional/callback.h" -#include "base/gtest_prod_util.h" -#include "base/memory/raw_ptr.h" -#include "build/build_config.h" -#include "chrome/browser/net/nss_service.h" -#include "net/cert/nss_cert_database.h" -#include "net/cert/scoped_nss_types.h" -#include "net/ssl/client_cert_identity.h" - -namespace content { -class BrowserContext; -} // namespace content - -#if BUILDFLAG(IS_CHROMEOS) -namespace ash { -class PolicyCertificateProvider; -} - -namespace chromeos { -class CertificateProvider; -} - -namespace kcer { -class Kcer; -} -#endif - -// CertificateManagerModel provides the data to be displayed in the certificate -// manager dialog, and processes changes from the view. -class CertificateManagerModel { - public: - // Holds information about a certificate, along with the certificate itself. - class CertInfo { - public: - enum class Source { - // This certificate is installed in the platform certificate database. - kPlatform, - // This certificate is provided by enterprise policy. - kPolicy, - // This certificate is provided by an extension. - kExtension - }; - - CertInfo(net::ScopedCERTCertificate cert, - net::CertType type, - std::u16string name, - bool can_be_deleted, - bool untrusted, - Source source, - bool web_trust_anchor, - bool hardware_backed, - bool device_wide); - - CertInfo(const CertInfo&) = delete; - CertInfo& operator=(const CertInfo&) = delete; - - ~CertInfo(); - - CERTCertificate* cert() const { return cert_.get(); } - net::CertType type() const { return type_; } - const std::u16string& name() const { return name_; } - bool can_be_deleted() const { return can_be_deleted_; } - bool untrusted() const { return untrusted_; } - Source source() const { return source_; } - bool web_trust_anchor() const { return web_trust_anchor_; } - bool hardware_backed() const { return hardware_backed_; } - bool device_wide() const { return device_wide_; } - - // Clones a CertInfo, duplicating the contained NSS certificate. - static std::unique_ptr<CertInfo> Clone(const CertInfo* cert_info); - - private: - // The certificate itself. - net::ScopedCERTCertificate cert_; - - // The type of the certificate. Used to filter certificates to be displayed - // on the tabs of the certificate manager UI. - net::CertType type_; - - // A user readable certificate name. - std::u16string name_; - - // false if the certificate is stored on a read-only slot or provided by - // enterprise policy or an extension, otherwise true. - bool can_be_deleted_; - - // true if the certificate is untrusted. - bool untrusted_; - - // Describes where this certificate originates from. - Source source_; - - // true if the certificate is given web trust (either by its platform trust - // settings, or by enterprise policy). - bool web_trust_anchor_; - - // true if the certificate is hardware-backed. Note that extension-provided - // certificates are not regarded as hardware-backed. - bool hardware_backed_; - - // true if the certificate is device-wide. - // Note: can be true only on Chrome OS. - bool device_wide_; - - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, - CanDeleteCertificateCommonTest); - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, - CanDeleteUserCertificateTest); - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, - CanDeleteCACertificateTest); - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, - CanEditCertificateCommonTest); - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, - CanEditUserCertificateTest); - FRIEND_TEST_ALL_PREFIXES(CertificateHandlerTest, CanEditCACertificateTest); - }; - - class CertsSource; - - // Holds parameters during construction. - struct Params { -#if BUILDFLAG(IS_CHROMEOS) - // May be nullptr. - raw_ptr<ash::PolicyCertificateProvider> policy_certs_provider = nullptr; - // May be nullptr. - std::unique_ptr<chromeos::CertificateProvider> - extension_certificate_provider; - // Valid as long as the underlying Profile is valid. The implementation - // doesn't check for validity of the WeakPtr because the - // CertificateManagerModel has the same validity time frame. - base::WeakPtr<kcer::Kcer> kcer; -#endif - - Params(); - - Params(const Params&) = delete; - Params& operator=(const Params&) = delete; - - Params(Params&& other); - - ~Params(); - }; - - // Map from the subject organization name to the list of certs from that - // organization. If a cert does not have an organization name, the - // subject's CertPrincipal::GetDisplayName() value is used instead. - using OrgGroupingMap = - std::map<std::string, std::vector<std::unique_ptr<CertInfo>>>; - - using CreationCallback = - base::OnceCallback<void(std::unique_ptr<CertificateManagerModel>)>; - - class Observer { - public: - // Called to notify the view that the certificate list has been refreshed. - // TODO(mattm): do a more granular updating strategy? Maybe retrieve new - // list of certs, diff against past list, and then notify of the changes? - virtual void CertificatesRefreshed() = 0; - - protected: - virtual ~Observer() = default; - }; - - // Creates a CertificateManagerModel. The model will be passed to the callback - // when it is ready. The caller must ensure the model does not outlive the - // |browser_context|. - static void Create(content::BrowserContext* browser_context, - Observer* observer, - CreationCallback callback); - - // Use |Create| instead to create a |CertificateManagerModel| for a - // |BrowserContext|. - CertificateManagerModel(std::unique_ptr<Params> params, - Observer* observer, - net::NSSCertDatabase* nss_cert_database); - - CertificateManagerModel(const CertificateManagerModel&) = delete; - CertificateManagerModel& operator=(const CertificateManagerModel&) = delete; - - ~CertificateManagerModel(); - - // Accessor for read-only access to the underlying NSSCertDatabase. - const net::NSSCertDatabase* cert_db() const { return cert_db_; } - - // Trigger a refresh of the list of certs, unlock any slots if necessary. - // Following this call, the observer CertificatesRefreshed method will be - // called so the view can call FilterAndBuildOrgGroupingMap as necessary to - // refresh its tree views. - void Refresh(); - - // Fill |*out_org_grouping_map| with the certificates matching |filter_type|. - void FilterAndBuildOrgGroupingMap(net::CertType filter_type, - OrgGroupingMap* out_org_grouping_map) const; - - // Import private keys and certificates from PKCS #12 encoded - // |data|, using the given |password|. If |is_extractable| is false, - // mark the private key as unextractable from the slot. - // Returns a net error code on failure or net::OK on success using the - // `callback`. - void ImportFromPKCS12(PK11SlotInfo* slot_info, - const std::string& data, - const std::u16string& password, - bool is_extractable, - base::OnceCallback<void(int net_result)> callback); - - // Import user certificate from DER encoded |data|. - // Returns a net error code on failure. - int ImportUserCert(const std::string& data); - - // Import CA certificates. - // Tries to import all the certificates given. The root will be trusted - // according to |trust_bits|. Any certificates that could not be imported - // will be listed in |not_imported|. - // |trust_bits| should be a bit field of TRUST* values from NSSCertDatabase. - // Returns false if there is an internal error, otherwise true is returned and - // |not_imported| should be checked for any certificates that were not - // imported. - bool ImportCACerts(const net::ScopedCERTCertificateList& certificates, - net::NSSCertDatabase::TrustBits trust_bits, - net::NSSCertDatabase::ImportCertFailureList* not_imported); - - // Import server certificate. The first cert should be the server cert. Any - // additional certs should be intermediate/CA certs and will be imported but - // not given any trust. - // Any certificates that could not be imported will be listed in - // |not_imported|. - // |trust_bits| can be set to explicitly trust or distrust the certificate, or - // use TRUST_DEFAULT to inherit trust as normal. - // Returns false if there is an internal error, otherwise true is returned and - // |not_imported| should be checked for any certificates that were not - // imported. - bool ImportServerCert( - const net::ScopedCERTCertificateList& certificates, - net::NSSCertDatabase::TrustBits trust_bits, - net::NSSCertDatabase::ImportCertFailureList* not_imported); - - // Set trust values for certificate. - // |trust_bits| should be a bit field of TRUST* values from NSSCertDatabase. - // Returns true on success or false on failure. - bool SetCertTrust(CERTCertificate* cert, - net::CertType type, - net::NSSCertDatabase::TrustBits trust_bits); - - // Remove the cert from the cert database. - void RemoveFromDatabase(net::ScopedCERTCertificate cert, - base::OnceCallback<void(bool /*success*/)> callback); - - private: - // Called when one of the |certs_sources_| has been updated. Will notify the - // |observer_| that the certificate list has been refreshed. - void OnCertsSourceUpdated(); - - // Finds the |CertsSource| which provided |cert|. Can return nullptr (e.g. if - // the cert has been deleted in the meantime). - CertsSource* FindCertsSourceForCert(CERTCertificate* cert); - - // Methods used during initialization, see the comment at the top of the .cc - // file for details. - static void DidGetCertDBOnUIThread( - std::unique_ptr<Params> params, - CertificateManagerModel::Observer* observer, - CreationCallback callback, - net::NSSCertDatabase* cert_db); - static void DidGetCertDBOnIOThread( - std::unique_ptr<Params> params, - CertificateManagerModel::Observer* observer, - CreationCallback callback, - net::NSSCertDatabase* cert_db); - static void GetCertDBOnIOThread(std::unique_ptr<Params> params, - NssCertDatabaseGetter database_getter, - CertificateManagerModel::Observer* observer, - CreationCallback callback); - - raw_ptr<net::NSSCertDatabase> cert_db_; -#if BUILDFLAG(IS_CHROMEOS) - base::WeakPtr<kcer::Kcer> kcer_; -#endif - - // CertsSource instances providing certificates. The order matters - if a - // certificate is provided by more than one CertsSource, only the first one is - // accepted. - std::vector<std::unique_ptr<CertsSource>> certs_sources_; - - bool hold_back_updates_ = false; - - // The observer to notify when certificate list is refreshed. - raw_ptr<Observer> observer_; -}; - -#endif // CHROME_BROWSER_CERTIFICATE_MANAGER_MODEL_H_
diff --git a/chrome/browser/certificate_manager_model_ash_browsertest.cc b/chrome/browser/certificate_manager_model_ash_browsertest.cc deleted file mode 100644 index 9bb9c0a..0000000 --- a/chrome/browser/certificate_manager_model_ash_browsertest.cc +++ /dev/null
@@ -1,154 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/certificate_manager_model.h" - -#include <string> - -#include "base/files/file_util.h" -#include "base/test/test_future.h" -#include "base/threading/thread_restrictions.h" -#include "chrome/browser/ash/login/test/logged_in_user_mixin.h" -#include "chrome/browser/net/nss_service.h" -#include "chrome/browser/net/nss_service_factory.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/common/pref_names.h" -#include "chrome/test/base/mixin_based_in_process_browser_test.h" -#include "chromeos/constants/chromeos_features.h" -#include "components/prefs/pref_service.h" -#include "content/public/test/browser_test.h" -#include "crypto/scoped_test_nss_db.h" -#include "net/test/test_data_directory.h" - -// The correct password for the client.p12 file. -const char16_t kPassword[] = u"12345"; - -struct FakeObserver : CertificateManagerModel::Observer { - void CertificatesRefreshed() override {} -}; - -class CertificateManagerModelBrowserTestBase - : public MixinBasedInProcessBrowserTest { - public: - void SetUpOnMainThread() override { - MixinBasedInProcessBrowserTest::SetUpOnMainThread(); - logged_in_user_mixin_.LogInUser(); - - base::test::TestFuture<std::unique_ptr<CertificateManagerModel>> - model_waiter; - CertificateManagerModel::Create(browser()->profile(), &fake_observer_, - model_waiter.GetCallback()); - certificate_manager_model_ = model_waiter.Take(); - } - - void TearDownOnMainThread() override { certificate_manager_model_.reset(); } - - std::string ReadTestFile(const std::string& file_name) { - base::ScopedAllowBlockingForTesting allow_blocking; - base::FilePath file_path = - net::GetTestCertsDirectory().AppendASCII(file_name); - std::string file_data; - if (!base::ReadFileToString(file_path, &file_data)) { - ADD_FAILURE() << "Couldn't read " << file_path; - return {}; - } - return file_data; - } - - const std::string& GetPkcs12() { - static const base::NoDestructor<std::string> pkcs12( - ReadTestFile("client.p12")); - return *pkcs12; - } - - protected: - ash::LoggedInUserMixin logged_in_user_mixin_{ - &mixin_host_, /*test_base=*/this, embedded_test_server(), - ash::LoggedInUserMixin::LogInType::kConsumer}; - - FakeObserver fake_observer_; - base::test::ScopedFeatureList feature_list_; - std::unique_ptr<crypto::ScopedTestNSSDB> public_slot_ = - std::make_unique<crypto::ScopedTestNSSDB>(); - std::unique_ptr<CertificateManagerModel> certificate_manager_model_; -}; - -class CertificateManagerModelEnablePkcs12DualWrite - : public CertificateManagerModelBrowserTestBase { - public: - CertificateManagerModelEnablePkcs12DualWrite() { - feature_list_.InitAndEnableFeature( - chromeos::features::kEnablePkcs12ToChapsDualWrite); - } -}; - -// Test ImportFromPKCS12 with dual-write enabled. -IN_PROC_BROWSER_TEST_F(CertificateManagerModelEnablePkcs12DualWrite, - DualWriteIsEnabled) { - EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - - // Non-extractable certs should not be dual-written and should not set the - // related preference. - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - public_slot_->slot(), GetPkcs12(), kPassword, - /*is_extractable=*/false, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::OK); - EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - } - - // Extractable certs should be dual-written and should set the related - // preference. - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - public_slot_->slot(), GetPkcs12(), kPassword, - /*is_extractable=*/true, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::OK); - EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - } -} - -class CertificateManagerModelDisablePkcs12DualWrite - : public CertificateManagerModelBrowserTestBase { - public: - CertificateManagerModelDisablePkcs12DualWrite() { - feature_list_.InitAndDisableFeature( - chromeos::features::kEnablePkcs12ToChapsDualWrite); - } -}; - -// Test ImportFromPKCS12 with dual-write disabled. Everything should work as -// usual, kNssChapsDualWrittenCertsExist preference should not be set for all -// cases. -IN_PROC_BROWSER_TEST_F(CertificateManagerModelDisablePkcs12DualWrite, - DualWriteIsDisabled) { - EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - public_slot_->slot(), GetPkcs12(), kPassword, - /*is_extractable=*/false, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::OK); - EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - } - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - public_slot_->slot(), GetPkcs12(), kPassword, - /*is_extractable=*/true, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::OK); - EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean( - prefs::kNssChapsDualWrittenCertsExist)); - } -}
diff --git a/chrome/browser/certificate_manager_model_unittest.cc b/chrome/browser/certificate_manager_model_unittest.cc deleted file mode 100644 index a51142c..0000000 --- a/chrome/browser/certificate_manager_model_unittest.cc +++ /dev/null
@@ -1,732 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/certificate_manager_model.h" - -#include "base/memory/raw_ptr.h" -#include "base/observer_list.h" -#include "base/run_loop.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/test_future.h" -#include "build/build_config.h" -#include "content/public/test/browser_task_environment.h" -#include "crypto/scoped_test_nss_db.h" -#include "net/cert/nss_cert_database.h" -#include "net/cert/scoped_nss_types.h" -#include "net/cert/x509_util_nss.h" -#include "net/ssl/client_cert_identity_test_util.h" -#include "net/test/cert_builder.h" -#include "net/test/cert_test_util.h" -#include "net/test/test_data_directory.h" -#include "testing/gtest/include/gtest/gtest.h" - -#if BUILDFLAG(IS_CHROMEOS) -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/certificate_provider/certificate_provider.h" -#include "chromeos/ash/components/kcer/extra_instances.h" -#include "chromeos/ash/components/network/policy_certificate_provider.h" -#include "chromeos/components/onc/certificate_scope.h" -#include "chromeos/constants/chromeos_features.h" -#endif - -namespace { - -// A fake CertificateManagerModel::Observer that has the ability to execute a -// OnceClosure passed to it when |CertificatesRefreshed| is called. -class FakeObserver : public CertificateManagerModel::Observer { - public: - void CertificatesRefreshed() override { - if (!run_on_refresh_.is_null()) - std::move(run_on_refresh_).Run(); - } - - // Execute |closure| on the next |CertificatesRefreshed| invocation. - void RunOnNextRefresh(base::OnceClosure closure) { - run_on_refresh_ = std::move(closure); - } - - private: - base::OnceClosure run_on_refresh_; -}; - -// Looks up a |CertInfo| in |org_grouping_map| corresponding to |cert|. Returns -// nullptr if no such |CertInfo| was found. -CertificateManagerModel::CertInfo* GetCertInfoFromOrgGroupingMap( - const CertificateManagerModel::OrgGroupingMap& org_grouping_map, - CERTCertificate* cert) { - for (const auto& org_and_cert_info_list : org_grouping_map) { - for (const auto& cert_info : org_and_cert_info_list.second) { - if (net::x509_util::IsSameCertificate(cert_info->cert(), cert)) - return cert_info.get(); - } - } - return nullptr; -} - -} // namespace - -class CertificateManagerModelTest : public testing::Test { - public: - CertificateManagerModelTest() = default; - - CertificateManagerModelTest(const CertificateManagerModelTest&) = delete; - CertificateManagerModelTest& operator=(const CertificateManagerModelTest&) = - delete; - - protected: - void SetUp() override { - ASSERT_TRUE(test_nssdb_.is_open()); - - nss_cert_db_ = std::make_unique<net::NSSCertDatabase>( - crypto::ScopedPK11Slot( - PK11_ReferenceSlot(test_nssdb_.slot())) /* public slot */, - crypto::ScopedPK11Slot( - PK11_ReferenceSlot(test_nssdb_.slot())) /* private slot */); - - fake_observer_ = std::make_unique<FakeObserver>(); - certificate_manager_model_ = std::make_unique<CertificateManagerModel>( - GetCertificateManagerModelParams(), fake_observer_.get(), - nss_cert_db_.get()); - } - - void TearDown() override { - certificate_manager_model_.reset(); - nss_cert_db_.reset(); - } - - // Provides the platform-specific |Params| (containing policy/extension - // certificate provides on Chrome OS). - virtual std::unique_ptr<CertificateManagerModel::Params> - GetCertificateManagerModelParams() { - return std::make_unique<CertificateManagerModel::Params>(); - } - - protected: - // Invoke an explicit Refresh if the refresh is triggered and wait until the - // observer has been notified. - void WaitForRefresh(bool trigger_refresh) { - base::RunLoop run_loop; - fake_observer_->RunOnNextRefresh(run_loop.QuitClosure()); - if (trigger_refresh) { - certificate_manager_model_->Refresh(); - } - run_loop.Run(); - } - - content::BrowserTaskEnvironment task_environment_; - crypto::ScopedTestNSSDB test_nssdb_; - std::unique_ptr<net::NSSCertDatabase> nss_cert_db_; - std::unique_ptr<FakeObserver> fake_observer_; - std::unique_ptr<CertificateManagerModel> certificate_manager_model_; -}; - -// CertificateManagerModel correctly lists CA certificates from the platform NSS -// Database. -TEST_F(CertificateManagerModelTest, ListsCertsFromPlatform) { - net::CertificateList orig_certs = CreateCertificateListFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem", - net::X509Certificate::FORMAT_AUTO); - ASSERT_EQ(1U, orig_certs.size()); - - net::CertBuilder cert_builder(orig_certs[0]->cert_buffer(), nullptr); - scoped_refptr<net::X509Certificate> x509_cert = - cert_builder.GetX509Certificate(); - - net::ScopedCERTCertificate cert = - net::x509_util::CreateCERTCertificateFromX509Certificate(x509_cert.get()); - std::string cert_subject_name = x509_cert->subject().GetDisplayName(); - - ASSERT_EQ(SECSuccess, - PK11_ImportCert(test_nssdb_.slot(), cert.get(), CK_INVALID_HANDLE, - "cert", PR_FALSE /* includeTrust (unused) */)); - WaitForRefresh(true /*tigger_for_refresh*/); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, cert.get()); - ASSERT_TRUE(cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, cert_info->type()); - EXPECT_EQ(base::UTF8ToUTF16(cert_subject_name), cert_info->name()); - EXPECT_TRUE(cert_info->can_be_deleted()); - // This platform cert is untrusted because it is self-signed and has no - // trust bits. - EXPECT_TRUE(cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPlatform, - cert_info->source()); - EXPECT_FALSE(cert_info->web_trust_anchor()); - EXPECT_FALSE(cert_info->hardware_backed()); - } - - certificate_manager_model_->SetCertTrust(cert.get(), net::CertType::CA_CERT, - net::NSSCertDatabase::TRUSTED_SSL); - // Wait for refresh without triggering because observer should be notified by - // net::CertDatabase and refresh automatically. - WaitForRefresh(false /*tigger_for_refresh*/); - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, cert.get()); - ASSERT_TRUE(cert_info); - - EXPECT_FALSE(cert_info->untrusted()); - EXPECT_TRUE(cert_info->web_trust_anchor()); - } -} - -// CertificateManagerModel correctly lists client certificates from the platform -// NSS Database. -TEST_F(CertificateManagerModelTest, ListsClientCertsFromPlatform) { - net::ScopedCERTCertificate platform_client_cert; - net::ImportClientCertAndKeyFromFile( - net::GetTestCertsDirectory(), "client_1.pem", "client_1.pk8", - test_nssdb_.slot(), &platform_client_cert); - - WaitForRefresh(true /*tigger_for_refresh*/); - - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::USER_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, - platform_client_cert.get()); - ASSERT_TRUE(platform_cert_info); - - EXPECT_EQ(net::CertType::USER_CERT, platform_cert_info->type()); - EXPECT_EQ(u"Client Cert A", platform_cert_info->name()); - EXPECT_TRUE(platform_cert_info->can_be_deleted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPlatform, - platform_cert_info->source()); - EXPECT_FALSE(platform_cert_info->web_trust_anchor()); - EXPECT_FALSE(platform_cert_info->hardware_backed()); -} - -#if BUILDFLAG(IS_CHROMEOS) -namespace { - -class FakePolicyCertificateProvider : public ash::PolicyCertificateProvider { - public: - void AddPolicyProvidedCertsObserver(Observer* observer) override { - observer_list_.AddObserver(observer); - } - - void RemovePolicyProvidedCertsObserver(Observer* observer) override { - observer_list_.RemoveObserver(observer); - } - - net::CertificateList GetAllServerAndAuthorityCertificates( - const chromeos::onc::CertificateScope& scope) const override { - // The CertificateManagerModel only retrieves profile-wide certificates. - EXPECT_EQ(chromeos::onc::CertificateScope::Default(), scope); - - net::CertificateList merged; - merged.insert(merged.end(), web_trusted_certs_.begin(), - web_trusted_certs_.end()); - merged.insert(merged.end(), not_web_trusted_certs_.begin(), - not_web_trusted_certs_.end()); - return merged; - } - - net::CertificateList GetAllAuthorityCertificates( - const chromeos::onc::CertificateScope& scope) const override { - // This function is not called by CertificateManagerModel. - NOTREACHED(); - } - - net::CertificateList GetWebTrustedCertificates( - const chromeos::onc::CertificateScope& scope) const override { - // The CertificateManagerModel only retrieves profile-wide certificates. - EXPECT_EQ(chromeos::onc::CertificateScope::Default(), scope); - - return web_trusted_certs_; - } - - net::CertificateList GetCertificatesWithoutWebTrust( - const chromeos::onc::CertificateScope& scope) const override { - // The CertificateManagerModel only retrieves profile-wide certificates. - EXPECT_EQ(chromeos::onc::CertificateScope::Default(), scope); - - return not_web_trusted_certs_; - } - - const std::set<std::string>& GetExtensionIdsWithPolicyCertificates() - const override { - // This function is not called by CertificateManagerModel. - NOTREACHED(); - } - - void SetPolicyProvidedCertificates( - const net::CertificateList& web_trusted_certs, - const net::CertificateList& not_web_trusted_certs) { - web_trusted_certs_ = web_trusted_certs; - not_web_trusted_certs_ = not_web_trusted_certs; - } - - void NotifyObservers() { - for (auto& observer : observer_list_) - observer.OnPolicyProvidedCertsChanged(); - } - - private: - base::ObserverList<PolicyCertificateProvider::Observer, - true /* check_empty */>::Unchecked observer_list_; - net::CertificateList web_trusted_certs_; - net::CertificateList not_web_trusted_certs_; - const std::set<std::string> kNoExtensions = {}; -}; - -class FakeExtensionCertificateProvider : public chromeos::CertificateProvider { - public: - FakeExtensionCertificateProvider( - const net::CertificateList* extension_client_certificates, - const bool* extensions_hang) - : extension_client_certificates_(extension_client_certificates), - extensions_hang_(extensions_hang) {} - - void GetCertificates( - base::OnceCallback<void(net::ClientCertIdentityList)> callback) override { - if (*extensions_hang_) - return; - - std::move(callback).Run(FakeClientCertIdentityListFromCertificateList( - *extension_client_certificates_)); - } - - private: - raw_ptr<const net::CertificateList> extension_client_certificates_; - - // If *|extensions_hang| is true, the |FakeExtensionCertificateProvider| hangs - // - it never calls the callbacks passed to |GetCertificates|. - raw_ptr<const bool> extensions_hang_; -}; - -// Looks up a |CertInfo| in |org_grouping_map| corresponding to |cert|. Returns -// nullptr if no such |CertInfo| was found. -CertificateManagerModel::CertInfo* GetCertInfoFromOrgGroupingMap( - const CertificateManagerModel::OrgGroupingMap& org_grouping_map, - const net::X509Certificate* cert) { - for (const auto& org_and_cert_info_list : org_grouping_map) { - for (const auto& cert_info : org_and_cert_info_list.second) { - if (net::x509_util::IsSameCertificate(cert_info->cert(), cert)) - return cert_info.get(); - } - } - return nullptr; -} - -} // namespace - -class CertificateManagerModelChromeOSTest : public CertificateManagerModelTest { - protected: - std::unique_ptr<CertificateManagerModel::Params> - GetCertificateManagerModelParams() override { - auto params = std::make_unique<CertificateManagerModel::Params>(); - params->policy_certs_provider = &policy_certs_provider_; - params->extension_certificate_provider = - std::make_unique<FakeExtensionCertificateProvider>( - &extension_client_certs_, &extensions_hang_); - params->kcer = kcer::ExtraInstances::GetEmptyKcer(); - return params; - } - - void NotifyPolicyObserversAndWaitForRefresh() { - base::RunLoop run_loop; - fake_observer_->RunOnNextRefresh(run_loop.QuitClosure()); - policy_certs_provider_.NotifyObservers(); - run_loop.Run(); - } - - // Provider for policy certificates. In a non-test environment, this would - // usually be the UserNetworkConfigurationUpdater. - FakePolicyCertificateProvider policy_certs_provider_; - - // List of certificates that will be returned from the - // FakeExtensionCertificateProvider. - net::CertificateList extension_client_certs_; - // If true, the FakeExtensionCertificateProvider hangs. - bool extensions_hang_ = false; -}; - -// CertificateManagerModel correctly lists policy-provided certificates with web -// trust. -TEST_F(CertificateManagerModelChromeOSTest, ListsWebTrustedCertsFromPolicy) { - scoped_refptr<net::X509Certificate> cert = net::ImportCertFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem"); - ASSERT_TRUE(cert.get()); - policy_certs_provider_.SetPolicyProvidedCertificates({cert}, {}); - - NotifyPolicyObserversAndWaitForRefresh(); - - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, cert.get()); - ASSERT_TRUE(cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, cert_info->type()); - EXPECT_EQ(u"pywebsocket", cert_info->name()); - EXPECT_FALSE(cert_info->can_be_deleted()); - EXPECT_FALSE(cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPolicy, - cert_info->source()); - EXPECT_TRUE(cert_info->web_trust_anchor()); - EXPECT_FALSE(cert_info->hardware_backed()); -} - -// CertificateManagerModel correctly lists policy-provided certificates without -// web trust. -TEST_F(CertificateManagerModelChromeOSTest, ListsNotWebTrustedCertsFromPolicy) { - scoped_refptr<net::X509Certificate> cert = net::ImportCertFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem"); - ASSERT_TRUE(cert.get()); - policy_certs_provider_.SetPolicyProvidedCertificates({}, {cert}); - - NotifyPolicyObserversAndWaitForRefresh(); - - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, cert.get()); - ASSERT_TRUE(cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, cert_info->type()); - EXPECT_EQ(u"pywebsocket", cert_info->name()); - EXPECT_FALSE(cert_info->can_be_deleted()); - EXPECT_FALSE(cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPolicy, - cert_info->source()); - EXPECT_FALSE(cert_info->web_trust_anchor()); - EXPECT_FALSE(cert_info->hardware_backed()); -} - -// CertificateManagerModel correctly lists CA certificates that are in the -// platform NSS database and provided by policy with web trust. The -// policy-provided certificate hides the platform certificate in this case. -TEST_F(CertificateManagerModelChromeOSTest, - WebTrustedPolicyCertsWinOverPlatformCerts) { - net::ScopedCERTCertificateList certs = CreateCERTCertificateListFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem", - net::X509Certificate::FORMAT_AUTO); - ASSERT_EQ(1U, certs.size()); - CERTCertificate* platform_cert = certs[0].get(); - ASSERT_EQ(SECSuccess, PK11_ImportCert(test_nssdb_.slot(), platform_cert, - CK_INVALID_HANDLE, "cert", - PR_FALSE /* includeTrust (unused) */)); - - scoped_refptr<net::X509Certificate> policy_cert = net::ImportCertFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem"); - ASSERT_TRUE(policy_cert.get()); - policy_certs_provider_.SetPolicyProvidedCertificates({policy_cert}, {}); - - WaitForRefresh(true /*tigger_for_refresh*/); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, platform_cert); - ASSERT_TRUE(platform_cert_info); - CertificateManagerModel::CertInfo* policy_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, policy_cert.get()); - ASSERT_TRUE(policy_cert_info); - - EXPECT_EQ(platform_cert_info, policy_cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, policy_cert_info->type()); - EXPECT_EQ(u"pywebsocket", policy_cert_info->name()); - EXPECT_FALSE(policy_cert_info->can_be_deleted()); - EXPECT_FALSE(policy_cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPolicy, - policy_cert_info->source()); - EXPECT_TRUE(policy_cert_info->web_trust_anchor()); - EXPECT_FALSE(policy_cert_info->hardware_backed()); - } - - // Remove the cert from policy-provided certs again. The platform certificate - // should be visible afterwards. - policy_certs_provider_.SetPolicyProvidedCertificates({}, {}); - NotifyPolicyObserversAndWaitForRefresh(); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, platform_cert); - ASSERT_TRUE(platform_cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, platform_cert_info->type()); - EXPECT_EQ(u"pywebsocket", platform_cert_info->name()); - EXPECT_TRUE(platform_cert_info->can_be_deleted()); - EXPECT_TRUE(platform_cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPlatform, - platform_cert_info->source()); - EXPECT_FALSE(platform_cert_info->web_trust_anchor()); - EXPECT_FALSE(platform_cert_info->hardware_backed()); - } -} - -// CertificateManagerModel correctly lists CA certificates that are in the -// platform NSS database and provided by policy without web trust. The platform -// certificate hides the policy-provided certificate in this case. -TEST_F(CertificateManagerModelChromeOSTest, - PlatformCertsWinOverNotWebTrustedCerts) { - net::ScopedCERTCertificateList certs = CreateCERTCertificateListFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem", - net::X509Certificate::FORMAT_AUTO); - ASSERT_EQ(1U, certs.size()); - CERTCertificate* platform_cert = certs[0].get(); - ASSERT_EQ(SECSuccess, PK11_ImportCert(test_nssdb_.slot(), platform_cert, - CK_INVALID_HANDLE, "cert", - PR_FALSE /* includeTrust (unused) */)); - - scoped_refptr<net::X509Certificate> policy_cert = net::ImportCertFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem"); - ASSERT_TRUE(policy_cert.get()); - policy_certs_provider_.SetPolicyProvidedCertificates({}, {policy_cert}); - - WaitForRefresh(true /*tigger_for_refresh*/); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, platform_cert); - ASSERT_TRUE(platform_cert_info); - CertificateManagerModel::CertInfo* policy_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, policy_cert.get()); - ASSERT_TRUE(policy_cert_info); - - EXPECT_EQ(platform_cert_info, policy_cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, platform_cert_info->type()); - EXPECT_EQ(u"pywebsocket", platform_cert_info->name()); - EXPECT_TRUE(platform_cert_info->can_be_deleted()); - EXPECT_TRUE(platform_cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPlatform, - platform_cert_info->source()); - EXPECT_FALSE(platform_cert_info->web_trust_anchor()); - EXPECT_FALSE(platform_cert_info->hardware_backed()); - } - - // Remove the certificate from the platform NSS database. The policy-provided - // certificate should be visible afterwards. - base::RunLoop run_loop; - fake_observer_->RunOnNextRefresh(run_loop.QuitClosure()); - base::test::TestFuture<bool> remove_result; - certificate_manager_model_->RemoveFromDatabase( - net::x509_util::DupCERTCertificate(platform_cert), - remove_result.GetCallback()); - EXPECT_TRUE(remove_result.Get()); - run_loop.Run(); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* policy_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, policy_cert.get()); - ASSERT_TRUE(policy_cert_info); - - EXPECT_EQ(net::CertType::CA_CERT, policy_cert_info->type()); - EXPECT_EQ(u"pywebsocket", policy_cert_info->name()); - EXPECT_FALSE(policy_cert_info->can_be_deleted()); - EXPECT_FALSE(policy_cert_info->untrusted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPolicy, - policy_cert_info->source()); - EXPECT_FALSE(policy_cert_info->web_trust_anchor()); - EXPECT_FALSE(policy_cert_info->hardware_backed()); - } -} - -// When the Extension CertificateProvider hangs (e.g. because an extension is -// not responding), policy and platform certificates are still listed. -TEST_F(CertificateManagerModelChromeOSTest, - PlatformAndPolicyCertsListedWhenExtensionsHang) { - extensions_hang_ = true; - - net::ScopedCERTCertificateList certs = CreateCERTCertificateListFromFile( - net::GetTestCertsDirectory(), "websocket_cacert.pem", - net::X509Certificate::FORMAT_AUTO); - ASSERT_EQ(1U, certs.size()); - CERTCertificate* platform_cert = certs[0].get(); - ASSERT_EQ(SECSuccess, PK11_ImportCert(test_nssdb_.slot(), platform_cert, - CK_INVALID_HANDLE, "cert", - PR_FALSE /* includeTrust (unused) */)); - - scoped_refptr<net::X509Certificate> policy_cert = - net::ImportCertFromFile(net::GetTestCertsDirectory(), "root_ca_cert.pem"); - ASSERT_TRUE(policy_cert.get()); - policy_certs_provider_.SetPolicyProvidedCertificates({policy_cert}, {}); - - WaitForRefresh(true /*tigger_for_refresh*/); - - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::CA_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, platform_cert); - ASSERT_TRUE(platform_cert_info); - CertificateManagerModel::CertInfo* policy_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, policy_cert.get()); - ASSERT_TRUE(policy_cert_info); - - EXPECT_NE(platform_cert_info, policy_cert_info); -} - -// CertificateManagerModel lists client certificates provided by extensions. -TEST_F(CertificateManagerModelChromeOSTest, ListsExtensionCerts) { - scoped_refptr<net::X509Certificate> extension_cert = - net::ImportCertFromFile(net::GetTestCertsDirectory(), "client_1.pem"); - ASSERT_TRUE(extension_cert.get()); - extension_client_certs_.push_back(extension_cert); - - WaitForRefresh(true /*tigger_for_refresh*/); - - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::USER_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* extension_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, extension_cert.get()); - ASSERT_TRUE(extension_cert_info); - - EXPECT_EQ(net::CertType::USER_CERT, extension_cert_info->type()); - EXPECT_EQ(u"Client Cert A (extension provided)", extension_cert_info->name()); - EXPECT_FALSE(extension_cert_info->can_be_deleted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kExtension, - extension_cert_info->source()); - EXPECT_FALSE(extension_cert_info->web_trust_anchor()); - EXPECT_FALSE(extension_cert_info->hardware_backed()); -} - -TEST_F(CertificateManagerModelChromeOSTest, - PlatformCertsWinOverExtensionCerts) { - net::ScopedCERTCertificate platform_client_cert; - net::ImportClientCertAndKeyFromFile( - net::GetTestCertsDirectory(), "client_1.pem", "client_1.pk8", - test_nssdb_.slot(), &platform_client_cert); - - scoped_refptr<net::X509Certificate> extension_cert = - net::ImportCertFromFile(net::GetTestCertsDirectory(), "client_1.pem"); - ASSERT_TRUE(extension_cert.get()); - extension_client_certs_.push_back(extension_cert); - - WaitForRefresh(true /*tigger_for_refresh*/); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::USER_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* platform_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, - platform_client_cert.get()); - ASSERT_TRUE(platform_cert_info); - CertificateManagerModel::CertInfo* extension_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, extension_cert.get()); - ASSERT_TRUE(extension_cert_info); - - EXPECT_EQ(platform_cert_info, extension_cert_info); - - EXPECT_EQ(net::CertType::USER_CERT, platform_cert_info->type()); - EXPECT_EQ(u"Client Cert A", platform_cert_info->name()); - EXPECT_TRUE(platform_cert_info->can_be_deleted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kPlatform, - platform_cert_info->source()); - EXPECT_FALSE(platform_cert_info->web_trust_anchor()); - EXPECT_FALSE(platform_cert_info->hardware_backed()); - } - - // Remove the platform client certificate. The extension-provided client - // certificate should be visible afterwards. - base::RunLoop run_loop; - fake_observer_->RunOnNextRefresh(run_loop.QuitClosure()); - base::test::TestFuture<bool> remove_result; - certificate_manager_model_->RemoveFromDatabase( - std::move(platform_client_cert), remove_result.GetCallback()); - EXPECT_TRUE(remove_result.Get()); - run_loop.Run(); - - { - CertificateManagerModel::OrgGroupingMap org_grouping_map; - certificate_manager_model_->FilterAndBuildOrgGroupingMap( - net::CertType::USER_CERT, &org_grouping_map); - CertificateManagerModel::CertInfo* extension_cert_info = - GetCertInfoFromOrgGroupingMap(org_grouping_map, extension_cert.get()); - ASSERT_TRUE(extension_cert_info); - - EXPECT_EQ(net::CertType::USER_CERT, extension_cert_info->type()); - EXPECT_EQ(u"Client Cert A (extension provided)", - extension_cert_info->name()); - EXPECT_FALSE(extension_cert_info->can_be_deleted()); - EXPECT_EQ(CertificateManagerModel::CertInfo::Source::kExtension, - extension_cert_info->source()); - EXPECT_FALSE(extension_cert_info->web_trust_anchor()); - EXPECT_FALSE(extension_cert_info->hardware_backed()); - } -} - -// Test that CertificateManagerModel handles PKCS#12 import correctly. -// The test doesn't simulate a valid certificate, actual handling of PKCS#12 -// data is covered by the tests for NSSCertDatabase and/or Kcer, but it tests -// that a meaningful result is returned to the caller. -// TODO(miersh): When kEnablePkcs12ToChapsDualWrite is enabled and -// is_extractable is true, PKCS#12 data is imported both into NSS and Kcer. That -// is difficult to verify at the moment. Soon UMA counters should be added and -// can be both tested here and used for the verification. And much later the -// import into NSS will be removed and the result code will come from Kcer. -TEST_F(CertificateManagerModelChromeOSTest, ImportFromPKCS12) { - std::string kInvalidPkcs12Data = "111"; - std::u16string kPassword = u"222"; - - base::test::ScopedFeatureList feature_list; - feature_list.InitAndDisableFeature( - chromeos::features::kEnablePkcs12ToChapsDualWrite); - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - test_nssdb_.slot(), kInvalidPkcs12Data, kPassword, - /*is_extractable=*/false, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::ERR_PKCS12_IMPORT_INVALID_FILE); - } - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - test_nssdb_.slot(), kInvalidPkcs12Data, kPassword, - /*is_extractable=*/true, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::ERR_PKCS12_IMPORT_INVALID_FILE); - } - - feature_list.Reset(); - feature_list.InitAndEnableFeature( - chromeos::features::kEnablePkcs12ToChapsDualWrite); - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - test_nssdb_.slot(), kInvalidPkcs12Data, kPassword, - /*is_extractable=*/false, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::ERR_PKCS12_IMPORT_INVALID_FILE); - } - - { - base::test::TestFuture<int> import_waiter; - certificate_manager_model_->ImportFromPKCS12( - test_nssdb_.slot(), kInvalidPkcs12Data, kPassword, - /*is_extractable=*/true, import_waiter.GetCallback()); - EXPECT_EQ(import_waiter.Get(), net::ERR_PKCS12_IMPORT_INVALID_FILE); - } -} - -#endif // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/chrome_browser_interface_binders_webui.cc b/chrome/browser/chrome_browser_interface_binders_webui.cc index 52795b7..8b1432b 100644 --- a/chrome/browser/chrome_browser_interface_binders_webui.cc +++ b/chrome/browser/chrome_browser_interface_binders_webui.cc
@@ -136,7 +136,7 @@ #include "components/search/ntp_features.h" #include "ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom.h" #include "ui/webui/resources/cr_components/customize_color_scheme_mode/customize_color_scheme_mode.mojom.h" -#include "ui/webui/resources/cr_components/help_bubble/help_bubble.mojom.h" +#include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h" #include "ui/webui/resources/cr_components/history/history.mojom.h" #include "ui/webui/resources/cr_components/history_clusters/history_clusters.mojom.h" #include "ui/webui/resources/cr_components/history_embeddings/history_embeddings.mojom.h" @@ -371,6 +371,10 @@ #include "chrome/browser/ui/webui/reset_password/reset_password_ui.h" #endif // BUILDFLAG(FULL_SAFE_BROWSING) +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h" +#endif + namespace chrome::internal { using content::RegisterWebUIControllerInterfaceBinder; @@ -1257,6 +1261,15 @@ ash::graduation::GraduationUI>(map); } #endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(ENABLE_EXTENSIONS) + RegisterWebUIControllerInterfaceBinder< + zero_state_promo::mojom::PageHandlerFactory, + extensions::ZeroStatePromoController>(map); + RegisterWebUIControllerInterfaceBinder< + custom_help_bubble::mojom::CustomHelpBubbleHandlerFactory, + extensions::ZeroStatePromoController>(map); +#endif } void PopulateChromeWebUIFrameInterfaceBrokers(
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc index 542c89f3b..a3f1e1c 100644 --- a/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -1875,7 +1875,7 @@ base::Value::Dict flexible_layout_dict; flexible_layout_dict.Set( - "verticalalDrawerEnabled", + "verticalDrawerEnabled", base::FeatureList::IsEnabled(::features::kDevToolsVerticalDrawer)); response_dict.Set("devToolsFlexibleLayout", std::move(flexible_layout_dict));
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index ead15439..24ca56d 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -6611,6 +6611,14 @@ "expiry_milestone": 133 }, { + "name": "new-content-for-checkerboarded-scrolls", + "owners": [ + "gastonr@microsoft.com", + "gerchiko@microsoft.com" + ], + "expiry_milestone": 150 + }, + { "name": "new-etc1-encoder", "owners": [ "cros-virt-devices-guests@google.com",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index ec6bc3c..e6b6fad 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -122,6 +122,13 @@ "If enabled, allows Chrome to integrate with the Android App Search " "directly without using internal library."; +const char kNewContentForCheckerboardedScrollsName[] = + "Change scrolling scheduling to reduce checkerboarding"; +const char kNewContentForCheckerboardedScrollsDescription[] = + "If enabled, scrolling that would generate blank frames will now " + "prioritize the new content over scrolling with the intention of " + "decreasing the amount of checkerboarded frames."; + #if BUILDFLAG(IS_ANDROID) const char kNewTabPageCustomizationName[] = "Customize the new tab page"; const char kNewTabPageCustomizationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 299b440..109e1f42 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -896,6 +896,9 @@ extern const char kBiometricAuthIdentityCheckDescription[]; #endif // BUILDFLAG(IS_ANDROID) +extern const char kNewContentForCheckerboardedScrollsName[]; +extern const char kNewContentForCheckerboardedScrollsDescription[]; + extern const char kNewMacNotificationAPIName[]; extern const char kNewMacNotificationAPIDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index d36f434..ec0b309 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -1229,7 +1229,7 @@ BASE_FEATURE(kTabStripContextMenuAndroid, "TabStripContextMenuAndroid", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kTabStripDensityChangeAndroid, "TabStripDensityChangeAndroid",
diff --git a/chrome/browser/glic/host/glic.mojom b/chrome/browser/glic/host/glic.mojom index 303ea62..c945994 100644 --- a/chrome/browser/glic/host/glic.mojom +++ b/chrome/browser/glic/host/glic.mojom
@@ -280,7 +280,7 @@ // Note: This must be kept in sync with the corresponding enum (same name) in // glic_api.ts. The enums are also recorded as histograms when they are // reported. -// Next version: 7 +// Next version: 8 // LINT.IfChange(ScrollToErrorReason) [Stable, Extensible] enum ScrollToErrorReason { @@ -313,6 +313,9 @@ // Page context access is disabled. [MinVersion=6] kTabContextPermissionDisabled, + + // The web client drops the highlight. + [MinVersion=7] kDroppedByWebClient, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/glic/enums.xml:GlicScrollToErrorReason) @@ -490,10 +493,15 @@ // Called when the user rates a response. OnResponseRated(bool positive); - // Scrolls to and (optionally) highlights content specified by `params`. - // Returns an error reason if the scroll fails, or null otherwise. + // Scrolls to and (optionally) highlights content specified by `params`. Only + // one highlight is active at a time. Returns an error reason if the scroll + // fails, or null otherwise. ScrollTo(ScrollToParams params) => (ScrollToErrorReason? error_reason); + // Drops the content highlight from ScrollTo(). No effects if no contents are + // highlighted. + DropScrollToHighlight(); + // Enrolls Chrome in the synthetic experiment group specified by // trial_name.group_name. Enrollment will start when the API is called and end // when Chrome closes. @@ -509,7 +517,6 @@ // Returns zero-state suggestions from the currently active tab. GetZeroStateSuggestionsForFocusedTab(bool? is_first_run) => (ZeroStateSuggestions? suggestions); - }; // Data sent from the browser to the web client with panel opening information.
diff --git a/chrome/browser/glic/host/glic_annotation_manager.cc b/chrome/browser/glic/host/glic_annotation_manager.cc index 0b968b36..1a7197b 100644 --- a/chrome/browser/glic/host/glic_annotation_manager.cc +++ b/chrome/browser/glic/host/glic_annotation_manager.cc
@@ -61,7 +61,8 @@ mojom::WebClientHandler::ScrollToCallback callback) { CHECK(base::FeatureList::IsEnabled(features::kGlicScrollTo)); if (annotation_task_ && annotation_task_->IsRunning()) { - annotation_task_->FailTask(mojom::ScrollToErrorReason::kNewerScrollToCall); + annotation_task_->FailTaskOrDropAnnotation( + mojom::ScrollToErrorReason::kNewerScrollToCall); } annotation_task_.reset(); @@ -224,6 +225,13 @@ std::move(wrapped_callback), *focused_primary_page); } +void GlicAnnotationManager::RemoveAnnotation( + mojom::ScrollToErrorReason reason) { + if (annotation_task_) { + annotation_task_->FailTaskOrDropAnnotation(reason); + } +} + GlicAnnotationManager::AnnotationTask::AnnotationTask( GlicAnnotationManager* annotation_manager, mojo::Remote<blink::mojom::AnnotationAgent> agent_remote, @@ -273,11 +281,22 @@ return state_ == State::kRunning; } -void GlicAnnotationManager::AnnotationTask::FailTask( - mojom::ScrollToErrorReason error_reason) { - SetState(State::kFailed); - std::move(scroll_to_callback_).Run(error_reason); - ResetConnections(); +void GlicAnnotationManager::AnnotationTask::FailTaskOrDropAnnotation( + mojom::ScrollToErrorReason reason) { + switch (state_) { + case State::kRunning: { + FailTask(reason); + break; + } + case State::kActive: { + DropAnnotation(); + break; + } + case State::kFailed: + case State::kInactive: { + break; + } + } } std::string GlicAnnotationManager::AnnotationTask::ToString(State state) { @@ -333,22 +352,11 @@ pref_change_registrar_.Reset(); } -void GlicAnnotationManager::AnnotationTask::FailTaskOrDropAnnotation( - mojom::ScrollToErrorReason reason) { - switch (state_) { - case State::kRunning: { - FailTask(reason); - break; - } - case State::kActive: { - DropAnnotation(); - break; - } - case State::kFailed: - case State::kInactive: { - NOTREACHED(); - } - } +void GlicAnnotationManager::AnnotationTask::FailTask( + mojom::ScrollToErrorReason error_reason) { + SetState(State::kFailed); + std::move(scroll_to_callback_).Run(error_reason); + ResetConnections(); } void GlicAnnotationManager::AnnotationTask::DidFinishAttachment(
diff --git a/chrome/browser/glic/host/glic_annotation_manager.h b/chrome/browser/glic/host/glic_annotation_manager.h index 0249c8c..7f9c762 100644 --- a/chrome/browser/glic/host/glic_annotation_manager.h +++ b/chrome/browser/glic/host/glic_annotation_manager.h
@@ -40,6 +40,9 @@ void ScrollTo(mojom::ScrollToParamsPtr params, mojom::WebClientHandler::ScrollToCallback callback); + // Removes any existing annotations. + void RemoveAnnotation(mojom::ScrollToErrorReason reason); + private: // Represents the processing of a single `ScrollTo` call. // Note: The task is currently kept alive after the scroll is triggered and @@ -63,9 +66,9 @@ // ScrollTo callback hasn't been run yet if this is true. bool IsRunning() const; - // Runs the callback with `error_reason` and destroys `this`. Should only - // be called when `IsRunning()` is true. - void FailTask(mojom::ScrollToErrorReason error_reason); + // Fails the task with `reason` if it's still running, otherwise drops the + // active annotation. + void FailTaskOrDropAnnotation(mojom::ScrollToErrorReason reason); private: enum class State { @@ -100,10 +103,9 @@ void DropAnnotation(); void ResetConnections(); - // Fails the task with `reason` if it's still running, otherwise drops the - // active annotation. Should only be called if the task is running or a - // highlight is active, and will fail a CHECK otherwise. - void FailTaskOrDropAnnotation(mojom::ScrollToErrorReason reason); + // Runs the callback with `error_reason` and invalidates `this`. Should only + // be called when `IsRunning()` is true. + void FailTask(mojom::ScrollToErrorReason error_reason); // blink::mojom::AnnotationAgentHost overrides. void DidFinishAttachment(
diff --git a/chrome/browser/glic/host/glic_annotation_manager_interactive_uitest.cc b/chrome/browser/glic/host/glic_annotation_manager_interactive_uitest.cc index 7ac4828..1e54a0e0 100644 --- a/chrome/browser/glic/host/glic_annotation_manager_interactive_uitest.cc +++ b/chrome/browser/glic/host/glic_annotation_manager_interactive_uitest.cc
@@ -366,6 +366,13 @@ })); } + auto UserSwitchesConversation() { + const DeepQuery kOnActiveThreadChanged{{"#dropScrollToHighlightBtn"}}; + static constexpr char kClickFn[] = "el => el.click()"; + return ExecuteJsAt(test::kGlicContentsElementId, kOnActiveThreadChanged, + kClickFn); + } + Selector ExactTextSelector( std::string text, std::optional<NodeIdCallback> node_id_cb = std::nullopt) { @@ -981,6 +988,45 @@ "Annotations should be dropped")); } +IN_PROC_BROWSER_TEST_F(GlicAnnotationManagerUiTest, + HighlightIsDroppedWhenActiveConversationChanged) { + RunTestSequence( + InstrumentTab(kActiveTabId), // + NavigateWebContents( + kActiveTabId, + embedded_test_server()->GetURL("/scrollable_page_with_content.html")), + OpenGlicWindow(GlicWindowMode::kDetached), // + SetTabContextPermission(true), + InsertFakeAnnotationService(), // + ScrollToAsync(ExactTextSelector("does not matter")), + WaitForEvent(kBrowserViewElementId, kScrollToRequestReceived), // + Do([&]() { + fake_service()->NotifyAttachment( + gfx::Rect(20, 20), blink::mojom::AttachmentResult::kSuccess); + }), + UserSwitchesConversation(), // + WaitForEvent(kBrowserViewElementId, kAnnotationAgentDisconnectedByRemote), + Check([&]() { return !fake_service()->HighlightIsActive(); }, + "Annotations should be dropped")); +} + +IN_PROC_BROWSER_TEST_F(GlicAnnotationManagerUiTest, + ActiveConversationChangedDuringScrollToRequest) { + RunTestSequence( + InstrumentTab(kActiveTabId), // + NavigateWebContents( + kActiveTabId, + embedded_test_server()->GetURL("/scrollable_page_with_content.html")), + OpenGlicWindow(GlicWindowMode::kDetached), // + SetTabContextPermission(true), + InsertFakeAnnotationService(), // + ScrollToAsync(ExactTextSelector("does not matter")), + WaitForEvent(kBrowserViewElementId, kScrollToRequestReceived), // + UserSwitchesConversation(), // + WaitForScrollToError(mojom::ScrollToErrorReason::kDroppedByWebClient) // + ); +} + class GlicAnnotationManagerWithScrollToDisabledUiTest : public InteractiveGlicTest { public:
diff --git a/chrome/browser/glic/host/glic_page_handler.cc b/chrome/browser/glic/host/glic_page_handler.cc index 450e573..8e2c31e 100644 --- a/chrome/browser/glic/host/glic_page_handler.cc +++ b/chrome/browser/glic/host/glic_page_handler.cc
@@ -671,6 +671,17 @@ annotation_manager_->ScrollTo(std::move(params), std::move(callback)); } + void DropScrollToHighlight() override { + if (!base::FeatureList::IsEnabled(features::kGlicScrollTo)) { + receiver_.ReportBadMessage( + "Client should not be able to call DropScrollToHighlight without the " + "GlicScrollTo feature enabled."); + return; + } + annotation_manager_->RemoveAnnotation( + mojom::ScrollToErrorReason::kDroppedByWebClient); + } + void SetSyntheticExperimentState(const std::string& trial_name, const std::string& group_name) override { g_browser_process->GetFeatures() @@ -895,7 +906,7 @@ mojo::Receiver<glic::mojom::WebClientHandler> receiver_; mojo::Remote<glic::mojom::WebClient> web_client_; std::unique_ptr<BrowserAttachObservation> browser_attach_observation_; - std::unique_ptr<GlicAnnotationManager> annotation_manager_; + const std::unique_ptr<GlicAnnotationManager> annotation_manager_; std::unique_ptr<system_permission_settings::ScopedObservation> system_permission_settings_observation_; std::vector<base::OnceClosure> on_get_user_profile_info_activation_callbacks_;
diff --git a/chrome/browser/glic/resources/browser_resources.grd b/chrome/browser/glic/resources/browser_resources.grd index a17b770..00aceca 100644 --- a/chrome/browser/glic/resources/browser_resources.grd +++ b/chrome/browser/glic/resources/browser_resources.grd
@@ -189,6 +189,12 @@ <message name="IDS_SETTINGS_GLIC_PERMISSIONS_SECTION" translateable="false" desc="Name of the Glic settings section related to permissions."> Permissions </message> + <message name="IDS_SETTINGS_GLIC_BUTTON_TOGGLE" translateable="false" desc="Name of the toggle that controls whether the glic button is shown in the tabstrip."> + Show glic at the top of the browser + </message> + <message name="IDS_SETTINGS_GLIC_BUTTON_TOGGLE_SUBLABEL" translateable="false" desc="Sublabel of the toggle that controls whether the glic button is shown in the tabstrip."> + Quickly open glic whenever you need it + </message> <if expr="is_macosx"> <message name="IDS_SETTINGS_GLIC_OS_WIDGET_TOGGLE" translateable="false" desc="Name of the Glic setting for the toggle enabling feature in the menu (on Mac only)."> Feature in your toolbar
diff --git a/chrome/browser/glic/resources/internal b/chrome/browser/glic/resources/internal index 3784a74..f236f97 160000 --- a/chrome/browser/glic/resources/internal +++ b/chrome/browser/glic/resources/internal
@@ -1 +1 @@ -Subproject commit 3784a743ccebd82808a50e14e99db28643e95bac +Subproject commit f236f97eebe6c78b5cec74e6c82f7ecabc4cac85
diff --git a/chrome/browser/glic/widget/glic_window_controller_impl.cc b/chrome/browser/glic/widget/glic_window_controller_impl.cc index f1df9fc..cd56142 100644 --- a/chrome/browser/glic/widget/glic_window_controller_impl.cc +++ b/chrome/browser/glic/widget/glic_window_controller_impl.cc
@@ -44,6 +44,7 @@ #include "chrome/browser/ui/views/tabs/window_finder.h" #include "chrome/common/chrome_features.h" #include "components/tabs/public/tab_interface.h" +#include "components/web_modal/web_contents_modal_dialog_manager.h" #include "content/public/browser/web_contents.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/ui_base_types.h" @@ -365,6 +366,9 @@ // attach indicator. HandleGlicButtonIndicator(); } + + modal_dialog_host_observers_.Notify( + &web_modal::ModalDialogHostObserver::OnPositionRequiresUpdate); } void GlicWindowControllerImpl::OnWidgetUserResizeStarted() { @@ -669,6 +673,14 @@ // Immediately hook up the WebView to the WebContents. GetGlicView()->SetWebContents(host().webui_contents()); GetGlicView()->UpdateBackgroundColor(); + + // Add capability to show web modal dialogs (e.g. Data Controls Dialogs for + // enterprise users) via constrained_window APIs. + web_modal::WebContentsModalDialogManager::CreateForWebContents( + host().webui_contents()); + web_modal::WebContentsModalDialogManager::FromWebContents( + host().webui_contents()) + ->SetDelegate(this); } void GlicWindowControllerImpl::SetupGlicWidgetAccessibilityText() { @@ -1019,6 +1031,12 @@ NotifyIfPanelStateChanged(); window_activation_callback_list_.Notify(false); + modal_dialog_host_observers_.Notify( + &web_modal::ModalDialogHostObserver::OnHostDestroying); + web_modal::WebContentsModalDialogManager::FromWebContents( + host().webui_contents()) + ->SetDelegate(nullptr); + host().PanelWasClosed(); if (base::FeatureList::IsEnabled(features::kGlicUnloadOnClose)) { host().Shutdown(); @@ -1414,4 +1432,49 @@ Browser* GlicWindowControllerImpl::attached_browser() { return attached_browser_; } + +web_modal::WebContentsModalDialogHost* +GlicWindowControllerImpl::GetWebContentsModalDialogHost() { + return this; +} + +gfx::Size GlicWindowControllerImpl::GetMaximumDialogSize() { + if (!glic_widget_) { + return gfx::Size(); + } + return glic_widget_->GetClientAreaBoundsInScreen().size(); +} + +gfx::NativeView GlicWindowControllerImpl::GetHostView() const { + if (!glic_widget_) { + return gfx::NativeView(); + } + return glic_widget_->GetNativeView(); +} + +gfx::Point GlicWindowControllerImpl::GetDialogPosition( + const gfx::Size& dialog_size) { + if (!glic_widget_) { + return gfx::Point(); + } + gfx::Rect client_area_bounds = glic_widget_->GetClientAreaBoundsInScreen(); + return gfx::Point((client_area_bounds.width() - dialog_size.width()) / 2, 0); +} + +bool GlicWindowControllerImpl::ShouldDialogBoundsConstrainedByHost() { + // Allows web modal dialogs to extend beyond the boundary of glic window. + // These web modals are usually larger than the glic window. + return false; +} + +void GlicWindowControllerImpl::AddObserver( + web_modal::ModalDialogHostObserver* observer) { + modal_dialog_host_observers_.AddObserver(observer); +} + +void GlicWindowControllerImpl::RemoveObserver( + web_modal::ModalDialogHostObserver* observer) { + modal_dialog_host_observers_.RemoveObserver(observer); +} + } // namespace glic
diff --git a/chrome/browser/glic/widget/glic_window_controller_impl.h b/chrome/browser/glic/widget/glic_window_controller_impl.h index 9a2704a8..5f809a94 100644 --- a/chrome/browser/glic/widget/glic_window_controller_impl.h +++ b/chrome/browser/glic/widget/glic_window_controller_impl.h
@@ -26,6 +26,8 @@ #include "chrome/browser/glic/widget/local_hotkey_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "components/web_modal/web_contents_modal_dialog_host.h" +#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" #include "content/public/browser/web_contents.h" #include "ui/base/interaction/element_tracker.h" #include "ui/views/widget/widget.h" @@ -51,9 +53,12 @@ // See the |State| enum below for the lifecycle of the window. When the glic // window is open |attached_browser_| indicates if the window is attached or // standalone. See |IsAttached| -class GlicWindowControllerImpl : public GlicWindowController, - public views::WidgetObserver, - public Host::Observer { +class GlicWindowControllerImpl + : public GlicWindowController, + public views::WidgetObserver, + public Host::Observer, + public web_modal::WebContentsModalDialogManagerDelegate, + public web_modal::WebContentsModalDialogHost { public: GlicWindowControllerImpl(const GlicWindowControllerImpl&) = delete; GlicWindowControllerImpl& operator=(const GlicWindowControllerImpl&) = delete; @@ -249,6 +254,18 @@ // Returns true of the window is showing and the content is loaded. bool IsWindowOpenAndReady(); + // web_modal::WebContentsModalDialogManagerDelegate: + web_modal::WebContentsModalDialogHost* GetWebContentsModalDialogHost() + override; + + // web_modal::WebContentsModalDialogHost: + gfx::Size GetMaximumDialogSize() override; + gfx::NativeView GetHostView() const override; + gfx::Point GetDialogPosition(const gfx::Size& dialog_size) override; + bool ShouldDialogBoundsConstrainedByHost() override; + void AddObserver(web_modal::ModalDialogHostObserver* observer) override; + void RemoveObserver(web_modal::ModalDialogHostObserver* observer) override; + // Observes the glic widget. base::ScopedObservation<views::Widget, views::WidgetObserver> glic_widget_observation_{this}; @@ -299,6 +316,11 @@ base::ObserverList<StateObserver> state_observers_; + // Used by web modals to listens for glic window events, e.g. size change or + // window close. + base::ObserverList<web_modal::ModalDialogHostObserver>::Unchecked + modal_dialog_host_observers_; + // The announcement should happen the first time focus is lost after the FRE. bool do_focus_loss_announcement_ = false;
diff --git a/chrome/browser/notifications/platform_notification_service_unittest.cc b/chrome/browser/notifications/platform_notification_service_unittest.cc index d6d4d49..6c5d380d 100644 --- a/chrome/browser/notifications/platform_notification_service_unittest.cc +++ b/chrome/browser/notifications/platform_notification_service_unittest.cc
@@ -424,7 +424,6 @@ RevocationState::kProposed, .site_engagement = 0.0, .daily_notification_count = kDailyNotificationCount, - .lifetime = base::Days(30), }); PlatformNotificationData data; @@ -459,7 +458,6 @@ RevocationState::kProposed, .site_engagement = 0.0, .daily_notification_count = kDailyNotificationCount, - .lifetime = base::Days(30), }); PlatformNotificationData data;
diff --git a/chrome/browser/page_load_metrics/integration_tests/data/soft_navigation.html b/chrome/browser/page_load_metrics/integration_tests/data/soft_navigation.html index ced678a..b00de34 100644 --- a/chrome/browser/page_load_metrics/integration_tests/data/soft_navigation.html +++ b/chrome/browser/page_load_metrics/integration_tests/data/soft_navigation.html
@@ -128,6 +128,9 @@ } const waitForSoftNavigationEntry = async () => { + if (!PerformanceObserver.supportedEntryTypes.includes('soft-navigation')) { + throw new Error("Soft Navigations API not supported"); + } await new Promise(resolve => { (new PerformanceObserver(resolve)).observe({ type: 'soft-navigation', buffered: true @@ -249,4 +252,4 @@ </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc index f4438409..2357c5ce 100644 --- a/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc +++ b/chrome/browser/page_load_metrics/integration_tests/soft_navigation_metrics_browsertest.cc
@@ -36,8 +36,9 @@ command_line->AppendSwitch(switches::kEnableGpuBenchmarking); command_line->AppendSwitch(blink::switches::kAllowPreCommitInput); std::vector<base::test::FeatureRef> enabled_feature_list = { + blink::features::kSoftNavigationDetection, blink::features::kNavigationId, - blink::features::kSoftNavigationDetection}; + blink::features::kSoftNavigationDetectionAdvancedPaintAttribution}; if (GetParam()) { enabled_feature_list.push_back( blink::features::kSoftNavigationHeuristics);
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index d6881c7..5724b29 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2387,6 +2387,10 @@ prefs::kNTPFooterManagementNoticeEnabled, base::Value::Type::BOOLEAN }, #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + { key::kAIModeSearchSuggestSettings, + omnibox::kAIModeSearchSuggestSettings, + base::Value::Type::INTEGER }, + }; // clang-format on @@ -3365,6 +3369,10 @@ key::kGenAIInlineImageSettings, ash::prefs::kLobsterEnterprisePolicySettings); #endif // BUILDFLAG(IS_CHROMEOS) + gen_ai_default_policies.emplace_back( + key::kAIModeSearchSuggestSettings, omnibox::kAIModeSearchSuggestSettings, + GenAiDefaultSettingsPolicyHandler::PolicyValueToPrefMap( + {{0, 0}, {1, 0}, {2, 1}})); handlers->AddHandler(std::make_unique<GenAiDefaultSettingsPolicyHandler>( std::move(gen_ai_default_policies)));
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 6825736..1ade93d 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -2118,7 +2118,7 @@ extensions::login_api::RegisterProfilePrefs(registry); extensions::platform_keys::EnterprisePlatformKeysRegisterProfilePrefs( registry); - certificate_manager::CertificatesHandler::RegisterProfilePrefs(registry); + certificate_manager::RegisterProfilePrefs(registry); chromeos::cloud_storage::RegisterProfilePrefs(registry); chromeos::cloud_upload::RegisterProfilePrefs(registry); policy::NetworkAnnotationBlocklistHandler::RegisterPrefs(registry);
diff --git a/chrome/browser/privacy_sandbox/notice/notice.mojom b/chrome/browser/privacy_sandbox/notice/notice.mojom index dab0371..df48a4de 100644 --- a/chrome/browser/privacy_sandbox/notice/notice.mojom +++ b/chrome/browser/privacy_sandbox/notice/notice.mojom
@@ -21,7 +21,7 @@ // Notice shown. kShown = 5, }; -// LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxNoticeEvent) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxNoticeEvent) // An identifier for the different notices. enum PrivacySandboxNotice {
diff --git a/chrome/browser/privacy_sandbox/notice/notice_storage.h b/chrome/browser/privacy_sandbox/notice/notice_storage.h index 4c417ff..3938b4d 100644 --- a/chrome/browser/privacy_sandbox/notice/notice_storage.h +++ b/chrome/browser/privacy_sandbox/notice/notice_storage.h
@@ -51,7 +51,7 @@ kTimedOut = 9, kMaxValue = kTimedOut, }; -// LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxNoticeAction) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxNoticeAction) // Different notice action outcomes. These values are persisted to logs. Entries // should not be renumbered and numeric values should never be reused. @@ -65,7 +65,7 @@ kDuplicateActionTaken = 2, kMaxValue = kDuplicateActionTaken, }; -// LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxNoticeActionBehavior) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxNoticeActionBehavior) struct NoticeEventTimestampPair { bool operator==(const NoticeEventTimestampPair& other) const = default;
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h index cc95df4..4e8eb48 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -72,7 +72,7 @@ kSignedInCapabilityUnknown = 4, kMaxValue = kSignedInCapabilityUnknown, }; - // LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxPrimaryAccountUserGroups) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxPrimaryAccountUserGroups) // Suppression reason for a generic prompt. // LINT.IfChange(FakeNoticePromptSuppressionReason) @@ -90,7 +90,7 @@ kNoticeShownBefore = 1 << 3, kMaxValue = kNoticeShownBefore, }; - // LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxPromptSuppressionReason) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxPromptSuppressionReason) // An exhaustive list of actions related to showing & interacting with the // prompt. Includes actions which do not impact consent / notice state.
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 24df7a3..eaaab56 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -4544,6 +4544,7 @@ void RenderViewContextMenu::ExecSaveVideoFrameAs() { base::RecordAction(UserMetricsAction("MediaContextMenu_SaveVideoFrameAs")); + RecordDownloadSource(DOWNLOAD_INITIATED_BY_CONTEXT_MENU); MediaPlayerAction(blink::mojom::MediaPlayerAction( blink::mojom::MediaPlayerActionType::kSaveVideoFrameAs, /*enable=*/true));
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index c4484a2..5e51b875 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -91,7 +91,10 @@ } if (enable_extensions) { - public_deps += [ "accessibility:reading_mode_gdocs_extension_resources" ] + public_deps += [ + "accessibility:reading_mode_gdocs_extension_resources", + "extensions_zero_state_promo:resources", + ] } if (is_mac) {
diff --git a/chrome/browser/resources/ash/settings/os_printing_page/OWNERS b/chrome/browser/resources/ash/settings/os_printing_page/OWNERS index 9d91b85b..402891a4 100644 --- a/chrome/browser/resources/ash/settings/os_printing_page/OWNERS +++ b/chrome/browser/resources/ash/settings/os_printing_page/OWNERS
@@ -1,2 +1 @@ gavinwill@chromium.org -dpad@google.com
diff --git a/chrome/browser/resources/certificate_manager/certificate_manager_dialog.html b/chrome/browser/resources/certificate_manager/certificate_manager_dialog.html deleted file mode 100644 index eb5a561..0000000 --- a/chrome/browser/resources/certificate_manager/certificate_manager_dialog.html +++ /dev/null
@@ -1,15 +0,0 @@ -<!doctype html> -<html dir="$i18n{textdirection}" lang="$i18n{language}"> - - <head> - <meta charset="utf-8"> - <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> - <script type="module" src="./strings.m.js"></script> - <script type="module" src="chrome://resources/cr_components/certificate_manager/certificate_manager.js"></script> - </head> - - <body> - <certificate-manager></certificate-manager> - </body> - -</html>
diff --git a/chrome/browser/resources/extensions_zero_state_promo/BUILD.gn b/chrome/browser/resources/extensions_zero_state_promo/BUILD.gn new file mode 100644 index 0000000..4141e686 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/BUILD.gn
@@ -0,0 +1,49 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//ui/webui/resources/tools/build_webui.gni") + +assert(enable_extensions, "enable extensions check failed") +assert(!is_android, + "extensions zero state promo should not be enabled for android") +assert(!is_ios, "extensions zero state promo should not be enabled for ios") + +build_webui("build") { + grd_prefix = "extensions_zero_state_promo" + + static_files = [ "zero_state_promo.html" ] + + ts_files = [ + "zero_state_promo_app.ts", + "zero_state_promo_app.html.ts", + "zero_state_promo_browser_proxy.ts", + ] + + icons_html_files = [ "icons.html" ] + html_to_wrapper_template = "detect" + + # Files that are passed as input to css_to_wrapper(). + css_files = [ "zero_state_promo_app.css" ] + + mojo_files_deps = [ + "//chrome/browser/ui/webui/extensions_zero_state_promo:mojo_bindings_ts__generator", + "//ui/webui/resources/cr_components/help_bubble:mojo_bindings_ts__generator", + ] + mojo_files = [ + "$root_gen_dir/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom-webui.ts", + "$root_gen_dir/ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom-webui.ts", + ] + + ts_composite = true + + ts_deps = [ + "//third_party/lit/v3_0:build_ts", + "//ui/webui/resources/cr_components/help_bubble:build_ts", + "//ui/webui/resources/cr_elements:build_ts", + "//ui/webui/resources/js:build_ts", + "//ui/webui/resources/mojo:build_ts", + ] + + webui_context_type = "trusted" +}
diff --git a/chrome/browser/resources/extensions_zero_state_promo/DIR_METADATA b/chrome/browser/resources/extensions_zero_state_promo/DIR_METADATA new file mode 100644 index 0000000..3a31847 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/DIR_METADATA
@@ -0,0 +1,7 @@ +monorail: { + component: "Platform>Extensions" +} +team_email: "webstore-consumer@google.com" +buganizer_public: { + component_id: 1456110 +}
diff --git a/chrome/browser/resources/extensions_zero_state_promo/OWNERS b/chrome/browser/resources/extensions_zero_state_promo/OWNERS new file mode 100644 index 0000000..efdf0ed --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/OWNERS
@@ -0,0 +1,4 @@ +uwyiming@google.com +phu@google.com +dfried@chromium.org +webstore-consumer@google.com
diff --git a/chrome/browser/resources/extensions_zero_state_promo/icons.html b/chrome/browser/resources/extensions_zero_state_promo/icons.html new file mode 100644 index 0000000..2f53592 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/icons.html
@@ -0,0 +1,18 @@ +<cr-iconset name="zero-state-promo" size="14"> + <svg> + <defs> + <g id="ai"> + <path d="M7 13.4c-.022 0-.033-.011-.033-.033 0-.878-.167-1.7-.5-2.467A6.244 6.244 0 0 0 3.1 7.533a6.119 6.119 0 0 0-2.467-.5C.611 7.033.6 7.023.6 7c0-.022.011-.033.033-.033A6.3 6.3 0 0 0 3.1 6.483a6.474 6.474 0 0 0 2.017-1.366A6.244 6.244 0 0 0 6.467 3.1c.333-.767.5-1.589.5-2.467C6.967.611 6.977.6 7 .6c.022 0 .033.011.033.033 0 .878.161 1.7.484 2.467a6.474 6.474 0 0 0 1.366 2.017A6.473 6.473 0 0 0 10.9 6.483a6.3 6.3 0 0 0 2.467.484c.022 0 .033.01.033.033 0 .022-.011.033-.033.033-.878 0-1.7.167-2.467.5a6.244 6.244 0 0 0-2.017 1.35A6.473 6.473 0 0 0 7.517 10.9a6.3 6.3 0 0 0-.484 2.467c0 .022-.01.033-.033.033Z"/> + </g> + <g id="coupons"> + <path d="M1.45 13.533c-.389 0-.717-.133-.983-.4a1.336 1.336 0 0 1-.4-.983V4.717c0-.39.133-.717.4-.984.266-.266.594-.4.983-.4H2.5v-.266c.011-.69.25-1.295.717-1.817C3.683.728 4.277.467 5 .467a2.38 2.38 0 0 1 1.75.716c.489.478.739 1.061.75 1.75v.4h1.05c.389 0 .717.134.983.4.267.267.4.595.4.984v7.433c0 .389-.133.717-.4.983-.266.267-.594.4-.983.4h-7.1Zm0-1.383h7.1V4.717H7.5v.9c0 .2-.067.366-.2.5-.133.133-.3.2-.5.2a.715.715 0 0 1-.5-.2.678.678 0 0 1-.2-.5v-.9H3.9v.9c0 .2-.067.366-.2.5-.133.133-.3.2-.5.2a.715.715 0 0 1-.5-.2.678.678 0 0 1-.2-.5v-.9H1.45v7.433ZM3.9 3.333h2.2v-.4c0-.3-.111-.555-.333-.766A1.044 1.044 0 0 0 5 1.85a1.1 1.1 0 0 0-.783.317 1.044 1.044 0 0 0-.317.766v.4ZM1.45 12.15V4.717v7.433Z"/> + </g> + <g id="productivity"> + <path d="M7 13.4a6.238 6.238 0 0 1-2.483-.5 6.623 6.623 0 0 1-2.05-1.367A6.624 6.624 0 0 1 1.1 9.483 6.237 6.237 0 0 1 .6 7c0-.889.167-1.717.5-2.483A6.421 6.421 0 0 1 4.517 1.1 6.237 6.237 0 0 1 7 .6a6.16 6.16 0 0 1 2.483.5 6.287 6.287 0 0 1 2.034 1.383A6.286 6.286 0 0 1 12.9 4.517c.333.766.5 1.594.5 2.483 0 .3-.022.594-.067.883a5.48 5.48 0 0 1-.166.85 2.02 2.02 0 0 0-.517-.35 1.855 1.855 0 0 0-.6-.166c.056-.2.094-.4.117-.6.022-.2.033-.406.033-.617 0-1.444-.506-2.672-1.517-3.683C9.673 2.306 8.444 1.8 7 1.8s-2.672.506-3.683 1.517C2.306 4.327 1.8 5.556 1.8 7s.506 2.672 1.517 3.683C4.327 11.694 5.556 12.2 7 12.2c.578 0 1.122-.083 1.633-.25a5.19 5.19 0 0 0 1.434-.75c.1.189.227.35.383.483.156.134.328.245.517.334a6.416 6.416 0 0 1-1.834 1.016A6.147 6.147 0 0 1 7 13.4Zm4.8-2.4a.772.772 0 0 1-.567-.233A.772.772 0 0 1 11 10.2c0-.222.078-.411.233-.567A.772.772 0 0 1 11.8 9.4c.222 0 .411.078.567.233a.772.772 0 0 1 .233.567.772.772 0 0 1-.233.567.772.772 0 0 1-.567.233ZM9.233 9.833 6.4 7V3h1.2v3.5l2.483 2.483-.85.85Z"/> + </g> + <g id="writing"> + <path d="M2.833 5.217 2.1 3.583l-1.633-.75L2.1 2.1 2.833.467l.75 1.633 1.634.733-1.634.75-.75 1.634Zm-1.566 7.516V10.3l4.516-4.5L8.2 8.217l-4.5 4.516H1.267ZM2.65 11.35h.467L6.25 8.217l-.217-.25-.25-.217-3.133 3.133v.467Zm6.4-3.983L6.633 4.95l3.434-3.433c.089-.078.183-.14.283-.184a.892.892 0 0 1 .333-.066c.111 0 .223.022.334.066.11.045.21.106.3.184l1.166 1.166c.078.09.14.19.184.3a.892.892 0 0 1 .066.334.892.892 0 0 1-.066.333.71.71 0 0 1-.184.3L9.05 7.367Zm-3.017.6-.25-.217.25.217.217.25-.217-.25Z"/> + </g> + </defs> + </svg> +</cr-iconset>
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo.html b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo.html new file mode 100644 index 0000000..b4b4fc3 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo.html
@@ -0,0 +1,21 @@ +<!DOCTYPE HTML> +<html dir="$i18n{textdirection}" lang="$i18n{language}"> + <head> + <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + <link rel="stylesheet" href="chrome://theme/colors.css?sets=ui,chrome"> + <meta charset="utf-8"> + <style> + @media (prefers-color-scheme: dark) { + html { + background: var(--md-background-color); + } + } + body { + margin: 0; + } + </style> + </head> + <extensions-zero-state-promo-app></extensions-zero-state-promo-app> + <script type="module" src="zero_state_promo_app.js"></script> +</html>
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css new file mode 100644 index 0000000..f14afad --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css
@@ -0,0 +1,67 @@ +/* Copyright 2025 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style-lit + * #import=chrome://resources/cr_elements/cr_shared_vars.css.js + * #import=chrome://resources/cr_elements/cr_icons_lit.css.js + * #import=chrome://resources/cr_elements/cr_hidden_style_lit.css.js + * #import=chrome://resources/cr_elements/cr_shared_style_lit.css.js + * #include=cr-hidden-style-lit cr-shared-style-lit cr-icons-lit + * #css_wrapper_metadata_end */ + +:host { + --zero-state-promo-background-color: var(--color-button-foreground); + --zero-state-promo-foreground-color: var(--color-button-background); + --top-container-padding: 20px; + + border-radius: 12px; + display: flex; + flex-direction: column; + justify-content: center; + gap: 8px; + padding: 20px; + width: 300px; + background-color: var(--zero-state-promo-background-color); + color: var(--zero-state-promo-foreground-color); +} + +#headerContainer { + align-items: flex-start; + display: flex; + justify-content: space-between; + padding: 0px; +} + +#title { + font-size: 18px; + font-weight: 500; + line-height: 24px; + margin: 0px; + width: calc(100% - var(--top-container-padding) * 2); +} + +#dismissButton { + --cr-icon-button-icon-size: 18px; + --cr-icon-button-margin-end: 0px; + --cr-icon-button-size: 20px; + flex-shrink:0; +} + +#sectionHeaderContainer { + font-size: 15px; + font-weight: 400; + line-height: 20px; + padding-bottom: 4px; +} + +#labelContainer { + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 8px; + padding: 0px; + --color-chip-foreground: var(--zero-state-promo-foreground-color); + --color-chip-icon: var(--color-sys-inverse-primary); +}
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts new file mode 100644 index 0000000..aa985d7 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts
@@ -0,0 +1,47 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {html} from '//resources/lit/v3_0/lit.rollup.js'; + +import type {ZeroStatePromoAppElement} from './zero_state_promo_app.js'; + +export function getHtml(this: ZeroStatePromoAppElement) { + // clang-format off + return html`<!--_html_template_start_--> +<div id="headerContainer"> + <h3 id="title">$i18n{extensionsZeroStateIphHeader}</h3> + <cr-icon-button id="dismissButton" + class="icon-clear" + title="$i18n{extensionsZeroStateIphDismissButtonTitle}" + @click="${this.onDismissButtonClick_}"> + </cr-icon-button> +</div> +<div id="sectionHeaderContainer"> + $i18nRaw{extensionsZeroStateChipsIphDesc} +</div> +<div id="labelContainer"> + <cr-chip id="couponsButton" chip-role="link" + @click="${this.onCouponsButtonClick_}"> + <cr-icon icon="zero-state-promo:coupons"></cr-icon> + $i18n{extensionsZeroStateIphShoppingCategoryLabel} + </cr-chip> + <cr-chip id="writingButton" chip-role="link" + @click="${this.onWritingButtonClick_}"> + <cr-icon icon="zero-state-promo:writing"></cr-icon> + $i18n{extensionsZeroStateIphWritingHelpCollectionLabel} + </cr-chip> + <cr-chip id="productivityButton" + @click="${this.onProductivityButtonClick_}"> + <cr-icon icon="zero-state-promo:productivity"></cr-icon> + $i18n{extensionsZeroStateIphProductivityCategoryLabel} + </cr-chip> + <cr-chip id="aiButton" + @click="${this.onAiButtonClick_}"> + <cr-icon icon="zero-state-promo:ai"></cr-icon> + $i18n{extensionsZeroStateIphAiProductivityCollectionLabel} + </cr-chip> +</div> +<!--_html_template_end_-->`; + // clang-format on +}
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts new file mode 100644 index 0000000..52553737 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts
@@ -0,0 +1,93 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import './icons.html.js'; +import 'chrome://resources/cr_elements/cr_button/cr_button.js'; +import 'chrome://resources/cr_elements/cr_chip/cr_chip.js'; +import 'chrome://resources/cr_elements/cr_icon/cr_icon.js'; +import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; + +import type {CustomHelpBubbleHandlerInterface} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble.mojom-webui.js'; +import {CustomHelpBubbleUserAction} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble.mojom-webui.js'; +import {CustomHelpBubbleProxyImpl} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble_proxy.js'; +import type {CrChipElement} from 'chrome://resources/cr_elements/cr_chip/cr_chip.js'; +import type {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; + +import {WebStoreLinkClicked} from './zero_state_promo.mojom-webui.js'; +import {getCss} from './zero_state_promo_app.css.js'; +import {getHtml} from './zero_state_promo_app.html.js'; +import type {ZeroStatePromoBrowserProxy} from './zero_state_promo_browser_proxy.js'; +import {ZeroStatePromoBrowserProxyImpl} from './zero_state_promo_browser_proxy.js'; + +export interface ZeroStatePromoAppElement { + $: { + dismissButton: CrIconButtonElement, + couponsButton: CrChipElement, + writingButton: CrChipElement, + productivityButton: CrChipElement, + aiButton: CrChipElement, + }; +} + +export class ZeroStatePromoAppElement extends CrLitElement { + static get is() { + return 'extensions-zero-state-promo-app'; + } + + static override get styles() { + return getCss(); + } + + override render() { + return getHtml.bind(this)(); + } + + private apiProxy_: ZeroStatePromoBrowserProxy = + ZeroStatePromoBrowserProxyImpl.getInstance(); + private customHelpBubbleHandler_: CustomHelpBubbleHandlerInterface = + CustomHelpBubbleProxyImpl.getInstance().getHandler(); + + protected onChromeWebStoreLinkClick_() { + this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kDiscoverExtension); + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kAction); + } + + protected onCouponsButtonClick_() { + this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kCoupon); + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kAction); + } + + protected onWritingButtonClick_() { + this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kWriting); + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kAction); + } + + protected onProductivityButtonClick_() { + this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kProductivity); + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kAction); + } + + protected onAiButtonClick_() { + this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kAi); + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kAction); + } + + protected onDismissButtonClick_() { + this.customHelpBubbleHandler_.notifyUserAction( + CustomHelpBubbleUserAction.kDismiss); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'extensions-zero-state-promo-app': ZeroStatePromoAppElement; + } +} + +customElements.define(ZeroStatePromoAppElement.is, ZeroStatePromoAppElement);
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_browser_proxy.ts b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_browser_proxy.ts new file mode 100644 index 0000000..8ff2d05 --- /dev/null +++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_browser_proxy.ts
@@ -0,0 +1,40 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview A helper object used from the "Web Store Discovery" dialog to + * interact with the browser. + */ +import {PageHandlerFactory, PageHandlerRemote} from './zero_state_promo.mojom-webui.js'; +import type {WebStoreLinkClicked} from './zero_state_promo.mojom-webui.js'; + +let instance: ZeroStatePromoBrowserProxy|null = null; + +export interface ZeroStatePromoBrowserProxy { + launchWebStoreLink(link: WebStoreLinkClicked): void; +} + +export class ZeroStatePromoBrowserProxyImpl implements + ZeroStatePromoBrowserProxy { + private handler_: PageHandlerRemote; + + constructor() { + this.handler_ = new PageHandlerRemote(); + + const factory = PageHandlerFactory.getRemote(); + factory.createPageHandler(this.handler_.$.bindNewPipeAndPassReceiver()); + } + + launchWebStoreLink(link: WebStoreLinkClicked) { + this.handler_.launchWebStoreLink(link); + } + + static getInstance(): ZeroStatePromoBrowserProxy { + return instance || (instance = new ZeroStatePromoBrowserProxyImpl()); + } + + static setInstance(obj: ZeroStatePromoBrowserProxy) { + instance = obj; + } +}
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts index 55d54d0..903c06e 100644 --- a/chrome/browser/resources/glic/glic_api/glic_api.ts +++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -422,14 +422,21 @@ * @todo Not yet implemented for PDFs. https://crbug.com/395859365 * * Scrolls to and (optionally) highlights content specified by an input - * selector. Returns a promise that resolves when the selected content is - * matched and a scroll is started. + * selector. Only one highlight is active at a time. Returns a promise that + * resolves when the selected content is matched and a scroll is started. Only + * available when `GlicScrollTo` is enabled. * * @throws {ScrollToError} on failure. */ scrollTo?(params: ScrollToParams): Promise<void>; /** + * Drops the content highlight from scrollTo(). No effects if no contents are + * highlighted. Only available when `GlicScrollTo` is enabled. + */ + dropScrollToHighlight?(): void; + + /** * Enrolls the Chrome client in the synthetic experiment group specified by * trial_name.group_name. Enrollment will only start when the API is called * and end when Chrome closes. @@ -1093,6 +1100,11 @@ * Tab context permission was disabled. */ TAB_CONTEXT_PERMISSION_DISABLED = 7, + + /** + * The web client requested to drop the highlight via `dropScrollToHighlight`. + */ + DROPPED_BY_WEB_CLIENT = 8, } /**
diff --git a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts index ad4f01d..69b4c0f 100644 --- a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts +++ b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts
@@ -234,6 +234,7 @@ if (!state.enableScrollTo) { this.scrollTo = undefined; + this.dropScrollToHighlight = undefined; } if (!state.enableActInFocusedTab) { @@ -514,6 +515,11 @@ } return zeroStateResult.suggestions; } + + dropScrollToHighlight?(): void { + this.sender.requestWithResponse( + 'glicBrowserDropScrollToHighlight', undefined); + } } class GlicBrowserHostMetricsImpl implements GlicBrowserHostMetrics {
diff --git a/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts b/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts index 3228d661..9fdaa36 100644 --- a/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts +++ b/chrome/browser/resources/glic/glic_api_impl/glic_api_host.ts
@@ -589,6 +589,10 @@ }; } } + + glicBrowserDropScrollToHighlight(): void { + this.handler.dropScrollToHighlight(); + } } export class GlicApiHost implements PostMessageRequestHandler {
diff --git a/chrome/browser/resources/glic/glic_api_impl/request_types.ts b/chrome/browser/resources/glic/glic_api_impl/request_types.ts index 5dd39dc..ad9e336 100644 --- a/chrome/browser/resources/glic/glic_api_impl/request_types.ts +++ b/chrome/browser/resources/glic/glic_api_impl/request_types.ts
@@ -172,6 +172,7 @@ glicBrowserScrollTo: { request: {params: ScrollToParams}, }; + glicBrowserDropScrollToHighlight: {}; glicBrowserSetSyntheticExperimentState: { request: { trialName: string, @@ -316,6 +317,7 @@ GetOsMicrophonePermissionStatus: 0, GetZeroStateSuggestionsForFocusedTab: 0, SetClosedCaptioningSetting: 0, + DropScrollToHighlight: 0, }; return apiRequestTypes; // LINT.ThenChange(//tools/metrics/histograms/metadata/glic/histograms.xml:ApiRequestType)
diff --git a/chrome/browser/resources/intro/default_browser/app.html.ts b/chrome/browser/resources/intro/default_browser/app.html.ts index 56cc5039..c3f25a02 100644 --- a/chrome/browser/resources/intro/default_browser/app.html.ts +++ b/chrome/browser/resources/intro/default_browser/app.html.ts
@@ -18,8 +18,8 @@ <img id="default-browser-frame" alt=""> <img id="product-logo" src="images/product-logo.svg" alt=""> </div> - <h1 class="title">$i18n{defaultBrowserTitle}</h1> - <p class="subtitle">$i18n{defaultBrowserSubtitle}</p> + <h1 class="title">${this.getTitle()}</h1> + <p class="subtitle">${this.getSubtitle()}</p> </div> </div>
diff --git a/chrome/browser/resources/intro/default_browser/app.ts b/chrome/browser/resources/intro/default_browser/app.ts index cc1b3e7f..93143813 100644 --- a/chrome/browser/resources/intro/default_browser/app.ts +++ b/chrome/browser/resources/intro/default_browser/app.ts
@@ -2,9 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import '/strings.m.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.js'; import {WebUiListenerMixinLit} from 'chrome://resources/cr_elements/web_ui_listener_mixin_lit.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; import {getCss} from './app.css.js'; @@ -57,6 +59,13 @@ this.anyButtonClicked_ = false; } + protected getTitle() { + return loadTimeData.getString('defaultBrowserTitle'); + } + protected getSubtitle() { + return loadTimeData.getString('defaultBrowserSubtitle'); + } + /** * Disable buttons if a button was clicked. */
diff --git a/chrome/browser/resources/on_device_internals/tools.html.ts b/chrome/browser/resources/on_device_internals/tools.html.ts index c74298a..19f63f5 100644 --- a/chrome/browser/resources/on_device_internals/tools.html.ts +++ b/chrome/browser/resources/on_device_internals/tools.html.ts
@@ -90,7 +90,7 @@ <cr-icon icon="cr:add" slot="prefix-icon"></cr-icon> Add audio </cr-button> - <input id="audioInput" type="file"> + <input id="audioInput" type="file" accept="audio/*"> </div> ${this.audioFile_ ? html` <cr-button class="floating-button" @click="${this.onRemoteAudioClick_}">
diff --git a/chrome/browser/resources/pdf/elements/ink_text_box.ts b/chrome/browser/resources/pdf/elements/ink_text_box.ts index 0595fa5a..110b07d 100644 --- a/chrome/browser/resources/pdf/elements/ink_text_box.ts +++ b/chrome/browser/resources/pdf/elements/ink_text_box.ts
@@ -347,6 +347,16 @@ this.pageNumber_ = data.annotation.pageNumber; this.textOrientation_ = data.annotation.textOrientation; this.updateTextAttributes_(data.annotation.textAttributes); + + this.focusTextboxWhenReady_(); + } + + private async focusTextboxWhenReady_() { + await this.updateComplete; + setTimeout(() => { + this.$.textbox.focus(); + this.fire('textbox-focused-for-test'); + }, 0); } private onViewportChanged_(update: ViewportParams) {
diff --git a/chrome/browser/resources/pdf/ink2_manager.ts b/chrome/browser/resources/pdf/ink2_manager.ts index d5419af..70f3538 100644 --- a/chrome/browser/resources/pdf/ink2_manager.ts +++ b/chrome/browser/resources/pdf/ink2_manager.ts
@@ -138,6 +138,10 @@ this.viewport_ = viewport; } + resetAnnotationIdForTest() { + this.nextAnnotationId_ = 0; + } + private isClickOnScrollbar_(location: Point): boolean { assert(this.viewport_); const hasScrollbars = this.viewport_.documentHasScrollbars(); @@ -155,14 +159,20 @@ // Initialize a text annotation at `location` in screen coordinates. // No-op if there is no PDF page at `location`. - initializeTextAnnotation(location: Point) { + // If location is not provided, creates the annotation at the center of + // the visible portion of the most visible page. + initializeTextAnnotation(location?: Point) { assert(this.isTextInitializationComplete()); assert(this.viewport_); - // Only actually compute the page if the click isn't on a scrollbar. - const page = this.isClickOnScrollbar_(location) ? - -1 : - this.viewport_.getPageAtPoint(location); + let page = -1; + if (!location) { + page = this.viewport_.getMostVisiblePage(); + } else if (!this.isClickOnScrollbar_(location)) { + // Only actually compute the page if the click isn't on a scrollbar. + page = this.viewport_.getPageAtPoint(location); + } + if (page === -1) { // In any case where we ignore the click, blur the textbox. Otherwise, // the textarea will remain in focus and will continue handling all @@ -173,6 +183,20 @@ } const pageDimensions = this.viewport_.getPageScreenRect(page); + // Set location to the middle of the visible portion of the page. + if (!location) { + const minX = Math.max(pageDimensions.x, 0); + const minY = Math.max(pageDimensions.y, 0); + const maxX = Math.min( + pageDimensions.x + pageDimensions.width, this.viewport_.size.width); + const maxY = Math.min( + pageDimensions.y + pageDimensions.height, this.viewport_.size.height); + location = { + x: Math.max(0, (minX + maxX) / 2 - DEFAULT_TEXTBOX_WIDTH / 2), + y: Math.max(0, (minY + maxY) / 2 - DEFAULT_TEXTBOX_HEIGHT / 2), + }; + } + // Is the click in an existing box? let existing = null; // Get the annotations for the current page.
diff --git a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts index 694f2da..1b3f68d 100644 --- a/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts +++ b/chrome/browser/resources/pdf/pdf_internal_plugin_wrapper.ts
@@ -201,6 +201,10 @@ } return; + // <if expr="enable_pdf_ink2"> + case 'Enter': + // Enter is used to create new text annotations. + // </if> case 'Escape': case 'Tab': // Print Preview is interested in Escape and Tab.
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts index edf43a75..0c87709 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.ts +++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -464,6 +464,13 @@ e.preventDefault(); } return; + // <if expr="enable_pdf_ink2"> + case 'Enter': + if ((e as ExtendedKeyEvent).fromPlugin && + this.isInTextAnnotationMode_()) { + Ink2Manager.getInstance().initializeTextAnnotation(); + } + // </if> } // Handle toolbar related key events.
diff --git a/chrome/browser/resources/settings/site_settings/constants.ts b/chrome/browser/resources/settings/site_settings/constants.ts index d3c5326..edae526 100644 --- a/chrome/browser/resources/settings/site_settings/constants.ts +++ b/chrome/browser/resources/settings/site_settings/constants.ts
@@ -113,7 +113,7 @@ INCOGNITO_ONLY = 2, LIMITED = 3, } -// LINT.ThenChange(/tools/metrics/histograms/enums.xml:CookieControlsMode, /components/content_settings/core/browser/cookie_settings.h:CookieControlsMode) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:CookieControlsMode, //components/content_settings/core/browser/cookie_settings.h:CookieControlsMode) /** * Contains the possible sources of a ContentSetting.
diff --git a/chrome/browser/resources/side_panel/read_anything/common.ts b/chrome/browser/resources/side_panel/read_anything/common.ts index d064568..4f3cfa9 100644 --- a/chrome/browser/resources/side_panel/read_anything/common.ts +++ b/chrome/browser/resources/side_panel/read_anything/common.ts
@@ -64,7 +64,7 @@ export function openMenu( menuToOpen: CrActionMenuElement, target: HTMLElement, - showAtConfig?: {minX: number, maxX: number}) { + showAtConfig?: {minX: number, maxX: number}, onShow?: () => void) { // The button should stay active while the menu is open and deactivate when // the menu closes. menuToOpen.addEventListener('close', () => { @@ -90,6 +90,9 @@ noOffset: true, }, showAtConfig)); + if (onShow) { + onShow(); + } }); }); }
diff --git a/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.css b/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.css index 7e47f2a2..0f63a89 100644 --- a/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.css +++ b/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.css
@@ -92,6 +92,7 @@ overflow: hidden; padding-inline-end: 16px; text-overflow: ellipsis; + white-space: nowrap; } .item-hidden-true {
diff --git a/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.ts b/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.ts index 3ae41337..0464eb6 100644 --- a/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.ts +++ b/chrome/browser/resources/side_panel/read_anything/voice_selection_menu.ts
@@ -155,18 +155,20 @@ this.notificationManager_.addListener(this); const menu = this.$.voiceSelectionMenu.get(); - openMenu(menu, targetElement, { - minX: this.spBodyPadding_, - maxX: document.body.clientWidth - this.spBodyPadding_, - }); + openMenu( + menu, targetElement, { + minX: this.spBodyPadding_, + maxX: document.body.clientWidth - this.spBodyPadding_, + }, + this.onMenuShown.bind(this)); + } - // Scroll to the selected voice. - requestAnimationFrame(() => { - this.fire(ToolbarEvent.VOICE_MENU_OPEN); - const selectedItem = - menu.querySelector<HTMLElement>('.item-hidden-false.check-mark'); - selectedItem?.scrollIntoViewIfNeeded(); - }); + private onMenuShown() { + this.fire(ToolbarEvent.VOICE_MENU_OPEN); + const selectedItem = + this.$.voiceSelectionMenu.get().querySelector<HTMLElement>( + '.item-hidden-false.check-mark'); + selectedItem?.scrollIntoViewIfNeeded(); } protected voiceItemTabIndex_(groupIndex: number, voiceIndex: number) {
diff --git a/chrome/browser/sync/test/integration/BUILD.gn b/chrome/browser/sync/test/integration/BUILD.gn index d719c81..8b0ecd6a 100644 --- a/chrome/browser/sync/test/integration/BUILD.gn +++ b/chrome/browser/sync/test/integration/BUILD.gn
@@ -2,7 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("sync_integration_tests.gni") if (is_android) { import("//build/config/android/rules.gni") } else { @@ -43,8 +42,32 @@ "//components/version_info", ] - sources = sync_integration_tests_sources + sources = [ + "single_client_autofill_profile_sync_test.cc", + "single_client_bookmarks_sync_test.cc", + "single_client_collaboration_group_sync_test.cc", + "single_client_contact_info_sync_test.cc", + "single_client_custom_passphrase_sync_test.cc", + "single_client_device_info_sync_test.cc", + "single_client_history_delete_directives_sync_test.cc", + "single_client_history_sync_test.cc", + "single_client_offer_sync_test.cc", + "single_client_plus_address_setting_sync_test.cc", + "single_client_plus_address_sync_test.cc", + "single_client_preferences_sync_test.cc", + "single_client_reading_list_sync_test.cc", + "single_client_shared_tab_group_data_sync_test.cc", + "single_client_standalone_transport_sync_test.cc", + "single_client_sync_invalidations_test.cc", + "sync_exponential_backoff_test.cc", + # TODO(crbug.com/393119606): After enough of the implementation is ready + # (CL #N), add integration tests. Careful, sync_integration_tests runs in CQ + # but android_sync_integration_tests do not. + # TODO(crbug.com/397767033): After enough of the implementation is ready + # (CL #N), add integration tests. Careful, sync_integration_tests runs in CQ + # but android_sync_integration_tests do not. + ] data = [ "//chrome/test/data/sync/" ] if (is_android) { @@ -75,6 +98,102 @@ "$root_gen_dir/components/dev_ui_components_resources.pak", ] } else { # !is_android + sources += [ + "apps_sync_test_base.cc", + "apps_sync_test_base.h", + "enable_disable_test.cc", + "local_sync_test.cc", + "migration_test.cc", + "password_manager_sync_test.cc", + "single_client_app_settings_sync_test.cc", + "single_client_common_sync_test.cc", + "single_client_extension_apps_sync_test.cc", + "single_client_extensions_sync_test.cc", + "single_client_incoming_password_sharing_invitation_test.cc", + "single_client_nigori_sync_test.cc", + "single_client_outgoing_password_sharing_invitation_test.cc", + "single_client_password_sharing_policy_test.cc", + "single_client_passwords_sync_test.cc", + "single_client_polling_sync_test.cc", + "single_client_product_specifications_sync_test.cc", + "single_client_saved_tab_groups_sync_test.cc", + "single_client_search_engines_sync_test.cc", + "single_client_secondary_account_sync_test.cc", + "single_client_send_tab_to_self_sync_test.cc", + "single_client_sessions_sync_test.cc", + "single_client_sharing_message_sync_test.cc", + "single_client_themes_sync_test.cc", + "single_client_user_consents_sync_test.cc", + "single_client_user_events_sync_test.cc", + "single_client_valuables_sync_test.cc", + "single_client_wallet_credential_sync_test.cc", + "single_client_wallet_sync_test.cc", + "single_client_web_apps_sync_generated_icon_fix_sync_test.cc", + "single_client_web_apps_sync_test.cc", + "single_client_webauthn_credentials_sync_test.cc", + "sync_auth_test.cc", + "sync_errors_test.cc", + + # Tests with two clients can't run on Android. + "two_client_app_settings_sync_test.cc", + "two_client_autocomplete_sync_test.cc", + "two_client_autofill_sync_test.cc", + "two_client_bookmarks_sync_test.cc", + "two_client_contact_info_sync_test.cc", + "two_client_custom_passphrase_sync_test.cc", + "two_client_extension_apps_sync_test.cc", + "two_client_extension_settings_sync_test.cc", + "two_client_extensions_sync_test.cc", + "two_client_history_sync_test.cc", + "two_client_passwords_sync_test.cc", + "two_client_power_bookmarks_sync_test.cc", + "two_client_preferences_sync_test.cc", + "two_client_search_engines_sync_test.cc", + "two_client_send_tab_to_self_sync_test.cc", + "two_client_sessions_sync_test.cc", + "two_client_shared_tab_group_data_sync_test.cc", + "two_client_themes_sync_test.cc", + "two_client_user_events_sync_test.cc", + "two_client_wallet_credential_sync_test.cc", + "two_client_wallet_sync_test.cc", + "two_client_web_apps_bmo_sync_test.cc", + "two_client_web_apps_generated_icon_fix_test.cc", + "two_client_web_apps_integration_test.cc", + "two_client_web_apps_integration_test_base.cc", + "two_client_web_apps_integration_test_base.h", + "two_client_web_apps_sync_test.cc", + "two_client_webauthn_credentials_sync_test.cc", + "web_apps_sync_test_base.cc", + "web_apps_sync_test_base.h", + ] + if (!is_mac) { + # Dictionary sync is disabled on Mac. + sources += [ + "single_client_dictionary_sync_test.cc", + "two_client_dictionary_sync_test.cc", + ] + } + if (is_win || is_mac || is_linux) { + sources += [ "two_client_web_apps_integration_test_mac_win_linux.cc" ] + } + if (is_win || is_linux) { + sources += [ "two_client_web_apps_integration_test_win_linux.cc" ] + } + if (is_mac) { + sources += [ "two_client_web_apps_integration_test_mac.cc" ] + } + if (is_win) { + sources += [ "two_client_web_apps_integration_test_win.cc" ] + } + if (is_chromeos) { + sources += [ "two_client_web_apps_integration_test_cros.cc" ] + } + if (!is_chromeos) { + sources += [ + "select_type_and_migrate_local_data_items_when_active_sync_test.cc", + ] + } + deps += [ "//chrome:packed_resources", "//chrome:resources",
diff --git a/chrome/browser/sync/test/integration/sync_integration_tests.gni b/chrome/browser/sync/test/integration/sync_integration_tests.gni deleted file mode 100644 index 93b69a6..0000000 --- a/chrome/browser/sync/test/integration/sync_integration_tests.gni +++ /dev/null
@@ -1,124 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. -sync_integration_tests_sources = [ - "//chrome/browser/sync/test/integration/single_client_autofill_profile_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_collaboration_group_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_contact_info_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_custom_passphrase_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_device_info_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_history_delete_directives_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_history_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_offer_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_plus_address_setting_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_plus_address_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_reading_list_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_shared_tab_group_data_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc", - "//chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc", - - # TODO(crbug.com/393119606): After enough of the implementation is ready - # (CL #N), add integration tests. Careful, sync_integration_tests runs in CQ - # but android_sync_integration_tests do not. - # TODO(crbug.com/397767033): After enough of the implementation is ready - # (CL #N), add integration tests. Careful, sync_integration_tests runs in CQ - # but android_sync_integration_tests do not. -] -if (!is_android) { - sync_integration_tests_sources += [ - "//chrome/browser/sync/test/integration/apps_sync_test_base.cc", - "//chrome/browser/sync/test/integration/apps_sync_test_base.h", - "//chrome/browser/sync/test/integration/enable_disable_test.cc", - "//chrome/browser/sync/test/integration/local_sync_test.cc", - "//chrome/browser/sync/test/integration/migration_test.cc", - "//chrome/browser/sync/test/integration/password_manager_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_app_settings_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_common_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_extension_apps_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_extensions_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_incoming_password_sharing_invitation_test.cc", - "//chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_outgoing_password_sharing_invitation_test.cc", - "//chrome/browser/sync/test/integration/single_client_password_sharing_policy_test.cc", - "//chrome/browser/sync/test/integration/single_client_passwords_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_polling_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_product_specifications_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_saved_tab_groups_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_search_engines_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_send_tab_to_self_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_sharing_message_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_themes_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_user_events_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_valuables_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_wallet_credential_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_wallet_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_web_apps_sync_generated_icon_fix_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc", - "//chrome/browser/sync/test/integration/single_client_webauthn_credentials_sync_test.cc", - "//chrome/browser/sync/test/integration/sync_auth_test.cc", - "//chrome/browser/sync/test/integration/sync_errors_test.cc", - - # Tests with two clients can't run on Android. - "//chrome/browser/sync/test/integration/two_client_app_settings_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_autocomplete_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_autofill_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_contact_info_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_custom_passphrase_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_extension_apps_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_extension_settings_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_history_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_passwords_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_power_bookmarks_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_preferences_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_search_engines_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_send_tab_to_self_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_sessions_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_shared_tab_group_data_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_themes_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_user_events_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_wallet_credential_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_web_apps_generated_icon_fix_test.cc", - "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test.cc", - "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.cc", - "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_base.h", - "//chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_webauthn_credentials_sync_test.cc", - "//chrome/browser/sync/test/integration/web_apps_sync_test_base.cc", - "//chrome/browser/sync/test/integration/web_apps_sync_test_base.h", - ] - if (!is_mac) { - # Dictionary sync is disabled on Mac. - sync_integration_tests_sources += [ - "//chrome/browser/sync/test/integration/single_client_dictionary_sync_test.cc", - "//chrome/browser/sync/test/integration/two_client_dictionary_sync_test.cc", - ] - } -} -if (is_win || is_mac || is_linux) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac_win_linux.cc" ] -} -if (is_win || is_linux) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_win_linux.cc" ] -} -if (is_mac) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_mac.cc" ] -} -if (is_win) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_win.cc" ] -} -if (is_chromeos) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/two_client_web_apps_integration_test_cros.cc" ] -} -if (!is_chromeos && !is_android) { - sync_integration_tests_sources += [ "//chrome/browser/sync/test/integration/select_type_and_migrate_local_data_items_when_active_sync_test.cc" ] -}
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc index 860fe8c9..73d2f18 100644 --- a/chrome/browser/sync_file_system/sync_file_system_service.cc +++ b/chrome/browser/sync_file_system/sync_file_system_service.cc
@@ -20,7 +20,6 @@ #include "base/memory/ref_counted.h" #include "base/observer_list.h" #include "base/task/single_thread_task_runner.h" -#include "chrome/browser/apps/platform_apps/api/deprecation_features.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/sync_file_system/local/local_file_sync_service.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index cc5375c..a0c464bd 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3627,10 +3627,6 @@ if (toolkit_views) { sources += [ "bubble_anchor_util.h", - "sharing_hub/screenshot/screenshot_captured_bubble_controller.cc", - "sharing_hub/screenshot/screenshot_captured_bubble_controller.h", - "sharing_hub/sharing_hub_bubble_controller.h", - "sharing_hub/sharing_hub_bubble_view.h", "side_search/side_search_prefs.cc", "side_search/side_search_prefs.h", "sync/one_click_signin_links_delegate.h", @@ -3916,8 +3912,6 @@ "views/desktop_capture/desktop_media_source_view.h", "views/desktop_capture/desktop_media_tab_list.cc", "views/desktop_capture/desktop_media_tab_list.h", - "views/desktop_capture/rounded_corner_image_view.cc", - "views/desktop_capture/rounded_corner_image_view.h", "views/desktop_capture/screen_capture_permission_checker.cc", "views/desktop_capture/screen_capture_permission_checker.h", "views/desktop_capture/share_audio_view.cc", @@ -4975,6 +4969,8 @@ "//chrome/browser/ui/qrcode_generator:impl", "//chrome/browser/ui/send_tab_to_self", "//chrome/browser/ui/send_tab_to_self:impl", + "//chrome/browser/ui/sharing_hub", + "//chrome/browser/ui/sharing_hub:impl", "//chrome/browser/ui/views", "//chrome/browser/ui/views/bubble", "//chrome/browser/ui/views/download", @@ -5043,6 +5039,7 @@ "//chrome/browser/ui/views", "//chrome/browser/ui/views/bubble", "//chrome/browser/ui/commerce:impl", + "//chrome/browser/ui/sharing_hub:impl", # TODO(crbug.com/413572035): Remove circular dependency once/if # chrome_{typography,layout_provider} get modularized. @@ -5072,15 +5069,7 @@ } if (is_chromeos) { - sources += [ - "sharing_hub/sharing_hub_bubble_controller_chromeos_impl.cc", - "sharing_hub/sharing_hub_bubble_controller_chromeos_impl.h", - "views/status_icons/status_tray_chromeos.cc", - ] - - # TODO(crbug.com/419210492): Remove this dep when sharing_hub_bubble_controller_chromeos_impl.h (above) - # gets componentized. - public_deps += [ "//chrome/browser/sharesheet" ] + sources += [ "views/status_icons/status_tray_chromeos.cc" ] deps += [ "//chromeos/ash/experiences/arc/intent_helper:arc_intent_helper_constants", @@ -5171,8 +5160,6 @@ if (!is_chromeos) { sources += [ "idle_dialog.h", - "sharing_hub/sharing_hub_bubble_controller_desktop_impl.cc", - "sharing_hub/sharing_hub_bubble_controller_desktop_impl.h", "sync/sync_passphrase_dialog.cc", "sync/sync_passphrase_dialog.h", "views/accessibility/accessibility_focus_highlight.cc", @@ -5335,6 +5322,7 @@ "//chrome/browser/policy:policy_util", "//chrome/browser/profiles", "//chrome/browser/ui/extensions:extension_enable_flow_delegate", + "//chrome/browser/ui/webui/extensions_zero_state_promo:mojo_bindings", "//chrome/browser/web_applications", "//chrome/browser/web_applications/app_service", "//chrome/browser/web_share_target", @@ -5459,6 +5447,10 @@ "web_applications/webui_web_app_navigation_throttle.h", "webui/extensions/extension_basic_info.cc", "webui/extensions/extension_basic_info.h", + "webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc", + "webui/extensions_zero_state_promo/zero_state_promo_page_handler.h", + "webui/extensions_zero_state_promo/zero_state_promo_ui.cc", + "webui/extensions_zero_state_promo/zero_state_promo_ui.h", ] if (is_mac) { @@ -5602,10 +5594,6 @@ "crypto_module_delegate_nss.h", "crypto_module_password_dialog_nss.cc", "crypto_module_password_dialog_nss.h", - "webui/certificate_manager_localized_strings_provider.cc", - "webui/certificate_manager_localized_strings_provider.h", - "webui/certificates_handler.cc", - "webui/certificates_handler.h", ] if (use_aura) { @@ -5633,7 +5621,12 @@ "webui/certificate_manager/user_cert_sources.cc", "webui/certificate_manager/user_cert_sources.h", ] - if (!is_chromeos) { + if (is_chromeos) { + sources += [ + "webui/certificates_handler.cc", + "webui/certificates_handler.h", + ] + } else { sources += [ "webui/certificate_manager/platform_cert_sources.cc", "webui/certificate_manager/platform_cert_sources.h",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 7278364..86a5966 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -4375,12 +4375,6 @@ <message name="IDS_MENU_NEW_TAB_GROUP" desc="Menu item for opening a new tab group. [CHAR_LIMIT=27]"> New tab group </message> - <message name="IDS_MENU_ADD_TO_GROUP" desc="Menu item for adding a tab to a group. [CHAR_LIMIT=27]"> - Add to group - </message> - <message name="IDS_MENU_ADD_TO_NEW_GROUP" desc="Menu item for adding a tab to a new group. [CHAR_LIMIT=27]"> - Add to new group - </message> <message name="IDS_MENU_BOOKMARKS" desc="Menu item for opening the bookmarks page that contains all the user's bookmarks. [CHAR_LIMIT=27]"> Bookmarks </message> @@ -4476,6 +4470,9 @@ <message name="IDS_MENU_ADD_TAB_TO_NEW_GROUP" desc="Menu item for adding a tab to a new tab group."> Add tab to new group </message> + <message name="IDS_MENU_MOVE_TAB_TO_GROUP" desc="Menu item for moving a tab to another group."> + Move tab to group + </message> <message name="IDS_MENU_OPEN_WITH" desc="Menu item to open the content with another app."> Open with… </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_GROUP.png.sha1 deleted file mode 100644 index 8c4e59d..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_GROUP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -5b8eadad38af8929dacf3e16acdb4a9bc990c85c \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_NEW_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_NEW_GROUP.png.sha1 deleted file mode 100644 index cb34f27..0000000 --- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_ADD_TO_NEW_GROUP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -b24a769419194dbc56b4f44cf6436b7fd4b470ee \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_GROUP.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_GROUP.png.sha1 new file mode 100644 index 0000000..e8bff82 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_MENU_MOVE_TAB_TO_GROUP.png.sha1
@@ -0,0 +1 @@ +6ccf44aea7419b2ab4026b4e9d176e92dc50887e \ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index 61d2aa6..47f925f2 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -240,6 +240,7 @@ "java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListMediator.java", "java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionsBridge.java", "java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManagerImpl.java", + "java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuButtonCoordinator.java", ] } } @@ -314,6 +315,7 @@ "java/res/drawable-xxxhdpi/incognito_simple.png", "java/res/drawable-xxxhdpi/incognito_small.png", "java/res/drawable-xxxhdpi/popup_bg_bottom.9.png", + "java/res/drawable/chrome_extension.xml", "java/res/drawable/home_surface_search_box_background.xml", "java/res/drawable/ic_close_all_tabs.xml", "java/res/drawable/ic_switch_out_of_incognito.xml",
diff --git a/chrome/browser/ui/android/toolbar/java/res/drawable/chrome_extension.xml b/chrome/browser/ui/android/toolbar/java/res/drawable/chrome_extension.xml new file mode 100644 index 0000000..f08b267 --- /dev/null +++ b/chrome/browser/ui/android/toolbar/java/res/drawable/chrome_extension.xml
@@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2025 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + <path + android:fillColor="@android:color/white" + android:pathData="M200,840Q167,840 143.5,816.5Q120,793 120,760L120,608Q168,608 204,577.5Q240,547 240,500Q240,453 204,422.5Q168,392 120,392L120,240Q120,207 143.5,183.5Q167,160 200,160L360,160Q360,118 389,89Q418,60 460,60Q502,60 531,89Q560,118 560,160L720,160Q753,160 776.5,183.5Q800,207 800,240L800,400Q842,400 871,429Q900,458 900,500Q900,542 871,571Q842,600 800,600L800,760Q800,793 776.5,816.5Q753,840 720,840L200,840ZM200,760L720,760L720,240L200,240L200,328Q254,348 287,395Q320,442 320,500Q320,557 287,604Q254,651 200,672L200,760ZM460,500L460,500L460,500Q460,500 460,500Q460,500 460,500Q460,500 460,500L460,500L460,500Z"/> +</vector> \ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/java/res/layout/extension_toolbar_container.xml b/chrome/browser/ui/android/toolbar/java/res/layout/extension_toolbar_container.xml index 04f32ff9..dfd61af 100644 --- a/chrome/browser/ui/android/toolbar/java/res/layout/extension_toolbar_container.xml +++ b/chrome/browser/ui/android/toolbar/java/res/layout/extension_toolbar_container.xml
@@ -7,6 +7,22 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="match_parent" - android:orientation="horizontal" /> + android:orientation="horizontal" > + + <LinearLayout + android:id="@+id/extension_action_list" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:orientation="horizontal"/> + + <org.chromium.ui.listmenu.ListMenuButton + android:id="@+id/extensions_menu_button" + style="@style/ToolbarHoverableButton" + android:src="@drawable/chrome_extension" + app:menuVerticalOverlapAnchor="false" + app:tint="@color/default_icon_color_tint_list"/> + +</LinearLayout>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java index ad60b79..bce4f97 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
@@ -117,11 +117,14 @@ private final ControlContainer mControlContainer; private final ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier; private final BrowserControlsSizer mBrowserControlsSizer; + private final ObservableSupplierImpl<Integer> mControlContainerHeightSupplier; private final ObservableSupplier<Boolean> mIsKeyboardAccessorySheetShowing; private final MiniOriginWindowInsetsAnimationListener mWindowInsetsAnimationListener; + private final Callback<Boolean> mAccessorySheetShowingObserver; private @MiniOriginState int mMiniOriginBarState = MiniOriginState.NOT_READY; private FrameLayout.LayoutParams mDefaultLocationBarLayoutParams; private final TouchEventObserver mTouchEventObserver; + private final InsetObserver mInsetObserver; private final int mDefaultLocationBarRightPadding; // The starting horizontal position of the location bar when the mini origin bar is in its // least-minimized state. @@ -150,6 +153,7 @@ BrowserControlsSizer browserControlsSizer, InsetObserver insetObserver, ObservableSupplierImpl<Integer> controlContainerTranslationSupplier, + ObservableSupplierImpl<Integer> controlContainerHeightSupplier, ObservableSupplier<Boolean> isKeyboardAccessorySheetShowing) { mLocationBar = locationBar; mIsFormFieldFocusedSupplier = isFormFieldFocusedSupplier; @@ -158,7 +162,9 @@ mControlContainer = controlContainer; mSuppressToolbarSceneLayerSupplier = suppressToolbarSceneLayerSupplier; mBrowserControlsSizer = browserControlsSizer; + mControlContainerHeightSupplier = controlContainerHeightSupplier; mIsKeyboardAccessorySheetShowing = isKeyboardAccessorySheetShowing; + mInsetObserver = insetObserver; mDefaultLocationBarRightPadding = mLocationBar.getContainerView().getPaddingRight(); mDefaultLocationBarLayoutParams = (FrameLayout.LayoutParams) mLocationBar.getContainerView().getLayoutParams(); @@ -177,7 +183,7 @@ : MiniOriginEvent.KEYBOARD_ANIMATION_ENDED), this::updateAnimationProgress, this::waitingForImeAnimationToStart); - insetObserver.addWindowInsetsAnimationListener(mWindowInsetsAnimationListener); + mInsetObserver.addWindowInsetsAnimationListener(mWindowInsetsAnimationListener); mIsFormFieldFocusedObserver = (focused) -> { @@ -210,12 +216,13 @@ }; controlContainer.addTouchEventObserver(mTouchEventObserver); - mIsKeyboardAccessorySheetShowing.addObserver( + mAccessorySheetShowingObserver = (showing) -> updateMiniOriginBarState( showing ? MiniOriginEvent.ACCESSORY_SHEET_APPEARED - : MiniOriginEvent.ACCESSORY_SHEET_DISAPPEARED)); + : MiniOriginEvent.ACCESSORY_SHEET_DISAPPEARED); + mIsKeyboardAccessorySheetShowing.addObserver(mAccessorySheetShowingObserver); } private void updateMiniOriginBarState(@MiniOriginEvent int event) { @@ -271,6 +278,7 @@ int newControlContainerHeight = mContext.getResources().getDimensionPixelSize(R.dimen.mini_origin_bar_height); + mControlContainerHeightSupplier.set(newControlContainerHeight); mControlContainer.mutateLayoutParams().height = newControlContainerHeight; var minifiedLayoutParams = new FrameLayout.LayoutParams( @@ -304,6 +312,7 @@ mControlContainer.toggleLocationBarOnlyMode(false); mControlContainer.mutateLayoutParams().height = LayoutParams.WRAP_CONTENT; + mControlContainerHeightSupplier.set(LayoutParams.WRAP_CONTENT); var locationBarView = mLocationBar.getContainerView(); locationBarView.setLayoutParams(mDefaultLocationBarLayoutParams); @@ -318,7 +327,9 @@ public void destroy() { mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener(mKeyboardVisibilityObserver); mIsFormFieldFocusedSupplier.removeObserver(mIsFormFieldFocusedObserver); + mIsKeyboardAccessorySheetShowing.removeObserver(mAccessorySheetShowingObserver); mBrowserControlsSizer.removeObserver(this); + mInsetObserver.removeWindowInsetsAnimationListener(mWindowInsetsAnimationListener); } @Override
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java index bcdc3f44..ee3deebe 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
@@ -81,6 +81,9 @@ new ObservableSupplierImpl<>(false); ObservableSupplierImpl<Integer> mControlContainerTranslationSupplier = new ObservableSupplierImpl<>(0); + + ObservableSupplierImpl<Integer> mControlContainerHeightSupplier = + new ObservableSupplierImpl<>(LayoutParams.WRAP_CONTENT); private final ObservableSupplierImpl<Boolean> mIsKeyboardAccessorySheetShowing = new ObservableSupplierImpl<>(false); @@ -110,6 +113,7 @@ mBrowserControlsSizer, mInsetObserver, mControlContainerTranslationSupplier, + mControlContainerHeightSupplier, mIsKeyboardAccessorySheetShowing); } @@ -133,6 +137,9 @@ mLayoutParamsCaptor.getValue().height); Assert.assertEquals( MiniOriginState.SHOWING, mMiniOriginBarController.getCurrentStateForTesting()); + Assert.assertEquals( + mContext.getResources().getDimensionPixelSize(R.dimen.mini_origin_bar_height), + mControlContainerHeightSupplier.get().intValue()); mKeyboardVisibilityDelegate.setVisibilityForTests(false); verify(mLocationBar).setShowOriginOnly(false); @@ -140,6 +147,8 @@ assertEquals(LayoutParams.WRAP_CONTENT, mControlContainerLayoutParams.height); assertEquals(Gravity.TOP, mLocationBarLayoutParams.gravity); Assert.assertEquals( + LayoutParams.WRAP_CONTENT, mControlContainerHeightSupplier.get().intValue()); + Assert.assertEquals( MiniOriginState.READY, mMiniOriginBarController.getCurrentStateForTesting()); }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java index 9ae1ba4..8a59985 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java
@@ -17,6 +17,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout.LayoutParams; +import org.chromium.base.Callback; import org.chromium.base.DeviceInfo; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.ObservableSupplier; @@ -36,6 +37,7 @@ import org.chromium.chrome.browser.toolbar.settings.AddressBarPreference; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.ui.KeyboardVisibilityDelegate; +import org.chromium.ui.KeyboardVisibilityDelegate.KeyboardVisibilityListener; import org.chromium.ui.base.DeviceFormFactor; import java.lang.annotation.Retention; @@ -90,11 +92,27 @@ private final Context mContext; private final ObservableSupplier<Integer> mKeyboardAccessoryHeightSupplier; private final ObservableSupplier<Integer> mControlContainerTranslationSupplier; + private final ObservableSupplier<Integer> mControlContainerHeightSupplier; private final Handler mHandler; @LayerVisibility private int mLayerVisibility; + private int mControlContainerHeight; private final BottomControlsLayerWithOffset mBottomToolbarLayer; private final BottomControlsLayerWithOffset mProgressBarLayer; + private final Callback<Boolean> mIsNtpShowingObserver; + private final Callback<Boolean> mIsTabSwitcherFinishedShowingObserver; + private final Callback<Boolean> mIsOmniboxFocusedObserver; + private final Callback<Boolean> mIsFormFieldFocusedObserver; + private final Callback<Boolean> mIsFindInPageShowingObserver; + private final KeyboardVisibilityListener mKeyboardVisibilityListener; + private final Callback<Integer> mKeyboardAccessoryToolbarCallback; + private final Callback<Integer> mKeyboardAccessoryProgressBarCallback; + private final KeyboardVisibilityListener mKeyboardVisibilityViewOffsetCallback; + private final Callback<Boolean> mFormFieldViewOffsetCallback; + private final Callback<Integer> mControlContainerTranslationCallback; + private final Callback<Integer> mControlContainerHeightCallback; + private final SharedPreferences mSharedPreferences; + @ControlsPosition private int mCurrentPosition; private final int mHairlineHeight; @@ -115,6 +133,9 @@ * @param keyboardAccessoryHeightSupplier Supplier of the height of the keyboard accessory, * which stacks on top of the soft keyboard. * @param controlContainer The control container for the current context. + * @param controlContainerHeightSupplier Supplier of an override current height of the control + * container. If the value is equal to LayoutParams.WRAP_CONTENT, it should be understood as + * meaning that the height should no longer be overridden. * @param bottomControlsStacker {@link BottomControlsStacker} used to harmonize the position of * the bottom toolbar with other bottom-anchored UI. */ @@ -133,6 +154,7 @@ ObservableSupplierImpl<Integer> browserControlsOffsetSupplier, View toolbarProgressBarContainer, ObservableSupplier<Integer> controlContainerTranslationSupplier, + ObservableSupplier<Integer> controlContainerHeightSupplier, Handler handler, Context context) { mBrowserControlsSizer = browserControlsSizer; @@ -148,20 +170,30 @@ mBrowserControlsOffsetSupplier = browserControlsOffsetSupplier; mToolbarProgressBarContainer = toolbarProgressBarContainer; mControlContainerTranslationSupplier = controlContainerTranslationSupplier; + mControlContainerHeightSupplier = controlContainerHeightSupplier; mContext = context; mCurrentPosition = mBrowserControlsSizer.getControlsPosition(); mHairlineHeight = context.getResources().getDimensionPixelSize(R.dimen.toolbar_hairline_height); - mIsNtpShowingSupplier.addObserver((showing) -> updateCurrentPosition()); - mIsTabSwitcherFinishedShowingSupplier.addObserver((showing) -> updateCurrentPosition()); - mIsOmniboxFocusedSupplier.addObserver((focused) -> updateCurrentPosition()); - mIsFormFieldFocusedSupplier.addObserver( - (focused) -> updateCurrentPosition(/* formFieldStateChanged= */ true, false)); - mIsFindInPageShowingSupplier.addObserver((showing) -> updateCurrentPosition()); - mKeyboardVisibilityDelegate.addKeyboardVisibilityListener( - (showing) -> updateCurrentPosition(/* formFieldStateChanged= */ true, false)); - sharedPreferences.registerOnSharedPreferenceChangeListener(this); + + mIsNtpShowingObserver = (showing) -> updateCurrentPosition(); + mIsTabSwitcherFinishedShowingObserver = (showing) -> updateCurrentPosition(); + mIsOmniboxFocusedObserver = (focused) -> updateCurrentPosition(); + mIsFormFieldFocusedObserver = + (focused) -> updateCurrentPosition(/* formFieldStateChanged= */ true, false); + mIsFindInPageShowingObserver = (showing) -> updateCurrentPosition(); + mKeyboardVisibilityListener = + (showing) -> updateCurrentPosition(/* formFieldStateChanged= */ true, false); + + mIsNtpShowingSupplier.addObserver(mIsNtpShowingObserver); + mIsTabSwitcherFinishedShowingSupplier.addObserver(mIsTabSwitcherFinishedShowingObserver); + mIsOmniboxFocusedSupplier.addObserver(mIsOmniboxFocusedObserver); + mIsFormFieldFocusedSupplier.addObserver(mIsFormFieldFocusedObserver); + mIsFindInPageShowingSupplier.addObserver(mIsFindInPageShowingObserver); + mKeyboardVisibilityDelegate.addKeyboardVisibilityListener(mKeyboardVisibilityListener); + mSharedPreferences = sharedPreferences; + mSharedPreferences.registerOnSharedPreferenceChangeListener(this); recordStartupPosition(isToolbarConfiguredToShowOnTop()); mLayerVisibility = LayerVisibility.HIDDEN; @@ -186,7 +218,7 @@ @Override public int getHeight() { - return mControlContainer.getToolbarHeight(); + return mControlContainerHeight; } @Override @@ -243,20 +275,48 @@ mBottomControlsStacker.addLayer(mBottomToolbarLayer); mBottomControlsStacker.addLayer(mProgressBarLayer); - mKeyboardAccessoryHeightSupplier.addObserver( - (height) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView())); - mKeyboardAccessoryHeightSupplier.addObserver( - (height) -> updateViewOffset(mProgressBarLayer, mToolbarProgressBarContainer)); + + mKeyboardAccessoryToolbarCallback = + (height) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView()); + mKeyboardAccessoryProgressBarCallback = + (height) -> updateViewOffset(mProgressBarLayer, mToolbarProgressBarContainer); + mKeyboardVisibilityViewOffsetCallback = + (showing) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView()); + mFormFieldViewOffsetCallback = + (focused) -> updateViewOffset(mProgressBarLayer, mToolbarProgressBarContainer); + mControlContainerTranslationCallback = + (offset) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView()); + mControlContainerHeightCallback = this::updateControlContainerHeight; + mControlContainerHeightSupplier.addSyncObserverAndCallIfNonNull( + mControlContainerHeightCallback); + + mKeyboardAccessoryHeightSupplier.addObserver(mKeyboardAccessoryToolbarCallback); + mKeyboardAccessoryHeightSupplier.addObserver(mKeyboardAccessoryProgressBarCallback); mKeyboardVisibilityDelegate.addKeyboardVisibilityListener( - (showing) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView())); - mIsFormFieldFocusedSupplier.addObserver( - (focused) -> updateViewOffset(mProgressBarLayer, mToolbarProgressBarContainer)); - mControlContainerTranslationSupplier.addObserver( - (offset) -> updateViewOffset(mBottomToolbarLayer, mControlContainer.getView())); + mKeyboardVisibilityViewOffsetCallback); + mIsFormFieldFocusedSupplier.addObserver(mFormFieldViewOffsetCallback); + mControlContainerTranslationSupplier.addObserver(mControlContainerTranslationCallback); updateCurrentPosition(); mHandler = handler; } + public void destroy() { + mIsNtpShowingSupplier.removeObserver(mIsNtpShowingObserver); + mIsTabSwitcherFinishedShowingSupplier.removeObserver(mIsTabSwitcherFinishedShowingObserver); + mIsOmniboxFocusedSupplier.removeObserver(mIsOmniboxFocusedObserver); + mIsFormFieldFocusedSupplier.removeObserver(mIsFormFieldFocusedObserver); + mIsFindInPageShowingSupplier.removeObserver(mIsFindInPageShowingObserver); + mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener(mKeyboardVisibilityListener); + mSharedPreferences.unregisterOnSharedPreferenceChangeListener(this); + mKeyboardAccessoryHeightSupplier.removeObserver(mKeyboardAccessoryToolbarCallback); + mKeyboardAccessoryHeightSupplier.removeObserver(mKeyboardAccessoryProgressBarCallback); + mKeyboardVisibilityDelegate.removeKeyboardVisibilityListener( + mKeyboardVisibilityViewOffsetCallback); + mIsFormFieldFocusedSupplier.removeObserver(mFormFieldViewOffsetCallback); + mControlContainerTranslationSupplier.removeObserver(mControlContainerTranslationCallback); + mControlContainerHeightSupplier.removeObserver(mControlContainerHeightCallback); + } + /** * Returns whether the given {context, device, cct-ness} combo is eligible for toolbar position * customization. @@ -484,6 +544,16 @@ } } + private void updateControlContainerHeight(int height) { + if (height == LayoutParams.WRAP_CONTENT) { + mControlContainerHeight = mControlContainer.getToolbarHeight(); + } else { + mControlContainerHeight = height; + } + + mBottomControlsStacker.requestLayerUpdate(false); + } + /** Returns whether the toolbar will be shown on top for the supplied tab. */ public static boolean shouldShowToolbarOnTop(Tab tab) { boolean isRegularNtp =
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java index 322cee6..6d91fa7 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java
@@ -257,6 +257,8 @@ new ObservableSupplierImpl<>(0); private final ObservableSupplierImpl<Integer> mControlContainerTranslationSupplier = new ObservableSupplierImpl<>(0); + private final ObservableSupplierImpl<Integer> mControlContainerHeightSupplier = + new ObservableSupplierImpl<>(LayoutParams.WRAP_CONTENT); private HistogramWatcher mStartupExpectation; private WindowAndroid mWindowAndroid; @@ -322,6 +324,7 @@ mBottomToolbarOffsetSupplier, mProgressBarContainer, mControlContainerTranslationSupplier, + mControlContainerHeightSupplier, new Handler(Looper.getMainLooper()), mContext); } @@ -852,6 +855,26 @@ assertControlsAtTop(); } + @Test + @EnableFeatures({ChromeFeatureList.ANDROID_BOTTOM_TOOLBAR, ChromeFeatureList.MINI_ORIGIN_BAR}) + public void testControlContainerHeightAdjustments() { + setUserToolbarAnchorPreference(/* showToolbarOnTop= */ false); + mIsFormFieldFocused.onNodeAttributeUpdated(true, false); + mKeyboardVisibilityDelegate.setVisibilityForTests(true); + assertControlsAtBottom(); + assertEquals(TOOLBAR_HEIGHT, mBottomControlsStacker.getTotalHeight()); + + mControlContainerHeightSupplier.set(15); + assertEquals(15, mBottomControlsStacker.getTotalHeight()); + } + + @Test + public void testDestroy() { + mController.destroy(); + setUserToolbarAnchorPreference(/* showToolbarOnTop= */ false); + assertControlsAtTop(); + } + private void assertControlsAtBottom() { assertEquals(ControlsPosition.BOTTOM, mBrowserControlsSizer.getControlsPosition()); assertEquals(0, mBrowserControlsSizer.getTopControlsHeight());
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java index 5971b59d..16b85cb 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarTest.java
@@ -393,8 +393,6 @@ Drawable drawable = mProgressBar.getDrawable(); assertTrue(drawable instanceof LayerDrawable); LayerDrawable layerDrawable = (LayerDrawable) drawable; - assertEquals(2, layerDrawable.getNumberOfLayers()); - assertTrue(layerDrawable.getDrawable(0) instanceof ClipDrawable); - assertTrue(layerDrawable.getDrawable(1) instanceof ClipDrawable); + assertTrue(layerDrawable.getNumberOfLayers() > 1); } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java index 4f12fd69..5ff0ad77 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionActionListCoordinator.java
@@ -6,7 +6,6 @@ import android.content.Context; import android.view.LayoutInflater; -import android.view.ViewStub; import android.widget.LinearLayout; import org.chromium.base.lifetime.Destroyable; @@ -34,10 +33,9 @@ public ExtensionActionListCoordinator( Context context, - ViewStub containerStub, + LinearLayout container, ObservableSupplier<Profile> profileSupplier, ObservableSupplier<Tab> currentTabSupplier) { - LinearLayout container = (LinearLayout) containerStub.inflate(); ModelList models = new ModelList(); mMediator = new ExtensionActionListMediator(models, profileSupplier, currentTabSupplier); mAdapter =
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManager.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManager.java index 5b4915a..15f27d8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManager.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManager.java
@@ -14,6 +14,7 @@ import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.theme.ThemeColorProvider; /** Provides extension-related buttons for {@link ToolbarManager}. */ @NullMarked @@ -23,7 +24,8 @@ Context context, ViewStub extensionToolbarStub, ObservableSupplier<Profile> profileSupplier, - ObservableSupplier<Tab> currentTabSupplier); + ObservableSupplier<Tab> currentTabSupplier, + ThemeColorProvider themeColorProvider); /** Instantiates the implementation of {@link ExtensionToolbarManager} if it is available. */ @Nullable @@ -31,13 +33,19 @@ Context context, ViewStub extensionToolbarStub, ObservableSupplier<Profile> profileSupplier, - ObservableSupplier<Tab> currentTabSupplier) { + ObservableSupplier<Tab> currentTabSupplier, + ThemeColorProvider themeColorProvider) { ExtensionToolbarManager manager = ServiceLoaderUtil.maybeCreate(ExtensionToolbarManager.class); if (manager == null) { return null; } - manager.initialize(context, extensionToolbarStub, profileSupplier, currentTabSupplier); + manager.initialize( + context, + extensionToolbarStub, + profileSupplier, + currentTabSupplier, + themeColorProvider); return manager; } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManagerImpl.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManagerImpl.java index 1c2e4782..208a1f5d 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManagerImpl.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionToolbarManagerImpl.java
@@ -6,6 +6,7 @@ import android.content.Context; import android.view.ViewStub; +import android.widget.LinearLayout; import org.chromium.base.lifetime.LifetimeAssert; import org.chromium.base.supplier.ObservableSupplier; @@ -14,6 +15,9 @@ import org.chromium.build.annotations.ServiceImpl; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.theme.ThemeColorProvider; +import org.chromium.chrome.browser.toolbar.R; +import org.chromium.ui.listmenu.ListMenuButton; /** * Implements extension-related buttons for {@link ToolbarManager}. @@ -25,6 +29,7 @@ public class ExtensionToolbarManagerImpl implements ExtensionToolbarManager { @Nullable private final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); @Nullable private ExtensionActionListCoordinator mExtensionActionListCoordinator; + @Nullable private ExtensionsMenuButtonCoordinator mExtensionsMenuButtonCoordinator; public ExtensionToolbarManagerImpl() {} @@ -33,10 +38,19 @@ Context context, ViewStub extensionToolbarStub, ObservableSupplier<Profile> profileSupplier, - ObservableSupplier<Tab> currentTabSupplier) { + ObservableSupplier<Tab> currentTabSupplier, + ThemeColorProvider themeColorProvider) { + LinearLayout container = (LinearLayout) extensionToolbarStub.inflate(); + + LinearLayout actionListContainer = container.findViewById(R.id.extension_action_list); mExtensionActionListCoordinator = new ExtensionActionListCoordinator( - context, extensionToolbarStub, profileSupplier, currentTabSupplier); + context, actionListContainer, profileSupplier, currentTabSupplier); + + ListMenuButton extensionsMenuButton = container.findViewById(R.id.extensions_menu_button); + mExtensionsMenuButtonCoordinator = + new ExtensionsMenuButtonCoordinator( + context, extensionsMenuButton, themeColorProvider); } @Override @@ -45,6 +59,10 @@ mExtensionActionListCoordinator.destroy(); mExtensionActionListCoordinator = null; } + if (mExtensionsMenuButtonCoordinator != null) { + mExtensionsMenuButtonCoordinator.destroy(); + mExtensionsMenuButtonCoordinator = null; + } LifetimeAssert.setSafeToGc(mLifetimeAssert, true); } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuButtonCoordinator.java new file mode 100644 index 0000000..9c97bdc --- /dev/null +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/extensions/ExtensionsMenuButtonCoordinator.java
@@ -0,0 +1,58 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.toolbar.extensions; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.view.View; + +import androidx.core.widget.ImageViewCompat; + +import org.chromium.base.lifetime.Destroyable; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; +import org.chromium.chrome.browser.theme.ThemeColorProvider; +import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; +import org.chromium.ui.listmenu.ListMenuButton; + +/** Root component for the extension menu button. */ +@NullMarked +public class ExtensionsMenuButtonCoordinator implements Destroyable { + + private final ListMenuButton mExtensionsMenuButton; + private final ThemeColorProvider mThemeColorProvider; + private final ThemeColorProvider.TintObserver mTintObserver; + + public ExtensionsMenuButtonCoordinator( + Context context, + ListMenuButton extensionsMenuButton, + ThemeColorProvider themeColorProvider) { + mExtensionsMenuButton = extensionsMenuButton; + mExtensionsMenuButton.setOnClickListener(this::onClick); + + mThemeColorProvider = themeColorProvider; + mTintObserver = this::onTintChanged; + mThemeColorProvider.addTintObserver(mTintObserver); + } + + void onClick(View view) { + if (view != mExtensionsMenuButton) return; + + // TODO(crbug.com/409181513): Implement popup view for extensions. + } + + public void onTintChanged( + @Nullable ColorStateList tintList, + @Nullable ColorStateList activityFocusTintList, + @BrandedColorScheme int brandedColorScheme) { + ImageViewCompat.setImageTintList(mExtensionsMenuButton, activityFocusTintList); + } + + @Override + public void destroy() { + mExtensionsMenuButton.setOnClickListener(null); + mThemeColorProvider.removeTintObserver(mTintObserver); + } +}
diff --git a/chrome/browser/ui/browser_window/public/browser_window_interface.h b/chrome/browser/ui/browser_window/public/browser_window_interface.h index fbb7152..7e11941 100644 --- a/chrome/browser/ui/browser_window/public/browser_window_interface.h +++ b/chrome/browser/ui/browser_window/public/browser_window_interface.h
@@ -108,6 +108,24 @@ // Returns true if the window is visible. virtual bool IsVisible() const = 0; + // WARNING: Many uses of base::WeakPtr are inappropriate and lead to bugs. + // An appropriate use case is as a variable passed to an asynchronously + // invoked PostTask. + // An inappropriate use case is to store as a member of an object that can + // outlive BrowserWindowInterface. This leads to inconsistent state machines. + // For example (don't do this): + // class FooOutlivesBrowser { + // base::WeakPtr<BrowserWindowInterface> bwi_; + // // Conceptually, this member should only be set if bwi_ is set. + // std::optional<SkColor> color_of_browser_; + // }; + // For example (do this): + // class FooOutlivesBrowser { + // // Use RegisterBrowserDidClose() to clear both bwi_ and + // // color_of_browser_ prior to bwi_ destruction. + // raw_ptr<BrowserWindowInterface> bwi_; + // std::optional<SkColor> color_of_browser_; + // }; virtual base::WeakPtr<BrowserWindowInterface> GetWeakPtr() = 0; // Returns the view that houses the Lens overlay.
diff --git a/chrome/browser/ui/qrcode_generator/BUILD.gn b/chrome/browser/ui/qrcode_generator/BUILD.gn index 597eb1e..36f97343 100644 --- a/chrome/browser/ui/qrcode_generator/BUILD.gn +++ b/chrome/browser/ui/qrcode_generator/BUILD.gn
@@ -23,6 +23,7 @@ deps = [ ":qrcode_generator", "//chrome/browser:browser_process", + "//chrome/browser/ui/sharing_hub", "//chrome/common:constants", "//components/prefs", "//url",
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc index 08801250..ccb79ae8 100644 --- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc +++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.cc
@@ -10,17 +10,19 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/user_metrics.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/safety_hub/safety_hub_util.h" #include "chrome/common/chrome_features.h" #include "components/content_settings/core/browser/content_settings_info.h" #include "components/content_settings/core/browser/content_settings_type_set.h" #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings_constraints.h" +#include "components/content_settings/core/common/content_settings_metadata.h" #include "components/content_settings/core/common/content_settings_pattern.h" #include "components/content_settings/core/common/content_settings_types.h" #include "components/content_settings/core/common/content_settings_utils.h" +#include "components/content_settings/core/common/features.h" #include "components/permissions/notifications_engagement_service.h" #include "components/site_engagement/content/site_engagement_service.h" #include "services/metrics/public/cpp/ukm_builders.h" @@ -33,6 +35,7 @@ namespace { constexpr char kRevokedStatusDictKeyStr[] = "revoked_status"; +constexpr char kAcknowledgedStr[] = "acknowledged"; constexpr char kIgnoreStr[] = "ignore"; constexpr char kRevokeStr[] = "revoke"; constexpr char kProposedStr[] = "proposed"; @@ -41,33 +44,63 @@ constexpr char kHasReportedProposalStr[] = "has_reported_proposal"; constexpr char kHasReportedFalsePositiveStr[] = "has_reported_false_positive"; constexpr char kTimestampStr[] = "timestamp"; +constexpr char kVersionStr[] = "version"; constexpr char kRevocationResultHistogram[] = "Settings.SafetyHub.DisruptiveNotificationRevocations.RevocationResult"; -DisruptiveNotificationPermissionsManager::RevocationState GetRevocationState( - const base::Value::Dict& dict) { +base::TimeDelta GetRevocationsLifetime() { + return content_settings::features:: + kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold.Get(); +} + +std::optional<DisruptiveNotificationPermissionsManager::RevocationState> +GetRevocationState(const base::Value::Dict& dict) { const std::string* revocation_state = dict.FindString(kRevokedStatusDictKeyStr); if (!revocation_state) { - return DisruptiveNotificationPermissionsManager::RevocationState::kNone; + return std::nullopt; } else if (*revocation_state == kProposedStr) { return DisruptiveNotificationPermissionsManager::RevocationState::kProposed; + } else if (*revocation_state == kAcknowledgedStr) { + return DisruptiveNotificationPermissionsManager::RevocationState:: + kAcknowledged; } else if (*revocation_state == kRevokeStr) { return DisruptiveNotificationPermissionsManager::RevocationState::kRevoked; } else if (*revocation_state == kIgnoreStr) { return DisruptiveNotificationPermissionsManager::RevocationState::kIgnore; } else { - return DisruptiveNotificationPermissionsManager::RevocationState::kUnknown; + return std::nullopt; } } } // namespace +bool DisruptiveNotificationPermissionsManager::RevocationEntry::operator==( + const RevocationEntry& other) const = default; + DisruptiveNotificationPermissionsManager::ContentSettingHelper:: ContentSettingHelper(HostContentSettingsMap& hcsm) : hcsm_(hcsm) {} +std::vector< + std::pair<GURL, DisruptiveNotificationPermissionsManager::RevocationEntry>> +DisruptiveNotificationPermissionsManager::ContentSettingHelper:: + GetAllEntries() { + std::vector<std::pair<GURL, RevocationEntry>> entries; + for (const auto& item : hcsm_->GetSettingsForOneType( + ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS)) { + const GURL& url = item.primary_pattern.ToRepresentativeUrl(); + std::optional<RevocationEntry> revocation_entry = + ToRevocationEntry(item.setting_value, item.metadata); + if (revocation_entry) { + entries.push_back( + std::make_pair(url, std::move(revocation_entry).value())); + } + } + return entries; +} + std::optional<DisruptiveNotificationPermissionsManager::RevocationEntry> DisruptiveNotificationPermissionsManager::ContentSettingHelper:: GetRevocationEntry(const GURL& url) { @@ -75,13 +108,34 @@ base::Value stored_value = hcsm_->GetWebsiteSetting( url, url, ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, &info); - if (stored_value.is_none() || !stored_value.is_dict()) { + return ToRevocationEntry(stored_value, info.metadata); +} + +std::optional<DisruptiveNotificationPermissionsManager::RevocationEntry> +DisruptiveNotificationPermissionsManager::ContentSettingHelper:: + ToRevocationEntry(const base::Value& value, + const content_settings::RuleMetaData& metadata) { + if (value.is_none() || !value.is_dict()) { return std::nullopt; } - base::Value::Dict dict = std::move(stored_value).TakeDict(); + const base::Value::Dict& dict = value.GetDict(); + + std::optional<RevocationState> revocation_state = GetRevocationState(dict); + if (!revocation_state) { + return std::nullopt; + } + + if (*revocation_state == RevocationState::kProposed && + dict.FindInt(kVersionStr).value_or(-1) != + features::kSafetyHubDisruptiveNotificationRevocationExperimentVersion + .Get()) { + // This is a proposed revocation created for a different version of a + // revocation experiment. It is outdated, so let's ignore it. + return std::nullopt; + } return RevocationEntry{ - .revocation_state = GetRevocationState(dict), + .revocation_state = *revocation_state, .site_engagement = dict.FindDouble(kSiteEngagementStr).value_or(0), .daily_notification_count = dict.FindInt(kDailyNotificationCountStr).value_or(0), @@ -91,8 +145,6 @@ dict.FindBool(kHasReportedProposalStr).value_or(false), .has_reported_false_positive = dict.FindBool(kHasReportedFalsePositiveStr).value_or(false), - .created_at = info.metadata.expiration() - info.metadata.lifetime(), - .lifetime = info.metadata.lifetime(), }; } @@ -101,22 +153,29 @@ CHECK(url.is_valid()); std::string_view revocation_state_string; + base::TimeDelta lifetime; + base::Value::Dict dict; switch (entry.revocation_state) { - case DisruptiveNotificationPermissionsManager::RevocationState::kNone: - case DisruptiveNotificationPermissionsManager::RevocationState::kUnknown: - // Invalid entry, we won't persist it. - return; case DisruptiveNotificationPermissionsManager::RevocationState::kProposed: revocation_state_string = kProposedStr; + dict.Set( + kVersionStr, + features::kSafetyHubDisruptiveNotificationRevocationExperimentVersion + .Get()); break; case DisruptiveNotificationPermissionsManager::RevocationState::kRevoked: revocation_state_string = kRevokeStr; + lifetime = GetRevocationsLifetime(); break; case DisruptiveNotificationPermissionsManager::RevocationState::kIgnore: revocation_state_string = kIgnoreStr; break; + case DisruptiveNotificationPermissionsManager::RevocationState:: + kAcknowledged: + revocation_state_string = kAcknowledgedStr; + lifetime = GetRevocationsLifetime(); + break; } - base::Value::Dict dict; dict.Set(kRevokedStatusDictKeyStr, revocation_state_string); dict.Set(kSiteEngagementStr, entry.site_engagement); dict.Set(kDailyNotificationCountStr, entry.daily_notification_count); @@ -127,8 +186,8 @@ if (entry.has_reported_false_positive) { dict.Set(kHasReportedFalsePositiveStr, entry.has_reported_false_positive); } - content_settings::ContentSettingConstraints constraints(entry.created_at); - constraints.set_lifetime(entry.lifetime); + content_settings::ContentSettingConstraints constraints(entry.timestamp); + constraints.set_lifetime(lifetime); hcsm_->SetWebsiteSettingCustomScope( ContentSettingsPattern::FromURLNoWildcard(url), ContentSettingsPattern::Wildcard(), @@ -233,9 +292,41 @@ std::optional<RevocationEntry> revocation_entry = ContentSettingHelper(*hcsm_).GetRevocationEntry(url); if (revocation_entry) { - revoked_anything |= HandleExistingValueAndMaybeRevoke( - url, *revocation_entry, is_disruptive); - continue; + switch (revocation_entry->revocation_state) { + case RevocationState::kRevoked: + // This should never happen, because the content setting is granted. + // We are in an inconsistent state, so let's clean this up. + ContentSettingHelper(*hcsm_).DeleteRevocationEntry(url); + break; + case RevocationState::kIgnore: + base::UmaHistogramEnumeration(kRevocationResultHistogram, + RevocationResult::kIgnore); + // Ignore this entry, we should not revoke permissions for this url + // again. + continue; + case RevocationState::kProposed: + if (!is_disruptive) { + // Not disruptive anymore, clean up proposed revocation. + ContentSettingHelper(*hcsm_).DeleteRevocationEntry(url); + } else { + if (!features::kSafetyHubDisruptiveNotificationRevocationShadowRun + .Get() && + CanRevokeNotifications(url, *revocation_entry)) { + RevokeNotifications(url, *revocation_entry); + revoked_anything = true; + } else { + base::UmaHistogramEnumeration( + kRevocationResultHistogram, + RevocationResult::kAlreadyInProposedRevokeList); + } + continue; + } + break; + case RevocationState::kAcknowledged: + // Was revoked in the past, but the user regranted. We can revoke + // again. + break; + } } if (!is_disruptive) { @@ -274,45 +365,66 @@ if (revoked_anything) { DisplayNotification(); } + + ReportDailyRunMetrics(); } -bool DisruptiveNotificationPermissionsManager:: - HandleExistingValueAndMaybeRevoke(const GURL& url, - const RevocationEntry& revocation_entry, - bool is_disruptive) { - switch (revocation_entry.revocation_state) { - case RevocationState::kNone: - case RevocationState::kUnknown: - case RevocationState::kRevoked: - // kNone and kUnknown mean that this is an invalid entry, while kRevoked - // should never happen, because the content setting is granted. In any of - // these three cases we are in an inconsistent state, so let's clean this - // up. - ContentSettingHelper(*hcsm_).DeleteRevocationEntry(url); - return false; - case RevocationState::kIgnore: - base::UmaHistogramEnumeration(kRevocationResultHistogram, - RevocationResult::kIgnore); - return false; - case RevocationState::kProposed: - if (!is_disruptive) { - // Not disruptive anymore, clean up proposed revocation. - ContentSettingHelper(*hcsm_).DeleteRevocationEntry(url); - base::UmaHistogramEnumeration(kRevocationResultHistogram, - RevocationResult::kNotDisruptive); - return false; - } - if (!features::kSafetyHubDisruptiveNotificationRevocationShadowRun - .Get() && - CanRevokeNotifications(url, revocation_entry)) { - RevokeNotifications(url, revocation_entry); - return true; - } else { - base::UmaHistogramEnumeration( - kRevocationResultHistogram, - RevocationResult::kAlreadyInProposedRevokeList); - return false; - } +void DisruptiveNotificationPermissionsManager::ReportDailyRunMetrics() { + base::Time now = clock_->Now(); + for (const auto& [url, revocation_entry] : + ContentSettingHelper(*hcsm_).GetAllEntries()) { + if (now - revocation_entry.timestamp > GetRevocationsLifetime()) { + // Since ignored entries don't expire while revoked do, report entries + // only for a limited amount of time in order to ensure that the + // distribution makes sense. + continue; + } + + std::string_view revocation_state; + switch (revocation_entry.revocation_state) { + case RevocationState::kRevoked: + revocation_state = "Revoked"; + break; + case RevocationState::kAcknowledged: + revocation_state = "Acknowledged"; + break; + case RevocationState::kIgnore: + revocation_state = "Regranted"; + break; + case RevocationState::kProposed: + revocation_state = "Proposed"; + break; + } + + std::string_view site_engagement; + double score = site_engagement_service_->GetScore(url); + if (score == 0.0) { + site_engagement = "0"; + } else if (score <= 1) { + site_engagement = "1"; + } else if (score <= 2) { + site_engagement = "2"; + } else if (score <= 3) { + site_engagement = "3"; + } else if (score <= 4) { + site_engagement = "4"; + } else if (score <= 5) { + site_engagement = "5"; + } else if (score <= 7) { + site_engagement = "6-7"; + } else if (score <= 10) { + site_engagement = "8-10"; + } else if (score <= 15) { + site_engagement = "11-15"; + } else { + site_engagement = ">15"; + } + base::UmaHistogramCustomCounts( + base::StrCat({"Settings.SafetyHub.DisruptiveNotificationRevocations." + "DailyDistribution.", + revocation_state, ".SiteEngagement", site_engagement, + ".DaysSinceRevocation"}), + (now - revocation_entry.timestamp).InDays(), 1, 30, 30); } } @@ -340,8 +452,8 @@ const base::TimeDelta delta_since_proposed_revocation = clock_->Now() - revocation_entry.timestamp; revocation_entry.revocation_state = RevocationState::kRevoked; - revocation_entry.created_at = clock_->Now(); - revocation_entry.lifetime = safety_hub_util::GetCleanUpThreshold(); + // Reset timestamp so that it reflects the revocation time. + revocation_entry.timestamp = clock_->Now(); ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, revocation_entry); UpdateNotificationPermission(url, ContentSetting::CONTENT_SETTING_DEFAULT); base::UmaHistogramEnumeration(kRevocationResultHistogram, @@ -448,8 +560,6 @@ RevocationEntry revocation_entry, bool regranted_in_safety_hub) { revocation_entry.revocation_state = RevocationState::kIgnore; - // Clear the lifetime so that this won't expire. - revocation_entry.lifetime = base::TimeDelta(); ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, revocation_entry); std::string uma_metric_prefix = base::StrCat( @@ -487,9 +597,6 @@ UpdateNotificationPermission(url, ContentSetting::CONTENT_SETTING_DEFAULT); revocation_entry->revocation_state = RevocationState::kRevoked; - revocation_entry->created_at = - constraints.expiration() - constraints.lifetime(); - revocation_entry->lifetime = constraints.lifetime(); ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, *revocation_entry); } @@ -502,43 +609,29 @@ ContentSettingHelper(*hcsm_).GetRevocationEntry(url); if (revocation_entry && revocation_entry->revocation_state == RevocationState::kRevoked) { - DeleteRevokedPermissionContentSetting( - revoked_permission.primary_pattern, - revoked_permission.secondary_pattern); + revocation_entry->revocation_state = RevocationState::kAcknowledged; + ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, + *revocation_entry); } } } -void DisruptiveNotificationPermissionsManager:: - DeleteRevokedPermissionContentSetting( - const ContentSettingsPattern& primary_pattern, - const ContentSettingsPattern& secondary_pattern) { - hcsm_->SetWebsiteSettingCustomScope( - primary_pattern, secondary_pattern, - ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, {}); -} - void DisruptiveNotificationPermissionsManager::RestoreDeletedRevokedPermission( const ContentSettingsPattern& primary_pattern, content_settings::ContentSettingConstraints constraints) { GURL url = primary_pattern.ToRepresentativeUrl(); - base::Value engagement_as_value = hcsm_->GetWebsiteSetting( - url, GURL(), ContentSettingsType::NOTIFICATION_INTERACTIONS); - int daily_notification_count = 0; - if (!engagement_as_value.is_none() && engagement_as_value.is_dict()) { - daily_notification_count = permissions::NotificationsEngagementService:: - GetDailyAverageNotificationCount(engagement_as_value.GetDict()); + std::optional<RevocationEntry> revocation_entry = + ContentSettingHelper(*hcsm_).GetRevocationEntry(url); + + // If the user is restoring an acknowledged revoked permission then there + // should be a corresponding acknowledged entry. + if (!revocation_entry || + revocation_entry->revocation_state != RevocationState::kAcknowledged) { + return; } - ContentSettingHelper(*hcsm_).PersistRevocationEntry( - url, RevocationEntry{ - .revocation_state = RevocationState::kRevoked, - .site_engagement = site_engagement_service_->GetScore(url), - .daily_notification_count = daily_notification_count, - .timestamp = clock_->Now(), - .created_at = constraints.expiration() - constraints.lifetime(), - .lifetime = constraints.lifetime(), - }); + revocation_entry->revocation_state = RevocationState::kRevoked; + ContentSettingHelper(*hcsm_).PersistRevocationEntry(url, *revocation_entry); } bool DisruptiveNotificationPermissionsManager::IsNotificationDisruptive(
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h index 73a5899..4036d88 100644 --- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h +++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h
@@ -86,12 +86,11 @@ // LINT.IfChange(RevocationState) enum class RevocationState { - kNone = 0, kProposed = 1, kRevoked = 2, kIgnore = 3, - kUnknown = 4, - kMaxValue = kUnknown, + kAcknowledged = 4, + kMaxValue = kAcknowledged, }; // LINT.ThenChange(//tools/metrics/histograms/enums.xml:DisruptiveNotificationRevocationState) @@ -143,11 +142,6 @@ // be shown to the user. Does not change permissions themselves. void ClearRevokedPermissionsList(); - // Removes the `REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS` setting. - void DeleteRevokedPermissionContentSetting( - const ContentSettingsPattern& primary_pattern, - const ContentSettingsPattern& secondary_pattern); - // Restores REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS entry for the // primary_pattern after it was deleted after user has accepted the revocation // (via `ClearRevokedPermissionsList()`). Only restores the value if there is @@ -199,18 +193,17 @@ // A revocation entry as stored in content settings // (ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS). struct RevocationEntry { + bool operator==(const RevocationEntry& other) const; + RevocationState revocation_state; double site_engagement; int daily_notification_count; + + // Timestamp of proposed or actual revocation. base::Time timestamp; bool has_reported_proposal = false; bool has_reported_false_positive = false; - - base::Time created_at = base::Time::Now(); - - // If lifetime is 0, it doesn't expire. - base::TimeDelta lifetime; }; // Helper class to manage content settings for @@ -224,20 +217,16 @@ std::optional<RevocationEntry> GetRevocationEntry(const GURL& url); void PersistRevocationEntry(const GURL& url, const RevocationEntry& entry); void DeleteRevocationEntry(const GURL& url); + std::vector<std::pair<GURL, RevocationEntry>> GetAllEntries(); private: + std::optional<RevocationEntry> ToRevocationEntry( + const base::Value& value, + const content_settings::RuleMetaData& metadata); + base::raw_ref<HostContentSettingsMap> hcsm_; }; - // Process existing content setting value: record false positive, revoke - // notifications or report the site as already in the proposed revocation - // list. Returns `true` if notifications were actually revoked, `false` - // otherwise. - bool HandleExistingValueAndMaybeRevoke( - const GURL& url, - const RevocationEntry& revocation_entry, - bool is_disruptive); - // If the notifications should be revoked based on whether the metrics were // already reported or the cooldown period has run out. bool CanRevokeNotifications(const GURL& url, @@ -268,6 +257,9 @@ RevocationEntry revocation_entry, bool regranted_in_safety_hub); + // Report metrics for the daily run. + void ReportDailyRunMetrics(); + scoped_refptr<HostContentSettingsMap> hcsm_; raw_ptr<site_engagement::SiteEngagementService> site_engagement_service_;
diff --git a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc index a75b780f..c1183a5 100644 --- a/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc +++ b/chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager_unittest.cc
@@ -14,6 +14,7 @@ #include "chrome/common/chrome_features.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/features.h" #include "components/content_settings/core/test/content_settings_mock_provider.h" #include "components/content_settings/core/test/content_settings_test_utils.h" #include "components/permissions/constants.h" @@ -143,7 +144,6 @@ .site_engagement = 0.0, .daily_notification_count = kDailyNotificationCount, .timestamp = base::Time::Now() - base::Days(days_since_revocation), - .lifetime = base::Days(30), }); } @@ -167,6 +167,106 @@ base::SimpleTestClock clock_; }; +TEST_F(DisruptiveNotificationPermissionsManagerTest, + ContentSettingHelperCorrectLifetime) { + GURL url("https://example.com"); + + for (const auto& [revocation_state, expected_lifetime] : + std::initializer_list<std::pair<RevocationState, base::TimeDelta>>{ + {RevocationState::kProposed, base::Days(0)}, + {RevocationState::kRevoked, + content_settings::features:: + kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold + .Get()}, + {RevocationState::kIgnore, base::Days(0)}, + {RevocationState::kAcknowledged, + content_settings::features:: + kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold + .Get()}, + }) { + ContentSettingHelper(*hcsm()).PersistRevocationEntry( + url, RevocationEntry{ + .revocation_state = revocation_state, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }); + content_settings::SettingInfo info; + base::Value stored_value = hcsm()->GetWebsiteSetting( + url, url, + ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, + &info); + EXPECT_TRUE(stored_value.is_dict()); + EXPECT_EQ(info.metadata.lifetime(), expected_lifetime); + ContentSettingHelper(*hcsm()).DeleteRevocationEntry(url); + EXPECT_TRUE( + hcsm() + ->GetWebsiteSetting(url, url, + ContentSettingsType:: + REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, + &info) + .is_none()); + } +} + +TEST_F(DisruptiveNotificationPermissionsManagerTest, + ProposedRevocationsWithWrongVersionAreIgnored) { + feature_list_.InitAndEnableFeatureWithParameters( + features::kSafetyHubDisruptiveNotificationRevocation, + {{features::kSafetyHubDisruptiveNotificationRevocationExperimentVersion + .name, + "1"}}); + + GURL proposed_url("https://www.example1.com"); + GURL revoked_url("https://www.example2.com"); + GURL ignore_url("https://www.example3.com"); + RevocationEntry proposed_entry = RevocationEntry{ + .revocation_state = RevocationState::kProposed, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + RevocationEntry revoked_entry = RevocationEntry{ + .revocation_state = RevocationState::kRevoked, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + RevocationEntry ignore_entry = RevocationEntry{ + .revocation_state = RevocationState::kIgnore, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + ContentSettingHelper(*hcsm()).PersistRevocationEntry(proposed_url, + proposed_entry); + ContentSettingHelper(*hcsm()).PersistRevocationEntry(revoked_url, + revoked_entry); + ContentSettingHelper(*hcsm()).PersistRevocationEntry(ignore_url, + ignore_entry); + + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(proposed_url), + Optional(Eq(proposed_entry))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(revoked_url), + Optional(Eq(revoked_entry))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(ignore_url), + Optional(Eq(ignore_entry))); + + feature_list_.Reset(); + feature_list_.InitAndEnableFeatureWithParameters( + features::kSafetyHubDisruptiveNotificationRevocation, + {{features::kSafetyHubDisruptiveNotificationRevocationExperimentVersion + .name, + "2"}}); + + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(proposed_url), + Eq(std::nullopt)); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(revoked_url), + Optional(Eq(revoked_entry))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(ignore_url), + Optional(Eq(ignore_entry))); +} + class DisruptiveNotificationPermissionsManagerRevocationTest : public DisruptiveNotificationPermissionsManagerTest { public: @@ -254,11 +354,25 @@ // After that, no new metrics are reported since there is no notification // content setting exception. + clock()->Advance(base::Days(1)); manager()->RevokeDisruptiveNotifications(); EXPECT_EQ(GetRevokedPermissionsCount(), 1); t.ExpectBucketCount(kRevocationResultHistogram, RevocationResult::kProposedRevoke, 1); t.ExpectBucketCount(kRevocationResultHistogram, RevocationResult::kRevoke, 1); + + t.ExpectBucketCount( + "Settings.SafetyHub.DisruptiveNotificationRevocations.DailyDistribution." + "Proposed.SiteEngagement0.DaysSinceRevocation", + 0, 1); + t.ExpectBucketCount( + "Settings.SafetyHub.DisruptiveNotificationRevocations.DailyDistribution." + "Revoked.SiteEngagement0.DaysSinceRevocation", + 0, 1); + t.ExpectBucketCount( + "Settings.SafetyHub.DisruptiveNotificationRevocations.DailyDistribution." + "Revoked.SiteEngagement0.DaysSinceRevocation", + 1, 1); } TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, @@ -611,8 +725,6 @@ .revocation_state = RevocationState::kProposed, .site_engagement = 0.0, .daily_notification_count = kDailyNotificationCount, - .created_at = base::Time::Now(), - .lifetime = base::Days(30), }); ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID(); @@ -665,7 +777,6 @@ .site_engagement = 0.0, .daily_notification_count = 3, .timestamp = clock()->Now(), - .lifetime = safety_hub_util::GetCleanUpThreshold(), }); clock()->Advance(base::Days(5)); @@ -688,8 +799,6 @@ EXPECT_THAT(revocation_entry, Optional(Field(&RevocationEntry::revocation_state, RevocationState::kIgnore))); - EXPECT_THAT(revocation_entry, Optional(Field(&RevocationEntry::lifetime, - Eq(base::TimeDelta())))); t.ExpectUniqueSample( "Settings.SafetyHub.DisruptiveNotificationRevocations.UserRegrant." @@ -744,7 +853,7 @@ // Undo the regrant (return to revoked state). content_settings::ContentSettingConstraints constraints(base::Time::Now()); - constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold()); + constraints.set_lifetime(base::Days(30)); manager()->UndoRegrantPermissionForUrl( url, {ContentSettingsType::NOTIFICATIONS}, std::move(constraints)); @@ -767,9 +876,6 @@ Optional(Field(&RevocationEntry::daily_notification_count, 3))); EXPECT_THAT(revocation_entry, Optional(Field(&RevocationEntry::timestamp, base::Time::Now()))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::lifetime, - safety_hub_util::GetCleanUpThreshold()))); } TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, @@ -784,7 +890,6 @@ // Attempt to undo the regrant (return to revoked state). content_settings::ContentSettingConstraints constraints(base::Time::Now()); - constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold()); manager()->UndoRegrantPermissionForUrl( url, {ContentSettingsType::NOTIFICATIONS}, std::move(constraints)); @@ -816,7 +921,6 @@ // Attempt to undo the regrant (return to revoked state). content_settings::ContentSettingConstraints constraints(base::Time::Now()); - constraints.set_lifetime(safety_hub_util::GetCleanUpThreshold()); manager()->UndoRegrantPermissionForUrl( url, {ContentSettingsType::GEOLOCATION}, std::move(constraints)); @@ -828,93 +932,68 @@ } TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, - ClearRevokedPermissionsList) { + ClearAndRestoreRevokedPermissionsList) { base::HistogramTester t; // Set up a revoked permission. GURL revoked_url("https://www.example1.com"); - ContentSettingHelper(*hcsm()).PersistRevocationEntry( - revoked_url, RevocationEntry{ - .revocation_state = RevocationState::kRevoked, - .site_engagement = 0.0, - .daily_notification_count = 3, - .timestamp = base::Time::Now(), - }); + RevocationEntry revoked_entry = RevocationEntry{ + .revocation_state = RevocationState::kRevoked, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + ContentSettingHelper(*hcsm()).PersistRevocationEntry(revoked_url, + revoked_entry); // Set up a proposed permission. GURL proposed_url("https://www.example2.com"); - ContentSettingHelper(*hcsm()).PersistRevocationEntry( - proposed_url, RevocationEntry{ - .revocation_state = RevocationState::kProposed, - .site_engagement = 0.0, - .daily_notification_count = 3, - .timestamp = base::Time::Now(), - }); + RevocationEntry proposed_entry = RevocationEntry{ + .revocation_state = RevocationState::kProposed, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + ContentSettingHelper(*hcsm()).PersistRevocationEntry(proposed_url, + proposed_entry); // Set up an ignored permission. GURL ignored_url("https://www.example3.com"); - ContentSettingHelper(*hcsm()).PersistRevocationEntry( - ignored_url, RevocationEntry{ - .revocation_state = RevocationState::kIgnore, - .site_engagement = 0.0, - .daily_notification_count = 3, - .timestamp = base::Time::Now(), - }); + RevocationEntry ignored_entry = RevocationEntry{ + .revocation_state = RevocationState::kIgnore, + .site_engagement = 0.0, + .daily_notification_count = 3, + .timestamp = base::Time::Now(), + }; + ContentSettingHelper(*hcsm()).PersistRevocationEntry(ignored_url, + ignored_entry); EXPECT_EQ(GetRevokedPermissionsCount(), 3); manager()->ClearRevokedPermissionsList(); - EXPECT_EQ(GetRevokedPermissionsCount(), 2); + EXPECT_EQ(GetRevokedPermissionsCount(), 3); - // Only revoked value is cleared, others are not affected. + RevocationEntry acknowledged_entry = revoked_entry; + acknowledged_entry.revocation_state = RevocationState::kAcknowledged; + + // Only revoked value is set to acknowledged, others are not affected. EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(revoked_url), - Eq(std::nullopt)); + Optional(Eq(acknowledged_entry))); EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(proposed_url), - Not(Eq(std::nullopt))); + Optional(Eq(proposed_entry))); EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(ignored_url), - Not(Eq(std::nullopt))); -} - -TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, - RestoreDeletedRevokedPermission) { - GURL url("https://www.example1.com"); - - SetDailyAverageNotificationCount(url, 3); - site_engagement_service()->ResetBaseScoreForURL(url, 1.0); + Optional(Eq(ignored_entry))); content_settings::ContentSettingConstraints constraints; manager()->RestoreDeletedRevokedPermission( - ContentSettingsPattern::FromURLNoWildcard(url), constraints.Clone()); + ContentSettingsPattern::FromURLNoWildcard(revoked_url), + constraints.Clone()); - std::optional<RevocationEntry> revocation_entry = - ContentSettingHelper(*hcsm()).GetRevocationEntry(url); - - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::has_reported_proposal, false))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::site_engagement, 1.0))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::daily_notification_count, 3))); -} - -TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, - RestoreDeletedRevokedPermissionNoNotificationCount) { - GURL url("https://www.example1.com"); - - site_engagement_service()->ResetBaseScoreForURL(url, 1.0); - - content_settings::ContentSettingConstraints constraints; - manager()->RestoreDeletedRevokedPermission( - ContentSettingsPattern::FromURLNoWildcard(url), constraints.Clone()); - - std::optional<RevocationEntry> revocation_entry = - ContentSettingHelper(*hcsm()).GetRevocationEntry(url); - - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::has_reported_proposal, false))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::site_engagement, 1.0))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::daily_notification_count, 0))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(revoked_url), + Optional(Eq(revoked_entry))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(proposed_url), + Optional(Eq(proposed_entry))); + EXPECT_THAT(ContentSettingHelper(*hcsm()).GetRevocationEntry(ignored_url), + Optional(Eq(ignored_entry))); } TEST_F(DisruptiveNotificationPermissionsManagerRevocationTest, @@ -961,9 +1040,6 @@ .site_engagement = 0.0, .daily_notification_count = 3, .timestamp = base::Time::Now(), - .lifetime = initial_state == RevocationState::kIgnore - ? base::TimeDelta() - : base::Days(14), }); SetNotificationPermission(url, new_content_setting); std::optional revocation_entry = @@ -971,11 +1047,6 @@ EXPECT_THAT( revocation_entry, Optional(Field(&RevocationEntry::revocation_state, expected_state))); - EXPECT_THAT(revocation_entry, - Optional(Field(&RevocationEntry::lifetime, - expected_state == RevocationState::kIgnore - ? base::TimeDelta() - : base::Days(14)))); // Clean up. ContentSettingHelper(*hcsm()).DeleteRevocationEntry(url); @@ -992,7 +1063,6 @@ .site_engagement = 0.0, .daily_notification_count = 3, .timestamp = base::Time::Now(), - .lifetime = base::Days(14), }); clock()->Advance(base::Days(5)); site_engagement_service()->ResetBaseScoreForURL(url, 7.0);
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc b/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc index db0143e..c0acf97 100644 --- a/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc +++ b/chrome/browser/ui/safety_hub/revoked_permissions_service_unittest.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/permissions/notifications_engagement_service_factory.h" #include "chrome/browser/safe_browsing/test_safe_browsing_service.h" #include "chrome/browser/ui/safety_hub/abusive_notification_permissions_manager.h" +#include "chrome/browser/ui/safety_hub/disruptive_notification_permissions_manager.h" #include "chrome/browser/ui/safety_hub/mock_safe_browsing_database_manager.h" #include "chrome/browser/ui/safety_hub/revoked_permissions_service_factory.h" #include "chrome/browser/ui/safety_hub/safety_hub_constants.h" @@ -93,10 +94,6 @@ // An arbitrary large number that doesn't match any ContentSettingsType; const int32_t unknown_type = 300000; -constexpr std::string_view kRevokedStatus = "revoked_status"; -constexpr std::string_view kProposed = "proposed"; -constexpr std::string_view kRevoke = "revoke"; - std::set<ContentSettingsType> abusive_permission_types({notifications_type}); std::set<ContentSettingsType> unused_permission_types({geolocation_type, chooser_type}); @@ -335,11 +332,17 @@ EXPECT_EQ(expected_size, revoked_permissions_list.size()); } - void ExpectRevokedDisruptiveNotificationPermissionSize(size_t expected_size) { - ContentSettingsForOneType revoked_permissions = - hcsm()->GetSettingsForOneType( - ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS); - EXPECT_EQ(expected_size, revoked_permissions.size()); + int GetRevokedDisruptiveNotificationPermissionSize() { + int count = 0; + for (const auto& [url, revocation_entry] : + DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm()) + .GetAllEntries()) { + if (revocation_entry.revocation_state == + DisruptiveNotificationPermissionsManager::RevocationState::kRevoked) { + ++count; + } + } + return count; } void SetupRevokedUnusedPermissionSite( @@ -395,34 +398,24 @@ constraint); } - void SetupRevokedDisruptiveNotificationSite( - std::string url, - base::TimeDelta lifetime = - content_settings::features:: - kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold - .Get()) { - content_settings::ContentSettingConstraints constraint(clock()->Now()); - constraint.set_lifetime(lifetime); - hcsm()->SetWebsiteSettingDefaultScope( - GURL(url), GURL(url), - ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, - base::Value(base::Value::Dict().Set(kRevokedStatus, kRevoke)), - constraint); + void SetupRevokedDisruptiveNotificationSite(std::string url) { + DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm()) + .PersistRevocationEntry( + GURL(url), + DisruptiveNotificationPermissionsManager::RevocationEntry{ + .revocation_state = DisruptiveNotificationPermissionsManager:: + RevocationState::kRevoked, + .timestamp = clock()->Now()}); } - void SetupProposedRevokedDisruptiveNotificationSite( - std::string url, - base::TimeDelta lifetime = - content_settings::features:: - kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold - .Get()) { - content_settings::ContentSettingConstraints constraint(clock()->Now()); - constraint.set_lifetime(lifetime); - hcsm()->SetWebsiteSettingDefaultScope( - GURL(url), GURL(url), - ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, - base::Value(base::Value::Dict().Set(kRevokedStatus, kProposed)), - constraint); + void SetupProposedRevokedDisruptiveNotificationSite(std::string url) { + DisruptiveNotificationPermissionsManager::ContentSettingHelper(*hcsm()) + .PersistRevocationEntry( + GURL(url), + DisruptiveNotificationPermissionsManager::RevocationEntry{ + .revocation_state = DisruptiveNotificationPermissionsManager:: + RevocationState::kProposed, + .timestamp = clock()->Now()}); } void UndoRegrantPermissionsForUrl( @@ -1278,7 +1271,7 @@ service()->ClearRevokedPermissionsList(); EXPECT_EQ(0U, GetRevokedUnusedPermissions(hcsm()).size()); ExpectRevokedAbusiveNotificationPermissionSize(0U); - ExpectRevokedDisruptiveNotificationPermissionSize(0U); + EXPECT_EQ(GetRevokedDisruptiveNotificationPermissionSize(), 0); } TEST_P(RevokedPermissionsServiceTest, RestoreClearedRevokedPermissionsList) { @@ -1318,7 +1311,7 @@ service()->ClearRevokedPermissionsList(); EXPECT_EQ(0U, GetRevokedUnusedPermissions(hcsm()).size()); ExpectRevokedAbusiveNotificationPermissionSize(0U); - ExpectRevokedDisruptiveNotificationPermissionSize(0U); + EXPECT_EQ(GetRevokedDisruptiveNotificationPermissionSize(), 0); service()->RestoreDeletedRevokedPermissionsList(revoked_permissions_vector); @@ -1329,7 +1322,7 @@ ExpectRevokedAbusiveNotificationPermissionSize(2U); } if (ShouldSetupDisruptiveSites()) { - ExpectRevokedDisruptiveNotificationPermissionSize(1U); + EXPECT_EQ(GetRevokedDisruptiveNotificationPermissionSize(), 1); } } @@ -1423,8 +1416,9 @@ const auto default_lifetime = content_settings::features:: kSafetyCheckUnusedSitePermissionsRevocationCleanUpThreshold.Get(); - const auto shorter_lifetime = base::Days(1); - const auto longer_lifetime = base::Days(10); + const auto shorter_lifetime = default_lifetime - base::Days(1); + const auto longer_lifetime = default_lifetime + base::Days(1); + const auto disruptive_revocations_lifetime = default_lifetime; if (ShouldSetupAbusiveNotificationSites()) { SetupAbusiveNotificationSite(url2, ContentSetting::CONTENT_SETTING_ASK); SetupAbusiveNotificationSite(url3, ContentSetting::CONTENT_SETTING_ASK); @@ -1441,8 +1435,8 @@ SetupRevokedUnusedPermissionSite(url6, shorter_lifetime); } if (ShouldSetupDisruptiveSites()) { - SetupRevokedDisruptiveNotificationSite(url5, shorter_lifetime); - SetupRevokedDisruptiveNotificationSite(url6, longer_lifetime); + SetupRevokedDisruptiveNotificationSite(url5); + SetupRevokedDisruptiveNotificationSite(url6); } // When we start up a new service instance, the latest result (i.e. the list @@ -1477,7 +1471,8 @@ EXPECT_EQ(permission_5.constraints.lifetime(), longer_lifetime); auto permission_6 = GetPermissionsDataByUrl(revoked_permissions, url6); - EXPECT_EQ(permission_6.constraints.lifetime(), longer_lifetime); + EXPECT_EQ(permission_6.constraints.lifetime(), + disruptive_revocations_lifetime); } else if (ShouldSetupUnusedSites()) { EXPECT_EQ(5U, revoked_permissions.size()); EXPECT_TRUE(IsUrlInRevokedSettings(revoked_permissions, url1));
diff --git a/chrome/browser/ui/sharing_hub/BUILD.gn b/chrome/browser/ui/sharing_hub/BUILD.gn new file mode 100644 index 0000000..2ef6bd8 --- /dev/null +++ b/chrome/browser/ui/sharing_hub/BUILD.gn
@@ -0,0 +1,80 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ui.gni") + +assert(is_win || is_mac || is_linux || is_chromeos) +assert(toolkit_views) + +source_set("sharing_hub") { + sources = [ + "screenshot/screenshot_captured_bubble_controller.h", + "sharing_hub_bubble_controller.h", + "sharing_hub_bubble_view.h", + ] + public_deps = [ + "//base", + "//chrome/browser/share", + "//chrome/browser/sharing_hub", + "//content/public/browser", + ] + + if (is_chromeos) { + sources += [ "sharing_hub_bubble_controller_chromeos_impl.h" ] + public_deps += [ + "//chrome/browser/sharesheet", + "//chromeos/components/sharesheet:constants", + "//ui/views", + ] + } else { + sources += [ "sharing_hub_bubble_controller_desktop_impl.h" ] + } +} + +source_set("impl") { + sources = [ "screenshot/screenshot_captured_bubble_controller.cc" ] + deps = [ + ":sharing_hub", + "//chrome/browser/image_editor", + "//chrome/browser/profiles:profile", + ] + + if (is_chromeos) { + sources += [ "sharing_hub_bubble_controller_chromeos_impl.cc" ] + deps += [ + "//components/services/app_service/", + "//ui/views", + ] + } else { + sources += [ "sharing_hub_bubble_controller_desktop_impl.cc" ] + deps += [ + "//chrome/app:command_ids", + "//chrome/app:generated_resources", + "//chrome/browser/favicon", + "//chrome/browser/ui/color:color_headers", + "//chrome/browser/ui/qrcode_generator", + "//chrome/browser/ui/send_tab_to_self", + "//components/media_router/browser", + "//ui/base", + "//ui/color:color_headers", + "//ui/native_theme", + ] + } + public_deps = [ "//chrome/browser:browser_public_dependencies" ] +} + +if (is_win || is_mac || is_linux) { + source_set("test_support_ui") { + testonly = true + sources = [ + "fake_sharing_hub_bubble_controller.cc", + "fake_sharing_hub_bubble_controller.h", + ] + + public_deps = [ + ":sharing_hub", + "//testing/gmock", + ] + } +}
diff --git a/chrome/browser/ui/tab_ui_helper.cc b/chrome/browser/ui/tab_ui_helper.cc index 701bbe8e..5584423 100644 --- a/chrome/browser/ui/tab_ui_helper.cc +++ b/chrome/browser/ui/tab_ui_helper.cc
@@ -9,7 +9,10 @@ #include "build/build_config.h" #include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/sessions/session_restore.h" +#include "chrome/browser/ui/tabs/public/tab_features.h" +#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_web_contents_listener.h" #include "chrome/grit/generated_resources.h" +#include "components/tabs/public/tab_interface.h" #include "ui/base/l10n/l10n_util.h" #include "ui/resources/grit/ui_resources.h" @@ -30,6 +33,17 @@ TabUIHelper::~TabUIHelper() = default; std::u16string TabUIHelper::GetTitle() const { + tabs::TabInterface* const tab_interface = + tabs::TabInterface::GetFromContents(web_contents()); + const tab_groups::SavedTabGroupWebContentsListener* wc_listener = + tab_interface->GetTabFeatures()->saved_tab_group_web_contents_listener(); + if (wc_listener) { + if (const std::optional<tab_groups::DeferredTabState>& deferred_tab_state = + wc_listener->deferred_tab_state()) { + return deferred_tab_state.value().title(); + } + } + const std::u16string& contents_title = web_contents()->GetTitle(); if (!contents_title.empty()) { return contents_title; @@ -43,6 +57,17 @@ } ui::ImageModel TabUIHelper::GetFavicon() const { + tabs::TabInterface* const tab_interface = + tabs::TabInterface::GetFromContents(web_contents()); + const tab_groups::SavedTabGroupWebContentsListener* wc_listener = + tab_interface->GetTabFeatures()->saved_tab_group_web_contents_listener(); + if (wc_listener) { + if (const std::optional<tab_groups::DeferredTabState>& deferred_tab_state = + wc_listener->deferred_tab_state()) { + return deferred_tab_state.value().favicon(); + } + } + return ui::ImageModel::FromImage( favicon::TabFaviconFromWebContents(web_contents())); }
diff --git a/chrome/browser/ui/tabs/tab_renderer_data.cc b/chrome/browser/ui/tabs/tab_renderer_data.cc index 6de221d..5a1673c 100644 --- a/chrome/browser/ui/tabs/tab_renderer_data.cc +++ b/chrome/browser/ui/tabs/tab_renderer_data.cc
@@ -17,7 +17,6 @@ #include "chrome/browser/ui/tabs/public/tab_features.h" #include "chrome/browser/ui/tabs/saved_tab_groups/collaboration_messaging_tab_data.h" #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h" -#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_web_contents_listener.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h" #include "chrome/browser/ui/tabs/tab_utils.h" @@ -82,19 +81,6 @@ data.favicon = tab_ui_helper->GetFavicon(); data.title = tab_ui_helper->GetTitle(); - // If the tab is in a deferred state, override favicon and title data. - if (features) { - const tab_groups::SavedTabGroupWebContentsListener* wc_listener = - features->saved_tab_group_web_contents_listener(); - if (wc_listener) { - if (const std::optional<tab_groups::DeferredTabState>& - deferred_tab_state = wc_listener->deferred_tab_state()) { - data.favicon = deferred_tab_state.value().favicon(); - data.title = deferred_tab_state.value().title(); - } - } - } - // Tabbed web apps should use the app icon on the home tab. BrowserWindowInterface* browser = tab->GetBrowserWindowInterface();
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc index f098dfb..9aa827b 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
@@ -169,28 +169,58 @@ // TODO(crbug.com/40228302): Split parameterized tests that are // applicable for only one offer type. + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayCardLinked DISABLED_GPayCardLinked +#else +#define MAYBE_GPayCardLinked GPayCardLinked +#endif INSTANTIATE_TEST_SUITE_P( - GPayCardLinked, + MAYBE_GPayCardLinked, OfferNotificationBubbleViewsInteractiveUiTest, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayCardLinked", AutofillOfferData::OfferType::GPAY_CARD_LINKED_OFFER, })); + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayCardLinkedWithNewPageAction \ + DISABLED_GPayCardLinkedWithNewPageAction +#else +#define MAYBE_GPayCardLinkedWithNewPageAction GPayCardLinkedWithNewPageAction +#endif INSTANTIATE_TEST_SUITE_P( - GPayCardLinkedWithNewPageAction, + MAYBE_GPayCardLinkedWithNewPageAction, OfferNotificationBubbleViewsInteractiveUiTest, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayCardLinked", AutofillOfferData::OfferType::GPAY_CARD_LINKED_OFFER, /*is_page_actions_migration_enabled=*/true, })); + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayPromoCode DISABLED_GPayPromoCode +#else +#define MAYBE_GPayPromoCode GPayPromoCode +#endif INSTANTIATE_TEST_SUITE_P( - GPayPromoCode, + MAYBE_GPayPromoCode, OfferNotificationBubbleViewsInteractiveUiTest, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayPromoCode", AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER})); + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayPromoCodeWithNewPageAction \ + DISABLED_GPayPromoCodeWithNewPageAction +#else +#define MAYBE_GPayPromoCodeWithNewPageAction GPayPromoCodeWithNewPageAction +#endif INSTANTIATE_TEST_SUITE_P( - GPayPromoCodeWithNewPageAction, + MAYBE_GPayPromoCodeWithNewPageAction, OfferNotificationBubbleViewsInteractiveUiTest, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayPromoCode", AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER, @@ -206,13 +236,28 @@ command_line->AppendSwitch("disable-field-trial-config"); } }; + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayPromoCode DISABLED_GPayPromoCode +#else +#define MAYBE_GPayPromoCode GPayPromoCode +#endif INSTANTIATE_TEST_SUITE_P( - GPayPromoCode, + MAYBE_GPayPromoCode, OfferNotificationBubbleViewsInteractiveUiTestNoTestingConfig, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayPromoCode", AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER})); + +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_GPayPromoCodeWithNewPageAction \ + DISABLED_GPayPromoCodeWithNewPageAction +#else +#define MAYBE_GPayPromoCodeWithNewPageAction GPayPromoCodeWithNewPageAction +#endif INSTANTIATE_TEST_SUITE_P( - GPayPromoCodeWithNewPageAction, + MAYBE_GPayPromoCodeWithNewPageAction, OfferNotificationBubbleViewsInteractiveUiTestNoTestingConfig, testing::Values(OfferNotificationBubbleViewsInteractiveUiTestData{ "GPayPromoCode", AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER, @@ -307,8 +352,14 @@ // 5. Switches to the blank site. Makes sure the bubble and icon will be gone. // 6. Switches to merchant site 2. Makes sure the icon is visible but the bubble // is not, since we have shown the offer bubble in the tab of merchant site 1. +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_CrossTabTracking DISABLED_CrossTabTracking +#else +#define MAYBE_CrossTabTracking CrossTabTracking +#endif IN_PROC_BROWSER_TEST_P(OfferNotificationBubbleViewsInteractiveUiTest, - CrossTabTracking) { + MAYBE_CrossTabTracking) { SetUpOfferDataWithDomains(test_offer_type_, {GetUrl("www.merchantsite1.test", "/"), GetUrl("www.merchantsite2.test", "/")}); @@ -370,8 +421,14 @@ } // Tests that bubble behaves correctly after user dismisses it. +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_DismissBubble DISABLED_DismissBubble +#else +#define MAYBE_DismissBubble DismissBubble +#endif IN_PROC_BROWSER_TEST_P(OfferNotificationBubbleViewsInteractiveUiTest, - DismissBubble) { + MAYBE_DismissBubble) { // Applies to card-linked offers only, as promo code offers do not have an OK // button. if (test_offer_type_ != @@ -558,8 +615,14 @@ 1); } +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_ShowGPayPromoCodeBubble DISABLED_ShowGPayPromoCodeBubble +#else +#define MAYBE_ShowGPayPromoCodeBubble ShowGPayPromoCodeBubble +#endif IN_PROC_BROWSER_TEST_P(OfferNotificationBubbleViewsInteractiveUiTest, - ShowGPayPromoCodeBubble) { + MAYBE_ShowGPayPromoCodeBubble) { // Applies to GPay promo code offers only. if (test_offer_type_ != AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER) { return; @@ -587,8 +650,17 @@ GURL(GetDefaultTestDetailsUrlString())); } -IN_PROC_BROWSER_TEST_P(OfferNotificationBubbleViewsInteractiveUiTest, - ReshowOfferNotificationBubble_OfferDeletedBetweenShows) { +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_ReshowOfferNotificationBubble_OfferDeletedBetweenShows \ + DISABLED_ReshowOfferNotificationBubble_OfferDeletedBetweenShows +#else +#define MAYBE_ReshowOfferNotificationBubble_OfferDeletedBetweenShows \ + ReshowOfferNotificationBubble_OfferDeletedBetweenShows +#endif +IN_PROC_BROWSER_TEST_P( + OfferNotificationBubbleViewsInteractiveUiTest, + MAYBE_ReshowOfferNotificationBubble_OfferDeletedBetweenShows) { // Applies to GPay promo code offers and card linked offers only. if (test_offer_type_ != AutofillOfferData::OfferType::GPAY_PROMO_CODE_OFFER && test_offer_type_ != @@ -631,8 +703,14 @@ } } +// TODO(crbug.com/416010106): Flaky failures. +#if BUILDFLAG(IS_MAC) +#define MAYBE_IconViewAccessibleName DISABLED_IconViewAccessibleName +#else +#define MAYBE_IconViewAccessibleName IconViewAccessibleName +#endif IN_PROC_BROWSER_TEST_P(OfferNotificationBubbleViewsInteractiveUiTest, - IconViewAccessibleName) { + MAYBE_IconViewAccessibleName) { EXPECT_EQ(GetOfferNotificationPageActionView() ->GetViewAccessibility() .GetCachedName(),
diff --git a/chrome/browser/ui/views/chrome_views_delegate_win.cc b/chrome/browser/ui/views/chrome_views_delegate_win.cc index ebb4396..fd9ccdd9 100644 --- a/chrome/browser/ui/views/chrome_views_delegate_win.cc +++ b/chrome/browser/ui/views/chrome_views_delegate_win.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/ui/views/native_widget_factory.h" #include "chrome/browser/win/app_icon.h" #include "components/keep_alive_registry/scoped_keep_alive.h" +#include "ui/views/widget/widget_delegate.h" namespace { @@ -151,6 +152,11 @@ native_widget_type = NativeWidgetType::DESKTOP_NATIVE_WIDGET_AURA; } } + + if (params->delegate && params->delegate->use_desktop_widget_override()) { + native_widget_type = NativeWidgetType::DESKTOP_NATIVE_WIDGET_AURA; + } + return ::CreateNativeWidget(native_widget_type, params, delegate); }
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc index 89df12a..69beeec 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_source_view.cc
@@ -7,7 +7,6 @@ #include "chrome/browser/media/webrtc/desktop_media_list.h" #include "chrome/browser/ui/views/desktop_capture/desktop_media_list_view.h" #include "chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h" -#include "chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h" #include "chrome/grit/generated_resources.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -58,10 +57,13 @@ DesktopMediaSourceViewStyle style) : parent_(parent), source_id_(source_id), selected_(false) { icon_view_ = AddChildView(std::make_unique<views::ImageView>()); - image_view_ = AddChildView(std::make_unique<RoundedCornerImageView>()); + image_view_ = AddChildView(std::make_unique<views::ImageView>()); label_ = AddChildView(std::make_unique<views::Label>()); icon_view_->SetCanProcessEventsWithinSubtree(false); image_view_->SetCanProcessEventsWithinSubtree(false); + image_view_->SetCornerRadius( + views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::Emphasis::kMedium)); SetFocusBehavior(FocusBehavior::ALWAYS); SetStyle(style); views::FocusRing::Install(this);
diff --git a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc deleted file mode 100644 index f139aba..0000000 --- a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2023 The Chromium Authors -// 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/desktop_capture/rounded_corner_image_view.h" - -#include "ui/gfx/canvas.h" -#include "ui/gfx/geometry/skia_conversions.h" -#include "ui/views/layout/layout_provider.h" - -RoundedCornerImageView::RoundedCornerImageView() { - SetCanProcessEventsWithinSubtree(false); -} - -void RoundedCornerImageView::OnPaint(gfx::Canvas* canvas) { - SkPath mask; - CHECK(GetLayoutProvider()); - const int corner_radius = - GetLayoutProvider()->GetCornerRadiusMetric(views::Emphasis::kMedium); - mask.addRoundRect(gfx::RectToSkRect(GetImageBounds()), corner_radius, - corner_radius); - canvas->ClipPath(mask, true); - ImageView::OnPaint(canvas); -} - -BEGIN_METADATA(RoundedCornerImageView) -END_METADATA
diff --git a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h b/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h deleted file mode 100644 index 6b64306..0000000 --- a/chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2023 The Chromium Authors -// 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_DESKTOP_CAPTURE_ROUNDED_CORNER_IMAGE_VIEW_H_ -#define CHROME_BROWSER_UI_VIEWS_DESKTOP_CAPTURE_ROUNDED_CORNER_IMAGE_VIEW_H_ - -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/views/controls/image_view.h" - -// TODO(crbug.com/40273922): Add support for rounded image corners to ImageView -class RoundedCornerImageView : public views::ImageView { - METADATA_HEADER(RoundedCornerImageView, views::ImageView) - - public: - RoundedCornerImageView(); - - RoundedCornerImageView(const RoundedCornerImageView&) = delete; - RoundedCornerImageView& operator=(const RoundedCornerImageView&) = delete; - - ~RoundedCornerImageView() override = default; - - protected: - // views::ImageView: - void OnPaint(gfx::Canvas* canvas) override; -}; - -#endif // CHROME_BROWSER_UI_VIEWS_DESKTOP_CAPTURE_ROUNDED_CORNER_IMAGE_VIEW_H_
diff --git a/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc b/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc index dedd725..d1524b2 100644 --- a/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc +++ b/chrome/browser/ui/views/desktop_capture/share_this_tab_source_view.cc
@@ -13,7 +13,6 @@ #include "base/task/thread_pool.h" #include "chrome/browser/favicon/favicon_utils.h" #include "chrome/browser/media/webrtc/desktop_media_picker_utils.h" -#include "chrome/browser/ui/views/desktop_capture/rounded_corner_image_view.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -24,6 +23,7 @@ #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/text_constants.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/layout/layout_provider.h" namespace { @@ -91,7 +91,11 @@ throbber_->SetBoundsRect(kThrobberRect); throbber_->Start(); - image_view_ = AddChildView(std::make_unique<RoundedCornerImageView>()); + image_view_ = AddChildView(std::make_unique<views::ImageView>()); + image_view_->SetCanProcessEventsWithinSubtree(false); + image_view_->SetCornerRadius( + views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::Emphasis::kMedium)); image_view_->SetVisible(false); image_view_->SetBoundsRect(kPreviewRect);
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.cc index d94562f..fcccede 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h" #include "chrome/browser/extensions/extension_tab_util.h" +#include "chrome/browser/extensions/extension_ui_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" @@ -12,9 +13,23 @@ #include "chrome/browser/ui/views/extensions/extensions_request_access_button.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_button.h" #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h" +#include "chrome/common/pref_names.h" #include "components/user_education/common/feature_promo/feature_promo_controller.h" +#include "extensions/browser/extension_util.h" #include "extensions/common/extension_features.h" +namespace { +// If true, block the Extensions Zero State Promo IPH from launching, to +// avoid a race condition in test environments. +bool g_block_zero_state_promo_for_testing = false; +} // namespace + +// static +base::AutoReset<bool> +ExtensionsToolbarContainerViewController::BlockZeroStatePromoForTesting() { + return base::AutoReset<bool>(&g_block_zero_state_promo_for_testing, true); +} + ExtensionsToolbarContainerViewController:: ExtensionsToolbarContainerViewController( Browser* browser, @@ -79,6 +94,18 @@ browser_->window()->MaybeShowFeaturePromo( feature_engagement::kIPHExtensionsMenuFeature); } + + // The Extensions Zero State promo prompts users without extensions to + // explore the Chrome Web Store. + // + // TODO(crbug.com/417543907): find a less busy method to trigger the zero + // state promo IPH. + if (!g_block_zero_state_promo_for_testing && + !extensions::util::AnyCurrentlyInstalledExtensionIsFromWebstore( + browser_->profile())) { + browser_->window()->MaybeShowFeaturePromo( + feature_engagement::kIPHExtensionsZeroStatePromoFeature); + } } void ExtensionsToolbarContainerViewController::UpdateRequestAccessButton() {
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h b/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h index 88c74c5..ce6bda6 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h
@@ -20,6 +20,26 @@ static constexpr int kFlexOrderRequestAccessButton = 2; static constexpr int kFlexOrderActionView = 3; + // Returns a scope object to block launching the Extensions Zero State + // Promo IPH. + // + // In a live environment, the Extensions Zero State Promo IPH will only open + // after at least 10 minutes into the browsing session. + // + // When running InProcessBrowserTest, the IPH can trigger as soon as the + // browser is constructed. When the IPH is shown, it takes focus away from + // the browser, and causes tests to time out, as + // InProcessBrowserTest::PreRunTestOnMainThread waits for the browser to + // come to focus. + // + // This global variable allows the In Process Browser Tests that trigger + // the IPH to avoid this race condition, by suppressing the IPH until the + // browser initialization and set up steps are done. + // + // TODO(crbug.com/417543907) Move the Zero State Promo IPH trigger to a more + // appropriate location to avoid this race condition. + static base::AutoReset<bool> BlockZeroStatePromoForTesting(); + ExtensionsToolbarContainerViewController( Browser* browser, ExtensionsToolbarContainer* extensions_container);
diff --git a/chrome/browser/ui/views/frame/multi_contents_view.cc b/chrome/browser/ui/views/frame/multi_contents_view.cc index 455d191..4766283 100644 --- a/chrome/browser/ui/views/frame/multi_contents_view.cc +++ b/chrome/browser/ui/views/frame/multi_contents_view.cc
@@ -221,7 +221,10 @@ void MultiContentsView::OnWebContentsFocused(views::WebView* web_view) { if (IsInSplitView()) { - if (GetInactiveContentsView()->web_contents() == web_view->web_contents()) { + // Check whether the widget is visible as otherwise during browser hide, + // inactive web contents gets focus. See crbug.com/419335827 + if (GetInactiveContentsView()->web_contents() == web_view->web_contents() && + GetWidget()->IsVisible()) { inactive_contents_focused_callback_.Run(web_view->web_contents()); } }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc index 8a5ace7..f662ba4 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc
@@ -109,42 +109,6 @@ corner_radius, corner_radius, flags); } -//////////////////////////////////////////////////////////////////////////////// -// RoundedCornerImageView: - -class RoundedCornerImageView : public views::ImageView { - METADATA_HEADER(RoundedCornerImageView, views::ImageView) - - public: - RoundedCornerImageView(); - - RoundedCornerImageView(const RoundedCornerImageView&) = delete; - RoundedCornerImageView& operator=(const RoundedCornerImageView&) = delete; - - ~RoundedCornerImageView() override = default; - - protected: - // views::ImageView: - void OnPaint(gfx::Canvas* canvas) override; -}; - -RoundedCornerImageView::RoundedCornerImageView() { - SetCanProcessEventsWithinSubtree(false); -} - -void RoundedCornerImageView::OnPaint(gfx::Canvas* canvas) { - SkPath mask; - const int corner_radius = views::LayoutProvider::Get()->GetCornerRadiusMetric( - views::Emphasis::kMedium); - mask.addRoundRect(gfx::RectToSkRect(GetImageBounds()), corner_radius, - corner_radius); - canvas->ClipPath(mask, true); - ImageView::OnPaint(canvas); -} - -BEGIN_METADATA(RoundedCornerImageView) -END_METADATA - } // namespace // Produces the largest centered square gfx::Rect that fits within a rectangle @@ -225,7 +189,11 @@ OmniboxMatchCellView::OmniboxMatchCellView(OmniboxResultView* result_view) { icon_view_ = AddChildView(std::make_unique<views::ImageView>()); - answer_image_view_ = AddChildView(std::make_unique<RoundedCornerImageView>()); + answer_image_view_ = AddChildView(std::make_unique<views::ImageView>()); + answer_image_view_->SetCanProcessEventsWithinSubtree(false); + answer_image_view_->SetCornerRadius( + views::LayoutProvider::Get()->GetCornerRadiusMetric( + views::Emphasis::kMedium)); tail_suggest_ellipse_view_ = AddChildView(std::make_unique<OmniboxTextView>(result_view)); tail_suggest_ellipse_view_->SetText(AutocompleteMatch::kEllipsis);
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 ced47c5c..662ae0e5 100644 --- a/chrome/browser/ui/views/passwords/password_save_update_view.cc +++ b/chrome/browser/ui/views/passwords/password_save_update_view.cc
@@ -170,6 +170,10 @@ extra_view_->SetCallback( base::BindOnce(button_clicked, base::Unretained(this), &Controller::OnNeverForThisSiteClicked)); + + // The third button will usually stretch the bubble beyond its intended + // width. Permit the bubble to use vertical buttons if this happens. + set_allow_vertical_buttons(true); } else { // 2-button save dialog variant. SetCancelCallback(base::BindOnce(button_clicked, base::Unretained(this),
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc index 816d4e8a..c24f519 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc
@@ -2592,7 +2592,7 @@ } // TODO(crbug.com/360106845): Fix flaky test and re-enable. -#if BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) #define MAYBE_SigninPausedFromWebSignoutThenRestartChrome \ DISABLED_SigninPausedFromWebSignoutThenRestartChrome #else
diff --git a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc index d709279d..fece831 100644 --- a/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc +++ b/chrome/browser/ui/views/profiles/first_run_flow_controller_dice.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/search_engine_choice/search_engine_choice_dialog_service.h" #include "chrome/browser/search_engine_choice/search_engine_choice_dialog_service_factory.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h" #include "chrome/browser/ui/views/profiles/profile_management_flow_controller_impl.h" @@ -45,6 +46,12 @@ #include "google_apis/gaia/core_account_id.h" #include "url/gurl.h" +#if BUILDFLAG(IS_WIN) +#include "chrome/browser/win/taskbar_manager.h" +#include "chrome/installer/util/install_util.h" +#include "chrome/installer/util/shell_util.h" +#endif + namespace { constexpr base::TimeDelta kDefaultBrowserCheckTimeout = base::Seconds(2); @@ -97,6 +104,12 @@ } } +#if BUILDFLAG(IS_WIN) +void PinToTaskbarResult(bool result) { + base::UmaHistogramBoolean("Windows.TaskbarPinFromFRESucceeded", result); +} +#endif // BUILDFLAG(IS_WIN) + class IntroStepController : public ProfileManagementStepController { public: explicit IntroStepController( @@ -246,6 +259,21 @@ weak_ptr_factory_.GetWeakPtr()))); } + void OnCanPinToTaskbarResult(bool can_pin) { + can_pin_ = can_pin; + if (can_pin) { + // Change subtitle if Chrome can be pinned to the taskbar. + auto* intro_ui = host() + ->GetPickerContents() + ->GetWebUI() + ->GetController() + ->GetAs<IntroUI>(); + CHECK(intro_ui); + intro_ui->SetCanPinToTaskbar(can_pin); + } + std::move(show_default_browser_screen_callback_).Run(); + } + void OnStepCompleted(DefaultBrowserChoice choice) { if (choice == DefaultBrowserChoice::kClickSetAsDefault) { CHECK(!IsDefaultBrowserDisabledByPolicy()); @@ -254,6 +282,13 @@ // freed once all its tasks have finished. base::MakeRefCounted<shell_integration::DefaultBrowserWorker>() ->StartSetAsDefault(base::BindOnce(&MaybeLogSetAsDefaultSuccess)); +#if BUILDFLAG(IS_WIN) + if (can_pin_) { + browser_util::PinAppToTaskbar( + ShellUtil::GetBrowserModelId(InstallUtil::IsPerUserInstall()), + base::BindOnce(&PinToTaskbarResult)); + } +#endif // BUILDFLAG(IS_WIN) } base::UmaHistogramEnumeration("ProfilePicker.FirstRun.DefaultBrowser", choice); @@ -275,6 +310,20 @@ state == shell_integration::OTHER_MODE_IS_DEFAULT; if (should_show_default_browser_step) { +#if BUILDFLAG(IS_WIN) + // Check if Chrome can pin to the taskbar, which is an async call. When it + // finishes, the result will be recorded and + // `show_default_browser_screen_callback_` will be run. + if (base::FeatureList::IsEnabled( + features::kOfferPinToTaskbarInFirstRunExperience)) { + browser_util::ShouldOfferToPin( + ShellUtil::GetBrowserModelId(InstallUtil::IsPerUserInstall()), + base::BindOnce( + &DefaultBrowserStepController::OnCanPinToTaskbarResult, + base::Unretained(this))); + return; + } +#endif // BUILDFLAG(IS_WIN) std::move(show_default_browser_screen_callback_).Run(); } else { std::move(step_completed_callback_) @@ -345,6 +394,9 @@ // `step_completed_callback_`. StepSwitchFinishedCallback switch_from_previous_step_finished_callback_; + // Whether or not Chrome be pinned to the taskbar. + bool can_pin_ = false; + base::OnceClosure navigation_finished_closure_; base::CancelableOnceClosure default_browser_check_timeout_closure_; base::OnceCallback<void()> show_default_browser_screen_callback_;
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc index 07816d4..b52cc0a 100644 --- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc +++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -96,6 +96,7 @@ #include "components/user_education/webui/help_bubble_handler.h" #include "components/user_education/webui/help_bubble_webui.h" #include "components/vector_icons/vector_icons.h" +#include "extensions/common/extension_urls.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" #include "ui/base/l10n/l10n_util.h" @@ -120,6 +121,10 @@ #include "chrome/browser/glic/resources/grit/glic_browser_resources.h" #endif // BUILDFLAG(ENABLE_GLIC) +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h" +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + namespace { using Platforms = user_education::Metadata::Platforms; @@ -609,6 +614,47 @@ .SetMetadata(117, "emiliapaz@chromium.org", "Triggered when an extension " "requests access permission."))); + + // kIPHExtensionsZeroStatePromoFeature + user_education::Metadata kIPHExtensionsZeroStatePromoFeatureMetaData = + user_education::Metadata( + 140, "uwyiming@google.com", + "Triggered when a user has no extensions installed."); + switch (feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.Get()) { + case feature_engagement::kCustomActionIph: + registry.RegisterFeature(std::move( + user_education::FeaturePromoSpecification::CreateForCustomAction( + feature_engagement::kIPHExtensionsZeroStatePromoFeature, + kToolbarAppMenuButtonElementId, + IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_DESCRIPTION, + IDS_EXTENSIONS_ZERO_STATE_PROMO_CUSTOM_ACTION_IPH_ACCEPT, + CreateNavigationAction(extension_urls::GetWebstoreLaunchURL())) + .SetCustomActionIsDefault(true) + .SetBubbleTitleText(IDS_EXTENSIONS_ZERO_STATE_PROMO_IPH_TITLE) + .SetMetadata( + std::move(kIPHExtensionsZeroStatePromoFeatureMetaData)) + .SetHighlightedMenuItem( + ExtensionsMenuModel::kVisitChromeWebStoreMenuItem))); + break; + case feature_engagement::kCustomUiChipIph: + case feature_engagement::kCustomUIPlainLinkIph: + registry.RegisterFeature(std::move( + user_education::FeaturePromoSpecification::CreateForCustomUi( + feature_engagement::kIPHExtensionsZeroStatePromoFeature, + kToolbarAppMenuButtonElementId, + MakeCustomWebUIHelpBubbleFactoryCallback< + extensions::ZeroStatePromoController>( + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + // No op. The individual buttons on the custom UI will perform the + // actual actions. + base::DoNothing()) + .SetMetadata( + std::move(kIPHExtensionsZeroStatePromoFeatureMetaData)) + .SetBubbleArrow(HelpBubbleArrow::kTopRight) + .SetHighlightedMenuItem( + ExtensionsMenuModel::kVisitChromeWebStoreMenuItem))); + break; + } #endif // kIPHLiveCaptionFeature:
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h index 3f173e4..ea72790 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h
@@ -58,9 +58,13 @@ ControllerClass##Config() \ : DefaultTopChromeWebUIConfig(content::kChromeUIScheme, HostName) {} \ ~ControllerClass##Config() override = default; \ - bool ShouldAutoResizeHost() override { \ - return true; \ - } \ + bool ShouldAutoResizeHost() override; \ + } + +// You need to do this in your custom help bubble WebUI controller `.cc` file. +#define DEFINE_TOP_CHROME_WEBUI_CONFIG(ControllerClass) \ + bool ControllerClass##Config::ShouldAutoResizeHost() { \ + return true; \ } // In order to be considered a controller for a custom help bubble WebUI, a
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc index fba6f34..239a56fc 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc
@@ -91,6 +91,7 @@ }; DECLARE_TOP_CHROME_WEBUI_CONFIG(TestWebUIHelpBubbleController, kTestWebUIHost); +DEFINE_TOP_CHROME_WEBUI_CONFIG(TestWebUIHelpBubbleController) WEB_UI_CONTROLLER_TYPE_IMPL(TestWebUIHelpBubbleController)
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 7156ade..e42c6c5 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
@@ -170,6 +170,7 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/ui/views/apps/app_dialog/app_uninstall_dialog_view.h" #else +#include "chrome/browser/apps/link_capturing/enable_link_capturing_infobar_delegate.h" #include "chrome/browser/ui/webui/app_home/app_home.mojom.h" #include "chrome/browser/ui/webui/app_home/app_home_page_handler.h" #include "chrome/browser/ui/webui/app_management/web_app_settings_page_handler.h" @@ -1777,6 +1778,17 @@ ASSERT_TRUE(app_browser_->is_type_app()); ASSERT_TRUE(AppBrowserController::IsForWebApp(app_browser_, app_id)); active_app_id_ = app_browser()->app_controller()->app_id(); + +#if !BUILDFLAG(IS_CHROMEOS) + // In certain tests where window controls overlay is being tested, if the app + // does not capture navigations by default, the EnableLinkCapturingInfoBar + // shows up, preventing the WCO area from being drawn. Since current tests + // using the integration testing framework do not interact with that UI, close + // it to prevent WCO related tests from flaking. + apps::EnableLinkCapturingInfoBarDelegate::RemoveInfoBar( + app_browser_->tab_strip_model()->GetActiveWebContents()); +#endif // !BUILDFLAG(IS_CHROMEOS) + AfterStateChangeAction(); }
diff --git a/chrome/browser/ui/web_applications/BUILD.gn b/chrome/browser/ui/web_applications/BUILD.gn index 4d05a98..08d23b8 100644 --- a/chrome/browser/ui/web_applications/BUILD.gn +++ b/chrome/browser/ui/web_applications/BUILD.gn
@@ -162,6 +162,9 @@ ] if (is_chromeos) { - deps += [ "//chrome/browser/ash/fileapi" ] + deps += [ + "//chrome/browser/ash/fileapi", + "//chrome/browser/sharesheet", + ] } }
diff --git a/chrome/browser/ui/webui/certificate_manager/certificate_manager_ui.cc b/chrome/browser/ui/webui/certificate_manager/certificate_manager_ui.cc index 7552774..2426969 100644 --- a/chrome/browser/ui/webui/certificate_manager/certificate_manager_ui.cc +++ b/chrome/browser/ui/webui/certificate_manager/certificate_manager_ui.cc
@@ -8,7 +8,6 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/certificate_manager/certificate_manager_utils.h" -#include "chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h" #include "chrome/browser/ui/webui/plural_string_handler.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" @@ -20,14 +19,10 @@ #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" #include "ui/webui/webui_util.h" - -#if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) #include "chrome/browser/ui/webui/certificate_manager/client_cert_sources.h" -#endif #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/ui/webui/certificate_provisioning_ui_handler.h" -#include "chrome/browser/ui/webui/certificates_handler.h" #include "components/user_manager/user_manager.h" #endif // BUILDFLAG(IS_CHROMEOS) @@ -37,26 +32,6 @@ "https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/" "chrome_root_store/faq.md"; -#if BUILDFLAG(IS_CHROMEOS) -void AddCertificateManagerStrings(content::WebUIDataSource* html_source) { - struct { - const char* name; - int id; - } localized_strings[] = { - {"cancel", IDS_CANCEL}, - {"close", IDS_CLOSE}, - {"edit", IDS_SETTINGS_EDIT}, - {"moreActions", IDS_SETTINGS_MORE_ACTIONS}, - {"ok", IDS_OK}, - }; - for (const auto& entry : localized_strings) { - html_source->AddLocalizedString(entry.name, entry.id); - } - certificate_manager::AddLocalizedStrings(html_source); -} -#endif // BUILDFLAG(IS_CHROMEOS) - -#if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) void AddCertificateManagerV2Strings(content::WebUIDataSource* html_source) { static constexpr webui::LocalizedString kLocalizedStrings[] = { {"ok", IDS_OK}, @@ -179,7 +154,6 @@ }; html_source->AddLocalizedStrings(kLocalizedStrings); } -#endif // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) } // namespace @@ -195,63 +169,32 @@ webui::EnableTrustedTypesCSP(source); webui::SetJSModuleDefaults(source); + source->AddResourcePath("", IDR_CERT_MANAGER_DIALOG_V2_HTML); + AddCertificateManagerV2Strings(source); + source->AddString("crsLearnMoreUrl", kCRSLearnMoreLink); #if BUILDFLAG(IS_CHROMEOS) - if (!base::FeatureList::IsEnabled(features::kEnableCertManagementUIV2)) { - // Serve the old certificate manager - AddCertificateManagerStrings(source); - - source->UseStringsJs(); - source->SetDefaultResource(IDR_CERT_MANAGER_DIALOG_HTML); - - source->AddBoolean("isGuest", - user_manager::UserManager::Get()->IsLoggedInAsGuest() || - user_manager::UserManager::Get() - ->IsLoggedInAsManagedGuestSession()); - source->AddBoolean( - "isKiosk", user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()); - - web_ui->AddMessageHandler( - std::make_unique<certificate_manager::CertificatesHandler>()); - web_ui->AddMessageHandler( - chromeos::cert_provisioning::CertificateProvisioningUiHandler:: - CreateForProfile(profile)); - } -#endif // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ - BUILDFLAG(IS_CHROMEOS) - if (base::FeatureList::IsEnabled(features::kEnableCertManagementUIV2)) { - source->AddResourcePath("", IDR_CERT_MANAGER_DIALOG_V2_HTML); - AddCertificateManagerV2Strings(source); - source->AddString("crsLearnMoreUrl", kCRSLearnMoreLink); -#if BUILDFLAG(IS_CHROMEOS) - ClientCertManagementAccessControls client_cert_policy(profile); - source->AddBoolean( - "clientCertImportAllowed", - client_cert_policy.IsManagementAllowed( - ClientCertManagementAccessControls::kSoftwareBacked)); - source->AddBoolean( - "clientCertImportAndBindAllowed", - client_cert_policy.IsManagementAllowed( - ClientCertManagementAccessControls::kHardwareBacked)); - web_ui->AddMessageHandler( - chromeos::cert_provisioning::CertificateProvisioningUiHandler:: - CreateForProfile(profile)); + ClientCertManagementAccessControls client_cert_policy(profile); + source->AddBoolean("clientCertImportAllowed", + client_cert_policy.IsManagementAllowed( + ClientCertManagementAccessControls::kSoftwareBacked)); + source->AddBoolean("clientCertImportAndBindAllowed", + client_cert_policy.IsManagementAllowed( + ClientCertManagementAccessControls::kHardwareBacked)); + web_ui->AddMessageHandler( + chromeos::cert_provisioning::CertificateProvisioningUiHandler:: + CreateForProfile(profile)); #endif - auto plural_string_handler = std::make_unique<PluralStringHandler>(); - plural_string_handler->AddLocalizedString( - "certificateManagerV2NumCerts", - IDS_SETTINGS_CERTIFICATE_MANAGER_V2_NUM_CERTS); - web_ui->AddMessageHandler(std::move(plural_string_handler)); - PrefService* prefs = profile->GetPrefs(); - source->AddBoolean("userCertsImportAllowed", - IsCACertificateManagementAllowed(*prefs)); - } -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || - // BUILDFLAG(IS_CHROMEOS) + auto plural_string_handler = std::make_unique<PluralStringHandler>(); + plural_string_handler->AddLocalizedString( + "certificateManagerV2NumCerts", + IDS_SETTINGS_CERTIFICATE_MANAGER_V2_NUM_CERTS); + web_ui->AddMessageHandler(std::move(plural_string_handler)); + PrefService* prefs = profile->GetPrefs(); + source->AddBoolean("userCertsImportAllowed", + IsCACertificateManagementAllowed(*prefs)); } -#if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) void CertificateManagerUI::BindInterface( mojo::PendingReceiver< certificate_manager_v2::mojom::CertificateManagerPageHandlerFactory> @@ -273,7 +216,6 @@ std::move(client), std::move(handler), Profile::FromWebUI(web_ui()), web_ui()->GetWebContents()); } -#endif // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) CertificateManagerUI::~CertificateManagerUI() = default;
diff --git a/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc b/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc deleted file mode 100644 index 009ed45d..0000000 --- a/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.cc +++ /dev/null
@@ -1,117 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h" - -#include "build/build_config.h" -#include "chrome/grit/generated_resources.h" -#include "components/strings/grit/components_strings.h" -#include "content/public/browser/web_ui_data_source.h" -#include "ui/base/webui/web_ui_util.h" -#include "ui/webui/webui_util.h" - -namespace certificate_manager { - -void AddLocalizedStrings(content::WebUIDataSource* html_source) { - static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"certificateManagerExpandA11yLabel", - IDS_SETTINGS_CERTIFICATE_MANAGER_EXPAND_ACCESSIBILITY_LABEL}, - {"certificateManagerNoCertificates", - IDS_SETTINGS_CERTIFICATE_MANAGER_NO_CERTIFICATES}, - {"certificateManagerYourCertificates", - IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES}, - {"certificateManagerYourCertificatesDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_YOUR_CERTIFICATES_DESCRIPTION}, - {"certificateManagerServers", IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS}, - {"certificateManagerServersDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_SERVERS_DESCRIPTION}, - {"certificateManagerAuthorities", - IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES}, - {"certificateManagerAuthoritiesDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_AUTHORITIES_DESCRIPTION}, - {"certificateManagerOthers", IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS}, - {"certificateManagerOthersDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_OTHERS_DESCRIPTION}, - {"certificateManagerView", IDS_SETTINGS_CERTIFICATE_MANAGER_VIEW}, - {"certificateManagerImport", IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT}, - {"certificateManagerImportAndBind", - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_AND_BIND}, - {"certificateManagerExport", IDS_SETTINGS_CERTIFICATE_MANAGER_EXPORT}, - {"certificateManagerDelete", IDS_SETTINGS_DELETE}, - {"certificateManagerUntrusted", - IDS_SETTINGS_CERTIFICATE_MANAGER_UNTRUSTED}, - // CA trust edit dialog. - {"certificateManagerCaTrustEditDialogTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_TITLE}, - {"certificateManagerCaTrustEditDialogDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_DESCRIPTION}, - {"certificateManagerCaTrustEditDialogExplanation", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EXPLANATION}, - {"certificateManagerCaTrustEditDialogSsl", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_SSL}, - {"certificateManagerCaTrustEditDialogEmail", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_EMAIL}, - {"certificateManagerCaTrustEditDialogObjSign", - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_TRUST_EDIT_DIALOG_OBJ_SIGN}, - // Certificate delete confirmation dialog. - {"certificateManagerDeleteUserTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_TITLE}, - {"certificateManagerDeleteUserDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_USER_DESCRIPTION}, - {"certificateManagerDeleteServerTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_TITLE}, - {"certificateManagerDeleteServerDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_SERVER_DESCRIPTION}, - {"certificateManagerDeleteCaTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_TITLE}, - {"certificateManagerDeleteCaDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CA_DESCRIPTION}, - {"certificateManagerDeleteOtherTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_OTHER_TITLE}, - // Encrypt/decrypt password dialogs. - {"certificateManagerEncryptPasswordTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_TITLE}, - {"certificateManagerDecryptPasswordTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_DECRYPT_PASSWORD_TITLE}, - {"certificateManagerEncryptPasswordDescription", - IDS_SETTINGS_CERTIFICATE_MANAGER_ENCRYPT_PASSWORD_DESCRIPTION}, - {"certificateManagerPassword", IDS_SETTINGS_CERTIFICATE_MANAGER_PASSWORD}, - {"certificateManagerConfirmPassword", - IDS_SETTINGS_CERTIFICATE_MANAGER_CONFIRM_PASSWORD}, - {"certificateImportErrorFormat", - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_FORMAT}, -#if BUILDFLAG(IS_CHROMEOS) - {"certificateProvisioningListHeader", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LIST_HEADER}, - {"certificateProvisioningRefresh", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_REFRESH}, - {"certificateProvisioningReset", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_RESET}, - {"certificateProvisioningDetails", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_DETAILS}, - {"certificateProvisioningAdvancedSectionTitle", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_ADVANCED}, - {"certificateProvisioningProcessId", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_PROCESS_ID}, - {"certificateProvisioningProfileName", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_NAME}, - {"certificateProvisioningProfileId", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_CERTIFICATE_PROFILE_ID}, - {"certificateProvisioningStatus", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS}, - {"certificateProvisioningStatusId", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_STATUS_ID}, - {"certificateProvisioningLastUpdate", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UPDATE}, - {"certificateProvisioningLastUnsuccessfulStatus", - IDS_SETTINGS_CERTIFICATE_MANAGER_PROVISIONING_LAST_UNSUCCESSFUL_STATUS}, - {"certificateProvisioningPublicKey", IDS_CERT_DETAILS_SUBJECT_KEY}, -#endif // BUILDFLAG(IS_CHROMEOS) - // For A11y. - {"menu", IDS_MENU}, - }; - html_source->AddLocalizedStrings(kLocalizedStrings); -} - -} // namespace certificate_manager
diff --git a/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h b/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h deleted file mode 100644 index d0b3d1c..0000000 --- a/chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h +++ /dev/null
@@ -1,21 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_CERTIFICATE_MANAGER_LOCALIZED_STRINGS_PROVIDER_H_ -#define CHROME_BROWSER_UI_WEBUI_CERTIFICATE_MANAGER_LOCALIZED_STRINGS_PROVIDER_H_ - -namespace content { -class WebUIDataSource; -} - -namespace certificate_manager { - -// Adds the strings needed for the certificate_manager component to -// |html_source|. String ids correspond to ids in -// ui/webui/resources/cr_components/certificate_manager/. -void AddLocalizedStrings(content::WebUIDataSource* html_source); - -} // namespace certificate_manager - -#endif // CHROME_BROWSER_UI_WEBUI_CERTIFICATE_MANAGER_LOCALIZED_STRINGS_PROVIDER_H_
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc index 69a8d9a..ca330245 100644 --- a/chrome/browser/ui/webui/certificates_handler.cc +++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -4,1324 +4,18 @@ #include "chrome/browser/ui/webui/certificates_handler.h" -#include <errno.h> -#include <stddef.h> -#include <stdint.h> - -#include <algorithm> -#include <map> -#include <utility> -#include <vector> - -#include "base/files/file_util.h" // for FileAccessProvider -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/i18n/string_compare.h" -#include "base/memory/raw_ptr.h" -#include "base/posix/safe_strerror.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/task_traits.h" -#include "base/task/thread_pool.h" -#include "base/values.h" -#include "build/build_config.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/certificate_viewer.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/certificate_dialogs.h" -#include "chrome/browser/ui/chrome_select_file_policy.h" -#include "chrome/browser/ui/crypto_module_password_dialog_nss.h" -#include "chrome/browser/ui/webui/certificate_viewer/certificate_viewer_webui.h" -#include "chrome/common/net/x509_certificate_model_nss.h" #include "chrome/common/pref_names.h" -#include "chrome/grit/generated_resources.h" -#include "components/file_access/scoped_file_access.h" -#include "components/file_access/scoped_file_access_delegate.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" -#include "content/public/browser/web_contents.h" -#include "net/base/net_errors.h" -#include "net/cert/x509_certificate.h" -#include "net/cert/x509_util_nss.h" -#include "third_party/boringssl/src/include/openssl/bytestring.h" -#include "third_party/boringssl/src/include/openssl/span.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/shell_dialogs/selected_file_info.h" - -using base::UTF8ToUTF16; - -namespace { - -// Field names for communicating certificate info to JS. -static const char kCertificatesHandlerEmailField[] = "email"; -static const char kCertificatesHandlerExtractableField[] = "extractable"; -static const char kCertificatesHandlerKeyField[] = "id"; -static const char kCertificatesHandlerNameField[] = "name"; -static const char kCertificatesHandlerObjSignField[] = "objSign"; -static const char kCertificatesHandlerPolicyInstalledField[] = "policy"; -static const char kCertificatesHandlerWebTrustAnchorField[] = "webTrustAnchor"; -static const char kCertificatesHandlerCanBeDeletedField[] = "canBeDeleted"; -static const char kCertificatesHandlerCanBeEditedField[] = "canBeEdited"; -static const char kCertificatesHandlerSslField[] = "ssl"; -static const char kCertificatesHandlerSubnodesField[] = "subnodes"; -static const char kCertificatesHandlerContainsPolicyCertsField[] = - "containsPolicyCerts"; -static const char kCertificatesHandlerUntrustedField[] = "untrusted"; - -// Field names for communicating erros to JS. -static const char kCertificatesHandlerCertificateErrors[] = "certificateErrors"; -static const char kCertificatesHandlerErrorDescription[] = "description"; -static const char kCertificatesHandlerErrorField[] = "error"; -static const char kCertificatesHandlerErrorTitle[] = "title"; - -std::string OrgNameToId(const std::string& org) { - return "org-" + org; -} - -struct DictionaryIdComparator { - explicit DictionaryIdComparator(icu::Collator* collator) - : collator_(collator) {} - - bool operator()(const base::Value& a, const base::Value& b) const { - DCHECK(a.type() == base::Value::Type::DICT); - DCHECK(b.type() == base::Value::Type::DICT); - const base::Value::Dict& a_dict = a.GetDict(); - const base::Value::Dict& b_dict = b.GetDict(); - std::u16string a_str; - std::u16string b_str; - const std::string* ptr = a_dict.FindString(kCertificatesHandlerNameField); - if (ptr) { - a_str = base::UTF8ToUTF16(*ptr); - } - ptr = b_dict.FindString(kCertificatesHandlerNameField); - if (ptr) { - b_str = base::UTF8ToUTF16(*ptr); - } - if (collator_ == nullptr) { - return a_str < b_str; - } - return base::i18n::CompareString16WithCollator(*collator_, a_str, b_str) == - UCOL_LESS; - } - - raw_ptr<icu::Collator> collator_; -}; - -std::string NetErrorToString(int net_error) { - switch (net_error) { - // TODO(mattm): handle more cases. - case net::ERR_IMPORT_CA_CERT_NOT_CA: - return l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_NOT_CA); - case net::ERR_IMPORT_CERT_ALREADY_EXISTS: - return l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_CERT_ALREADY_EXISTS); - default: - return l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR); - } -} - -// Struct to bind the Equals member function to an object for use in find_if. -struct CertEquals { - explicit CertEquals(CERTCertificate* cert) : cert_(cert) {} - bool operator()(const scoped_refptr<net::X509Certificate> cert) const { - return net::x509_util::IsSameCertificate(cert_, cert.get()); - } - raw_ptr<CERTCertificate> cert_; -}; - -// Determine if |data| could be a PFX Protocol Data Unit. -// This only does the minimum parsing necessary to distinguish a PFX file from a -// DER encoded Certificate. -// -// From RFC 7292 section 4: -// PFX ::= SEQUENCE { -// version INTEGER {v3(3)}(v3,...), -// authSafe ContentInfo, -// macData MacData OPTIONAL -// } -// From RFC 5280 section 4.1: -// Certificate ::= SEQUENCE { -// tbsCertificate TBSCertificate, -// signatureAlgorithm AlgorithmIdentifier, -// signatureValue BIT STRING } -// -// Certificate must be DER encoded, while PFX may be BER encoded. -// Therefore PFX can be distingushed by checking if the file starts with an -// indefinite SEQUENCE, or a definite SEQUENCE { INTEGER, ... }. -bool CouldBePFX(std::string_view data) { - if (data.size() < 4) { - return false; - } - - // Indefinite length SEQUENCE. - if (data[0] == 0x30 && static_cast<uint8_t>(data[1]) == 0x80) { - return true; - } - - // If the SEQUENCE is definite length, it can be parsed through the version - // tag using DER parser, since INTEGER must be definite length, even in BER. - CBS cbs = bssl::StringAsBytes(data); - CBS sequence, version; - return CBS_get_asn1(&cbs, &sequence, CBS_ASN1_SEQUENCE) && - CBS_get_asn1(&sequence, &version, CBS_ASN1_INTEGER); -} - -} // namespace namespace certificate_manager { -/////////////////////////////////////////////////////////////////////////////// -// FileAccessProvider - -// TODO(mattm): Move to some shared location? -class FileAccessProvider - : public base::RefCountedThreadSafe<FileAccessProvider> { - public: - // The first parameter is 0 on success or errno on failure. The second - // parameter is read result. - typedef base::OnceCallback<void(const int*, const std::string*)> ReadCallback; - - // The first parameter is 0 on success or errno on failure. - typedef base::OnceCallback<void(const int*)> WriteCallback; - - base::CancelableTaskTracker::TaskId StartRead( - const base::FilePath& path, - ReadCallback callback, - base::CancelableTaskTracker* tracker, - file_access::ScopedFileAccess file_access); - base::CancelableTaskTracker::TaskId StartWrite( - const base::FilePath& path, - const std::string& data, - WriteCallback callback, - base::CancelableTaskTracker* tracker); - - private: - friend class base::RefCountedThreadSafe<FileAccessProvider>; - virtual ~FileAccessProvider() = default; - - // Reads file at |path|. |saved_errno| is 0 on success or errno on failure. - // When success, |data| has file content. - void DoRead(const base::FilePath& path, - int* saved_errno, - std::string* data, - file_access::ScopedFileAccess file_access); - // Writes data to file at |path|. |saved_errno| is 0 on success or errno on - // failure. - void DoWrite(const base::FilePath& path, - const std::string& data, - int* saved_errno); -}; - -base::CancelableTaskTracker::TaskId FileAccessProvider::StartRead( - const base::FilePath& path, - ReadCallback callback, - base::CancelableTaskTracker* tracker, - file_access::ScopedFileAccess file_access) { - // Owned by reply callback posted below. - int* saved_errno = new int(0); - std::string* data = new std::string(); - - // Post task to a background sequence to read file. - auto task_runner = base::ThreadPool::CreateTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT}); - return tracker->PostTaskAndReply( - task_runner.get(), FROM_HERE, - base::BindOnce(&FileAccessProvider::DoRead, this, path, saved_errno, data, - std::move(file_access)), - base::BindOnce(std::move(callback), base::Owned(saved_errno), - base::Owned(data))); -} - -base::CancelableTaskTracker::TaskId FileAccessProvider::StartWrite( - const base::FilePath& path, - const std::string& data, - WriteCallback callback, - base::CancelableTaskTracker* tracker) { - // Owned by reply callback posted below. - int* saved_errno = new int(0); - - // This task blocks shutdown because it saves critical user data. - auto task_runner = base::ThreadPool::CreateTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::BLOCK_SHUTDOWN}); - return tracker->PostTaskAndReply( - task_runner.get(), FROM_HERE, - base::BindOnce(&FileAccessProvider::DoWrite, this, path, data, - saved_errno), - base::BindOnce(std::move(callback), base::Owned(saved_errno))); -} - -// The `file_access` object for reading `path` should be in scope to -// successfully read the file when Data Leak Prevention policies are enabled. -void FileAccessProvider::DoRead(const base::FilePath& path, - int* saved_errno, - std::string* data, - file_access::ScopedFileAccess file_access) { - bool success = base::ReadFileToString(path, data); - *saved_errno = success ? 0 : errno; -} - -void FileAccessProvider::DoWrite(const base::FilePath& path, - const std::string& data, - int* saved_errno) { - if (base::WriteFile(path, data)) { - *saved_errno = 0; - } else { - *saved_errno = errno; - } -} - -/////////////////////////////////////////////////////////////////////////////// -// CertificatesHandler - -CertificatesHandler::CertificatesHandler() - : requested_certificate_manager_model_(false), - use_hardware_backed_(false), - file_access_provider_(base::MakeRefCounted<FileAccessProvider>()) {} - -CertificatesHandler::~CertificatesHandler() { - if (select_file_dialog_.get()) { - select_file_dialog_->ListenerDestroyed(); - } - select_file_dialog_.reset(); -} - -void CertificatesHandler::RegisterMessages() { - web_ui()->RegisterMessageCallback( - "viewCertificate", - base::BindRepeating(&CertificatesHandler::HandleViewCertificate, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "getCaCertificateTrust", - base::BindRepeating(&CertificatesHandler::HandleGetCATrust, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "editCaCertificateTrust", - base::BindRepeating(&CertificatesHandler::HandleEditCATrust, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "cancelImportExportCertificate", - base::BindRepeating(&CertificatesHandler::HandleCancelImportExportProcess, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "exportPersonalCertificate", - base::BindRepeating(&CertificatesHandler::HandleExportPersonal, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "exportPersonalCertificatePasswordSelected", - base::BindRepeating( - &CertificatesHandler::HandleExportPersonalPasswordSelected, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "importPersonalCertificate", - base::BindRepeating(&CertificatesHandler::HandleImportPersonal, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "importPersonalCertificatePasswordSelected", - base::BindRepeating( - &CertificatesHandler::HandleImportPersonalPasswordSelected, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "importCaCertificate", - base::BindRepeating(&CertificatesHandler::HandleImportCA, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "importCaCertificateTrustSelected", - base::BindRepeating(&CertificatesHandler::HandleImportCATrustSelected, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "importServerCertificate", - base::BindRepeating(&CertificatesHandler::HandleImportServer, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "exportCertificate", - base::BindRepeating(&CertificatesHandler::HandleExportCertificate, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "deleteCertificate", - base::BindRepeating(&CertificatesHandler::HandleDeleteCertificate, - base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "refreshCertificates", - base::BindRepeating(&CertificatesHandler::HandleRefreshCertificates, - base::Unretained(this))); -} - -void CertificatesHandler::CertificatesRefreshed() { - PopulateTree("personalCerts", net::USER_CERT); - PopulateTree("serverCerts", net::SERVER_CERT); - PopulateTree("caCerts", net::CA_CERT); - PopulateTree("otherCerts", net::OTHER_CERT); -} - -void CertificatesHandler::FileSelected(const ui::SelectedFileInfo& file, - int index) { - CHECK(pending_operation_.has_value()); - switch (*pending_operation_) { - case EXPORT_PERSONAL_FILE: - ExportPersonalFileSelected(file.path()); - break; - case IMPORT_PERSONAL_FILE: - file_access::RequestFilesAccessForSystem( - {file.path()}, - base::BindOnce(&CertificatesHandler::ImportPersonalFileSelected, - weak_ptr_factory_.GetWeakPtr(), file.path())); - break; - case IMPORT_SERVER_FILE: - file_access::RequestFilesAccessForSystem( - {file.path()}, - base::BindOnce(&CertificatesHandler::ImportServerFileSelected, - weak_ptr_factory_.GetWeakPtr(), file.path())); - break; - case IMPORT_CA_FILE: - file_access::RequestFilesAccessForSystem( - {file.path()}, - base::BindOnce(&CertificatesHandler::ImportCAFileSelected, - weak_ptr_factory_.GetWeakPtr(), file.path())); - break; - default: - NOTREACHED(); - } - - select_file_dialog_.reset(); - pending_operation_ = std::nullopt; -} - -void CertificatesHandler::FileSelectionCanceled() { - ImportExportCleanup(); - RejectCallback(base::Value()); -} - -void CertificatesHandler::HandleViewCertificate(const base::Value::List& args) { - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 0 /* arg_index */); - if (!cert_info) { - return; - } - net::ScopedCERTCertificateList certs; - certs.push_back(net::x509_util::DupCERTCertificate(cert_info->cert())); - CertificateViewerDialog::ShowConstrained( - std::move(certs), web_ui()->GetWebContents(), GetParentWindow()); -} - -bool CertificatesHandler::AssignWebUICallbackId(const base::Value::List& args) { - CHECK_LE(1U, args.size()); - if (!webui_callback_id_.empty()) { - return false; - } - webui_callback_id_ = args[0].GetString(); - return true; -} - -void CertificatesHandler::HandleGetCATrust(const base::Value::List& args) { - AllowJavascript(); - - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 1 /* arg_index */); - if (!cert_info) { - return; - } - - net::NSSCertDatabase::TrustBits trust_bits = - certificate_manager_model_->cert_db()->GetCertTrust(cert_info->cert(), - net::CA_CERT); - - ResolveCallback( - base::Value::Dict() - .Set( - kCertificatesHandlerSslField, - static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_SSL)) - .Set(kCertificatesHandlerEmailField, - static_cast<bool>(trust_bits & - net::NSSCertDatabase::TRUSTED_EMAIL)) - .Set(kCertificatesHandlerObjSignField, - static_cast<bool>(trust_bits & - net::NSSCertDatabase::TRUSTED_OBJ_SIGN))); -} - -void CertificatesHandler::HandleEditCATrust(const base::Value::List& args) { - CHECK_EQ(5U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 1 /* arg_index */); - if (!cert_info) { - return; - } - - if (!CanEditCertificate(cert_info)) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SET_TRUST_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_NOT_ALLOWED)); - return; - } - - const bool trust_ssl = args[2].GetBool(); - const bool trust_email = args[3].GetBool(); - const bool trust_obj_sign = args[4].GetBool(); - - bool result = certificate_manager_model_->SetCertTrust( - cert_info->cert(), net::CA_CERT, - trust_ssl * net::NSSCertDatabase::TRUSTED_SSL + - trust_email * net::NSSCertDatabase::TRUSTED_EMAIL + - trust_obj_sign * net::NSSCertDatabase::TRUSTED_OBJ_SIGN); - if (!result) { - // TODO(mattm): better error messages? - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SET_TRUST_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR)); - } else { - ResolveCallback(base::Value()); - } -} - -void CertificatesHandler::HandleExportPersonal(const base::Value::List& args) { - // Early return if the select file dialog is already active. - if (select_file_dialog_) { - return; - } - - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 1 /* arg_index */); - if (!cert_info) { - return; - } - - selected_cert_list_.push_back( - net::x509_util::DupCERTCertificate(cert_info->cert())); - - ui::SelectFileDialog::FileTypeInfo file_type_info; - file_type_info.extensions.resize(1); - file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12")); - file_type_info.extension_description_overrides.push_back( - l10n_util::GetStringUTF16(IDS_SETTINGS_CERTIFICATE_MANAGER_PKCS12_FILES)); - file_type_info.include_all_files = true; - select_file_dialog_ = ui::SelectFileDialog::Create( - this, - std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents())); - pending_operation_ = EXPORT_PERSONAL_FILE; - select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_SAVEAS_FILE, - std::u16string(), base::FilePath(), - &file_type_info, 1, FILE_PATH_LITERAL("p12"), - GetParentWindow()); -} - -void CertificatesHandler::ExportPersonalFileSelected( - const base::FilePath& path) { - file_path_ = path; - ResolveCallback(base::Value()); -} - -void CertificatesHandler::HandleExportPersonalPasswordSelected( - const base::Value::List& args) { - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - password_ = UTF8ToUTF16(args[1].GetString()); // CHECKs if non-string. - - // Currently, we don't support exporting more than one at a time. If we do, - // this would need to either change this to use UnlockSlotsIfNecessary or - // change UnlockCertSlotIfNecessary to take a CertificateList. - CHECK_EQ(selected_cert_list_.size(), 1U); - - // TODO(mattm): do something smarter about non-extractable keys - chrome::UnlockCertSlotIfNecessary( - selected_cert_list_[0].get(), kCryptoModulePasswordCertExport, - net::HostPortPair(), // unused. - GetParentWindow(), - base::BindOnce(&CertificatesHandler::ExportPersonalSlotsUnlocked, - base::Unretained(this))); -} - -void CertificatesHandler::ExportPersonalSlotsUnlocked() { - std::string output; - int num_exported = certificate_manager_model_->cert_db()->ExportToPKCS12( - selected_cert_list_, password_, &output); - if (!num_exported) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_PKCS12_EXPORT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR)); - ImportExportCleanup(); - return; - } - file_access_provider_->StartWrite( - file_path_, output, - base::BindOnce(&CertificatesHandler::ExportPersonalFileWritten, - base::Unretained(this)), - &tracker_); -} - -void CertificatesHandler::ExportPersonalFileWritten(const int* write_errno) { - ImportExportCleanup(); - if (*write_errno) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_PKCS12_EXPORT_ERROR_TITLE), - l10n_util::GetStringFUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_WRITE_ERROR_FORMAT, - UTF8ToUTF16(base::safe_strerror(*write_errno)))); - } else { - ResolveCallback(base::Value()); - } -} - -void CertificatesHandler::HandleImportPersonal(const base::Value::List& args) { - // Early return if the select file dialog is already active. - if (select_file_dialog_) { - return; - } - - // When the "allowed" value changes while user on the certificate manager - // page, the UI doesn't update without page refresh and user can still see and - // use import button. Because of this 'return' the button will do nothing. - if (!IsClientCertificateManagementAllowed(Slot::kUser)) { - return; - } - - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - use_hardware_backed_ = args[1].GetBool(); - - ui::SelectFileDialog::FileTypeInfo file_type_info; - file_type_info.extensions.resize(1); - file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12")); - file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pfx")); - file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("crt")); - file_type_info.extension_description_overrides.push_back( - l10n_util::GetStringUTF16( - IDS_SETTINGS_CERTIFICATE_MANAGER_USAGE_SSL_CLIENT)); - file_type_info.include_all_files = true; - select_file_dialog_ = ui::SelectFileDialog::Create( - this, - std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents())); - pending_operation_ = IMPORT_PERSONAL_FILE; - select_file_dialog_->SelectFile(ui::SelectFileDialog::SELECT_OPEN_FILE, - std::u16string(), base::FilePath(), - &file_type_info, 1, FILE_PATH_LITERAL("p12"), - GetParentWindow()); -} - -void CertificatesHandler::ImportPersonalFileSelected( - const base::FilePath& path, - file_access::ScopedFileAccess file_access) { - file_access_provider_->StartRead( - path, - base::BindOnce(&CertificatesHandler::ImportPersonalFileRead, - base::Unretained(this)), - &tracker_, std::move(file_access)); -} - -void CertificatesHandler::ImportPersonalFileRead(const int* read_errno, - const std::string* data) { - if (*read_errno) { - ImportExportCleanup(); - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_TITLE), - l10n_util::GetStringFUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_READ_ERROR_FORMAT, - UTF8ToUTF16(base::safe_strerror(*read_errno)))); - return; - } - - file_data_ = *data; - - if (CouldBePFX(file_data_)) { - ResolveCallback(base::Value(true)); - return; - } - - // Non .p12/.pfx files are assumed to be single/chain certificates without - // private key data. The default extension according to spec is '.crt', - // however other extensions are also used in some places to represent these - // certificates. - int result = certificate_manager_model_->ImportUserCert(file_data_); - ImportExportCleanup(); - int string_id; - switch (result) { - case net::OK: - ResolveCallback(base::Value(false)); - return; - case net::ERR_NO_PRIVATE_KEY_FOR_CERT: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_MISSING_KEY; - break; - case net::ERR_CERT_INVALID: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_INVALID_FILE; - break; - default: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR; - break; - } - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8(string_id)); -} - -void CertificatesHandler::HandleImportPersonalPasswordSelected( - const base::Value::List& args) { - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - password_ = UTF8ToUTF16(args[1].GetString()); // CHECKs if non-string. - - if (use_hardware_backed_) { - slot_ = certificate_manager_model_->cert_db()->GetPrivateSlot(); - } else { - slot_ = certificate_manager_model_->cert_db()->GetPublicSlot(); - } - - std::vector<crypto::ScopedPK11Slot> modules; - modules.push_back(crypto::ScopedPK11Slot(PK11_ReferenceSlot(slot_.get()))); - chrome::UnlockSlotsIfNecessary( - std::move(modules), kCryptoModulePasswordCertImport, - net::HostPortPair(), // unused. - GetParentWindow(), - base::BindOnce(&CertificatesHandler::ImportPersonalSlotUnlocked, - base::Unretained(this))); -} - -void CertificatesHandler::ImportPersonalSlotUnlocked() { - // Determine if the private key should be unextractable after the import. - // We do this by checking the value of |use_hardware_backed_| which is set - // to true if importing into a hardware module. Currently, this only happens - // for Chrome OS when the "Import and Bind" option is chosen. - bool is_extractable = !use_hardware_backed_; - certificate_manager_model_->ImportFromPKCS12( - slot_.get(), file_data_, password_, is_extractable, - base::BindOnce(&CertificatesHandler::ImportPersonalResultReceived, - weak_ptr_factory_.GetWeakPtr())); - ImportExportCleanup(); -} - -void CertificatesHandler::ImportPersonalResultReceived(int net_result) { - int string_id; - switch (net_result) { - case net::OK: - ResolveCallback(base::Value()); - return; - case net::ERR_PKCS12_IMPORT_BAD_PASSWORD: - // TODO(mattm): if the error was a bad password, we should reshow the - // password dialog after the user dismisses the error dialog. - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_BAD_PASSWORD; - break; - case net::ERR_PKCS12_IMPORT_INVALID_MAC: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_INVALID_MAC; - break; - case net::ERR_PKCS12_IMPORT_INVALID_FILE: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_INVALID_FILE; - break; - case net::ERR_PKCS12_IMPORT_UNSUPPORTED: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_UNSUPPORTED; - break; - default: - string_id = IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR; - break; - } - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8(string_id)); -} - -void CertificatesHandler::HandleCancelImportExportProcess( - const base::Value::List& args) { - ImportExportCleanup(); -} - -void CertificatesHandler::ImportExportCleanup() { - file_path_.clear(); - password_.clear(); - file_data_.clear(); - use_hardware_backed_ = false; - selected_cert_list_.clear(); - slot_.reset(); - tracker_.TryCancelAll(); - - // There may be pending file dialogs, we need to tell them that we've gone - // away so they don't try and call back to us. - if (select_file_dialog_.get()) { - select_file_dialog_->ListenerDestroyed(); - } - select_file_dialog_.reset(); - pending_operation_ = std::nullopt; -} - -void CertificatesHandler::HandleImportServer(const base::Value::List& args) { - // Early return if the select file dialog is already active. - if (select_file_dialog_) { - return; - } - - CHECK_EQ(1U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - select_file_dialog_ = ui::SelectFileDialog::Create( - this, - std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents())); - pending_operation_ = IMPORT_SERVER_FILE; - ShowCertSelectFileDialog(select_file_dialog_.get(), - ui::SelectFileDialog::SELECT_OPEN_FILE, - base::FilePath(), GetParentWindow()); -} - -void CertificatesHandler::ImportServerFileSelected( - const base::FilePath& path, - file_access::ScopedFileAccess file_access) { - file_access_provider_->StartRead( - path, - base::BindOnce(&CertificatesHandler::ImportServerFileRead, - base::Unretained(this)), - &tracker_, std::move(file_access)); -} - -void CertificatesHandler::ImportServerFileRead(const int* read_errno, - const std::string* data) { - if (*read_errno) { - ImportExportCleanup(); - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SERVER_IMPORT_ERROR_TITLE), - l10n_util::GetStringFUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_READ_ERROR_FORMAT, - UTF8ToUTF16(base::safe_strerror(*read_errno)))); - return; - } - - selected_cert_list_ = net::x509_util::CreateCERTCertificateListFromBytes( - base::as_byte_span(*data), net::X509Certificate::FORMAT_AUTO); - if (selected_cert_list_.empty()) { - ImportExportCleanup(); - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SERVER_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CERT_PARSE_ERROR)); - return; - } - - net::NSSCertDatabase::ImportCertFailureList not_imported; - // TODO(mattm): Add UI for trust. http://crbug.com/76274 - bool result = certificate_manager_model_->ImportServerCert( - selected_cert_list_, net::NSSCertDatabase::TRUST_DEFAULT, ¬_imported); - if (!result) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SERVER_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR)); - } else if (!not_imported.empty()) { - RejectCallbackWithImportError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_SERVER_IMPORT_ERROR_TITLE), - not_imported); - } else { - ResolveCallback(base::Value()); - } - ImportExportCleanup(); -} - -void CertificatesHandler::HandleImportCA(const base::Value::List& args) { - // Early return if the select file dialog is already active. - if (select_file_dialog_) { - return; - } - - // When the "allowed" value changes while user on the certificate manager - // page, the UI doesn't update without page refresh and user can still see and - // use import button. Because of this 'return' the button will do nothing. - if (!IsCACertificateManagementAllowed(CertificateSource::kImported)) { - return; - } - - CHECK_EQ(1U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - select_file_dialog_ = ui::SelectFileDialog::Create( - this, - std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents())); - pending_operation_ = IMPORT_CA_FILE; - ShowCertSelectFileDialog(select_file_dialog_.get(), - ui::SelectFileDialog::SELECT_OPEN_FILE, - base::FilePath(), GetParentWindow()); -} - -void CertificatesHandler::ImportCAFileSelected( - const base::FilePath& path, - file_access::ScopedFileAccess file_access) { - file_access_provider_->StartRead( - path, - base::BindOnce(&CertificatesHandler::ImportCAFileRead, - base::Unretained(this)), - &tracker_, std::move(file_access)); -} - -void CertificatesHandler::ImportCAFileRead(const int* read_errno, - const std::string* data) { - if (*read_errno) { - ImportExportCleanup(); - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_IMPORT_ERROR_TITLE), - l10n_util::GetStringFUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_READ_ERROR_FORMAT, - UTF8ToUTF16(base::safe_strerror(*read_errno)))); - return; - } - - selected_cert_list_ = net::x509_util::CreateCERTCertificateListFromBytes( - base::as_byte_span(*data), net::X509Certificate::FORMAT_AUTO); - if (selected_cert_list_.empty()) { - ImportExportCleanup(); - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CERT_PARSE_ERROR)); - return; - } - - CERTCertificate* root_cert = - certificate_manager_model_->cert_db()->FindRootInList( - selected_cert_list_); - - // TODO(mattm): check here if root_cert is not a CA cert and show error. - - base::Value cert_name( - x509_certificate_model::GetSubjectDisplayName(root_cert)); - ResolveCallback(cert_name); -} - -void CertificatesHandler::HandleImportCATrustSelected( - const base::Value::List& args) { - CHECK_EQ(4U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - const bool trust_ssl = args[1].GetBool(); - const bool trust_email = args[2].GetBool(); - const bool trust_obj_sign = args[3].GetBool(); - - // TODO(mattm): add UI for setting explicit distrust, too. - // http://crbug.com/128411 - net::NSSCertDatabase::ImportCertFailureList not_imported; - bool result = certificate_manager_model_->ImportCACerts( - selected_cert_list_, - trust_ssl * net::NSSCertDatabase::TRUSTED_SSL + - trust_email * net::NSSCertDatabase::TRUSTED_EMAIL + - trust_obj_sign * net::NSSCertDatabase::TRUSTED_OBJ_SIGN, - ¬_imported); - if (!result) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_IMPORT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR)); - } else if (!not_imported.empty()) { - RejectCallbackWithImportError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_CA_IMPORT_ERROR_TITLE), - not_imported); - } else { - ResolveCallback(base::Value()); - } - ImportExportCleanup(); -} - -void CertificatesHandler::HandleExportCertificate( - const base::Value::List& args) { - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 0 /* arg_index */); - if (!cert_info) { - return; - } - - net::ScopedCERTCertificateList export_certs; - export_certs.push_back(net::x509_util::DupCERTCertificate(cert_info->cert())); - ShowCertExportDialog(web_ui()->GetWebContents(), GetParentWindow(), - export_certs.begin(), export_certs.end()); -} - -void CertificatesHandler::HandleDeleteCertificate( - const base::Value::List& args) { - CHECK_EQ(2U, args.size()); - if (!AssignWebUICallbackId(args)) { - RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value()); - return; - } - - CertificateManagerModel::CertInfo* cert_info = - GetCertInfoFromCallbackArgs(args, 1 /* arg_index */); - if (!cert_info) { - return; - } - - if (!CanDeleteCertificate(cert_info)) { - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CERT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_ERROR_NOT_ALLOWED)); - return; - } - - certificate_manager_model_->RemoveFromDatabase( - net::x509_util::DupCERTCertificate(cert_info->cert()), - base::BindOnce(&CertificatesHandler::OnCertificateDeleted, - weak_ptr_factory_.GetWeakPtr())); -} - -void CertificatesHandler::OnCertificateDeleted(bool result) { - if (!result) { - // TODO(mattm): better error messages? - RejectCallbackWithError( - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_DELETE_CERT_ERROR_TITLE), - l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_UNKNOWN_ERROR)); - } else { - ResolveCallback(base::Value()); - } -} - -void CertificatesHandler::OnCertificateManagerModelCreated( - std::unique_ptr<CertificateManagerModel> model) { - certificate_manager_model_ = std::move(model); - CertificateManagerModelReady(); -} - -void CertificatesHandler::CertificateManagerModelReady() { - if (IsJavascriptAllowed()) { - FireWebUIListener( - "client-import-allowed-changed", - base::Value(IsClientCertificateManagementAllowed(Slot::kUser))); - FireWebUIListener("ca-import-allowed-changed", - base::Value(IsCACertificateManagementAllowed( - CertificateSource::kImported))); - } - certificate_manager_model_->Refresh(); -} - -void CertificatesHandler::HandleRefreshCertificates( - const base::Value::List& args) { - AllowJavascript(); - - if (certificate_manager_model_) { - // Already have a model, the webui must be re-loading. Just re-run the - // webui initialization. - CertificateManagerModelReady(); - return; - } - - if (!requested_certificate_manager_model_) { - // Request that a model be created. - CertificateManagerModel::Create( - Profile::FromWebUI(web_ui()), this, - base::BindOnce(&CertificatesHandler::OnCertificateManagerModelCreated, - weak_ptr_factory_.GetWeakPtr())); - requested_certificate_manager_model_ = true; - return; - } - - // We are already waiting for a CertificateManagerModel to be created, no need - // to do anything. -} - -void CertificatesHandler::PopulateTree(const std::string& tab_name, - net::CertType type) { - std::unique_ptr<icu::Collator> collator; - UErrorCode error = U_ZERO_ERROR; - collator.reset(icu::Collator::createInstance( - icu::Locale(g_browser_process->GetApplicationLocale().c_str()), error)); - if (U_FAILURE(error)) { - collator.reset(); - } - DictionaryIdComparator comparator(collator.get()); - CertificateManagerModel::OrgGroupingMap org_grouping_map; - - certificate_manager_model_->FilterAndBuildOrgGroupingMap(type, - &org_grouping_map); - - base::Value::List nodes; - for (auto& org_grouping_map_entry : org_grouping_map) { - // Populate second level (certs). - base::Value::List subnodes; - bool contains_policy_certs = false; - for (auto& org_cert : org_grouping_map_entry.second) { - // Move the CertInfo into |cert_info_id_map_|. - CertificateManagerModel::CertInfo* cert_info = org_cert.get(); - std::string id = - base::NumberToString(cert_info_id_map_.Add(std::move(org_cert))); - - bool is_extractable = !cert_info->hardware_backed(); -#if BUILDFLAG(IS_CHROMEOS) - is_extractable = false; -#endif - - auto cert_dict = - base::Value::Dict() - .Set(kCertificatesHandlerKeyField, id) - .Set(kCertificatesHandlerNameField, cert_info->name()) - .Set(kCertificatesHandlerCanBeDeletedField, - CanDeleteCertificate(cert_info)) - .Set(kCertificatesHandlerCanBeEditedField, - CanEditCertificate(cert_info)) - .Set(kCertificatesHandlerUntrustedField, cert_info->untrusted()) - .Set(kCertificatesHandlerPolicyInstalledField, - cert_info->source() == - CertificateManagerModel::CertInfo::Source::kPolicy) - .Set(kCertificatesHandlerWebTrustAnchorField, - cert_info->web_trust_anchor()) - // TODO(hshi): This should be determined by testing for PKCS #11 - // CKA_EXTRACTABLE attribute. We may need to use the NSS function - // PK11_ReadRawAttribute to do that. - .Set(kCertificatesHandlerExtractableField, is_extractable); - // TODO(mattm): Other columns. - subnodes.Append(std::move(cert_dict)); - - contains_policy_certs |= - cert_info->source() == - CertificateManagerModel::CertInfo::Source::kPolicy; - } - std::sort(subnodes.begin(), subnodes.end(), comparator); - - // Populate first level (org name). - auto org_dict = - base::Value::Dict() - .Set(kCertificatesHandlerKeyField, - OrgNameToId(org_grouping_map_entry.first)) - .Set(kCertificatesHandlerNameField, org_grouping_map_entry.first) - .Set(kCertificatesHandlerContainsPolicyCertsField, - contains_policy_certs) - .Set(kCertificatesHandlerSubnodesField, std::move(subnodes)); - nodes.Append(std::move(org_dict)); - } - std::sort(nodes.begin(), nodes.end(), comparator); - - if (IsJavascriptAllowed()) { - FireWebUIListener("certificates-changed", base::Value(tab_name), nodes); - } -} - -void CertificatesHandler::ResolveCallback(const base::ValueView response) { - DCHECK(!webui_callback_id_.empty()); - ResolveJavascriptCallback(base::Value(webui_callback_id_), response); - webui_callback_id_.clear(); -} - -void CertificatesHandler::RejectCallback(const base::ValueView response) { - DCHECK(!webui_callback_id_.empty()); - RejectJavascriptCallback(base::Value(webui_callback_id_), response); - webui_callback_id_.clear(); -} - -void CertificatesHandler::RejectCallbackWithError(const std::string& title, - const std::string& error) { - RejectCallback(base::Value::Dict() - .Set(kCertificatesHandlerErrorTitle, title) - .Set(kCertificatesHandlerErrorDescription, error)); -} - -void CertificatesHandler::RejectCallbackWithImportError( - const std::string& title, - const net::NSSCertDatabase::ImportCertFailureList& not_imported) { - std::string error; - if (selected_cert_list_.size() == 1) { - error = l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_SINGLE_NOT_IMPORTED); - } else if (not_imported.size() == selected_cert_list_.size()) { - error = l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_ALL_NOT_IMPORTED); - } else { - error = l10n_util::GetStringUTF8( - IDS_SETTINGS_CERTIFICATE_MANAGER_IMPORT_SOME_NOT_IMPORTED); - } - - base::Value::List cert_error_list; - for (const auto& failure : not_imported) { - cert_error_list.Append( - base::Value::Dict() - .Set(kCertificatesHandlerNameField, - x509_certificate_model::GetSubjectDisplayName( - failure.certificate.get())) - .Set(kCertificatesHandlerErrorField, - NetErrorToString(failure.net_error))); - } - - RejectCallback(base::Value::Dict() - .Set(kCertificatesHandlerErrorTitle, title) - .Set(kCertificatesHandlerErrorDescription, error) - .Set(kCertificatesHandlerCertificateErrors, - std::move(cert_error_list))); -} - -gfx::NativeWindow CertificatesHandler::GetParentWindow() { - return web_ui()->GetWebContents()->GetTopLevelNativeWindow(); -} - -CertificateManagerModel::CertInfo* -CertificatesHandler::GetCertInfoFromCallbackArgs(const base::Value::List& args, - size_t arg_index) { - if (arg_index >= args.size()) { - return nullptr; - } - const auto& arg = args[arg_index]; - if (!arg.is_string()) { - return nullptr; - } - - int32_t cert_info_id = 0; - if (!base::StringToInt(arg.GetString(), &cert_info_id)) { - return nullptr; - } - - return cert_info_id_map_.Lookup(cert_info_id); -} - -bool CertificatesHandler::IsClientCertificateManagementAllowed(Slot slot) { -#if BUILDFLAG(IS_CHROMEOS) - if (!IsClientCertificateManagementAllowedPolicy(slot)) { - return false; - } -#endif // BUILDFLAG(IS_CHROMEOS) - - return true; -} - -bool CertificatesHandler::IsCACertificateManagementAllowed( - CertificateSource source) { -#if BUILDFLAG(IS_CHROMEOS) - if (!IsCACertificateManagementAllowedPolicy(source)) { - return false; - } -#endif // BUILDFLAG(IS_CHROMEOS) - - return true; -} - -#if BUILDFLAG(IS_CHROMEOS) -bool CertificatesHandler::IsClientCertificateManagementAllowedPolicy( - Slot slot) { - Profile* profile = Profile::FromWebUI(web_ui()); - - PrefService* prefs = profile->GetPrefs(); - auto policy_value = static_cast<ClientCertificateManagementPermission>( - prefs->GetInteger(prefs::kClientCertificateManagementAllowed)); - - if (slot == Slot::kUser) { - return policy_value != ClientCertificateManagementPermission::kNone; - } - return policy_value == ClientCertificateManagementPermission::kAll; -} - -bool CertificatesHandler::IsCACertificateManagementAllowedPolicy( - CertificateSource source) { - Profile* profile = Profile::FromWebUI(web_ui()); - - PrefService* prefs = profile->GetPrefs(); - auto policy_value = static_cast<CACertificateManagementPermission>( - prefs->GetInteger(prefs::kCACertificateManagementAllowed)); - - switch (source) { - case CertificateSource::kBuiltIn: - return policy_value == CACertificateManagementPermission::kAll; - case CertificateSource::kImported: - return policy_value != CACertificateManagementPermission::kNone; - } -} -#endif // BUILDFLAG(IS_CHROMEOS) - -bool CertificatesHandler::CanDeleteCertificate( - const CertificateManagerModel::CertInfo* cert_info) { - if (!cert_info->can_be_deleted() || - cert_info->source() == - CertificateManagerModel::CertInfo::Source::kPolicy) { - return false; - } - - if (cert_info->type() == net::CertType::USER_CERT) { - return IsClientCertificateManagementAllowed( - cert_info->device_wide() ? Slot::kSystem : Slot::kUser); - } - if (cert_info->type() == net::CertType::CA_CERT) { - CertificateSource source = cert_info->can_be_deleted() - ? CertificateSource::kImported - : CertificateSource::kBuiltIn; - return IsCACertificateManagementAllowed(source); - } - return true; -} - -bool CertificatesHandler::CanEditCertificate( - const CertificateManagerModel::CertInfo* cert_info) { - if ((cert_info->type() != net::CertType::CA_CERT) || - (cert_info->source() == - CertificateManagerModel::CertInfo::Source::kPolicy)) { - return false; - } - - CertificateSource source = cert_info->can_be_deleted() - ? CertificateSource::kImported - : CertificateSource::kBuiltIn; - return IsCACertificateManagementAllowed(source); -} - -#if BUILDFLAG(IS_CHROMEOS) -void CertificatesHandler::RegisterProfilePrefs( - user_prefs::PrefRegistrySyncable* registry) { +void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { // Allow users to manage all client certificates by default. This can be // overridden by enterprise policy. registry->RegisterIntegerPref( prefs::kClientCertificateManagementAllowed, static_cast<int>(ClientCertificateManagementPermission::kAll)); } -#endif // BUILDFLAG(IS_CHROMEOS) } // namespace certificate_manager
diff --git a/chrome/browser/ui/webui/certificates_handler.h b/chrome/browser/ui/webui/certificates_handler.h index 0bb35f0..8ae8d40 100644 --- a/chrome/browser/ui/webui/certificates_handler.h +++ b/chrome/browser/ui/webui/certificates_handler.h
@@ -5,243 +5,16 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CERTIFICATES_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_CERTIFICATES_HANDLER_H_ -#include <memory> -#include <string> - -#include "base/containers/id_map.h" -#include "base/memory/weak_ptr.h" -#include "base/task/cancelable_task_tracker.h" #include "build/build_config.h" -#include "chrome/browser/certificate_manager_model.h" #include "chrome/browser/ui/webui/certificate_manager/certificate_manager_utils.h" -#include "components/file_access/scoped_file_access.h" -#include "content/public/browser/web_ui_message_handler.h" -#include "net/cert/nss_cert_database.h" -#include "ui/gfx/native_widget_types.h" -#include "ui/shell_dialogs/select_file_dialog.h" namespace user_prefs { class PrefRegistrySyncable; } -enum class Slot { kUser, kSystem }; -enum class CertificateSource { kBuiltIn, kImported }; - namespace certificate_manager { - -class FileAccessProvider; - -class CertificatesHandler : public content::WebUIMessageHandler, - public CertificateManagerModel::Observer, - public ui::SelectFileDialog::Listener { - public: - CertificatesHandler(); - - CertificatesHandler(const CertificatesHandler&) = delete; - CertificatesHandler& operator=(const CertificatesHandler&) = delete; - - ~CertificatesHandler() override; - - // content::WebUIMessageHandler. - void RegisterMessages() override; - - // CertificateManagerModel::Observer implementation. - void CertificatesRefreshed() override; - - // SelectFileDialog::Listener implementation. - void FileSelected(const ui::SelectedFileInfo& file, int index) override; - void FileSelectionCanceled() override; - -#if BUILDFLAG(IS_CHROMEOS) // Register profile preferences. - static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); -#endif // BUILDFLAG(IS_CHROMEOS) - - private: - enum PendingOperation { - EXPORT_PERSONAL_FILE, - IMPORT_PERSONAL_FILE, - IMPORT_SERVER_FILE, - IMPORT_CA_FILE, - }; - - // View certificate. - void HandleViewCertificate(const base::Value::List& args); - - // Edit certificate authority trust values. The sequence goes like: - // 1. user clicks edit button -> Edit dialog is shown -> - // HandleGetCATrust -> Edit dialog is populated. - // 2. User checks/unchecks boxes, and clicks ok -> HandleEditCATrust -> - // edit dialog is dismissed upon success. - void HandleGetCATrust(const base::Value::List& args); - void HandleEditCATrust(const base::Value::List& args); - - // Cleanup state stored during import or export process. - void HandleCancelImportExportProcess(const base::Value::List& args); - void ImportExportCleanup(); - - // Export to PKCS #12 file. The sequence goes like: - // 1. user click on export button -> HandleExportPersonal -> launches file - // selector - // 2. user selects file -> ExportPersonalFileSelected -> launches password - // dialog - // 3. user enters password -> HandleExportPersonalPasswordSelected -> - // unlock slots - // 4. slots unlocked -> ExportPersonalSlotsUnlocked -> exports to memory - // buffer -> starts async write operation - // 5. write finishes (or fails) -> ExportPersonalFileWritten - void HandleExportPersonal(const base::Value::List& args); - void ExportPersonalFileSelected(const base::FilePath& path); - void HandleExportPersonalPasswordSelected(const base::Value::List& args); - void ExportPersonalSlotsUnlocked(); - void ExportPersonalFileWritten(const int* write_errno); - - // Import from PKCS #12 or cert file. The sequence goes like: - // 1. user click on import button -> HandleImportPersonal -> - // launches file selector - // 2. user selects file -> ImportPersonalFileSelected -> starts async - // read operation - // 3. read operation completes -> ImportPersonalFileRead -> - // If file is PFX -> launches password dialog, goto step 4 - // Else -> import as certificate, goto step 6 - // 4. user enters password -> HandleImportPersonalPasswordSelected -> - // unlock slot - // 5. slot unlocked -> ImportPersonalSlotUnlocked attempts to - // import with previously entered password - // 6a. if import succeeds -> ImportExportCleanup - // 6b. if import fails -> show error, ImportExportCleanup - // TODO(mattm): allow retrying with different password - void HandleImportPersonal(const base::Value::List& args); - void ImportPersonalFileSelected(const base::FilePath& path, - file_access::ScopedFileAccess file_access); - void ImportPersonalFileRead(const int* read_errno, const std::string* data); - void HandleImportPersonalPasswordSelected(const base::Value::List& args); - void ImportPersonalSlotUnlocked(); - void ImportPersonalResultReceived(int net_result); - - // Import Server certificates from file. Sequence goes like: - // 1. user clicks on import button -> HandleImportServer -> launches file - // selector - // 2. user selects file -> ImportServerFileSelected -> starts async read - // 3. read completes -> ImportServerFileRead -> parse certs -> attempt import - // 4a. if import succeeds -> ImportExportCleanup - // 4b. if import fails -> show error, ImportExportCleanup - void HandleImportServer(const base::Value::List& args); - void ImportServerFileSelected(const base::FilePath& path, - file_access::ScopedFileAccess file_access); - void ImportServerFileRead(const int* read_errno, const std::string* data); - - // Import Certificate Authorities from file. Sequence goes like: - // 1. user clicks on import button -> HandleImportCA -> launches file - // selector - // 2. user selects file -> ImportCAFileSelected -> starts async read - // 3. read completes -> ImportCAFileRead -> parse certs -> Certificate trust - // level dialog is shown. - // 4. user clicks ok -> HandleImportCATrustSelected -> attempt import - // 5a. if import succeeds -> ImportExportCleanup - // 5b. if import fails -> show error, ImportExportCleanup - void HandleImportCA(const base::Value::List& args); - void ImportCAFileSelected(const base::FilePath& path, - file_access::ScopedFileAccess file_access); - void ImportCAFileRead(const int* read_errno, const std::string* data); - void HandleImportCATrustSelected(const base::Value::List& args); - - // Export a certificate. - void HandleExportCertificate(const base::Value::List& args); - - // Delete certificate and private key (if any). - void HandleDeleteCertificate(const base::Value::List& args); - void OnCertificateDeleted(bool result); - - // Model initialization methods. - void OnCertificateManagerModelCreated( - std::unique_ptr<CertificateManagerModel> model); - void CertificateManagerModelReady(); - - // Populate the trees in all the tabs. - void HandleRefreshCertificates(const base::Value::List& args); - - // Populate the given tab's tree. - void PopulateTree(const std::string& tab_name, net::CertType type); - - void ResolveCallback(const base::ValueView response); - void RejectCallback(const base::ValueView response); - - // Reject the pending JS callback with a generic error. - void RejectCallbackWithError(const std::string& title, - const std::string& error); - - // Reject the pending JS callback with a certificate import error. - void RejectCallbackWithImportError( - const std::string& title, - const net::NSSCertDatabase::ImportCertFailureList& not_imported); - - // Assigns a new |webui_callback_id_|. Returns false if a previous request - // is still in-flight, in which case the new request should be rejected and - // ignored. - [[nodiscard]] bool AssignWebUICallbackId(const base::Value::List& args); - - gfx::NativeWindow GetParentWindow(); - - // If |args| is a list, parses the list element at |arg_index| as an id for - // |cert_info_id_map_| and looks up the corresponding CertInfo. If there is - // an error parsing the list, returns nullptr. - CertificateManagerModel::CertInfo* GetCertInfoFromCallbackArgs( - const base::Value::List& args, - size_t arg_index); - - // Returns true if the user may manage client certificates on |slot|. - bool IsClientCertificateManagementAllowed(Slot slot); - - // Returns true if the user may manage CA certificates. - bool IsCACertificateManagementAllowed(CertificateSource source); - -#if BUILDFLAG(IS_CHROMEOS) - // Returns true if the user may manage certificates on |slot| according - // to ClientCertificateManagementAllowed policy. - bool IsClientCertificateManagementAllowedPolicy(Slot slot); - - // Returns true if the user may manage certificates according - // to CACertificateManagementAllowed policy. - bool IsCACertificateManagementAllowedPolicy(CertificateSource source); -#endif // BUILDFLAG(IS_CHROMEOS) - - // Returns true if the certificate represented by |cert_info| can be deleted. - bool CanDeleteCertificate(const CertificateManagerModel::CertInfo* cert_info); - - // Returns true if the certificate represented by |cert_info| can be edited. - bool CanEditCertificate(const CertificateManagerModel::CertInfo* cert_info); - - // The Certificates Manager model - bool requested_certificate_manager_model_; - std::unique_ptr<CertificateManagerModel> certificate_manager_model_; - - // For multi-step import or export processes, we need to store the path, - // password, etc the user chose while we wait for them to enter a password, - // wait for file to be read, etc. - base::FilePath file_path_; - std::u16string password_; - // The WebUI callback ID of the last in-flight async request. There is always - // only one in-flight such request. - std::string webui_callback_id_; - bool use_hardware_backed_; - std::string file_data_; - net::ScopedCERTCertificateList selected_cert_list_; - scoped_refptr<ui::SelectFileDialog> select_file_dialog_; - std::optional<PendingOperation> pending_operation_; - crypto::ScopedPK11Slot slot_; - - // Used in reading and writing certificate files. - base::CancelableTaskTracker tracker_; - scoped_refptr<FileAccessProvider> file_access_provider_; - - base::IDMap<std::unique_ptr<CertificateManagerModel::CertInfo>> - cert_info_id_map_; - - base::WeakPtrFactory<CertificatesHandler> weak_ptr_factory_{this}; - friend class ::CertificateHandlerTest; -}; - +void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); } // namespace certificate_manager #endif // CHROME_BROWSER_UI_WEBUI_CERTIFICATES_HANDLER_H_
diff --git a/chrome/browser/ui/webui/certificates_handler_unittest.cc b/chrome/browser/ui/webui/certificates_handler_unittest.cc deleted file mode 100644 index 51a61e8..0000000 --- a/chrome/browser/ui/webui/certificates_handler_unittest.cc +++ /dev/null
@@ -1,359 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/certificates_handler.h" - -#include "base/memory/raw_ptr.h" -#include "base/test/gtest_tags.h" -#include "build/build_config.h" -#include "chrome/common/pref_names.h" -#include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "chrome/test/base/testing_profile.h" -#include "components/sync_preferences/testing_pref_service_syncable.h" -#include "content/public/test/test_web_ui.h" -#include "testing/gtest/include/gtest/gtest.h" - -class CertificateHandlerTest : public ChromeRenderViewHostTestHarness { - public: - void SetUp() override { - base::AddTagToTestResult("feature_id", - "screenplay-7c74e36b-7675-4fa7-91ca-24577bb37203"); - ChromeRenderViewHostTestHarness::SetUp(); - - web_ui_.set_web_contents(web_contents()); - cert_handler_.set_web_ui(&web_ui_); - } - -#if BUILDFLAG(IS_CHROMEOS) - bool IsCACertificateManagementAllowedPolicy(CertificateSource source) { - return cert_handler_.IsCACertificateManagementAllowedPolicy(source); - } -#endif // BUILDFLAG(IS_CHROMEOS) - - bool CanDeleteCertificate( - const CertificateManagerModel::CertInfo* cert_info) { - return cert_handler_.CanDeleteCertificate(cert_info); - } - - bool CanEditCertificate(const CertificateManagerModel::CertInfo* cert_info) { - return cert_handler_.CanEditCertificate(cert_info); - } - - sync_preferences::TestingPrefServiceSyncable* pref_service() { - return profile()->GetTestingPrefService(); - } - - protected: - content::TestWebUI web_ui_; - certificate_manager::CertificatesHandler cert_handler_; -}; - -#if BUILDFLAG(IS_CHROMEOS) -TEST_F(CertificateHandlerTest, IsCACertificateManagementAllowedPolicyTest) { - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kAll)); - - EXPECT_TRUE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kImported)); - EXPECT_TRUE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kBuiltIn)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kUserOnly)); - - EXPECT_TRUE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kImported)); - EXPECT_FALSE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kBuiltIn)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kNone)); - - EXPECT_FALSE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kImported)); - EXPECT_FALSE( - IsCACertificateManagementAllowedPolicy(CertificateSource::kBuiltIn)); - } -} -#endif // BUILDFLAG(IS_CHROMEOS) - -TEST_F(CertificateHandlerTest, CanDeleteCertificateCommonTest) { - CertificateManagerModel::CertInfo default_cert_info( - {} /* cert */, net::CertType::USER_CERT, {} /* cert_name */, - false /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kPolicy, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - - { - auto cert_info = - CertificateManagerModel::CertInfo::Clone(&default_cert_info); - cert_info->type_ = net::CertType::USER_CERT; - cert_info->can_be_deleted_ = false; - cert_info->source_ = CertificateManagerModel::CertInfo::Source::kExtension; - - // Deletion of |!can_be_deleted_| certificates is not allowed. - EXPECT_FALSE(CanDeleteCertificate(cert_info.get())); - } - - { - auto cert_info = - CertificateManagerModel::CertInfo::Clone(&default_cert_info); - cert_info->type_ = net::CertType::USER_CERT; - cert_info->can_be_deleted_ = true; - cert_info->source_ = CertificateManagerModel::CertInfo::Source::kPolicy; - - // Deletion of policy certificates is not allowed. - EXPECT_FALSE(CanDeleteCertificate(cert_info.get())); - } -} - -TEST_F(CertificateHandlerTest, CanDeleteUserCertificateTest) { - CertificateManagerModel::CertInfo cert_info( - {} /* cert */, net::CertType::USER_CERT, {} /* cert_name */, - true /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - { - cert_info.device_wide_ = false; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - } - -#if BUILDFLAG(IS_CHROMEOS) - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kAll)); - - cert_info.device_wide_ = false; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kUserOnly)); - - cert_info.device_wide_ = false; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kNone)); - - cert_info.device_wide_ = false; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - } -#endif // BUILDFLAG(IS_CHROMEOS) -} - -TEST_F(CertificateHandlerTest, CanDeleteCACertificateTest) { - CertificateManagerModel::CertInfo cert_info( - {} /* cert */, net::CertType::CA_CERT, {} /* cert_name */, - true /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - { - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - } - -#if BUILDFLAG(IS_CHROMEOS) - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kAll)); - - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kUserOnly)); - - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanDeleteCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kNone)); - - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - cert_info.can_be_deleted_ = true; - EXPECT_FALSE(CanDeleteCertificate(&cert_info)); - } -#endif // BUILDFLAG(IS_CHROMEOS) -} - -TEST_F(CertificateHandlerTest, CanEditCertificateCommonTest) { - CertificateManagerModel::CertInfo cert_info( - {} /* cert */, net::CertType::USER_CERT, {} /* cert_name */, - true /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - - cert_info.source_ = CertificateManagerModel::CertInfo::Source::kExtension; - cert_info.type_ = net::CertType::USER_CERT; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.source_ = CertificateManagerModel::CertInfo::Source::kExtension; - cert_info.type_ = net::CertType::SERVER_CERT; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.source_ = CertificateManagerModel::CertInfo::Source::kExtension; - cert_info.type_ = net::CertType::OTHER_CERT; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.source_ = CertificateManagerModel::CertInfo::Source::kPolicy; - cert_info.type_ = net::CertType::CA_CERT; - EXPECT_FALSE(CanEditCertificate(&cert_info)); -} - -// Edit of user certificates is not allowed in any case. -TEST_F(CertificateHandlerTest, CanEditUserCertificateTest) { - CertificateManagerModel::CertInfo cert_info( - {} /* cert */, net::CertType::USER_CERT, {} /* cert_name */, - true /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - { - cert_info.device_wide_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - } - -#if BUILDFLAG(IS_CHROMEOS) - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kAll)); - - cert_info.device_wide_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kUserOnly)); - - cert_info.device_wide_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kClientCertificateManagementAllowed, - static_cast<int>(ClientCertificateManagementPermission::kNone)); - - cert_info.device_wide_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.device_wide_ = true; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - } -#endif // BUILDFLAG(IS_CHROMEOS) -} - -TEST_F(CertificateHandlerTest, CanEditCACertificateTest) { - CertificateManagerModel::CertInfo cert_info( - {} /* cert */, net::CertType::CA_CERT, {} /* cert_name */, - false /* can_be_deleted */, false /* untrusted */, - CertificateManagerModel::CertInfo::Source::kExtension, - true /* web_trust_anchor */, false /* hardware_backed */, - false /* device_wide */); - { - cert_info.can_be_deleted_ = false; - EXPECT_TRUE(CanEditCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanEditCertificate(&cert_info)); - } - -#if BUILDFLAG(IS_CHROMEOS) - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kAll)); - - cert_info.can_be_deleted_ = false; - EXPECT_TRUE(CanEditCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanEditCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kUserOnly)); - - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_TRUE(CanEditCertificate(&cert_info)); - } - - { - pref_service()->SetInteger( - prefs::kCACertificateManagementAllowed, - static_cast<int>(CACertificateManagementPermission::kNone)); - - cert_info.can_be_deleted_ = false; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - - cert_info.can_be_deleted_ = true; - EXPECT_FALSE(CanEditCertificate(&cert_info)); - } -#endif // BUILDFLAG(IS_CHROMEOS) -}
diff --git a/chrome/browser/ui/webui/chrome_web_ui_configs.cc b/chrome/browser/ui/webui/chrome_web_ui_configs.cc index 1bdef887..f740a18 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_configs.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_configs.cc
@@ -127,6 +127,10 @@ #include "chrome/browser/ui/webui/extensions/extensions_ui.h" #endif // !BUILDFLAG(ENABLE_EXTENSIONS_CORE) +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h" +#endif // ENABLE_EXTENSIONS + #if BUILDFLAG(ENABLE_PRINT_PREVIEW) #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h" #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -345,6 +349,11 @@ map.AddWebUIConfig(std::make_unique<extensions::ExtensionsUIConfig>()); #endif // !BUILDFLAG(ENABLE_EXTENSIONS_CORE) +#if BUILDFLAG(ENABLE_EXTENSIONS) + map.AddWebUIConfig( + std::make_unique<extensions::ZeroStatePromoControllerConfig>()); +#endif // !BUILDFLAG(ENABLE_EXTENSIONS) + #if BUILDFLAG(ENABLE_PRINT_PREVIEW) map.AddWebUIConfig(std::make_unique<printing::PrintPreviewUIConfig>()); #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW)
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc b/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc index 380bd5b..ac6c7c3 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc +++ b/chrome/browser/ui/webui/extensions/extension_settings_test_base.cc
@@ -11,11 +11,14 @@ #include "chrome/browser/extensions/chrome_test_extension_loader.h" #include "chrome/browser/extensions/unpacked_installer.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" #include "extensions/browser/extension_dialog_auto_confirm.h" +#if !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/ui/browser.h" +#endif // !BUILDFLAG(IS_ANDROID) + using extensions::Extension; ExtensionSettingsTestBase::ExtensionSettingsTestBase() @@ -71,8 +74,8 @@ } void ExtensionSettingsTestBase::SetDevModeEnabled(bool enabled) { - browser()->profile()->GetPrefs()->SetBoolean( - prefs::kExtensionsUIDeveloperMode, enabled); + GetProfile()->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, + enabled); } void ExtensionSettingsTestBase::SetSilenceDeprecatedManifestVersionWarnings( @@ -83,7 +86,7 @@ const Extension* ExtensionSettingsTestBase::InstallExtension( const base::FilePath& path) { - extensions::ChromeTestExtensionLoader loader(browser()->profile()); + extensions::ChromeTestExtensionLoader loader(GetProfile()); loader.set_ignore_manifest_warnings(true); return loader.LoadExtension(path).get(); }
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_test_base.h b/chrome/browser/ui/webui/extensions/extension_settings_test_base.h index 8b3e158..6465b4fc 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_test_base.h +++ b/chrome/browser/ui/webui/extensions/extension_settings_test_base.h
@@ -9,10 +9,13 @@ #include "base/files/file_path.h" #include "chrome/browser/extensions/install_verifier.h" -#include "chrome/browser/extensions/scoped_test_mv2_enabler.h" #include "chrome/test/base/web_ui_mocha_browser_test.h" #include "extensions/browser/scoped_ignore_content_verifier_for_test.h" +#if !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/extensions/scoped_test_mv2_enabler.h" +#endif // !BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(IS_WIN) #include "base/base_paths_win.h" #include "base/test/scoped_path_override.h" @@ -84,8 +87,10 @@ std::unique_ptr<extensions::ScopedTestDialogAutoConfirm> uninstall_auto_confirm_; +#if !BUILDFLAG(IS_ANDROID) // TODO(https://crbug.com/40804030): Remove this when updated to use MV3. extensions::ScopedTestMV2Enabler mv2_enabler_; +#endif // BUILDFLAG(IS_ANDROID) }; #endif // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_EXTENSION_SETTINGS_TEST_BASE_H_
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/BUILD.gn b/chrome/browser/ui/webui/extensions_zero_state_promo/BUILD.gn new file mode 100644 index 0000000..8421a7ac --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +import("//mojo/public/tools/bindings/mojom.gni") +mojom("mojo_bindings") { + sources = [ "zero_state_promo.mojom" ] + webui_module_path = "/" + public_deps = [ + "//mojo/public/mojom/base", + "//ui/base/mojom", + ] +}
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/DIR_METADATA b/chrome/browser/ui/webui/extensions_zero_state_promo/DIR_METADATA new file mode 100644 index 0000000..3a31847 --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/DIR_METADATA
@@ -0,0 +1,7 @@ +monorail: { + component: "Platform>Extensions" +} +team_email: "webstore-consumer@google.com" +buganizer_public: { + component_id: 1456110 +}
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/OWNERS b/chrome/browser/ui/webui/extensions_zero_state_promo/OWNERS new file mode 100644 index 0000000..062f367 --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/OWNERS
@@ -0,0 +1,7 @@ +per-file *.mojom=set noparent +per-file *.mojom=file://ipc/SECURITY_OWNERS + +uwyiming@google.com +phu@google.com +dfried@chromium.org +webstore-consumer@google.com
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc new file mode 100644 index 0000000..95b8aaa --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc
@@ -0,0 +1,248 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/metrics/histogram_tester.h" +#include "chrome/browser/ui/views/extensions/extensions_toolbar_container_view_controller.h" +#include "chrome/browser/ui/views/user_education/custom_webui_help_bubble.h" +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/test/user_education/interactive_feature_promo_test.h" +#include "components/user_education/common/user_education_data.h" +#include "components/user_education/views/help_bubble_view.h" +#include "content/public/test/browser_test.h" +#include "extensions/common/extension_urls.h" +#include "ui/base/interaction/polling_state_observer.h" + +namespace { +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kFirstTabContents); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kSecondTabContents); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kZeroStatePromoWebUiIphId); +DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>, + kTabCountState); +} // namespace + +class ExtensionsZeroStatePromoTestBase : public InteractiveFeaturePromoTest { + public: + ExtensionsZeroStatePromoTestBase( + feature_engagement::IPHExtensionsZeroStatePromoVariant iphVariant) + : InteractiveFeaturePromoTest(UseDefaultTrackerAllowingPromosWithParams( + {{feature_engagement::kIPHExtensionsZeroStatePromoFeature, + {{feature_engagement::kIPHExtensionsZeroStatePromoVariantParam + .name, + feature_engagement::kIPHExtensionsZeroStatePromoVariantParam + .GetName(iphVariant)}}}})) {} + + void PreRunTestOnMainThread() override { + // Block zero state promo IPH during browser launch, to prevent a race + // condition where the IPH steals focus from the browser, and causes the + // PreRunTestOnMainThread method to time out waiting for the browser to + // come to focus. + auto auto_reset = ExtensionsToolbarContainerViewController:: + BlockZeroStatePromoForTesting(); + InProcessBrowserTest::PreRunTestOnMainThread(); + } + + auto WaitForTabCount(int expected_count) { + return Steps( + PollState(kTabCountState, + [this]() { return browser()->tab_strip_model()->count(); }), + WaitForState(kTabCountState, expected_count), + StopObservingState(kTabCountState)); + } + + auto CheckZeroStatePromoClosedReason( + user_education::FeaturePromoClosedReason closeReason) { + return Do([this, closeReason]() { + histogram_tester_.ExpectBucketCount( + "UserEducation.MessageAction.IPH_ExtensionsZeroStatePromo", + closeReason, 1); + }); + } + + auto CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked link, + base::HistogramBase::Count32 expected_count) { + return Do([this, link, expected_count]() { + histogram_tester_.ExpectBucketCount( + "Extension.ZeroStatePromo.IphActionChromeWebStoreLink", link, + expected_count); + }); + } + + private: + base::HistogramTester histogram_tester_; +}; + +class ExtensionsZeroStateCustomActionIphTest + : public ExtensionsZeroStatePromoTestBase { + public: + ExtensionsZeroStateCustomActionIphTest() + : ExtensionsZeroStatePromoTestBase( + feature_engagement::IPHExtensionsZeroStatePromoVariant:: + kCustomActionIph) {} +}; + +// Test showing the zero state promo custom action IPH to users with no +// extensions installed. Clicking on the custom action opens a page to the +// Chrome Web Store. +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomActionIphTest, + ShowingZeroStatePromoCustomActionIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + InAnyContext(WaitForPromo( + feature_engagement::kIPHExtensionsZeroStatePromoFeature)), + PressDefaultPromoButton(), WaitForTabCount(2), + InstrumentTab(kSecondTabContents, 1), + WaitForWebContentsReady(kSecondTabContents, + extension_urls::GetWebstoreLaunchURL())); +} + +class ExtensionsZeroStateCustomUiChipIphTest + : public ExtensionsZeroStatePromoTestBase { + public: + ExtensionsZeroStateCustomUiChipIphTest() + : ExtensionsZeroStatePromoTestBase( + feature_engagement::IPHExtensionsZeroStatePromoVariant:: + kCustomUiChipIph) {} + + const DeepQuery kDismissButton{"extensions-zero-state-promo-app", + "#dismissButton"}; + const DeepQuery kCouponButton{"extensions-zero-state-promo-app", + "#couponsButton"}; + const DeepQuery kWritingButton{"extensions-zero-state-promo-app", + "#writingButton"}; + const DeepQuery kProductivityButton{"extensions-zero-state-promo-app", + "#productivityButton"}; + const DeepQuery kAiButton{"extensions-zero-state-promo-app", "#aiButton"}; +}; + +// Test showing the zero state promo custom ui IPH (chips variant) with no +// extensions installed. Clicking on the coupon chip button should open a +// page to the Chrome Web Store. +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest, + ClickCouponChipOnZeroStatePromoIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents, 0), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + InstrumentNonTabWebView(kZeroStatePromoWebUiIphId, + CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForWebContentsReady( + kZeroStatePromoWebUiIphId, + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 0), + ClickElement(kZeroStatePromoWebUiIphId, kCouponButton, + ExecuteJsMode::kFireAndForget), + WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForTabCount(2), InstrumentTab(kSecondTabContents, 1), + WaitForWebContentsReady(kSecondTabContents, + GURL("https://chromewebstore.google.com/category/" + "extensions/lifestyle/shopping")), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 1)); +} + +// Test showing the zero state promo custom ui IPH (chips variant) with no +// extensions installed. Clicking on the writing chip button should open a +// page to the Chrome Web Store. +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest, + ClickWritingChipOnZeroStatePromoIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents, 0), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + InstrumentNonTabWebView(kZeroStatePromoWebUiIphId, + CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForWebContentsReady( + kZeroStatePromoWebUiIphId, + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kWriting, 0), + ClickElement(kZeroStatePromoWebUiIphId, kWritingButton, + ExecuteJsMode::kFireAndForget), + WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForTabCount(2), InstrumentTab(kSecondTabContents, 1), + WaitForWebContentsReady(kSecondTabContents, + GURL("https://chromewebstore.google.com/" + "collection/writing_essentials")), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kWriting, 1)); +} + +// Test showing the zero state promo custom ui IPH (chips variant) with no +// extensions installed. Clicking on the productivity chip button should open a +// page to the Chrome Web Store. +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest, + ClickProductivityChipOnZeroStatePromoIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents, 0), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + InstrumentNonTabWebView(kZeroStatePromoWebUiIphId, + CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForWebContentsReady( + kZeroStatePromoWebUiIphId, + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 0), + ClickElement(kZeroStatePromoWebUiIphId, kProductivityButton, + ExecuteJsMode::kFireAndForget), + WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForTabCount(2), InstrumentTab(kSecondTabContents, 1), + WaitForWebContentsReady(kSecondTabContents, + GURL("https://chromewebstore.google.com/category/" + "extensions/productivity/workflow")), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 1)); +} + +// Test showing the zero state promo custom ui IPH (chips variant) with no +// extensions installed. Clicking on the ai chip button should open a +// page to the Chrome Web Store. +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest, + ClickAiChipOnZeroStatePromoIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents, 0), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + InstrumentNonTabWebView(kZeroStatePromoWebUiIphId, + CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForWebContentsReady( + kZeroStatePromoWebUiIphId, + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kAi, 0), + ClickElement(kZeroStatePromoWebUiIphId, kAiButton, + ExecuteJsMode::kFireAndForget), + WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForTabCount(2), InstrumentTab(kSecondTabContents, 1), + WaitForWebContentsReady( + kSecondTabContents, + GURL("https://chromewebstore.google.com/collection/ai_productivity")), + CheckZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kAi, 1)); +} + +IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest, + DismissPromoIph) { + RunTestSequence( + InstrumentTab(kFirstTabContents, 0), + NavigateWebContents(kFirstTabContents, GURL(chrome ::kChromeUIAboutURL)), + WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + InstrumentNonTabWebView(kZeroStatePromoWebUiIphId, + CustomWebUIHelpBubble::kWebViewIdForTesting), + WaitForWebContentsReady( + kZeroStatePromoWebUiIphId, + GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)), + ClickElement(kZeroStatePromoWebUiIphId, kDismissButton, + ExecuteJsMode::kFireAndForget), + WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting), + CheckResult( + [this] { return browser()->tab_strip_model()->GetTabCount(); }, 1, + "CheckTabCount"), + CheckZeroStatePromoClosedReason( + user_education::FeaturePromoClosedReason::kDismiss)); +}
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom new file mode 100644 index 0000000..466fb46d --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom
@@ -0,0 +1,48 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module zero_state_promo.mojom; + +// Enum depicting the webstore link the user clicked on the promo. Used for +// UMA reporting. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// +// LINT.IfChange(WebStoreLinkClicked) +enum WebStoreLinkClicked { + // The 'Discover Extensions' link. + kDiscoverExtension = 0, + // The 'Find Coupons' link. + kCoupon = 1, + // The 'Write better' link. + kWriting = 2, + // The 'Boost productivity' link. + kProductivity = 3, + // The 'Enhance with AI' link. + kAi = 4, +}; +// LINT.ThenChange(//tools/metrics/histograms/enums.xml:WebStoreLinkClicked) + +// URL for each WebStoreLinkClicked. +const string kDiscoverExtensionWebStoreUrl = "https://chromewebstore.google.com/"; +const string kCouponWebStoreUrl = "https://chromewebstore.google.com/category/extensions/lifestyle/shopping"; +const string kWritingWebStoreUrl = "https://chromewebstore.google.com/collection/writing_essentials"; +const string kProductivityWebStoreUrl = "https://chromewebstore.google.com/category/extensions/productivity/workflow"; +const string kAiWebStoreUrl = "https://chromewebstore.google.com/collection/ai_productivity"; + +// Used by the WebUI page to bootstrap bidirectional communication. +interface PageHandlerFactory { + // WebUI calls this method when the page is initialized. + CreatePageHandler(pending_receiver<PageHandler> handler); +}; + +// Browser-side handler for requests from the WebUI page. +interface PageHandler { + // Launch a new tab to the specified Chrome Web Store link. + // + // TODO(crbug.com/418027382) Remove this method and invoke 'window.open' directly + // in script after TopChrome WebUI bubble supports 'window.open'. + LaunchWebStoreLink(WebStoreLinkClicked link); +};
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc new file mode 100644 index 0000000..59432a0c --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc
@@ -0,0 +1,54 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h" + +#include "base/memory/ptr_util.h" +#include "base/memory/raw_ptr.h" +#include "base/metrics/histogram_functions.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_navigator.h" +#include "chrome/browser/ui/browser_window.h" +#include "components/url_formatter/url_formatter.h" +#include "mojo/public/cpp/bindings/message.h" +#include "ui/base/mojom/window_open_disposition.mojom.h" +#include "ui/base/window_open_disposition.h" +#include "url/gurl.h" + +ZeroStatePromoPageHandler::ZeroStatePromoPageHandler( + Profile* profile, + mojo::PendingReceiver<zero_state_promo::mojom::PageHandler> receiver) + : receiver_(this, std::move(receiver)), profile_(profile) {} + +ZeroStatePromoPageHandler::~ZeroStatePromoPageHandler() {} + +void ZeroStatePromoPageHandler::LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked link) { + GURL url; + switch (link) { + case zero_state_promo::mojom::WebStoreLinkClicked::kDiscoverExtension: + url = GURL(zero_state_promo::mojom::kDiscoverExtensionWebStoreUrl); + break; + case zero_state_promo::mojom::WebStoreLinkClicked::kCoupon: + url = GURL(zero_state_promo::mojom::kCouponWebStoreUrl); + break; + case zero_state_promo::mojom::WebStoreLinkClicked::kWriting: + url = GURL(zero_state_promo::mojom::kWritingWebStoreUrl); + break; + case zero_state_promo::mojom::WebStoreLinkClicked::kProductivity: + url = GURL(zero_state_promo::mojom::kProductivityWebStoreUrl); + break; + case zero_state_promo::mojom::WebStoreLinkClicked::kAi: + url = GURL(zero_state_promo::mojom::kAiWebStoreUrl); + break; + } + + NavigateParams params(profile_, url, ::ui::PAGE_TRANSITION_AUTO_BOOKMARK); + params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB; + Navigate(¶ms); + base::UmaHistogramEnumeration( + "Extension.ZeroStatePromo.IphActionChromeWebStoreLink", link); +}
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h new file mode 100644 index 0000000..60b5484 --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h
@@ -0,0 +1,33 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_PAGE_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_PAGE_HANDLER_H_ + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom.h" +#include "mojo/public/cpp/bindings/receiver.h" +#include "mojo/public/cpp/bindings/remote.h" + +class ZeroStatePromoPageHandler : public zero_state_promo::mojom::PageHandler { + public: + explicit ZeroStatePromoPageHandler( + Profile* profile, + mojo::PendingReceiver<zero_state_promo::mojom::PageHandler> receiver); + + ZeroStatePromoPageHandler(const ZeroStatePromoPageHandler&) = delete; + ZeroStatePromoPageHandler& operator=(const ZeroStatePromoPageHandler&) = + delete; + + ~ZeroStatePromoPageHandler() override; + + void LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked link) override; + + private: + mojo::Receiver<zero_state_promo::mojom::PageHandler> receiver_; + const raw_ptr<Profile> profile_; +}; + +#endif // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_PAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_unittest.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_unittest.cc new file mode 100644 index 0000000..8929b7a --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_unittest.cc
@@ -0,0 +1,112 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h" + +#include "base/test/metrics/histogram_tester.h" +#include "chrome/test/base/browser_with_test_window_test.h" + +namespace extensions { + +class ZeroStatePromoPageHandlerTest : public BrowserWithTestWindowTest { + public: + ZeroStatePromoPageHandlerTest() {} + + void SetUp() override { + BrowserWithTestWindowTest::SetUp(); + handler_ = std::make_unique<ZeroStatePromoPageHandler>( + mojo::PendingReceiver<zero_state_promo::mojom::PageHandler>()); + histogram_tester_ = std::make_unique<base::HistogramTester>(); + + // Start the test with 1 active tab. + AddTab(browser(), GURL("about:blank")); + } + + void TearDown() override { BrowserWithTestWindowTest::TearDown(); } + + void ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked link, + base::HistogramBase::Count32 expected_count) { + histogram_tester_->ExpectBucketCount( + "Extension.ZeroStatePromo.IphActionChromeWebStoreLink", link, + expected_count); + } + + ZeroStatePromoPageHandler& handler() { return *handler_; } + + protected: + std::unique_ptr<ZeroStatePromoPageHandler> handler_; + std::unique_ptr<base::HistogramTester> histogram_tester_; +}; + +TEST_F(ZeroStatePromoPageHandlerTest, LaunchDiscoverWebStoreLink) { + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kDiscoverExtension, 0); + + handler().LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked::kDiscoverExtension); + + ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(zero_state_promo::mojom::kDiscoverExtensionWebStoreUrl, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kDiscoverExtension, 1); +} + +TEST_F(ZeroStatePromoPageHandlerTest, LaunchCouponLink) { + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 0); + + handler().LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked::kCoupon); + + ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(zero_state_promo::mojom::kCouponWebStoreUrl, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 1); +} + +TEST_F(ZeroStatePromoPageHandlerTest, LaunchWritingLink) { + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kWriting, 0); + + handler().LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked::kWriting); + + ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(zero_state_promo::mojom::kWritingWebStoreUrl, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kWriting, 1); +} + +TEST_F(ZeroStatePromoPageHandlerTest, LaunchProductivityLink) { + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 0); + + handler().LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked::kProductivity); + + ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(zero_state_promo::mojom::kProductivityWebStoreUrl, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 1); +} + +TEST_F(ZeroStatePromoPageHandlerTest, LaunchAiLink) { + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kAi, 0); + + handler().LaunchWebStoreLink( + zero_state_promo::mojom::WebStoreLinkClicked::kAi); + + ASSERT_EQ(2, browser()->tab_strip_model()->count()); + ASSERT_EQ(zero_state_promo::mojom::kAiWebStoreUrl, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); + ExpectZeroStatePromoLinkClickCount( + zero_state_promo::mojom::WebStoreLinkClicked::kAi, 1); +} +} // namespace extensions
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc new file mode 100644 index 0000000..13bdbd1b --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc
@@ -0,0 +1,82 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h" + +#include <string> +#include <utility> + +#include "base/containers/span.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profiles_state.h" +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/grit/extensions_zero_state_promo_resources.h" +#include "chrome/grit/extensions_zero_state_promo_resources_map.h" +#include "chrome/grit/generated_resources.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" +#include "ui/base/webui/web_ui_util.h" +#include "ui/views/style/platform_style.h" +#include "ui/webui/webui_util.h" + +namespace extensions { + +DEFINE_TOP_CHROME_WEBUI_CONFIG(ZeroStatePromoController) + +ZeroStatePromoController::ZeroStatePromoController(content::WebUI* web_ui) + : TopChromeWebUIController(web_ui, true) { + Profile* const profile = Profile::FromWebUI(web_ui); + content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd( + profile, chrome::kChromeUIExtensionsZeroStatePromoHost); + + static constexpr webui::LocalizedString kLocalizedStrings[] = { + {"extensionsZeroStateIphHeader", IDS_EXTENSIONS_ZERO_STATE_IPH_HEADER}, + {"extensionsZeroStateChipsIphDesc", + IDS_EXTENSIONS_ZERO_STATE_CHIPS_IPH_DESCRIPTION}, + {"extensionsZeroStateIphShoppingCategoryLabel", + IDS_EXTENSIONS_ZERO_STATE_IPH_SHOPPING_CATEGORY_LABEL}, + {"extensionsZeroStateIphWritingHelpCollectionLabel", + IDS_EXTENSIONS_ZERO_STATE_IPH_WRITING_HELP_COLLECTION_LABEL}, + {"extensionsZeroStateIphProductivityCategoryLabel", + IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LABEL}, + {"extensionsZeroStateIphAiProductivityCollectionLabel", + IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LABEL}, + {"extensionsZeroStateIphDismissButtonTitle", + IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TITLE}, + }; + source->AddLocalizedStrings(kLocalizedStrings); + + webui::SetupWebUIDataSource( + source, kExtensionsZeroStatePromoResources, + IDR_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_HTML); +} + +ZeroStatePromoController::~ZeroStatePromoController() = default; + +WEB_UI_CONTROLLER_TYPE_IMPL(ZeroStatePromoController) + +void ZeroStatePromoController::BindInterface( + mojo::PendingReceiver<zero_state_promo::mojom::PageHandlerFactory> + receiver) { + page_factory_receiver_.reset(); + page_factory_receiver_.Bind(std::move(receiver)); +} + +void ZeroStatePromoController::BindInterface( + mojo::PendingReceiver< + custom_help_bubble::mojom::CustomHelpBubbleHandlerFactory> + pending_receiver) { + CustomWebUIHelpBubbleController::BindInterface(std::move(pending_receiver)); +} + +void ZeroStatePromoController::CreatePageHandler( + mojo::PendingReceiver<zero_state_promo::mojom::PageHandler> receiver) { + page_handler_ = std::make_unique<ZeroStatePromoPageHandler>( + Profile::FromWebUI(web_ui()), std::move(receiver)); +} + +} // namespace extensions
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h new file mode 100644 index 0000000..662beef --- /dev/null +++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.h
@@ -0,0 +1,67 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_UI_H_ + +#include <memory> + +#include "chrome/browser/ui/views/user_education/custom_webui_help_bubble.h" +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom.h" +#include "chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.h" +#include "chrome/browser/ui/webui/top_chrome/top_chrome_web_ui_controller.h" +#include "chrome/common/webui_url_constants.h" +#include "content/public/browser/webui_config.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/receiver.h" + +namespace extensions { + +class ZeroStatePromoController + : public TopChromeWebUIController, + public CustomWebUIHelpBubbleController, + public zero_state_promo::mojom::PageHandlerFactory { + public: + explicit ZeroStatePromoController(content::WebUI* web_ui); + + ZeroStatePromoController(const ZeroStatePromoController&) = delete; + ZeroStatePromoController& operator=(const ZeroStatePromoController&) = delete; + + ~ZeroStatePromoController() override; + + // Instantiates the implementor of the mojom::PageHandlerFactory mojo + // interface passing the pending receiver that will be internally bound. + void BindInterface( + mojo::PendingReceiver<zero_state_promo::mojom::PageHandlerFactory> + receiver); + + void BindInterface(mojo::PendingReceiver< + custom_help_bubble::mojom::CustomHelpBubbleHandlerFactory> + pending_receiver); + + static constexpr std::string GetWebUIName() { + return "ExtensionsWebStoreZeroStatePromo"; + } + + private: + // zero_state_promo::mojom::PageHandlerFactory: + void CreatePageHandler( + mojo::PendingReceiver<zero_state_promo::mojom::PageHandler> receiver) + override; + + std::unique_ptr<ZeroStatePromoPageHandler> page_handler_; + + mojo::Receiver<zero_state_promo::mojom::PageHandlerFactory> + page_factory_receiver_{this}; + + WEB_UI_CONTROLLER_TYPE_DECL(); +}; + +DECLARE_TOP_CHROME_WEBUI_CONFIG(ZeroStatePromoController, + chrome::kChromeUIExtensionsZeroStatePromoHost); + +} // namespace extensions + +#endif // CHROME_BROWSER_UI_WEBUI_EXTENSIONS_ZERO_STATE_PROMO_ZERO_STATE_PROMO_UI_H_
diff --git a/chrome/browser/ui/webui/intro/intro_handler.cc b/chrome/browser/ui/webui/intro/intro_handler.cc index 7763ceb..a8177a5 100644 --- a/chrome/browser/ui/webui/intro/intro_handler.cc +++ b/chrome/browser/ui/webui/intro/intro_handler.cc
@@ -29,6 +29,7 @@ #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/signin_constants.h" #include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" #include "google_apis/gaia/core_account_id.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/l10n/l10n_util.h" @@ -166,10 +167,12 @@ IntroHandler::IntroHandler( base::RepeatingCallback<void(IntroChoice)> intro_callback, base::OnceCallback<void(DefaultBrowserChoice)> default_browser_callback, - bool is_device_managed) + bool is_device_managed, + std::string_view source_name) : intro_callback_(std::move(intro_callback)), default_browser_callback_(std::move(default_browser_callback)), - is_device_managed_(is_device_managed) { + is_device_managed_(is_device_managed), + source_name_(source_name) { DCHECK(intro_callback_); DCHECK(default_browser_callback_); } @@ -249,6 +252,20 @@ } } +void IntroHandler::SetCanPinToTaskbar(bool can_pin) { + if (can_pin) { + base::Value::Dict update; + update.Set( + "defaultBrowserTitle", + l10n_util::GetStringUTF16(IDS_FRE_DEFAULT_BROWSER_AND_PINNING_TITLE)); + update.Set("defaultBrowserSubtitle", + l10n_util::GetStringUTF16( + IDS_FRE_DEFAULT_BROWSER_AND_PINNING_SUBTITLE)); + content::WebUIDataSource::Update(Profile::FromWebUI(web_ui()), source_name_, + std::move(update)); + } +} + void IntroHandler::FireManagedDisclaimerUpdate(std::string disclaimer) { DCHECK(is_device_managed_); if (IsJavascriptAllowed()) {
diff --git a/chrome/browser/ui/webui/intro/intro_handler.h b/chrome/browser/ui/webui/intro/intro_handler.h index 9506e5d..b1f64c3b 100644 --- a/chrome/browser/ui/webui/intro/intro_handler.h +++ b/chrome/browser/ui/webui/intro/intro_handler.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_UI_WEBUI_INTRO_INTRO_HANDLER_H_ #define CHROME_BROWSER_UI_WEBUI_INTRO_INTRO_HANDLER_H_ +#include <string_view> + #include "base/functional/callback_forward.h" #include "components/policy/core/common/cloud/cloud_policy_store.h" #include "components/signin/public/base/signin_buildflags.h" @@ -23,7 +25,8 @@ explicit IntroHandler( base::RepeatingCallback<void(IntroChoice)> intro_callback, base::OnceCallback<void(DefaultBrowserChoice)> default_browser_callback, - bool is_device_managed); + bool is_device_managed, + std::string_view source_name); IntroHandler(const IntroHandler&) = delete; IntroHandler& operator=(const IntroHandler&) = delete; @@ -36,6 +39,10 @@ void ResetIntroButtons(); void ResetDefaultBrowserButtons(); + // This updates the strings displayed in the set as default page of the first + // run experience to indicate that it will also pin Chrome to the taskbar. + void SetCanPinToTaskbar(bool can_pin); + private: // Handles "continueWithAccount" message from the page. No arguments. // This message is sent when the user confirms that they want to sign in to @@ -68,6 +75,9 @@ base::OnceCallback<void(DefaultBrowserChoice)> default_browser_callback_; const bool is_device_managed_ = false; std::unique_ptr<policy::CloudPolicyStore::Observer> policy_store_observer_; + + // Name of the WebUIDataSource to update. + std::string source_name_; }; #endif // CHROME_BROWSER_UI_WEBUI_INTRO_INTRO_HANDLER_H_
diff --git a/chrome/browser/ui/webui/intro/intro_ui.cc b/chrome/browser/ui/webui/intro/intro_ui.cc index cfa6c5e..27c5cff 100644 --- a/chrome/browser/ui/webui/intro/intro_ui.cc +++ b/chrome/browser/ui/webui/intro/intro_ui.cc
@@ -95,7 +95,7 @@ base::BindRepeating(&IntroUI::HandleSigninChoice, base::Unretained(this)), base::BindOnce(&IntroUI::HandleDefaultBrowserChoice, base::Unretained(this)), - is_device_managed); + is_device_managed, chrome::kChromeUIIntroHost); intro_handler_ = intro_handler.get(); web_ui->AddMessageHandler(std::move(intro_handler)); } @@ -139,4 +139,8 @@ } } +void IntroUI::SetCanPinToTaskbar(bool can_pin) { + intro_handler_->SetCanPinToTaskbar(can_pin); +} + WEB_UI_CONTROLLER_TYPE_IMPL(IntroUI)
diff --git a/chrome/browser/ui/webui/intro/intro_ui.h b/chrome/browser/ui/webui/intro/intro_ui.h index 0ac1c1a..710c5566 100644 --- a/chrome/browser/ui/webui/intro/intro_ui.h +++ b/chrome/browser/ui/webui/intro/intro_ui.h
@@ -72,6 +72,7 @@ void SetSigninChoiceCallback(IntroSigninChoiceCallback callback); void SetDefaultBrowserCallback(DefaultBrowserCallback callback); + void SetCanPinToTaskbar(bool can_pin); private: void HandleSigninChoice(IntroChoice choice);
diff --git a/chrome/browser/ui/webui/metrics_internals/OWNERS b/chrome/browser/ui/webui/metrics_internals/OWNERS index b4a3e38..22068804 100644 --- a/chrome/browser/ui/webui/metrics_internals/OWNERS +++ b/chrome/browser/ui/webui/metrics_internals/OWNERS
@@ -3,5 +3,4 @@ # Prefer sending CLs to below. lucnguyen@google.com -per-file structured_metrics_internals_handler*=andrewbregger@google.com per-file field_trials_handler.*=harringtond@chromium.org
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h index 903f7c81..d1cd39d 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h +++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h
@@ -19,7 +19,7 @@ kCallbackUnknownBeforeShown = 2, kMaxValue = kCallbackUnknownBeforeShown, }; -// LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxDialogCallbackState) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxDialogCallbackState) class PrivacySandboxDialogHandler : public content::WebUIMessageHandler { public: PrivacySandboxDialogHandler(
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 b0986f8..f89cd92c 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -154,10 +154,6 @@ #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #endif // BUILDFLAG(IS_WIN) -#if BUILDFLAG(USE_NSS_CERTS) -#include "chrome/browser/ui/webui/certificate_manager_localized_strings_provider.h" -#endif - #if BUILDFLAG(IS_LINUX) #include "ui/linux/linux_ui_factory.h" #include "ui/ozone/public/ozone_platform.h" @@ -3802,10 +3798,6 @@ AddSystemStrings(html_source); #endif -#if BUILDFLAG(USE_NSS_CERTS) - certificate_manager::AddLocalizedStrings(html_source); -#endif - policy_indicator::AddLocalizedStrings(html_source); AddSecurityKeysStrings(html_source);
diff --git a/chrome/browser/ui/webui/user_education_internals/user_education_internals_page_handler_impl.cc b/chrome/browser/ui/webui/user_education_internals/user_education_internals_page_handler_impl.cc index ac1d7cf5..b3590fd10 100644 --- a/chrome/browser/ui/webui/user_education_internals/user_education_internals_page_handler_impl.cc +++ b/chrome/browser/ui/webui/user_education_internals/user_education_internals_page_handler_impl.cc
@@ -298,8 +298,6 @@ instructions.push_back( RemoveStringPlaceholders(spec.bubble_title_string_id())); } - instructions.push_back( - RemoveStringPlaceholders(spec.bubble_body_string_id())); } return instructions; }
diff --git a/chrome/browser/vr/graphics_delegate_android.cc b/chrome/browser/vr/graphics_delegate_android.cc index fd35d82..02d3141 100644 --- a/chrome/browser/vr/graphics_delegate_android.cc +++ b/chrome/browser/vr/graphics_delegate_android.cc
@@ -140,7 +140,8 @@ // they all have subtly different uses. // TODO(https://crbug.com/40909689): Consolidate this usage. gfx::Size buffer_size = GetTextureSize(); - if (shared_buffer_ && shared_buffer_->size == buffer_size) { + if (shared_buffer_ && shared_buffer_->shared_image && + shared_buffer_->shared_image->size() == buffer_size) { return true; } @@ -197,10 +198,6 @@ egl_image.get()); shared_buffer_->local_eglimage = std::move(egl_image); - // Save size to avoid resize next time. - DVLOG(1) << __func__ << ": resized to " << buffer_size.width() << "x" - << buffer_size.height(); - shared_buffer_->size = buffer_size; return true; } @@ -212,7 +209,6 @@ << shared_buffer_->shared_image->mailbox().ToDebugString(); mailbox_bridge_->DestroySharedImage( shared_buffer_->sync_token, std::move(shared_buffer_->shared_image)); - shared_buffer_->size = {0, 0}; } }
diff --git a/chrome/browser/webshare/BUILD.gn b/chrome/browser/webshare/BUILD.gn index e077a8d..2b6bac4a 100644 --- a/chrome/browser/webshare/BUILD.gn +++ b/chrome/browser/webshare/BUILD.gn
@@ -52,7 +52,10 @@ ] if (is_chromeos) { - deps += [ "//chrome/browser/webshare/chromeos:unit_tests" ] + deps += [ + "//chrome/browser/sharesheet", + "//chrome/browser/webshare/chromeos:unit_tests", + ] } if (is_chromeos || is_mac) {
diff --git a/chrome/browser/win/installer_downloader/BUILD.gn b/chrome/browser/win/installer_downloader/BUILD.gn index b8eb0d90..fc97252 100644 --- a/chrome/browser/win/installer_downloader/BUILD.gn +++ b/chrome/browser/win/installer_downloader/BUILD.gn
@@ -31,6 +31,7 @@ public_deps = [ "//base" ] deps = [ + ":infobar", ":prefs", "//chrome/browser:browser_process", "//chrome/browser/profiles", @@ -38,6 +39,7 @@ "//chrome/browser/ui/browser_window", "//chrome/browser/win:cloud_synced_folder_checker", "//components/download/public/common:public", + "//components/infobars/content", "//components/infobars/core", "//components/prefs", "//components/tabs:public", @@ -46,16 +48,42 @@ } source_set("infobar") { + friend = [ + ":infobar_impl", + ":controller", + ] + public = [ "installer_downloader_infobar_delegate.h" ] - sources = [ "installer_downloader_infobar_delegate.cc" ] + sources = [ + "installer_downloader_active_browser_window_tracker.h", + "installer_downloader_infobar_window_active_tab_tracker.h", + ] + + public_deps = [ "//base" ] + + deps = [ + "//chrome/browser/ui:browser_list", + "//components/infobars/core", + "//content/public/browser", + "//ui/base", + ] +} + +source_set("infobar_impl") { + sources = [ + "installer_downloader_active_browser_window_tracker.cc", + "installer_downloader_infobar_delegate.cc", + "installer_downloader_infobar_window_active_tab_tracker.cc", + ] deps = [ ":controller", - "//base", + ":infobar", "//chrome/app:branded_strings_grit", "//chrome/app:generated_resources_grit", "//chrome/browser/ui", + "//chrome/browser/ui/browser_window", "//components/infobars/content", "//components/infobars/core", "//components/omnibox/browser:vector_icons", @@ -91,3 +119,23 @@ "//ui/base", ] } + +source_set("interactive_ui_tests") { + testonly = true + + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + + sources = [ "installer_downloader_interactive_uitest.cc" ] + + deps = [ + ":controller", + ":prefs", + "//chrome/browser:browser_process", + "//chrome/browser:global_features", + "//chrome/browser/ui:browser_element_identifiers", + "//chrome/browser/ui:ui", + "//chrome/test:test_support_ui", + "//content/test:test_support", + "//testing/gtest", + ] +}
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.cc b/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.cc new file mode 100644 index 0000000..27c7125 --- /dev/null +++ b/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.cc
@@ -0,0 +1,70 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.h" + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/browser_window.h" + +namespace installer_downloader { + +InstallerDownloaderActiveBrowserWindowTracker:: + InstallerDownloaderActiveBrowserWindowTracker() { + BrowserList::GetInstance()->AddObserver(this); + MaybeUpdateLastActiveWindow(BrowserList::GetInstance()->GetLastActive()); +} + +InstallerDownloaderActiveBrowserWindowTracker:: + ~InstallerDownloaderActiveBrowserWindowTracker() { + BrowserList::GetInstance()->RemoveObserver(this); +} + +base::CallbackListSubscription InstallerDownloaderActiveBrowserWindowTracker:: + RegisterActiveWindowChangedCallback(WindowChangedCallback callback) { + auto subscription = active_window_change_callbacks_.Add(callback); + callback.Run(last_active_window_); + return subscription; +} + +base::CallbackListSubscription +InstallerDownloaderActiveBrowserWindowTracker::RegisterRemovedWindowCallback( + WindowChangedCallback callback) { + return window_remove_callbacks_.Add(callback); +} + +void InstallerDownloaderActiveBrowserWindowTracker::OnBrowserSetLastActive( + Browser* browser) { + MaybeUpdateLastActiveWindow(browser); +} + +void InstallerDownloaderActiveBrowserWindowTracker::OnBrowserRemoved( + Browser* browser) { + window_remove_callbacks_.Notify( + static_cast<BrowserWindowInterface*>(browser)); + + if (!last_active_window_ || + static_cast<BrowserWindowInterface*>(browser) != last_active_window_) { + return; + } + + MaybeUpdateLastActiveWindow(BrowserList::GetInstance()->GetLastActive()); +} + +void InstallerDownloaderActiveBrowserWindowTracker::MaybeUpdateLastActiveWindow( + Browser* browser) { + BrowserWindowInterface* last_active_window = + browser && browser->is_type_normal() + ? static_cast<BrowserWindowInterface*>(browser) + : nullptr; + + if (last_active_window == last_active_window_) { + return; + } + + last_active_window_ = last_active_window; + active_window_change_callbacks_.Notify(last_active_window_); +} + +} // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.h b/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.h new file mode 100644 index 0000000..ba0d30a --- /dev/null +++ b/chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.h
@@ -0,0 +1,70 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_ACTIVE_BROWSER_WINDOW_TRACKER_H_ +#define CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_ACTIVE_BROWSER_WINDOW_TRACKER_H_ + +#include "base/callback_list.h" +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" +#include "chrome/browser/ui/browser_list_observer.h" + +class BrowserWindowInterface; + +namespace installer_downloader { + +// Lightweight helper that always knows which *normal* browser window was last +// activated. Observers can register for change notifications. +// - The tracker **does not** own the window. +// - When the last window closes, `active_window()` returns `nullptr`. +class InstallerDownloaderActiveBrowserWindowTracker final + : public BrowserListObserver { + public: + using WindowChangedCallback = + base::RepeatingCallback<void(BrowserWindowInterface*)>; + + InstallerDownloaderActiveBrowserWindowTracker(); + + InstallerDownloaderActiveBrowserWindowTracker( + const InstallerDownloaderActiveBrowserWindowTracker&) = delete; + InstallerDownloaderActiveBrowserWindowTracker& operator=( + const InstallerDownloaderActiveBrowserWindowTracker&) = delete; + + ~InstallerDownloaderActiveBrowserWindowTracker() override; + + // Register for active window changes. The callback is invoked immediately + // with the current active window, then on every subsequent change. + base::CallbackListSubscription RegisterActiveWindowChangedCallback( + WindowChangedCallback callback); + + // Register for window remove changes. The callback is invoked immediately + // when a browser window is removed. + base::CallbackListSubscription RegisterRemovedWindowCallback( + WindowChangedCallback callback); + + private: + // BrowserListObserver: + void OnBrowserSetLastActive(Browser* browser) override; + void OnBrowserRemoved(Browser* browser) override; + + // Helps to update `last_active_window_` when the active browser changes or + // when a browser removed. + void MaybeUpdateLastActiveWindow(Browser* browser); + + // Track the last active window. It can be null if all the browser window type + // are not normal. + raw_ptr<BrowserWindowInterface> last_active_window_; + + // Stores the list of callback listening for active browser window change. + base::RepeatingCallbackList<void(BrowserWindowInterface*)> + active_window_change_callbacks_; + + // Stores the list of callback listening for browser window remove event. + base::RepeatingCallbackList<void(BrowserWindowInterface*)> + window_remove_callbacks_; +}; + +} // namespace installer_downloader + +#endif // CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_ACTIVE_BROWSER_WINDOW_TRACKER_H_
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller.cc b/chrome/browser/win/installer_downloader/installer_downloader_controller.cc index 295b2fd..870a47c 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller.cc
@@ -10,9 +10,11 @@ #include "base/base_paths.h" #include "base/check_deref.h" +#include "base/check_is_test.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/strings/string_util.h" #include "base/uuid.h" @@ -22,9 +24,13 @@ #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h" #include "chrome/browser/win/installer_downloader/installer_downloader_feature.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model_impl.h" #include "chrome/browser/win/installer_downloader/system_info_provider_impl.h" +#include "components/infobars/content/content_infobar_manager.h" +#include "components/infobars/core/confirm_infobar_delegate.h" +#include "components/infobars/core/infobar.h" #include "components/tabs/public/tab_interface.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/download_manager.h" @@ -76,7 +82,9 @@ model_(std::make_unique<InstallerDownloaderModelImpl>( std::make_unique<SystemInfoProviderImpl>())), get_active_web_contents_callback_( - base::BindRepeating(&GetActiveWebContents)) {} + base::BindRepeating(&GetActiveWebContents)) { + RegisterBrowserWindowEvents(); +} InstallerDownloaderController::InstallerDownloaderController( ShowInfobarCallback show_infobar_callback, @@ -86,15 +94,52 @@ show_infobar_callback_(std::move(show_infobar_callback)), model_(std::move(model)), get_active_web_contents_callback_( - base::BindRepeating(&GetActiveWebContents)) {} + base::BindRepeating(&GetActiveWebContents)) { + RegisterBrowserWindowEvents(); +} + +void InstallerDownloaderController::RegisterBrowserWindowEvents() { + active_window_subscription_ = + window_tracker_.RegisterActiveWindowChangedCallback(base::BindRepeating( + &InstallerDownloaderController::OnActiveBrowserWindowChanged, + base::Unretained(this))); + + removed_window_subscription_ = + window_tracker_.RegisterRemovedWindowCallback(base::BindRepeating( + &InstallerDownloaderController::OnRemovedBrowserWindow, + base::Unretained(this))); +} InstallerDownloaderController::~InstallerDownloaderController() = default; -void InstallerDownloaderController::MaybeShowInfoBar() { - // At this point, the decision to show the infobar should be taken. - // 1. Check local state whether shown limit has been reached or not. - // 2. Check eligibility. +void InstallerDownloaderController::OnActiveBrowserWindowChanged( + BrowserWindowInterface* bwi) { + // This can be null during the startup or when the last window is closed. + if (!bwi) { + return; + } + if (bwi_and_active_tab_tracker_map_.contains(bwi)) { + return; + } + + bwi_and_active_tab_tracker_map_[bwi] = + std::make_unique<InstallerDownloaderInfobarWindowActiveTabTracker>( + bwi, + base::BindRepeating(&InstallerDownloaderController::MaybeShowInfoBar, + base::Unretained(this))); +} + +void InstallerDownloaderController::OnRemovedBrowserWindow( + BrowserWindowInterface* bwi) { + if (!bwi_and_active_tab_tracker_map_.contains(bwi)) { + return; + } + + bwi_and_active_tab_tracker_map_.erase(bwi); +} + +void InstallerDownloaderController::MaybeShowInfoBar() { // The max show count of the infobar have been reached. Eligibility check is // no longer needed. if (model_->IsMaxShowCountReached()) { @@ -108,6 +153,20 @@ void InstallerDownloaderController::OnEligibilityReady( std::optional<base::FilePath> destination) { + if (infobar_closed_) { + return; + } + + auto* contents = get_active_web_contents_callback_.Run(); + + if (!contents) { + return; + } + + if (visible_infobars_web_contents_.contains(contents)) { + return; + } + // Early return when we have no destination and bypass is not allowed. if (!destination.has_value() && !model_->ShouldByPassEligibilityCheck()) { return; @@ -123,28 +182,72 @@ destination = std::move(desktop_path); } - // TODO(https://crbug.com/417708652): Ensure that the infobar is visible on - // the last activated windows. - auto* contents = get_active_web_contents_callback_.Run(); - - if (!contents) { - return; - } + infobars::ContentInfoBarManager* infobar_manager = + infobars::ContentInfoBarManager::FromWebContents(contents); // Installer Downloader is a global feature, therefore it's guaranteed that // InstallerDownloaderController will be alive at any point during the browser // runtime. - show_infobar_callback_.Run( - contents, + infobars::InfoBar* infobar = show_infobar_callback_.Run( + infobar_manager, base::BindOnce(&InstallerDownloaderController::OnDownloadRequestAccepted, base::Unretained(this), destination.value()), base::BindOnce(&InstallerDownloaderController::OnInfoBarDismissed, base::Unretained(this))); - model_->IncrementShowCount(); + + if (!infobar) { + return; + } + + if (infobar_manager) { + infobar_manager->AddObserver(this); + } else { + CHECK_IS_TEST(); + } + + visible_infobars_web_contents_[contents] = infobar; + + // This is the first show in this browser session. + if (visible_infobars_web_contents_.size() == 1u) { + model_->IncrementShowCount(); + base::UmaHistogramBoolean("Windows.InstallerDownloader.InfobarShown", + /*shown=*/true); + } +} + +void InstallerDownloaderController::OnInfoBarRemoved(infobars::InfoBar* infobar, + bool animate) { + auto it = std::find_if( + visible_infobars_web_contents_.begin(), + visible_infobars_web_contents_.end(), + [infobar](const auto& entry) { return entry.second == infobar; }); + + if (it == visible_infobars_web_contents_.end()) { + return; + } + + it->second->owner()->RemoveObserver(this); + visible_infobars_web_contents_.erase(it); + + if (!user_initiated_info_bar_close_pending_) { + return; + } + + for (auto [contents, infobar_instance] : visible_infobars_web_contents_) { + infobar_instance->owner()->RemoveObserver(this); + infobar_instance->RemoveSelf(); + } + + visible_infobars_web_contents_.clear(); + infobar_closed_ = true; } void InstallerDownloaderController::OnDownloadRequestAccepted( const base::FilePath& destination) { + base::UmaHistogramBoolean("Windows.InstallerDownloader.RequestAccepted", + true); + + user_initiated_info_bar_close_pending_ = true; // User have explicitly gave download consent. Therefore, a background // download should be issued. auto* contents = get_active_web_contents_callback_.Run(); @@ -175,8 +278,8 @@ void InstallerDownloaderController::OnDownloadCompleted( std::unique_ptr<ScopedProfileKeepAlive> keep_alive, bool success) { - // Update local state to indicated that downloaded have been successfully - // completed. + base::UmaHistogramBoolean("Windows.InstallerDownloader.DownloadSucceed", + success); } void InstallerDownloaderController::SetActiveWebContentsCallbackForTesting( @@ -185,8 +288,9 @@ } void InstallerDownloaderController::OnInfoBarDismissed() { - // TODO(crbug.com/417709084):Dismisses all installer Downloader infobars - // since this infobar is global. + base::UmaHistogramBoolean("Windows.InstallerDownloader.RequestAccepted", + false); + user_initiated_info_bar_close_pending_ = true; } } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller.h b/chrome/browser/win/installer_downloader/installer_downloader_controller.h index bda5cfc8..f8295401 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller.h +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller.h
@@ -5,12 +5,18 @@ #ifndef CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_CONTROLLER_H_ #define CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_CONTROLLER_H_ +#include <map> #include <memory> #include <optional> +#include "base/callback_list.h" #include "base/functional/callback.h" +#include "base/scoped_multi_source_observation.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_active_browser_window_tracker.h" +#include "components/infobars/core/infobar_manager.h" class ScopedProfileKeepAlive; +class BrowserWindowInterface; namespace base { class FilePath; @@ -20,9 +26,16 @@ class WebContents; } +namespace infobars { +class InfoBar; +class ContentInfoBarManager; +} // namespace infobars + namespace installer_downloader { class InstallerDownloaderModel; +class InstallerDownloaderActiveBrowserWindowTracker; +class InstallerDownloaderInfobarWindowActiveTabTracker; // UI-thread coordinator for the Installer Downloader. // The controller owns a single InstallerDownloaderModel instance and: @@ -37,17 +50,18 @@ // tod keep track the infobar show count. // // The controller is instantiated a GlobalFeature. -class InstallerDownloaderController { +class InstallerDownloaderController final + : public infobars::InfoBarManager::Observer { public: // A callback that will be run to show the installer download infobar in // `web_contents`. `on_accept` will be run if the user accepts the prompt. // This will show the infobar on the actual tab. // // TODO(https://crbug.com/417709084): Make the infobar global to the browser. - using ShowInfobarCallback = - base::RepeatingCallback<void(content::WebContents* web_contents, - base::OnceClosure on_accept, - base::OnceClosure on_dismiss)>; + using ShowInfobarCallback = base::RepeatingCallback<infobars::InfoBar*( + infobars::ContentInfoBarManager*, + base::OnceClosure on_accept, + base::OnceClosure on_dismiss)>; using GetActiveWebContentsCallback = base::RepeatingCallback<content::WebContents*()>; @@ -64,7 +78,7 @@ InstallerDownloaderController& operator=( const InstallerDownloaderController&) = delete; - ~InstallerDownloaderController(); + ~InstallerDownloaderController() override; // Called early during the browser startup and will show the installer // downloader infobar if a set of conditions are met. @@ -81,15 +95,60 @@ GetActiveWebContentsCallback callback); private: + using BrowserAndActiveTabTrackerMap = std::map< + BrowserWindowInterface*, + std::unique_ptr<InstallerDownloaderInfobarWindowActiveTabTracker>>; + void OnEligibilityReady(std::optional<base::FilePath> destination); void OnDownloadCompleted(std::unique_ptr<ScopedProfileKeepAlive> keep_alive, bool success); + void RegisterBrowserWindowEvents(); + + void OnActiveBrowserWindowChanged(BrowserWindowInterface* bwi); + void OnRemovedBrowserWindow(BrowserWindowInterface* bwi); + + // infobars::InfoBarManager::Observer: + void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override; + base::RepeatingCallback<bool()> is_metrics_enabled_callback_; ShowInfobarCallback show_infobar_callback_; std::unique_ptr<InstallerDownloaderModel> model_; GetActiveWebContentsCallback get_active_web_contents_callback_; + + // Tracks the last active browser / future browser window and notify the + // subscriber. This is important for future browser window so that we can + // subscribe for tab change in that window. + InstallerDownloaderActiveBrowserWindowTracker window_tracker_; + + // Stores the subscription for the active window change. + base::CallbackListSubscription active_window_subscription_; + + // Stores the subscription for the removed window change. + base::CallbackListSubscription removed_window_subscription_; + + // Stores all the active tab tracker across all the window. + BrowserAndActiveTabTrackerMap bwi_and_active_tab_tracker_map_; + + // Tracks the visible infobars with te associated web contents. + std::map<content::WebContents*, infobars::InfoBar*> + visible_infobars_web_contents_; + + // If `true`, that mean the infobar has been closed by the user during the + // actual browser session. As a result, the infobar should no longer be + // visible until the next browser session. + bool infobar_closed_ = false; + + // Accept/Dismiss callbacks are invoked before the infobar get removed. This + // flag will indicated that the close event has been initiate by the user or + // not. In the case where the close event has been initiated by the user, all + // the instance of the infobar should get removed. In all the other cases, + // only the specific infobar will get removed. Following are some of those + // cases: + // 1. Close tab. + // 2. Close browser window. + bool user_initiated_info_bar_close_pending_ = false; }; } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc b/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc index 8480b5d..0c9b02be 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc
@@ -15,6 +15,7 @@ #include "base/memory/raw_ptr.h" #include "base/test/bind.h" #include "base/test/gmock_callback_support.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/scoped_path_override.h" @@ -131,7 +132,8 @@ EXPECT_CALL(*mock_model_, CheckEligibility(_)) .WillOnce(base::test::RunOnceCallback<0>( std::optional<base::FilePath>(FILE_PATH_LITERAL("C:\\foo")))); - EXPECT_CALL(show_infobar_callback_, Run(_, _, _)).Times(1); + EXPECT_CALL(show_infobar_callback_, Run(_, _, _)) + .WillOnce(Return(reinterpret_cast<infobars::InfoBar*>(0x1))); EXPECT_CALL(*mock_model_, IncrementShowCount()).Times(1); controller_->MaybeShowInfoBar(); @@ -249,12 +251,14 @@ EXPECT_CALL(*mock_model_, IsMaxShowCountReached()).WillOnce(Return(false)); EXPECT_CALL(*mock_model_, ShouldByPassEligibilityCheck()) .WillOnce(Return(true)); + EXPECT_CALL(*mock_model_, IncrementShowCount()).Times(1); // Eligibility returns std::nullopt → controller must rely on the bypass path. EXPECT_CALL(*mock_model_, CheckEligibility(_)) .WillOnce(RunOnceCallback<0>(std::nullopt)); // When bypass is enabled we still expect the infobar to be shown. - EXPECT_CALL(show_infobar_callback_, Run(_, _, _)).Times(1); + EXPECT_CALL(show_infobar_callback_, Run(_, _, _)) + .WillOnce(Return(reinterpret_cast<infobars::InfoBar*>(0x1))); controller_->MaybeShowInfoBar(); } @@ -266,10 +270,80 @@ std::optional<base::FilePath>(base::FilePath(L"C:\\foo")))); EXPECT_CALL(*mock_model_, IncrementShowCount()).Times(1); - EXPECT_CALL(show_infobar_callback_, Run(_, _, _)).Times(1); + EXPECT_CALL(show_infobar_callback_, Run(_, _, _)) + .WillOnce(Return(reinterpret_cast<infobars::InfoBar*>(0x1))); controller_->MaybeShowInfoBar(); } +TEST_F(InstallerDownloaderControllerTest, InfobarShownLoggedOncePerSession) { + base::HistogramTester histograms; + + EXPECT_CALL(*mock_model_, IsMaxShowCountReached()) + .WillRepeatedly(Return(false)); + EXPECT_CALL(*mock_model_, CheckEligibility(_)) + .WillRepeatedly(base::test::RunOnceCallbackRepeatedly<0>( + std::optional<base::FilePath>(base::FilePath(L"C:\\foo")))); + EXPECT_CALL(*mock_model_, IncrementShowCount()).Times(1); + + // Stub Show() so the controller thinks the infobar has been created. + EXPECT_CALL(show_infobar_callback_, Run(_, _, _)) + .Times(1) + .WillOnce(Return(reinterpret_cast<infobars::InfoBar*>(0x1))); + + // First display: should log. + controller_->MaybeShowInfoBar(); + // Second display in the same session: should NOT log again. + controller_->MaybeShowInfoBar(); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.InfobarShown", + /*true=*/1, /*expected_count=*/1); +} + +TEST_F(InstallerDownloaderControllerTest, RequestAcceptedTrueMetric) { + base::HistogramTester histograms; + + EXPECT_CALL(is_metric_enabled_mock_callback_, Run()).WillOnce(Return(true)); + EXPECT_CALL(*mock_model_, StartDownload(_, _, _, _)).Times(1); + + controller_->OnDownloadRequestAccepted( + base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\installer.exe"))); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.RequestAccepted", + /*true=*/1, /*expected_count=*/1); +} + +TEST_F(InstallerDownloaderControllerTest, RequestAcceptedFalseMetric) { + base::HistogramTester histograms; + + controller_->OnInfoBarDismissed(); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.RequestAccepted", + /*false=*/0, /*expected_count=*/1); +} + +TEST_F(InstallerDownloaderControllerTest, LogsDownloadResultMetric) { + base::HistogramTester histograms; + + EXPECT_CALL(is_metric_enabled_mock_callback_, Run()).WillOnce(Return(true)); + + CompletionCallback download_completion_callback; + + EXPECT_CALL(*mock_model_, StartDownload(_, _, _, _)) + .WillOnce([&](const GURL&, const base::FilePath&, + content::DownloadManager&, CompletionCallback callback) { + download_completion_callback = std::move(callback); + }); + + controller_->OnDownloadRequestAccepted( + base::FilePath(FILE_PATH_LITERAL("C:\\tmp\\installer.exe"))); + + ASSERT_TRUE(download_completion_callback); + std::move(download_completion_callback).Run(/*success=*/true); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.DownloadSucceed", + /*success=*/1, /*expected_count=*/1); +} + } // namespace } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.cc b/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.cc index 987891ab..dd7fa1a 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.cc
@@ -34,16 +34,14 @@ } // namespace // static -void InstallerDownloaderInfoBarDelegate::Show(content::WebContents* contents, - base::OnceClosure accept_cb, - base::OnceClosure close_cb) { - infobars::ContentInfoBarManager* infobar_manager = - infobars::ContentInfoBarManager::FromWebContents(contents); - +infobars::InfoBar* InstallerDownloaderInfoBarDelegate::Show( + infobars::ContentInfoBarManager* infobar_manager, + base::OnceClosure accept_cb, + base::OnceClosure close_cb) { std::unique_ptr<InstallerDownloaderInfoBarDelegate> delegate = std::make_unique<InstallerDownloaderInfoBarDelegate>(std::move(accept_cb), std::move(close_cb)); - infobar_manager->AddInfoBar( + return infobar_manager->AddInfoBar( std::make_unique<ConfirmInfoBar>(std::move(delegate))); } @@ -72,6 +70,11 @@ return false; } +bool InstallerDownloaderInfoBarDelegate::Accept() { + std::move(accept_cb_).Run(); + return true; +} + void InstallerDownloaderInfoBarDelegate::InfoBarDismissed() { std::move(close_cb_).Run(); }
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.h b/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.h index 3dd72aa..d7d72906 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.h +++ b/chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.h
@@ -15,6 +15,11 @@ #include "ui/base/models/image_model.h" #include "ui/base/window_open_disposition.h" +namespace infobars { +class InfoBar; +class ContentInfoBarManager; +} // namespace infobars + namespace installer_downloader { class InstallerDownloaderInfoBarDelegate : public ConfirmInfoBarDelegate { @@ -22,9 +27,9 @@ // Creates a installer downloader infobar and adds it to the provided // `infobar_manager`. The `infobar_manager` will own the returned infobar. // `accept_cb` is called when the user accepts the infobar. - static void Show(content::WebContents* contents, - base::OnceClosure accept_cb, - base::OnceClosure close_cb); + static infobars::InfoBar* Show(infobars::ContentInfoBarManager* contents, + base::OnceClosure accept_cb, + base::OnceClosure close_cb); InstallerDownloaderInfoBarDelegate& operator=( const InstallerDownloaderInfoBarDelegate&) = delete; @@ -37,6 +42,7 @@ infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override; const gfx::VectorIcon& GetVectorIcon() const override; bool ShouldExpire(const NavigationDetails& details) const override; + bool Accept() override; void InfoBarDismissed() override; std::u16string GetMessageText() const override; std::u16string GetLinkText() const override;
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.cc b/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.cc new file mode 100644 index 0000000..04f60f9 --- /dev/null +++ b/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.cc
@@ -0,0 +1,31 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.h" + +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" + +namespace installer_downloader { + +InstallerDownloaderInfobarWindowActiveTabTracker:: + InstallerDownloaderInfobarWindowActiveTabTracker( + BrowserWindowInterface* window, + base::RepeatingClosure show_infobar_callback) + : window_(window), + show_infobar_callback_(std::move(show_infobar_callback)) { + active_tab_subscription_ = + window_->RegisterActiveTabDidChange(base::BindRepeating( + &InstallerDownloaderInfobarWindowActiveTabTracker::OnActiveTabChanged, + base::Unretained(this))); +} + +InstallerDownloaderInfobarWindowActiveTabTracker:: + ~InstallerDownloaderInfobarWindowActiveTabTracker() = default; + +void InstallerDownloaderInfobarWindowActiveTabTracker::OnActiveTabChanged( + BrowserWindowInterface*) { + show_infobar_callback_.Run(); +} + +} // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.h b/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.h new file mode 100644 index 0000000..0d6370a --- /dev/null +++ b/chrome/browser/win/installer_downloader/installer_downloader_infobar_window_active_tab_tracker.h
@@ -0,0 +1,42 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_INFOBAR_WINDOW_ACTIVE_TAB_TRACKER_H_ +#define CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_INFOBAR_WINDOW_ACTIVE_TAB_TRACKER_H_ + +#include "base/callback_list.h" +#include "base/functional/callback_forward.h" +#include "base/memory/raw_ptr.h" + +class BrowserWindowInterface; + +namespace installer_downloader { + +// It listens for `BrowserWindowInterface::RegisterActiveTabDidChange` +// notifications and injects the banner into the currently active tab. +class InstallerDownloaderInfobarWindowActiveTabTracker { + public: + InstallerDownloaderInfobarWindowActiveTabTracker( + BrowserWindowInterface* window, + base::RepeatingClosure show_infobar_callback); + + InstallerDownloaderInfobarWindowActiveTabTracker( + const InstallerDownloaderInfobarWindowActiveTabTracker&) = delete; + InstallerDownloaderInfobarWindowActiveTabTracker& operator=( + const InstallerDownloaderInfobarWindowActiveTabTracker&) = delete; + + ~InstallerDownloaderInfobarWindowActiveTabTracker(); + + private: + void OnActiveTabChanged(BrowserWindowInterface* window); + + const raw_ptr<BrowserWindowInterface> window_; + base::RepeatingClosure show_infobar_callback_; + + base::CallbackListSubscription active_tab_subscription_; +}; + +} // namespace installer_downloader + +#endif // CHROME_BROWSER_WIN_INSTALLER_DOWNLOADER_INSTALLER_DOWNLOADER_INFOBAR_WINDOW_ACTIVE_TAB_TRACKER_H_
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_interactive_uitest.cc b/chrome/browser/win/installer_downloader/installer_downloader_interactive_uitest.cc new file mode 100644 index 0000000..0c86109d --- /dev/null +++ b/chrome/browser/win/installer_downloader/installer_downloader_interactive_uitest.cc
@@ -0,0 +1,167 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/test/metrics/histogram_tester.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/global_features.h" +#include "chrome/browser/ui/browser_element_identifiers.h" +#include "chrome/browser/ui/views/infobars/confirm_infobar.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_controller.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_feature.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_pref_names.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/test/base/ui_test_utils.h" +#include "chrome/test/interaction/interactive_browser_test.h" +#include "content/public/test/browser_test.h" +#include "url/gurl.h" + +namespace installer_downloader { +namespace { + +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kSecondTabContents); + +// A valid template; IIDGUID and STATS are substituted at runtime. +constexpr char kUrlTemplate[] = + "https://example.com/installer.exe?iid=IIDGUID&stats=STATS"; + +class InstallerDownloaderInteractiveUiTest : public InteractiveBrowserTest { + protected: + void SetUp() override { + feature_list_.InitAndEnableFeatureWithParameters( + kInstallerDownloader, + {{kInstallerUrlTemplateParam.name, kUrlTemplate}}); + InteractiveBrowserTest::SetUp(); + } + + InteractiveTestApi::MultiStep ShowInfobarOnNewTab() { + return Steps(AddInstrumentedTab(kSecondTabContents, + GURL(chrome::kChromeUINewTabURL)), + WaitForShow(ConfirmInfoBar::kInfoBarElementId)); + } + + // Switches back to the first tab and verifies that the infobar is gone + // everywhere. + InteractiveTestApi::MultiStep VerifyNoInfobarInAnyTab() { + return Steps(WaitForHide(ConfirmInfoBar::kInfoBarElementId), + SelectTab(kTabStripElementId, 0), + WaitForHide(ConfirmInfoBar::kInfoBarElementId)); + } + + // Assumes that actual window have infobar visible. As a result, new window + // will also get the infobar. + InteractiveTestApi::MultiStep ShowInfobarInNewWindow() { + return Steps(Do([&]() { CreateBrowser(browser()->profile()); }), + WaitForShow(ConfirmInfoBar::kInfoBarElementId)); + } + + // Should be invoked from window 1 and that window just removed infobar. + InteractiveTestApi::MultiStep VerifyNoInfobarInAnyContext() { + return Steps(WaitForHide(ConfirmInfoBar::kInfoBarElementId), + SelectTab(kTabStripElementId, 0), + WaitForHide(ConfirmInfoBar::kInfoBarElementId)); + } + + void TriggerInfobar() { + g_browser_process->local_state()->SetBoolean( + prefs::kInstallerDownloaderBypassEligibilityCheck, true); + g_browser_process->GetFeatures() + ->installer_downloader_controller() + ->MaybeShowInfoBar(); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + AcceptRemovesInfobarFromAllTabs) { + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + ShowInfobarOnNewTab(), + PressButton(ConfirmInfoBar::kOkButtonElementId), + VerifyNoInfobarInAnyTab()); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + DismissRemovesInfobarFromAllTabs) { + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + ShowInfobarOnNewTab(), + PressButton(ConfirmInfoBar::kDismissButtonElementId), + VerifyNoInfobarInAnyTab()); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + InfobarVisibleInFullscreen) { + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), Do([&]() { + ui_test_utils::ToggleFullscreenModeAndWait(browser()); + }), + EnsurePresent(ConfirmInfoBar::kInfoBarElementId)); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + AcceptRemovesInfobarAcrossWindows) { + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + ShowInfobarInNewWindow(), + PressButton(ConfirmInfoBar::kOkButtonElementId), + VerifyNoInfobarInAnyContext()); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + DismissRemovesInfobarAcrossWindows) { + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + ShowInfobarInNewWindow(), + PressButton(ConfirmInfoBar::kDismissButtonElementId), + VerifyNoInfobarInAnyContext()); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + MetricsAcceptPath) { + base::HistogramTester histograms; + + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + PressButton(ConfirmInfoBar::kOkButtonElementId), + WaitForHide(ConfirmInfoBar::kInfoBarElementId)); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.InfobarShown", + /*sample=*/1, /*expected_count=*/1); + histograms.ExpectUniqueSample("Windows.InstallerDownloader.RequestAccepted", + /*sample=*/1, /*expected_count=*/1); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + MetricsDismissPath) { + base::HistogramTester histograms; + + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + PressButton(ConfirmInfoBar::kDismissButtonElementId), + WaitForHide(ConfirmInfoBar::kInfoBarElementId)); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.InfobarShown", + /*sample=*/1, /*expected_count=*/1); + histograms.ExpectUniqueSample("Windows.InstallerDownloader.RequestAccepted", + /*sample=*/0, /*expected_count=*/1); +} + +IN_PROC_BROWSER_TEST_F(InstallerDownloaderInteractiveUiTest, + Metrics_InfobarShownOnceAcrossTabsAndWindows) { + base::HistogramTester histograms; + + TriggerInfobar(); + RunTestSequence(WaitForShow(ConfirmInfoBar::kInfoBarElementId), + ShowInfobarOnNewTab(), ShowInfobarInNewWindow(), + PressButton(ConfirmInfoBar::kDismissButtonElementId), + VerifyNoInfobarInAnyContext()); + + histograms.ExpectUniqueSample("Windows.InstallerDownloader.InfobarShown", + /*sample=*/1, /*expected_count=*/1); +} + +} // namespace +} // namespace installer_downloader
diff --git a/chrome/browser_exposed_mojom_targets.gni b/chrome/browser_exposed_mojom_targets.gni index ef4ab27b..2780522 100644 --- a/chrome/browser_exposed_mojom_targets.gni +++ b/chrome/browser_exposed_mojom_targets.gni
@@ -31,6 +31,7 @@ "//chrome/browser/ui/webui/customize_buttons:mojo_bindings", "//chrome/browser/ui/webui/discards:mojo_bindings", "//chrome/browser/ui/webui/downloads:mojo_bindings", + "//chrome/browser/ui/webui/extensions_zero_state_promo:mojo_bindings", "//chrome/browser/ui/webui/infobar_internals:mojo_bindings", "//chrome/browser/ui/webui/user_education_internals:mojo_bindings", "//chrome/browser/ui/webui/location_internals:mojo_bindings",
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index 6c77e39..79a2ea8f 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1747958116-71d90e08d2fa9a822583b99f4c96ec0d81aced54-27634fa381c6426758aa5ee8e41e07eb20de6241.profdata +chrome-android32-main-1748023160-53a3b1556380bfcb27513c10ea16b9ba771766c7-ba5d54c843a7dd86a525dab79eeddcc4197e83f1.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index eadf352a..d1f0021 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1748001916-183778ea8c9239b370cd604fcbbf72f0ec11cd42-d3517c32f4acb0c4902504e3c763e2990811bb2a.profdata +chrome-android64-main-1748019711-187a71f3331a40aaaa690eec6e1a01e9126eeee1-2d9957d4d1ba001c88be55b67fa22e8aba370d93.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 9ba7d96..cd92b65c 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1748008746-6472960ed56b9340ad2fbb231f29536f0e734046-5815c7f5f5a10308fa464569f317957aa2b7b0e1.profdata +chrome-mac-arm-main-1748023160-b5833ec68f910664fa0982de950c574f971396f5-ba5d54c843a7dd86a525dab79eeddcc4197e83f1.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 509712b..18460c0 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1747990697-2cc8b8da72a4884880fb256ab6d5e154edb0e268-8d4871ed0fecd503404a21988b9ae9c4910631d3.profdata +chrome-win32-main-1748001307-f9b8539c940fd46e85b9377c1499f20bb27b9db7-234cda4f8d93a139ddc7594ad3e92323a331dcb2.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 4900fe4c..977f010 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1747968959-5d2e0f242d247ab01ec430bfda27bded5dfa587d-a442a1abdbd249132d1e0bb493c303a01c0bf597.profdata +chrome-win64-main-1748001307-df1533fe61af95a74a599c2d305a848fef4d3e0f-234cda4f8d93a139ddc7594ad3e92323a331dcb2.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index f0623c6..388b837 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -96,6 +96,12 @@ sources += [ "$root_gen_dir/extensions/extensions_browser_resources_${percent}_percent.pak" ] deps += [ "//extensions:extensions_browser_resources" ] } + if (enable_extensions) { + sources += + [ "$root_gen_dir/chrome/extensions_zero_state_promo_resources.pak" ] + deps += + [ "//chrome/browser/resources/extensions_zero_state_promo:resources" ] + } output = "${invoker.output_dir}/chrome_${percent}_percent.pak" }
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index f130eb7..4feab9a3 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -1143,6 +1143,11 @@ "SafetyHubDisruptiveNotificationRevocation", base::FEATURE_DISABLED_BY_DEFAULT); +constexpr base::FeatureParam<int> + kSafetyHubDisruptiveNotificationRevocationExperimentVersion{ + &kSafetyHubDisruptiveNotificationRevocation, + /*name=*/"experiment_version", /*default_value=*/0}; + constexpr base::FeatureParam<bool> kSafetyHubDisruptiveNotificationRevocationShadowRun{ &kSafetyHubDisruptiveNotificationRevocation,
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 82dbdd1..dfd1bbff 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -679,6 +679,14 @@ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kSafetyHubDisruptiveNotificationRevocation); +// And integer which tracks the current version of the running experiment for +// disruptive notification revocation. Proposed revocations will be versioned +// and ignored upon version change. This allows to ignore proposed revocations +// from previous experiments in order to consistently revoke and report metrics. +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::FeatureParam<int> + kSafetyHubDisruptiveNotificationRevocationExperimentVersion; + // Whether the disruptive notification revocation will be performed as a shadow // run (without actually revoking permissions). Used to collect metrics and // evaluate the conditions for autorevocation.
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index 6ce299a..c35d525 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -114,6 +114,10 @@ inline constexpr char kChromeUIExtensionsInternalsHost[] = "extensions-internals"; inline constexpr char kChromeUIExtensionsURL[] = "chrome://extensions/"; +inline constexpr char kChromeUIExtensionsZeroStatePromoHost[] = + "extensions-zero-state"; +inline constexpr char kChromeUIExtensionsZeroStatePromoURL[] = + "chrome://extensions-zero-state"; inline constexpr char kChromeUIFamilyLinkUserInternalsHost[] = "family-link-user-internals"; inline constexpr char kChromeUIFavicon2Host[] = "favicon2";
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h index 4da0de8..ee0e24e 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h +++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h
@@ -190,7 +190,11 @@ color_theme_ = color_theme; } - bool has_selection() const { return start_.is_valid(); } + // Sometimes iframes can return selection objects that have a valid id but + // aren't in the tree. + bool has_selection() const { + return start_.is_valid() && GetAXNode(start_.id); + } ui::AXNodeID start_node_id() const { return start_.id; } ui::AXNodeID end_node_id() const { return end_.id; } int start_offset() const { return start_.offset; }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 9434f72..40cd21f 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -15,7 +15,6 @@ import("//chrome/browser/downgrade/buildflags.gni") import("//chrome/browser/page_load_metrics/integration_tests/jsdeps.gni") import("//chrome/browser/page_load_metrics/integration_tests/sources.gni") -import("//chrome/browser/sync/test/integration/sync_integration_tests.gni") import("//chrome/common/features.gni") import("//chrome/services/speech/buildflags/buildflags.gni") import("//chrome/test/include_js_tests.gni") @@ -375,6 +374,8 @@ "../browser/extensions/test_extension_environment.h", "../browser/extensions/test_extension_prefs.cc", "../browser/extensions/test_extension_prefs.h", + "../browser/ui/webui/extensions/extension_settings_test_base.cc", + "../browser/ui/webui/extensions/extension_settings_test_base.h", "../common/extensions/manifest_tests/chrome_manifest_test.cc", "../common/extensions/manifest_tests/chrome_manifest_test.h", ] @@ -417,8 +418,6 @@ "../browser/ui/web_applications/test/web_app_browsertest_util.h", "../browser/ui/web_applications/web_app_browsertest_base.cc", "../browser/ui/web_applications/web_app_browsertest_base.h", - "../browser/ui/webui/extensions/extension_settings_test_base.cc", - "../browser/ui/webui/extensions/extension_settings_test_base.h", ] deps += [ @@ -3783,7 +3782,6 @@ data += [ "//chrome/browser/resources/chromeos/arc_support/i18n_template_no_process.js" ] sources += [ "../browser/accessibility/media_app/ax_media_app_untrusted_service_browsertest.cc", - "../browser/certificate_manager_model_ash_browsertest.cc", "../browser/chromeos/enterprise/cloud_storage/one_drive_pref_observer_browsertest.cc", "../browser/media/webrtc/capture_policy_utils_browsertest.cc", "../browser/media/webrtc/get_all_screens_media_browsertest.cc", @@ -9449,8 +9447,12 @@ deps += [ # TODO(crbug.com/419210492): Remove this dependency when chrome/browser/sharing_hub/sharing_hub_model_unittest.cc - # test (above) gets componentized. + # (above) gets componentized. "//chrome/browser/sharing_hub", + + # TODO(crbug.com/419210492): Remove this dependency when chrome/browser/ui/views/sharing_hub/sharing_hub_bubble_view_impl_unittest.cc + # (above) gets componentized. + "//chrome/browser/ui/sharing_hub:test_support_ui", ] } @@ -10338,16 +10340,12 @@ if (use_nss_certs) { sources += [ "../browser/ui/views/crypto_module_password_dialog_view_unittest.cc", - "../browser/ui/webui/certificates_handler_unittest.cc", ] } } } if (use_nss_certs) { - sources += [ - "../browser/certificate_manager_model_unittest.cc", - "../browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc", - ] + sources += [ "../browser/ui/webui/certificate_manager/client_cert_sources_writable_unittest.cc" ] if (is_chromeos) { sources += [ "../browser/net/nss_temp_certs_cache_chromeos_unittest.cc", @@ -10811,12 +10809,10 @@ } if (is_win || is_mac || is_linux) { - sources += [ - "../browser/ui/sharing_hub/fake_sharing_hub_bubble_controller.cc", - "../browser/ui/sharing_hub/fake_sharing_hub_bubble_controller.h", + deps += [ + "//chrome/browser/ui/sharing_hub:test_support_ui", + "//chrome/browser/ui/webui/app_settings", ] - - deps += [ "//chrome/browser/ui/webui/app_settings" ] } if (use_ozone) { @@ -11268,6 +11264,7 @@ "../browser/extensions/extension_keybinding_apitest.cc", "../browser/extensions/omnibox_focus_interactive_test.cc", "../browser/guest_view/mime_handler_view/chrome_mime_handler_view_interactive_uitest.cc", + "../browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc", ] deps += [ @@ -11344,6 +11341,11 @@ ] } + if (is_win && is_chrome_branded) { + deps += + [ "//chrome/browser/win/installer_downloader:interactive_ui_tests" ] + } + if (toolkit_views) { sources += [ "../browser/ui/toolbar/app_menu_fullscreen_interactive_uitest.cc", @@ -12162,130 +12164,12 @@ } if (!is_android) { - if (is_win) { - # TODO(crbug.com/419089901): Figure out why the below - # sync_integration_tests does not work on Windows. - test("sync_integration_tests") { - sources = sync_integration_tests_sources - - data = [ - "//chrome/test/data/password/", - "//chrome/test/data/sync/", - "//chrome/test/data/webapps_integration/", - "//chrome/test/data/web_apps/", - "//chrome/test/data/banners/", - "//net/tools/testserver/", - "//third_party/pywebsocket3/src/mod_pywebsocket/", - ] - - # TODO(phajdan.jr): Only temporary, to make transition easier. - defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] - - deps = [ - ":browser_tests_runner", - ":sync_integration_test_support", - ":test_support", - ":test_support_ui", - "//chrome:packed_resources", - "//chrome:resources", - "//chrome:strings", - "//chrome/app:chrome_dll_resources", - "//chrome/app:command_ids", - "//chrome/browser/affiliations", - "//chrome/browser/apps/link_capturing", - "//chrome/browser/autofill", - "//chrome/browser/browsing_data:constants", - "//chrome/browser/metrics/desktop_session_duration", - "//chrome/browser/plus_addresses", - "//chrome/browser/prefs", - "//chrome/browser/reading_list", - "//chrome/browser/search_engines", - "//chrome/browser/sync", - "//chrome/browser/themes", - "//chrome/browser/ui:browser_navigator_params_headers", - "//chrome/browser/ui:ui_features", - "//chrome/browser/web_applications:features", - "//chrome/browser/web_applications:web_applications_test_support", - "//chrome/common", - "//chrome/renderer", - "//components/app_constants", - "//components/bookmarks/browser", - "//components/bookmarks/test", - "//components/browser_sync", - "//components/commerce/core:feature_list", - "//components/consent_auditor", - "//components/data_sharing/public", - "//components/favicon/core", - "//components/history/content/browser", - "//components/history/core/common", - "//components/password_manager/core/browser/sharing", - "//components/plus_addresses", - "//components/plus_addresses:test_support", - "//components/plus_addresses/settings", - "//components/plus_addresses/settings:test_support", - "//components/plus_addresses/webdata", - "//components/power_bookmarks/common:test_support", - "//components/power_bookmarks/core", - "//components/reading_list/core", - "//components/reading_list/core:test_support", - "//components/saved_tab_groups/internal:tab_group_sync_bridge", - "//components/saved_tab_groups/test_support", - "//components/search_engines", - "//components/send_tab_to_self", - "//components/spellcheck/common", - "//components/sync", - "//components/sync:test_support", - "//components/sync_bookmarks", - "//components/sync_device_info:test_support", - "//components/sync_preferences:common_syncable_prefs_database", - "//components/trusted_vault", - "//components/trusted_vault:test_support", - "//components/undo", - "//components/version_info", - "//components/webapps/browser", - "//components/webapps/common", - "//components/webauthn/core/browser", - "//components/webauthn/core/browser:passkey_model", - "//testing/gmock", - "//testing/gtest", - "//third_party/blink/public:blink", - "//third_party/icu", - "//third_party/leveldatabase", - ] - - data_deps = [ - "//testing:test_scripts_shared", - "//testing/buildbot/filters:sync_integration_tests_filters", - "//third_party/angle:includes", - ] - - data_deps += [ "//chrome:packed_resources" ] - - deps += [ - "//chrome:other_version", - "//third_party/wtl", - "//ui/resources", - ] - - if (toolkit_views) { - deps += [ "//ui/views" ] - } - if (enable_printing) { - deps += [ "//printing" ] - } - if (enable_glic) { - deps += [ - "//chrome/browser/glic", - "//chrome/browser/glic/test_support", - ] - } - } - } else { - test("sync_integration_tests") { - use_xvfb = use_xvfb_in_this_config - deps = [ - "//chrome/browser/sync/test/integration:sync_integration_tests_impl", - ] + test("sync_integration_tests") { + use_xvfb = use_xvfb_in_this_config + deps = + [ "//chrome/browser/sync/test/integration:sync_integration_tests_impl" ] + if (is_win) { + configs += [ "//build/config/win:delayloads" ] } }
diff --git a/chrome/test/base/android/android_browser_test.cc b/chrome/test/base/android/android_browser_test.cc index 230585d..45aff2a 100644 --- a/chrome/test/base/android/android_browser_test.cc +++ b/chrome/test/base/android/android_browser_test.cc
@@ -93,3 +93,12 @@ base::FilePath AndroidBrowserTest::GetChromeTestDataDir() const { return chrome_test_utils::GetChromeTestDataDir(); } + +Profile* AndroidBrowserTest::GetProfile() const { + for (TabModel* model : TabModelList::models()) { + if (model->GetProfile()) { + return model->GetProfile(); + } + } + return nullptr; +}
diff --git a/chrome/test/base/android/android_browser_test.h b/chrome/test/base/android/android_browser_test.h index d66f53a..592339e 100644 --- a/chrome/test/base/android/android_browser_test.h +++ b/chrome/test/base/android/android_browser_test.h
@@ -7,6 +7,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/test/scoped_feature_list.h" +#include "chrome/browser/profiles/profile.h" #include "content/public/test/browser_test_base.h" class PrefService; @@ -67,6 +68,10 @@ // Returns the test data path used by the embedded test server. base::FilePath GetChromeTestDataDir() const; + // Returns the profile. If there are multiple profiles, it's not determined + // what profile is returned. + Profile* GetProfile() const; + private: // Temporary user data directory. Used only when a user data directory is not // specified in the command line.
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc index 676e38a..14c0963 100644 --- a/chrome/test/base/in_process_browser_test.cc +++ b/chrome/test/base/in_process_browser_test.cc
@@ -626,6 +626,10 @@ #endif // BUILDFLAG(IS_WIN); } +Profile* InProcessBrowserTest::GetProfile() const { + return browser() ? browser()->profile() : nullptr; +} + void InProcessBrowserTest::CloseBrowserSynchronously(Browser* browser) { CloseBrowserAsynchronously(browser); ui_test_utils::WaitForBrowserToClose(browser);
diff --git a/chrome/test/base/in_process_browser_test.h b/chrome/test/base/in_process_browser_test.h index 295e1c1..7d079bf 100644 --- a/chrome/test/base/in_process_browser_test.h +++ b/chrome/test/base/in_process_browser_test.h
@@ -195,6 +195,10 @@ // Tests can override this to customize the initial local_state. virtual void SetUpLocalStatePrefService(PrefService* local_state); + // Returns the profile. Prefer this method to browser()->profile() for + // cross-platform compatibility. + Profile* GetProfile() const; + protected: // Closes the given browser and waits for it to release all its resources. void CloseBrowserSynchronously(Browser* browser);
diff --git a/chrome/test/data/pdf/ink2_manager_test.ts b/chrome/test/data/pdf/ink2_manager_test.ts index ec3cfc6..79bd39a 100644 --- a/chrome/test/data/pdf/ink2_manager_test.ts +++ b/chrome/test/data/pdf/ink2_manager_test.ts
@@ -7,9 +7,9 @@ import {assert} from 'chrome://resources/js/assert.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; -import {assertAnnotationBrush, assertDeepEquals, MockDocumentDimensions, setGetAnnotationBrushReply, setupTestViewportAndMockPluginForInk} from './test_util.js'; +import {assertAnnotationBrush, assertDeepEquals, MockDocumentDimensions, setGetAnnotationBrushReply, setUpInkTestContext} from './test_util.js'; -const {viewport, mockPlugin} = setupTestViewportAndMockPluginForInk(); +const {viewport, mockPlugin, mockWindow} = setUpInkTestContext(); const manager = Ink2Manager.getInstance(); function getTestAnnotation(id: number): TextAnnotation { @@ -340,6 +340,112 @@ chrome.test.succeed(); }, + async function testInitializeTextboxNoLocation() { + // Update the viewport to be sufficiently large to accommodate a default + // size textbox for testing. + const documentDimensions = new MockDocumentDimensions(0, 0); + documentDimensions.addPage(400, 500); + viewport.setDocumentDimensions(documentDimensions); + + // Make the viewport window larger. + mockWindow.setSize(500, 500); + + let whenInitEvent = eventToPromise('initialize-text-box', manager); + // Initialize without a location. This is what happens when the user creates + // a textbox by using "Enter" on the plugin, instead of with the mouse. + manager.initializeTextAnnotation(); + let initEvent = await whenInitEvent; + + // The full document fits in the window. + chrome.test.assertEq( + DEFAULT_TEXTBOX_HEIGHT, initEvent.detail.annotation.textBoxRect.height); + // The page is centered on the viewport in the x direction, so it runs from + // 55 to 445 after subtracting the 5px shadows on each side. The center is + // at (55 + 445) / 2 = 250. Subtract half the default width to get the left + // edge. + chrome.test.assertEq( + 250 - DEFAULT_TEXTBOX_WIDTH / 2, + initEvent.detail.annotation.textBoxRect.locationX); + // The visible page starts at the y shadow/margin, which is 3, and is 490 + // tall after accounting for shadows. The center is at + // (493 + 3) / 2 = 248. Subtract half the default height to get the top + // edge. + chrome.test.assertEq( + 248 - DEFAULT_TEXTBOX_HEIGHT / 2, + initEvent.detail.annotation.textBoxRect.locationY); + chrome.test.assertEq( + DEFAULT_TEXTBOX_WIDTH, initEvent.detail.annotation.textBoxRect.width); + chrome.test.assertEq(0, initEvent.detail.annotation.pageNumber); + chrome.test.assertEq(55, initEvent.detail.pageCoordinates.x); + chrome.test.assertEq(3, initEvent.detail.pageCoordinates.y); + + // Zoom to 2.0. Now, the new annotation should be centered on the visible + // portion of the page. + viewport.setZoom(2.0); + whenInitEvent = eventToPromise('initialize-text-box', manager); + // Initialize without a location. This is what happens when the user creates + // a textbox by using "Enter" on the plugin, instead of with the mouse. + manager.initializeTextAnnotation(); + initEvent = await whenInitEvent; + + chrome.test.assertEq( + DEFAULT_TEXTBOX_HEIGHT, initEvent.detail.annotation.textBoxRect.height); + // The page starts at the x shadow/margin, which is 10, and goes to the + // viewport edge. The center is (500 + 10) / 2 = 255. Subtract half the + // default width to get the left edge. + chrome.test.assertEq( + 255 - DEFAULT_TEXTBOX_WIDTH / 2, + initEvent.detail.annotation.textBoxRect.locationX); + // The visible page starts at the y shadow/margin, which is 6, and goes to + // the viewport edge. The center is (500 + 6) / 2 = 253. Subtract half the + // default height to get the top edge. + chrome.test.assertEq( + 253 - DEFAULT_TEXTBOX_HEIGHT / 2, + initEvent.detail.annotation.textBoxRect.locationY); + chrome.test.assertEq( + DEFAULT_TEXTBOX_WIDTH, initEvent.detail.annotation.textBoxRect.width); + chrome.test.assertEq(0, initEvent.detail.annotation.pageNumber); + chrome.test.assertEq(10, initEvent.detail.pageCoordinates.x); + chrome.test.assertEq(6, initEvent.detail.pageCoordinates.y); + + // Zoom to 0.5. The new box should still be centered on the page, even + // though it is not centered in the viewport. + viewport.setZoom(0.5); + whenInitEvent = eventToPromise('initialize-text-box', manager); + // Initialize without a location. This is what happens when the user creates + // a textbox by using "Enter" on the plugin, instead of with the mouse. + Ink2Manager.getInstance().initializeTextAnnotation(); + initEvent = await whenInitEvent; + + chrome.test.assertEq( + DEFAULT_TEXTBOX_HEIGHT, initEvent.detail.annotation.textBoxRect.height); + // The page is centered on the viewport in the x direction, so it runs from + // 152.5 to 347.5. The center is at (152.5 + 347.5) / 2 = 250. Subtract half + // the default width to get the left edge. + chrome.test.assertEq( + 250 - DEFAULT_TEXTBOX_WIDTH / 2, + initEvent.detail.annotation.textBoxRect.locationX); + // The page starts at the y margin/shadow of 1.5 and runs to 246.5 since it + // is 245 tall without the shadows. The center is at + // (1.5 + 246.5) / 2 = 124. Subtract half the default height to get the top + // edge. + chrome.test.assertEq( + 124 - DEFAULT_TEXTBOX_HEIGHT / 2, + initEvent.detail.annotation.textBoxRect.locationY); + chrome.test.assertEq( + DEFAULT_TEXTBOX_WIDTH, initEvent.detail.annotation.textBoxRect.width); + chrome.test.assertEq(0, initEvent.detail.annotation.pageNumber); + chrome.test.assertEq(152.5, initEvent.detail.pageCoordinates.x); + chrome.test.assertEq(1.5, initEvent.detail.pageCoordinates.y); + + // Reset zoom, window size and annotation id for next test. + viewport.setZoom(1.0); + manager.resetAnnotationIdForTest(); + mockWindow.setSize(100, 100); + + chrome.test.succeed(); + }, + async function testInitializeTextBox() { // Create a new mock document dimensions that has different width from // height. This is relevant for testing different rotations.
diff --git a/chrome/test/data/pdf/ink2_text_box_test.ts b/chrome/test/data/pdf/ink2_text_box_test.ts index f077c11..ec7aa31f 100644 --- a/chrome/test/data/pdf/ink2_text_box_test.ts +++ b/chrome/test/data/pdf/ink2_text_box_test.ts
@@ -7,10 +7,10 @@ import {keyDownOn, keyUpOn} from 'chrome://webui-test/keyboard_mock_interactions.js'; import {eventToPromise, isVisible, microtasksFinished} from 'chrome://webui-test/test_util.js'; -import {assertDeepEquals, getRequiredElement, setupTestViewportAndMockPluginForInk} from './test_util.js'; +import {assertDeepEquals, getRequiredElement, setUpInkTestContext} from './test_util.js'; // Set up a dummy viewport so that we can get a predictable initial state. -const {viewport, mockPlugin} = setupTestViewportAndMockPluginForInk(); +const {viewport, mockPlugin} = setUpInkTestContext(); const manager = Ink2Manager.getInstance(); manager.initializeTextAnnotations(); const textbox = document.createElement('ink-text-box'); @@ -784,6 +784,9 @@ // Initialize to a 100x100 box at 10, 10. Place the box in the top corner // so that the viewport won't scroll when it is focused. initializeBox(100, 100, 10, 10); + // Wait for focus to happen so that we can correctly test focus changes + // later. + await eventToPromise('textbox-focused-for-test', textbox); await microtasksFinished(); chrome.test.assertFalse(textbox.hidden); chrome.test.assertTrue(isVisible(textbox)); @@ -799,10 +802,18 @@ textbox.$.textbox.value = testAnnotation.text; textbox.$.textbox.dispatchEvent(new CustomEvent('input')); await microtasksFinished(); - // Escape on the textarea focuses the top level box. - const whenFocused = eventToPromise('focus', textbox); + // Escape on the textarea blurs the textarea to focus the top level box. + // This won't actually fire a focus event to the textbox since focus stays + // within the box, so we wait for the blur event instead. + const whenBlurred = eventToPromise('blur', textbox.$.textbox); keyDownOn(textbox.$.textbox, 0, [], 'Escape'); - await whenFocused; + await whenBlurred; + // Textbox is still visible, because this event does not commit the + // annotation. + chrome.test.assertFalse(textbox.hidden); + chrome.test.assertTrue(isVisible(textbox)); + chrome.test.assertEq( + undefined, mockPlugin.findMessage('finishTextAnnotation')); // Escape on the textbox commits the annotation and hides the box. keyDownOn(textbox, 0, [], 'Escape'); @@ -951,6 +962,7 @@ // Using manager initialization to get correct coordinates for the zoom // level. manager.initializeTextAnnotation({x: 20, y: 20}); + await eventToPromise('textbox-focused-for-test', textbox); await microtasksFinished(); const styles = getComputedStyle(textbox); chrome.test.assertEq('20px', styles.getPropertyValue('left'));
diff --git a/chrome/test/data/pdf/test_util.ts b/chrome/test/data/pdf/test_util.ts index 34e449b..e32bf78 100644 --- a/chrome/test/data/pdf/test_util.ts +++ b/chrome/test/data/pdf/test_util.ts
@@ -560,9 +560,12 @@ // Sets up zoomable viewport and a dummy plugin for Ink. This combines the // functionality of getZoomableViewport() and setupTestMockPluginForInk(), which // are mutually exclusive since they both attempt to call setContent() on the -// viewport. Returns a reference to the new viewport and plugin. -export function setupTestViewportAndMockPluginForInk(): - {viewport: Viewport, mockPlugin: MockPdfPluginElement} { +// viewport. Returns a reference to the new viewport, plugin and mock window. +export function setUpInkTestContext(): { + viewport: Viewport, + mockPlugin: MockPdfPluginElement, + mockWindow: MockElement, +} { // Clear the DOM and create dummy content. document.body.innerHTML = ''; const dummyContent = document.createElement('div'); @@ -608,7 +611,7 @@ // changes. In prod these are piped through the top level pdf-viewer element. viewport.setViewportChangedCallback(() => manager.viewportChanged()); - return {viewport, mockPlugin}; + return {viewport, mockPlugin, mockWindow}; } /**
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 228e598e..b5481d5f7 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -94,6 +94,10 @@ sources += [ "extensions/extensions_browsertest.cc" ] } + if (enable_extensions) { + sources += [ "extensions_zero_state/zero_state_promo_browsertest.cc" ] + } + if (enable_webui_tab_strip) { sources += [ "tab_strip/tab_strip_browsertest.cc" ] } @@ -595,6 +599,11 @@ grdp_files += [ "$target_gen_dir/extensions/resources.grdp" ] } + if (enable_extensions) { + deps += [ "extensions_zero_state:build_grdp" ] + grdp_files += [ "$target_gen_dir/extensions_zero_state/resources.grdp" ] + } + if (enable_print_preview && !is_chromeos) { deps += [ "print_preview:build_grdp" ] grdp_files += [ "$target_gen_dir/print_preview/resources.grdp" ]
diff --git a/chrome/test/data/webui/cr_components/certificate_manager/BUILD.gn b/chrome/test/data/webui/cr_components/certificate_manager/BUILD.gn index 7f6a077..abfc1fb 100644 --- a/chrome/test/data/webui/cr_components/certificate_manager/BUILD.gn +++ b/chrome/test/data/webui/cr_components/certificate_manager/BUILD.gn
@@ -7,32 +7,25 @@ import("//crypto/features.gni") assert(!is_android && !is_ios) -assert(use_nss_certs || chrome_root_store_cert_management_ui) +assert(chrome_root_store_cert_management_ui) build_webui_tests("build") { - files = [] + files = [ + "certificate_entry_v2_test.ts", + "certificate_list_v2_test.ts", + "certificate_manager_v2_focus_test.ts", + "certificate_manager_v2_test.ts", + "certificate_manager_v2_test_support.ts", + "certificate_password_dialog_test.ts", + "certificate_subpage_v2_test.ts", + "local_certs_section_v2_test.ts", + "navigation_v2_test.ts", + ] - if (use_nss_certs) { - files += [ "certificate_manager_test.ts" ] - if (is_chromeos) { - files += [ - "certificate_manager_provisioning_test.ts", - "test_certificate_provisioning_browser_proxy.ts", - ] - } - } - - if (chrome_root_store_cert_management_ui) { + if (is_chromeos) { files += [ - "certificate_entry_v2_test.ts", - "certificate_list_v2_test.ts", - "certificate_manager_v2_focus_test.ts", - "certificate_manager_v2_test.ts", - "certificate_manager_v2_test_support.ts", - "certificate_password_dialog_test.ts", - "certificate_subpage_v2_test.ts", - "local_certs_section_v2_test.ts", - "navigation_v2_test.ts", + "certificate_manager_provisioning_test.ts", + "test_certificate_provisioning_browser_proxy.ts", ] } @@ -44,12 +37,8 @@ "//ui/webui/resources/mojo:build_ts", ] - ts_path_mappings = [ - "chrome://settings/strings.m.js|" + + ts_path_mappings = + [ "chrome://certificate-manager/strings.m.js|" + rebase_path("//tools/typescript/definitions/strings.d.ts", - target_gen_dir), - "chrome://certificate-manager/strings.m.js|" + - rebase_path("//tools/typescript/definitions/strings.d.ts", - target_gen_dir), - ] + target_gen_dir) ] }
diff --git a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_browsertest.cc b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_browsertest.cc index d1afcd7..435a217e 100644 --- a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_browsertest.cc +++ b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_browsertest.cc
@@ -10,40 +10,22 @@ #include "content/public/test/browser_test.h" #include "crypto/crypto_buildflags.h" -typedef WebUIMochaBrowserTest CrComponentsTest; +class CrComponentsCertManagerV2Test : public WebUIMochaBrowserTest { + protected: + CrComponentsCertManagerV2Test() { + set_test_loader_host(chrome::kChromeUICertificateManagerHost); + } +}; -#if BUILDFLAG(USE_NSS_CERTS) -IN_PROC_BROWSER_TEST_F(CrComponentsTest, CertificateManager) { - // Loaded from a settings URL so that localized strings are present. - set_test_loader_host(chrome::kChromeUISettingsHost); - RunTest("cr_components/certificate_manager/certificate_manager_test.js", - "mocha.run()"); -} -#endif // BUILDFLAG(USE_NSS_CERTS) - -#if BUILDFLAG(USE_NSS_CERTS) && BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(CrComponentsTest, CertificateManagerProvisioning) { - // Loaded from a settings URL so that localized strings are present. - set_test_loader_host(chrome::kChromeUISettingsHost); +#if BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(CrComponentsCertManagerV2Test, + CertificateManagerProvisioning) { RunTest( "cr_components/certificate_manager/" "certificate_manager_provisioning_test.js", "mocha.run()"); } -#endif // BUILDFLAG(USE_NSS_CERTS) && BUILDFLAG(IS_CHROMEOS) - -#if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) -class CrComponentsCertManagerV2Test : public WebUIMochaBrowserTest { - protected: - CrComponentsCertManagerV2Test() { - scoped_feature_list_.InitAndEnableFeature( - features::kEnableCertManagementUIV2); - set_test_loader_host(chrome::kChromeUICertificateManagerHost); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; +#endif // BUILDFLAG(IS_CHROMEOS) IN_PROC_BROWSER_TEST_F(CrComponentsCertManagerV2Test, CertificateManagerV2) { RunTest("cr_components/certificate_manager/certificate_manager_v2_test.js", @@ -82,4 +64,3 @@ "mocha.run()"); } -#endif // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI)
diff --git a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_interactive_test.cc b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_interactive_test.cc index d2899221..51abc8a 100644 --- a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_interactive_test.cc +++ b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_component_interactive_test.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/common/buildflags.h" #include "chrome/common/chrome_features.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/web_ui_mocha_browser_test.h" @@ -10,17 +9,11 @@ typedef WebUIMochaFocusTest CrComponentsFocusTest; -#if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) class CrComponentsCertManagerV2FocusTest : public WebUIMochaBrowserTest { protected: CrComponentsCertManagerV2FocusTest() { - scoped_feature_list_.InitAndEnableFeature( - features::kEnableCertManagementUIV2); set_test_loader_host(chrome::kChromeUICertificateManagerHost); } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; IN_PROC_BROWSER_TEST_F(CrComponentsCertManagerV2FocusTest, CertificateManagerV2) { @@ -28,4 +21,3 @@ "cr_components/certificate_manager/certificate_manager_v2_focus_test.js", "mocha.run()"); } -#endif // BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI)
diff --git a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_provisioning_test.ts b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_provisioning_test.ts index 58de83d3d..160f785 100644 --- a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_provisioning_test.ts +++ b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_provisioning_test.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://settings/strings.m.js'; +import 'chrome://certificate-manager/strings.m.js'; import 'chrome://resources/cr_components/certificate_manager/certificate_provisioning_list.js'; import 'chrome://resources/cr_components/certificate_manager/certificate_provisioning_entry.js';
diff --git a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_test.ts b/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_test.ts deleted file mode 100644 index c7b281b..0000000 --- a/chrome/test/data/webui/cr_components/certificate_manager/certificate_manager_test.ts +++ /dev/null
@@ -1,939 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// These test suites test the certificate-manager shared component in the -// context of the Settings privacy page. This simplifies the test setup and -// provides better context for testing. - -// clang-format off -import 'chrome://settings/strings.m.js'; -import 'chrome://resources/cr_components/certificate_manager/ca_trust_edit_dialog.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_list.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_manager.js'; -import 'chrome://resources/cr_components/certificate_manager/certificate_subentry.js'; - -import type {CrInputElement} from 'chrome://resources/cr_elements/cr_input/cr_input.js'; -import type {CaTrustEditDialogElement} from 'chrome://resources/cr_components/certificate_manager/ca_trust_edit_dialog.js'; -import type {CertificateDeleteConfirmationDialogElement} from 'chrome://resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.js'; -import type {CertificateListElement} from 'chrome://resources/cr_components/certificate_manager/certificate_list.js'; -import type {CertificateManagerElement} from 'chrome://resources/cr_components/certificate_manager/certificate_manager.js'; -import type { CertificateActionEventDetail} from 'chrome://resources/cr_components/certificate_manager/certificate_manager_types.js'; -import {CertificateAction, CertificateActionEvent} from 'chrome://resources/cr_components/certificate_manager/certificate_manager_types.js'; -import type {CertificatePasswordDecryptionDialogElement} from 'chrome://resources/cr_components/certificate_manager/certificate_password_decryption_dialog.js'; -import type {CertificatePasswordEncryptionDialogElement} from 'chrome://resources/cr_components/certificate_manager/certificate_password_encryption_dialog.js'; -import type {CertificateSubentryElement} from 'chrome://resources/cr_components/certificate_manager/certificate_subentry.js'; -import type {CaTrustInfo, CertificatesBrowserProxy, CertificatesError, CertificatesOrgGroup, CertificateSubnode} from 'chrome://resources/cr_components/certificate_manager/certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl, CertificateType} from 'chrome://resources/cr_components/certificate_manager/certificates_browser_proxy.js'; -// <if expr="is_chromeos"> -import {CertificateProvisioningBrowserProxyImpl} from 'chrome://resources/cr_components/certificate_manager/certificate_provisioning_browser_proxy.js'; -// </if> -import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; -import {keyEventOn} from 'chrome://webui-test/keyboard_mock_interactions.js'; -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; -import {eventToPromise} from 'chrome://webui-test/test_util.js'; - -// <if expr="is_chromeos"> -import {TestCertificateProvisioningBrowserProxy} from './test_certificate_provisioning_browser_proxy.js'; -// </if> - -// clang-format on - -/** - * A test version of CertificatesBrowserProxy. Provides helper methods - * for allowing tests to know when a method was called, as well as - * specifying mock responses. - */ -class TestCertificatesBrowserProxy extends TestBrowserProxy implements - CertificatesBrowserProxy { - private caTrustInfo_: CaTrustInfo; - private certificatesError_: CertificatesError|null = null; - - constructor() { - super([ - 'deleteCertificate', - 'editCaCertificateTrust', - 'exportCertificate', - 'exportPersonalCertificate', - 'exportPersonalCertificatePasswordSelected', - 'getCaCertificateTrust', - 'importCaCertificate', - 'importCaCertificateTrustSelected', - 'importPersonalCertificate', - 'importPersonalCertificatePasswordSelected', - 'importServerCertificate', - 'refreshCertificates', - 'viewCertificate', - ]); - - this.caTrustInfo_ = {ssl: true, email: true, objSign: true}; - } - - setCaCertificateTrust(caTrustInfo: CaTrustInfo) { - this.caTrustInfo_ = caTrustInfo; - } - - getCaCertificateTrust(id: string) { - this.methodCalled('getCaCertificateTrust', id); - return Promise.resolve(this.caTrustInfo_); - } - - importServerCertificate() { - this.methodCalled('importServerCertificate'); - return Promise.resolve(); - } - - importCaCertificate() { - this.methodCalled('importCaCertificate'); - return Promise.resolve('dummyName'); - } - - importCaCertificateTrustSelected( - ssl: boolean, email: boolean, objSign: boolean) { - this.methodCalled( - 'importCaCertificateTrustSelected', - {ssl: ssl, email: email, objSign: objSign}); - return this.fulfillRequest_(); - } - - editCaCertificateTrust( - id: string, ssl: boolean, email: boolean, objSign: boolean) { - this.methodCalled('editCaCertificateTrust', {id, ssl, email, objSign}); - return this.fulfillRequest_(); - } - - /** - * Forces some of the browser proxy methods to start returning errors. - */ - forceCertificatesError() { - this.certificatesError_ = { - title: 'DummyError', - description: 'DummyDescription', - }; - } - - /** - * @return A promise that is resolved or rejected based on the - * value of |certificatesError_|. - */ - private fulfillRequest_(): Promise<void> { - return this.certificatesError_ === null ? - Promise.resolve() : - Promise.reject(this.certificatesError_); - } - - deleteCertificate(id: string) { - this.methodCalled('deleteCertificate', id); - return this.fulfillRequest_(); - } - - exportPersonalCertificatePasswordSelected(password: string) { - this.methodCalled('exportPersonalCertificatePasswordSelected', password); - return this.fulfillRequest_(); - } - - importPersonalCertificate(useHardwareBacked: boolean) { - this.methodCalled('importPersonalCertificate', useHardwareBacked); - return Promise.resolve(true); - } - - importPersonalCertificatePasswordSelected(password: string) { - this.methodCalled('importPersonalCertificatePasswordSelected', password); - return this.fulfillRequest_(); - } - - refreshCertificates() { - this.methodCalled('refreshCertificates'); - } - - viewCertificate(id: string) { - this.methodCalled('viewCertificate', id); - } - - exportCertificate(id: string) { - this.methodCalled('exportCertificate', id); - } - - exportPersonalCertificate(id: string) { - this.methodCalled('exportPersonalCertificate', id); - return Promise.resolve(); - } - - cancelImportExportCertificate() {} -} - -function createSampleCertificateOrgGroup(): CertificatesOrgGroup { - return { - id: 'dummyCertificateId', - name: 'dummyCertificateName', - containsPolicyCerts: false, - subnodes: [createSampleCertificateSubnode()], - }; -} - -function createSampleCertificateSubnode(): CertificateSubnode { - return { - extractable: false, - id: 'dummySubnodeId', - name: 'dummySubnodeName', - policy: false, - canBeDeleted: true, - canBeEdited: true, - untrusted: false, - webTrustAnchor: false, - }; -} - -/** - * Triggers an 'input' event on the given text input field (which triggers - * validation to occur for password fields being tested in this file). - */ -async function triggerInputEvent(element: CrInputElement) { - await element.updateComplete; - // The actual key code is irrelevant for tests. - const kSpaceBar = 32; - keyEventOn(element, 'input', kSpaceBar); - await element.updateComplete; -} - -suite('CaTrustEditDialogTests', function() { - let dialog: CaTrustEditDialogElement; - - let browserProxy: TestCertificatesBrowserProxy; - - const caTrustInfo: CaTrustInfo = {ssl: true, email: false, objSign: false}; - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - browserProxy.setCaCertificateTrust(caTrustInfo); - - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - dialog = document.createElement('ca-trust-edit-dialog'); - }); - - teardown(function() { - dialog.remove(); - }); - - test('EditSuccess', async function() { - dialog.model = createSampleCertificateSubnode(); - document.body.appendChild(dialog); - - const id = await browserProxy.whenCalled('getCaCertificateTrust'); - - assertEquals((dialog.model as CertificateSubnode).id, id); - assertEquals(caTrustInfo.ssl, dialog.$.ssl.checked); - assertEquals(caTrustInfo.email, dialog.$.email.checked); - assertEquals(caTrustInfo.objSign, dialog.$.objSign.checked); - - // Simulate toggling all checkboxes. - dialog.$.ssl.click(); - dialog.$.email.click(); - dialog.$.objSign.click(); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - - const {id: model_id, ssl, email, objSign} = - await browserProxy.whenCalled('editCaCertificateTrust'); - - assertEquals((dialog.model as CertificateSubnode).id, model_id); - // Checking that the values sent to C++ are reflecting the - // changes made by the user (toggling all checkboxes). - assertEquals(caTrustInfo.ssl, !ssl); - assertEquals(caTrustInfo.email, !email); - assertEquals(caTrustInfo.objSign, !objSign); - // Check that the dialog is closed. - assertFalse(dialog.$.dialog.open); - }); - - test('ImportSuccess', async function() { - dialog.model = {name: 'Dummy certificate name'}; - document.body.appendChild(dialog); - - assertFalse(dialog.$.ssl.checked); - assertFalse(dialog.$.email.checked); - assertFalse(dialog.$.objSign.checked); - - dialog.$.ssl.click(); - dialog.$.email.click(); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - const {ssl, email, objSign} = - await browserProxy.whenCalled('importCaCertificateTrustSelected'); - - assertTrue(ssl); - assertTrue(email); - assertFalse(objSign); - }); - - test('EditError', async function() { - dialog.model = createSampleCertificateSubnode(); - document.body.appendChild(dialog); - browserProxy.forceCertificatesError(); - - const whenErrorEventFired = eventToPromise('certificates-error', dialog); - - await browserProxy.whenCalled('getCaCertificateTrust'); - - dialog.$.ok.click(); - await browserProxy.whenCalled('editCaCertificateTrust'); - - await whenErrorEventFired; - }); -}); - -suite('CertificateDeleteConfirmationDialogTests', function() { - let dialog: CertificateDeleteConfirmationDialogElement; - let browserProxy: TestCertificatesBrowserProxy; - - const model = createSampleCertificateSubnode(); - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - dialog = document.createElement('certificate-delete-confirmation-dialog'); - dialog.model = model; - dialog.certificateType = CertificateType.PERSONAL; - document.body.appendChild(dialog); - }); - - teardown(function() { - dialog.remove(); - }); - - test('DeleteSuccess', async function() { - assertTrue(dialog.$.dialog.open); - // Check that the dialog title includes the certificate name. - const titleEl = dialog.$.dialog.querySelector('[slot=title]'); - assertTrue(!!titleEl); - assertTrue(titleEl.textContent!.includes(model.name)); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - - const id = await browserProxy.whenCalled('deleteCertificate'); - assertEquals(model.id, id); - // Check that the dialog is closed. - assertFalse(dialog.$.dialog.open); - }); - - test('DeleteError', async function() { - browserProxy.forceCertificatesError(); - const whenErrorEventFired = eventToPromise('certificates-error', dialog); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - const id = await browserProxy.whenCalled('deleteCertificate'); - assertEquals(model.id, id); - // Ensure that the 'error' event was fired. - await whenErrorEventFired; - }); -}); - -suite('CertificatePasswordEncryptionDialogTests', function() { - let dialog: CertificatePasswordEncryptionDialogElement; - let browserProxy: TestCertificatesBrowserProxy; - - const methodName = 'exportPersonalCertificatePasswordSelected'; - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - dialog = document.createElement('certificate-password-encryption-dialog'); - document.body.appendChild(dialog); - }); - - teardown(function() { - dialog.remove(); - }); - - test('EncryptSuccess', async function() { - const passwordInputElements = dialog.$.dialog.querySelectorAll('cr-input'); - const passwordInputElement = passwordInputElements[0]; - assertTrue(!!passwordInputElement); - const confirmPasswordInputElement = passwordInputElements[1]; - assertTrue(!!confirmPasswordInputElement); - - assertTrue(dialog.$.dialog.open); - assertTrue(dialog.$.ok.disabled); - - // Test that the 'OK' button is disabled when the password fields are - // empty (even though they both have the same value). - await triggerInputEvent(passwordInputElement); - assertTrue(dialog.$.ok.disabled); - - // Test that the 'OK' button is disabled until the two password fields - // match. - passwordInputElement.value = 'foopassword'; - await triggerInputEvent(passwordInputElement); - assertTrue(dialog.$.ok.disabled); - confirmPasswordInputElement.value = passwordInputElement.value; - await triggerInputEvent(confirmPasswordInputElement); - assertFalse(dialog.$.ok.disabled); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - - const password = await browserProxy.whenCalled(methodName); - assertEquals(passwordInputElement.value, password); - // Check that the dialog is closed. - assertFalse(dialog.$.dialog.open); - }); - - test('EncryptError', async function() { - browserProxy.forceCertificatesError(); - - const passwordInputElements = dialog.$.dialog.querySelectorAll('cr-input'); - const passwordInputElement = passwordInputElements[0]; - assertTrue(!!passwordInputElement); - const confirmPasswordInputElement = passwordInputElements[1]; - assertTrue(!!confirmPasswordInputElement); - - passwordInputElement.value = 'foopassword'; - confirmPasswordInputElement.value = passwordInputElement.value; - await triggerInputEvent(passwordInputElement); - - const whenErrorEventFired = eventToPromise('certificates-error', dialog); - dialog.$.ok.click(); - - await browserProxy.whenCalled(methodName); - await whenErrorEventFired; - }); -}); - -suite('CertificatePasswordDecryptionDialogTests', function() { - let dialog: CertificatePasswordDecryptionDialogElement; - let browserProxy: TestCertificatesBrowserProxy; - - const methodName = 'importPersonalCertificatePasswordSelected'; - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - dialog = document.createElement('certificate-password-decryption-dialog'); - document.body.appendChild(dialog); - }); - - teardown(function() { - dialog.remove(); - }); - - test('DecryptSuccess', async function() { - const passwordInputElement = dialog.$.dialog.querySelector('cr-input'); - assertTrue(!!passwordInputElement); - assertTrue(dialog.$.dialog.open); - - // Test that the 'OK' button is enabled even when the password field is - // empty. - assertEquals('', passwordInputElement.value); - assertFalse(dialog.$.ok.disabled); - - passwordInputElement.value = 'foopassword'; - await passwordInputElement.updateComplete; - assertFalse(dialog.$.ok.disabled); - - // Simulate clicking 'OK'. - dialog.$.ok.click(); - - const password = await browserProxy.whenCalled(methodName); - assertEquals(passwordInputElement.value, password); - // Check that the dialog is closed. - assertFalse(dialog.$.dialog.open); - }); - - test('DecryptError', async function() { - browserProxy.forceCertificatesError(); - // Simulate entering some password. - const passwordInputElement = dialog.$.dialog.querySelector('cr-input'); - assertTrue(!!passwordInputElement); - passwordInputElement.value = 'foopassword'; - await triggerInputEvent(passwordInputElement); - - const whenErrorEventFired = eventToPromise('certificates-error', dialog); - dialog.$.ok.click(); - await browserProxy.whenCalled(methodName); - await whenErrorEventFired; - }); -}); - -suite('CertificateSubentryTests', function() { - let subentry: CertificateSubentryElement; - let browserProxy: TestCertificatesBrowserProxy; - - /** - * @return A promise firing once |CertificateActionEvent| fires. - */ - function actionEventToPromise(): - Promise<CustomEvent<CertificateActionEventDetail>> { - return eventToPromise(CertificateActionEvent, subentry); - } - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - subentry = document.createElement('certificate-subentry'); - subentry.model = createSampleCertificateSubnode(); - subentry.certificateType = CertificateType.PERSONAL; - document.body.appendChild(subentry); - - // Bring up the popup menu for the following tests to use. - subentry.$.dots.click(); - flush(); - }); - - teardown(function() { - subentry.remove(); - }); - - // Test case where 'View' option is tapped. - test('MenuOptions_View', async function() { - const viewButton = subentry.shadowRoot!.querySelector<HTMLElement>('#view'); - assertTrue(!!viewButton); - viewButton.click(); - const id = await browserProxy.whenCalled('viewCertificate'); - assertEquals(subentry.model.id, id); - }); - - // Test that the 'Edit' option is only shown when appropriate and that - // once tapped the correct event is fired. - test('MenuOptions_Edit', function() { - const editButton = subentry.shadowRoot!.querySelector<HTMLElement>('#edit'); - assertTrue(!!editButton); - - let model = createSampleCertificateSubnode(); - model.canBeEdited = false; - subentry.model = model; - assertTrue(editButton.hidden); - - model = createSampleCertificateSubnode(); - model.canBeEdited = true; - subentry.model = model; - assertFalse(editButton.hidden); - - subentry.model = createSampleCertificateSubnode(); - const waitForActionEvent = actionEventToPromise(); - editButton.click(); - return waitForActionEvent.then(function(event) { - const detail = event.detail; - assertEquals(CertificateAction.EDIT, detail.action); - assertEquals( - subentry.model.id, (detail.subnode as CertificateSubnode).id); - assertEquals(subentry.certificateType, detail.certificateType); - }); - }); - - // Test that the 'Delete' option is only shown when appropriate and that - // once tapped the correct event is fired. - test('MenuOptions_Delete', function() { - const deleteButton = - subentry.shadowRoot!.querySelector<HTMLElement>('#delete'); - assertTrue(!!deleteButton); - - // Should be disabled when 'model.canBeDeleted' is false. - const model = createSampleCertificateSubnode(); - model.canBeDeleted = false; - subentry.model = model; - assertTrue(deleteButton.hidden); - - subentry.model = createSampleCertificateSubnode(); - const waitForActionEvent = actionEventToPromise(); - deleteButton.click(); - return waitForActionEvent.then(function(event) { - const detail = event.detail; - assertEquals(CertificateAction.DELETE, detail.action); - assertEquals( - subentry.model.id, (detail.subnode as CertificateSubnode).id); - }); - }); - - // Test that the 'Export' option is always shown when the certificate type - // is not PERSONAL and that once tapped the correct event is fired. - test('MenuOptions_Export', async function() { - subentry.certificateType = CertificateType.SERVER; - const exportButton = - subentry.shadowRoot!.querySelector<HTMLElement>('#export'); - assertTrue(!!exportButton); - assertFalse(exportButton.hidden); - exportButton.click(); - const id = await browserProxy.whenCalled('exportCertificate'); - assertEquals(subentry.model.id, id); - }); - - // Test case of exporting a PERSONAL certificate. - test('MenuOptions_ExportPersonal', async function() { - const exportButton = - subentry.shadowRoot!.querySelector<HTMLElement>('#export'); - assertTrue(!!exportButton); - - // Should be disabled when 'model.extractable' is false. - assertTrue(exportButton.hidden); - - const model = createSampleCertificateSubnode(); - model.extractable = true; - subentry.model = model; - assertFalse(exportButton.hidden); - - const waitForActionEvent = actionEventToPromise(); - exportButton.click(); - const id = await browserProxy.whenCalled('exportPersonalCertificate'); - - assertEquals(subentry.model.id, id); - - // A promise firing once |CertificateActionEvent| is fired. - const event = await waitForActionEvent; - - const detail = event.detail; - assertEquals(CertificateAction.EXPORT_PERSONAL, detail.action); - assertEquals(subentry.model.id, (detail.subnode as CertificateSubnode).id); - }); -}); - -suite('CertificateManagerTests', function() { - let page: CertificateManagerElement; - let browserProxy: TestCertificatesBrowserProxy; - - enum CertificateCategoryIndex { - PERSONAL = 0, - SERVER = 1, - CA = 2, - OTHER = 3, - } - - setup(function() { - document.body.innerHTML = window.trustedTypes!.emptyHTML; - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - // <if expr="is_chromeos"> - const provisioningBrowserProxy = - new TestCertificateProvisioningBrowserProxy(); - CertificateProvisioningBrowserProxyImpl.setInstance( - provisioningBrowserProxy); - // </if> - page = document.createElement('certificate-manager'); - document.body.appendChild(page); - }); - - teardown(function() { - page.remove(); - }); - - /** - * Test that the page requests information from the browser on startup and - * that it gets populated accordingly. - */ - test('Initialization', async function() { - // Trigger all category tabs to be added to the DOM. - const crTabsElement = page.shadowRoot!.querySelector('cr-tabs'); - assertTrue(!!crTabsElement); - crTabsElement.selected = CertificateCategoryIndex.PERSONAL; - await crTabsElement.updateComplete; - crTabsElement.selected = CertificateCategoryIndex.SERVER; - await crTabsElement.updateComplete; - crTabsElement.selected = CertificateCategoryIndex.CA; - await crTabsElement.updateComplete; - crTabsElement.selected = CertificateCategoryIndex.OTHER; - await crTabsElement.updateComplete; - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - assertEquals(4, certificateLists.length); - - async function assertCertificateListLength( - listIndex: CertificateCategoryIndex, expectedSize: number) { - // Need to switch to the corresponding tab before querying the DOM. - assertTrue(!!crTabsElement); - crTabsElement.selected = listIndex; - await crTabsElement.updateComplete; - const certificateEntries = - certificateLists[listIndex]!.shadowRoot!.querySelectorAll( - 'certificate-entry'); - assertEquals(expectedSize, certificateEntries.length); - } - - await assertCertificateListLength(CertificateCategoryIndex.PERSONAL, 0); - await assertCertificateListLength(CertificateCategoryIndex.SERVER, 0); - await assertCertificateListLength(CertificateCategoryIndex.CA, 0); - await assertCertificateListLength(CertificateCategoryIndex.OTHER, 0); - - await browserProxy.whenCalled('refreshCertificates'); - // Simulate response for personal and CA certificates. - webUIListenerCallback( - 'certificates-changed', 'personalCerts', - [createSampleCertificateOrgGroup()]); - webUIListenerCallback( - 'certificates-changed', 'caCerts', - [createSampleCertificateOrgGroup(), createSampleCertificateOrgGroup()]); - flush(); - - assertCertificateListLength(CertificateCategoryIndex.PERSONAL, 1); - assertCertificateListLength(CertificateCategoryIndex.SERVER, 0); - assertCertificateListLength(CertificateCategoryIndex.CA, 2); - assertCertificateListLength(CertificateCategoryIndex.OTHER, 0); - }); - - /** - * Tests that a dialog opens as a response to a CertificateActionEvent. - * @param dialogTagName The type of dialog to test. - */ - function testDialogOpensOnAction( - dialogTagName: string, - eventDetail: CertificateActionEventDetail): Promise<void> { - assertFalse(!!page.shadowRoot!.querySelector(dialogTagName)); - const whenDialogOpen = eventToPromise('cr-dialog-open', page); - page.dispatchEvent(new CustomEvent( - CertificateActionEvent, - {bubbles: true, composed: true, detail: eventDetail})); - - // Some dialogs are opened after some async operation to fetch initial - // data. Ensure that the underlying cr-dialog is actually opened before - // returning. - return whenDialogOpen.then(() => { - assertTrue(!!page.shadowRoot!.querySelector(dialogTagName)); - }); - } - - test('OpensDialog_DeleteConfirmation', function() { - return testDialogOpensOnAction('certificate-delete-confirmation-dialog', { - action: CertificateAction.DELETE, - subnode: createSampleCertificateSubnode(), - certificateType: CertificateType.PERSONAL, - anchor: page, - }); - }); - - test('OpensDialog_PasswordEncryption', function() { - return testDialogOpensOnAction('certificate-password-encryption-dialog', { - action: CertificateAction.EXPORT_PERSONAL, - subnode: createSampleCertificateSubnode(), - certificateType: CertificateType.PERSONAL, - anchor: page, - }); - }); - - test('OpensDialog_PasswordDecryption', function() { - return testDialogOpensOnAction('certificate-password-decryption-dialog', { - action: CertificateAction.IMPORT, - subnode: createSampleCertificateSubnode(), - certificateType: CertificateType.PERSONAL, - anchor: page, - }); - }); - - test('OpensDialog_CaTrustEdit', function() { - return testDialogOpensOnAction('ca-trust-edit-dialog', { - action: CertificateAction.EDIT, - subnode: createSampleCertificateSubnode(), - certificateType: CertificateType.CA, - anchor: page, - }); - }); - - test('OpensDialog_CaTrustImport', function() { - return testDialogOpensOnAction('ca-trust-edit-dialog', { - action: CertificateAction.IMPORT, - subnode: {name: 'Dummy Certificate Name', id: ''}, - certificateType: CertificateType.CA, - anchor: page, - }); - }); - - // <if expr="is_chromeos"> - - async function renderTabContents() { - const crTabs = page.shadowRoot!.querySelector('cr-tabs'); - assertTrue(!!crTabs); - crTabs.selected = CertificateCategoryIndex.PERSONAL; - await crTabs.updateComplete; - crTabs.selected = CertificateCategoryIndex.CA; - await crTabs.updateComplete; - } - - // Test that import buttons are hidden by default. - test('ImportButton_Default', async function() { - await renderTabContents(); - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - const clientImportButton = certificateLists[0]!.$.import; - assertTrue(clientImportButton.hidden); - const clientImportAndBindButton = certificateLists[0]!.$.importAndBind; - assertTrue(clientImportAndBindButton.hidden); - const caImportButton = certificateLists[1]!.$.import; - assertTrue(caImportButton.hidden); - }); - - // Test that ClientCertificateManagementAllowed policy is applied to the - // UI when management is allowed. - test('ImportButton_ClientPolicyAllowed', async function() { - await renderTabContents(); - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - - await browserProxy.whenCalled('refreshCertificates'); - webUIListenerCallback( - 'client-import-allowed-changed', true /* clientImportAllowed */); - // Verify that import buttons are shown in the client certificate - // tab. - const clientImportButton = certificateLists[0]!.$.import; - assertFalse(clientImportButton.hidden); - const clientImportAndBindButton = certificateLists[0]!.$.importAndBind; - assertFalse(clientImportAndBindButton.hidden); - // Verify that import button is still hidden in the CA certificate - // tab. - const caImportButton = certificateLists[1]!.$.import; - assertTrue(caImportButton.hidden); - }); - - // Test that ClientCertificateManagementAllowed policy is applied to the - // UI when management is not allowed. - test('ImportButton_ClientPolicyDisallowed', async function() { - await renderTabContents(); - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - - await browserProxy.whenCalled('refreshCertificates'); - webUIListenerCallback( - 'client-import-allowed-changed', false /* clientImportAllowed */); - // Verify that import buttons are still hidden in the client - // certificate tab. - const clientImportButton = certificateLists[0]!.$.import; - assertTrue(clientImportButton.hidden); - const clientImportAndBindButton = certificateLists[0]!.$.importAndBind; - assertTrue(clientImportAndBindButton.hidden); - // Verify that import button is still hidden in the CA certificate - // tab. - const caImportButton = certificateLists[1]!.$.import; - assertTrue(caImportButton.hidden); - }); - - // Test that CACertificateManagementAllowed policy is applied to the - // UI when management is allowed. - test('ImportButton_CAPolicyAllowed', async function() { - await renderTabContents(); - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - - await browserProxy.whenCalled('refreshCertificates'); - webUIListenerCallback( - 'ca-import-allowed-changed', true /* clientImportAllowed */); - // Verify that import buttons are still hidden in the client - // certificate tab. - const clientImportButton = certificateLists[0]!.$.import; - assertTrue(clientImportButton.hidden); - const clientImportAndBindButton = certificateLists[0]!.$.importAndBind; - assertTrue(clientImportAndBindButton.hidden); - // Verify that import button is shown in the CA certificate tab. - const caImportButton = certificateLists[1]!.$.import; - assertFalse(caImportButton.hidden); - }); - - // Test that CACertificateManagementAllowed policy is applied to the - // UI when management is not allowed. - test('ImportButton_CAPolicyDisallowed', async function() { - await renderTabContents(); - const certificateLists = - page.shadowRoot!.querySelectorAll('certificate-list'); - - await browserProxy.whenCalled('refreshCertificates'); - webUIListenerCallback( - 'ca-import-allowed-changed', false /* clientImportAllowed */); - // Verify that import buttons are still hidden in the client - // certificate tab. - const clientImportButton = certificateLists[0]!.$.import; - assertTrue(clientImportButton.hidden); - const clientImportAndBindButton = certificateLists[0]!.$.importAndBind; - assertTrue(clientImportAndBindButton.hidden); - // Verify that import button is still hidden in the CA certificate - // tab. - const caImportButton = certificateLists[1]!.$.import; - assertTrue(caImportButton.hidden); - }); - // </if> -}); - -suite('CertificateListTests', function() { - let element: CertificateListElement; - let browserProxy: TestCertificatesBrowserProxy; - - setup(function() { - browserProxy = new TestCertificatesBrowserProxy(); - CertificatesBrowserProxyImpl.setInstance(browserProxy); - document.body.innerHTML = window.trustedTypes!.emptyHTML; - element = document.createElement('certificate-list'); - document.body.appendChild(element); - }); - - teardown(function() { - element.remove(); - }); - - /** - * Tests the "Import" button functionality. - * @param proxyMethodName The name of the proxy method expected to be - * called. - * @param actionEventExpected Whether a CertificateActionEvent is expected - * to fire as a result tapping the Import button. - * @param bindBtn Whether to click on the import and bind btn. - */ - async function testImportForCertificateType( - certificateType: CertificateType, proxyMethodName: string, - actionEventExpected: boolean, bindBtn: boolean) { - element.certificateType = certificateType; - flush(); - - const importButton = bindBtn ? - element.shadowRoot!.querySelector<HTMLElement>('#importAndBind') : - element.shadowRoot!.querySelector<HTMLElement>('#import'); - assertTrue(!!importButton); - - const waitForActionEvent = actionEventExpected ? - eventToPromise(CertificateActionEvent, element) : - Promise.resolve(null); - - importButton.click(); - const arg = await browserProxy.whenCalled(proxyMethodName); - - if (proxyMethodName === 'importPersonalCertificate') { - assertNotEquals(arg, undefined); - assertEquals(arg, bindBtn); - } - const event = await waitForActionEvent; - - if (actionEventExpected) { - assertEquals(CertificateAction.IMPORT, event.detail.action); - assertEquals(certificateType, event.detail.certificateType); - } - } - - test('ImportButton_Personal', async function() { - await testImportForCertificateType( - CertificateType.PERSONAL, 'importPersonalCertificate', true, false); - }); - - // <if expr="is_chromeos"> - test('ImportAndBindButton_Personal', async function() { - await testImportForCertificateType( - CertificateType.PERSONAL, 'importPersonalCertificate', true, true); - }); - // </if> - - test('ImportButton_Server', async function() { - await testImportForCertificateType( - CertificateType.SERVER, 'importServerCertificate', false, false); - }); - - test('ImportButton_CA', async function() { - await testImportForCertificateType( - CertificateType.CA, 'importCaCertificate', true, false); - }); -});
diff --git a/chrome/test/data/webui/extensions/extensions_focus_test.cc b/chrome/test/data/webui/extensions/extensions_focus_test.cc index 3ef00cab..1b9361cb 100644 --- a/chrome/test/data/webui/extensions/extensions_focus_test.cc +++ b/chrome/test/data/webui/extensions/extensions_focus_test.cc
@@ -25,8 +25,6 @@ "runMochaTest('ExtensionShortcutTest', 'UpdateShortcut')"); } -// TODO(crbug.com/392777363): Compile the test on android. -#if BUILDFLAG(ENABLE_EXTENSIONS) class CrExtensionsOptionsPageTest : public ExtensionSettingsTestBase { protected: void OnWebContentsAvailable(content::WebContents* web_contents) override { @@ -40,4 +38,3 @@ InstallExtensionWithInPageOptions(); RunTest("extensions/extension_options_dialog_test.js", "mocha.run()"); } -#endif // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/test/data/webui/extensions_zero_state/BUILD.gn b/chrome/test/data/webui/extensions_zero_state/BUILD.gn new file mode 100644 index 0000000..28fde0c --- /dev/null +++ b/chrome/test/data/webui/extensions_zero_state/BUILD.gn
@@ -0,0 +1,21 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//extensions/buildflags/buildflags.gni") +import("../build_webui_tests.gni") + +assert(enable_extensions_core, "enable extensions check failed") + +build_webui_tests("build") { + files = [ "zero_state_promo_app_test.ts" ] + + ts_path_mappings = [ "chrome://extensions-zero-state/*|" + rebase_path( + "$root_gen_dir/chrome/browser/resources/extensions_zero_state_promo/tsc/*", + target_gen_dir) ] + + ts_deps = [ + "//chrome/browser/resources/extensions_zero_state_promo:build_ts", + "//ui/webui/resources/cr_components/help_bubble:build_ts", + ] +}
diff --git a/chrome/test/data/webui/extensions_zero_state/DIR_METADATA b/chrome/test/data/webui/extensions_zero_state/DIR_METADATA new file mode 100644 index 0000000..3a31847 --- /dev/null +++ b/chrome/test/data/webui/extensions_zero_state/DIR_METADATA
@@ -0,0 +1,7 @@ +monorail: { + component: "Platform>Extensions" +} +team_email: "webstore-consumer@google.com" +buganizer_public: { + component_id: 1456110 +}
diff --git a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts new file mode 100644 index 0000000..98a6946a --- /dev/null +++ b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts
@@ -0,0 +1,120 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import 'chrome://extensions-zero-state/zero_state_promo_app.js'; + +import {WebStoreLinkClicked} from 'chrome://extensions-zero-state/zero_state_promo.mojom-webui.js'; +import type {ZeroStatePromoAppElement} from 'chrome://extensions-zero-state/zero_state_promo_app.js'; +import type {ZeroStatePromoBrowserProxy} from 'chrome://extensions-zero-state/zero_state_promo_browser_proxy.js'; +import {ZeroStatePromoBrowserProxyImpl} from 'chrome://extensions-zero-state/zero_state_promo_browser_proxy.js'; +import {CustomHelpBubbleUserAction} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble.mojom-webui.js'; +import type {CustomHelpBubbleHandlerInterface} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble.mojom-webui.js'; +import type {CustomHelpBubbleProxy} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble_proxy.js'; +import {CustomHelpBubbleProxyImpl} from 'chrome://resources/cr_components/help_bubble/custom_help_bubble_proxy.js'; +import {assertEquals} from 'chrome://webui-test/chai_assert.js'; +import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; + +export class TestBubbleHandler extends TestBrowserProxy implements + CustomHelpBubbleHandlerInterface { + constructor() { + super(['notifyUserAction']); + } + + notifyUserAction(action: CustomHelpBubbleUserAction) { + this.methodCalled('notifyUserAction', action); + } +} + +export class TestBubbleProxy implements CustomHelpBubbleProxy { + private handler_: TestBubbleHandler; + + constructor(handler: TestBubbleHandler) { + this.handler_ = handler; + } + + getHandler(): TestBubbleHandler { + return this.handler_; + } +} + +export class TestPromoProxy extends TestBrowserProxy implements + ZeroStatePromoBrowserProxy { + constructor() { + super(['launchWebStoreLink']); + } + + launchWebStoreLink(link: WebStoreLinkClicked) { + this.methodCalled('launchWebStoreLink', link); + } +} + +suite('ChipsUiTest', () => { + let bubbleHandler: TestBubbleHandler; + let zeroStatePromoApp: ZeroStatePromoAppElement; + let promoProxy: TestPromoProxy; + + setup(() => { + bubbleHandler = new TestBubbleHandler(); + CustomHelpBubbleProxyImpl.setInstance(new TestBubbleProxy(bubbleHandler)); + + promoProxy = new TestPromoProxy(); + ZeroStatePromoBrowserProxyImpl.setInstance(promoProxy); + + document.body.innerHTML = window.trustedTypes!.emptyHTML; + zeroStatePromoApp = + document.createElement('extensions-zero-state-promo-app'); + document.body.appendChild(zeroStatePromoApp); + }); + + test('ClickCouponsChip', async () => { + zeroStatePromoApp.$.couponsButton.click(); + + assertEquals( + WebStoreLinkClicked.kCoupon, + await promoProxy.whenCalled('launchWebStoreLink')); + assertEquals( + CustomHelpBubbleUserAction.kAction, + await bubbleHandler.whenCalled('notifyUserAction')); + }); + + test('ClickWritingChip', async () => { + zeroStatePromoApp.$.writingButton.click(); + + assertEquals( + WebStoreLinkClicked.kWriting, + await promoProxy.whenCalled('launchWebStoreLink')); + assertEquals( + CustomHelpBubbleUserAction.kAction, + await bubbleHandler.whenCalled('notifyUserAction')); + }); + + test('ClickProductivityChip', async () => { + zeroStatePromoApp.$.productivityButton.click(); + + assertEquals( + WebStoreLinkClicked.kProductivity, + await promoProxy.whenCalled('launchWebStoreLink')); + assertEquals( + CustomHelpBubbleUserAction.kAction, + await bubbleHandler.whenCalled('notifyUserAction')); + }); + + test('ClickAiChip', async () => { + zeroStatePromoApp.$.aiButton.click(); + + assertEquals( + WebStoreLinkClicked.kAi, + await promoProxy.whenCalled('launchWebStoreLink')); + assertEquals( + CustomHelpBubbleUserAction.kAction, + await bubbleHandler.whenCalled('notifyUserAction')); + }); + + test('ClickDismissButton', async () => { + zeroStatePromoApp.$.dismissButton.click(); + + assertEquals( + CustomHelpBubbleUserAction.kDismiss, + await bubbleHandler.whenCalled('notifyUserAction')); + }); +});
diff --git a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc new file mode 100644 index 0000000..9efd0810 --- /dev/null +++ b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc
@@ -0,0 +1,36 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/common/webui_url_constants.h" +#include "chrome/test/base/web_ui_mocha_browser_test.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/feature_list.h" +#include "content/public/test/browser_test.h" + +class ZeroStatePromoBrowserTest : public WebUIMochaBrowserTest { + protected: + ZeroStatePromoBrowserTest() { + set_test_loader_host(chrome::kChromeUIExtensionsZeroStatePromoHost); + } +}; + +class ZeroStatePromoChipsUiTest : public ZeroStatePromoBrowserTest { + protected: + ZeroStatePromoChipsUiTest() { + feature_list_.InitAndEnableFeatureWithParameters( + feature_engagement::kIPHExtensionsZeroStatePromoFeature, + {{feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.name, + feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.GetName( + feature_engagement::IPHExtensionsZeroStatePromoVariant:: + kCustomUiChipIph)}}); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(ZeroStatePromoChipsUiTest, AllTests) { + ZeroStatePromoBrowserTest::RunTest( + "extensions_zero_state/zero_state_promo_app_test.js", "mocha.run()"); +}
diff --git a/chrome/test/data/webui/glic/test_client/index.html b/chrome/test/data/webui/glic/test_client/index.html index 47bffaa..9308b6a 100644 --- a/chrome/test/data/webui/glic/test_client/index.html +++ b/chrome/test/data/webui/glic/test_client/index.html
@@ -469,6 +469,10 @@ <div><label>Node</label><select disabled id="scrollToNode" class="scrollToNodeSelect"></select></div> </div> <button id="scrollToBn" style="margin-top: 12px;">Scroll!</button> + <div> + <h2>Test dropScrollToHighlight()</h2> + <button id="dropScrollToHighlightBtn">Drop Highlight</button> + </div> </div> <div class="section"> <h1>Set Synthetic Experiment</h1>
diff --git a/chrome/test/data/webui/glic/test_client/page_element_types.ts b/chrome/test/data/webui/glic/test_client/page_element_types.ts index a9cd1fcb..9dc245fb 100644 --- a/chrome/test/data/webui/glic/test_client/page_element_types.ts +++ b/chrome/test/data/webui/glic/test_client/page_element_types.ts
@@ -121,6 +121,7 @@ closedCaptioningSwitch: HTMLInputElement; setClosedCaptioningTrue: HTMLButtonElement; setClosedCaptioningFalse: HTMLButtonElement; + dropScrollToHighlightBtn: HTMLButtonElement; } export const $: PageElementTypes = new Proxy({}, {
diff --git a/chrome/test/data/webui/glic/test_client/sections/scroll_to.ts b/chrome/test/data/webui/glic/test_client/sections/scroll_to.ts index fa2bfce8..3c1d36d 100644 --- a/chrome/test/data/webui/glic/test_client/sections/scroll_to.ts +++ b/chrome/test/data/webui/glic/test_client/sections/scroll_to.ts
@@ -153,3 +153,7 @@ logMessage(`scrollTo failed: ${error}`); } }); + +$.dropScrollToHighlightBtn.addEventListener('click', () => { + getBrowser()!.dropScrollToHighlight!(); +});
diff --git a/chrome/updater/certificate_tag.cc b/chrome/updater/certificate_tag.cc index 6d013670..1c6702c 100644 --- a/chrome/updater/certificate_tag.cc +++ b/chrome/updater/certificate_tag.cc
@@ -494,7 +494,7 @@ } // Recreate the header for the `WIN_CERTIFICATE` structure. - constexpr size_t kSizeofWinCertificateHeader = 8; + static constexpr size_t kSizeofWinCertificateHeader = 8; std::vector<uint8_t> win_certificate_header(kSizeofWinCertificateHeader); const uint32_t certs_size = kSizeofWinCertificateHeader + ret->size(); memcpy(&win_certificate_header[0], &certs_size, sizeof(certs_size));
diff --git a/chrome/updater/certificate_tag_unittest.cc b/chrome/updater/certificate_tag_unittest.cc index ed443b4..de5805b 100644 --- a/chrome/updater/certificate_tag_unittest.cc +++ b/chrome/updater/certificate_tag_unittest.cc
@@ -40,7 +40,7 @@ std::optional<std::vector<uint8_t>> orig_tag(bin->tag()); EXPECT_FALSE(orig_tag); - constexpr uint8_t kTag[] = {1, 2, 3, 4, 5}; + static constexpr uint8_t kTag[] = {1, 2, 3, 4, 5}; std::optional<std::vector<uint8_t>> updated_exe(bin->SetTag(kTag)); ASSERT_TRUE(updated_exe); @@ -52,7 +52,7 @@ EXPECT_TRUE(memcmp(kTag, parsed_tag->data(), sizeof(kTag)) == 0); // Update an existing tag. - constexpr uint8_t kTag2[] = {1, 2, 3, 4, 6}; + static constexpr uint8_t kTag2[] = {1, 2, 3, 4, 6}; std::optional<std::vector<uint8_t>> updated_again_exe(bin2->SetTag(kTag2)); ASSERT_TRUE(updated_again_exe); @@ -551,9 +551,9 @@ {"GUH-multiple.msi", [] { std::vector<uint8_t> expected_tag(8632); - constexpr char magic[] = "Gact2.0Omaha"; + static constexpr char magic[] = "Gact2.0Omaha"; std::memcpy(&expected_tag[0], magic, sizeof(magic)); - constexpr char tag[] = + static constexpr char tag[] = "appguid={8A69D345-D564-463C-AFF1-A69D9E530F96}&iid={2D8C18E9-" "8D3A-4EFC-6D61-AE23E3530EA2}&lang=en&browser=4&usagestats=0&" "appname=Google%20Chrome&needsadmin=prefers&brand=CHMB&"
diff --git a/chrome/updater/crash_reporter.cc b/chrome/updater/crash_reporter.cc index 387989a..634cf3d 100644 --- a/chrome/updater/crash_reporter.cc +++ b/chrome/updater/crash_reporter.cc
@@ -94,7 +94,7 @@ // Save dereferenced memory from all registers on the crashing thread. // Crashpad saves up to 512 bytes per CPU register, and in the worst case, // ARM64 has 32 registers. - constexpr uint32_t kIndirectMemoryLimit = 32 * 512; + static constexpr uint32_t kIndirectMemoryLimit = 32 * 512; crashpad::CrashpadInfo::GetCrashpadInfo() ->set_gather_indirectly_referenced_memory(crashpad::TriState::kEnabled, kIndirectMemoryLimit);
diff --git a/chrome/updater/device_management/dm_client_unittest.cc b/chrome/updater/device_management/dm_client_unittest.cc index e6fabb25..b6743f8 100644 --- a/chrome/updater/device_management/dm_client_unittest.cc +++ b/chrome/updater/device_management/dm_client_unittest.cc
@@ -126,8 +126,8 @@ void CreateStorage(bool init_dm_token, bool init_cache_info) { ASSERT_TRUE(storage_dir_.CreateUniqueTempDir()); - constexpr char kEnrollmentToken[] = "TestEnrollmentToken"; - constexpr char kDmToken[] = "test-dm-token"; + static constexpr char kEnrollmentToken[] = "TestEnrollmentToken"; + static constexpr char kDmToken[] = "test-dm-token"; storage_ = CreateDMStorage(storage_dir_.GetPath(), std::make_unique<TestTokenService>(
diff --git a/chrome/updater/device_management/dm_policy_builder_for_testing.cc b/chrome/updater/device_management/dm_policy_builder_for_testing.cc index 8ed2628..8cf61da 100644 --- a/chrome/updater/device_management/dm_policy_builder_for_testing.cc +++ b/chrome/updater/device_management/dm_policy_builder_for_testing.cc
@@ -142,13 +142,13 @@ } // namespace std::unique_ptr<DMSigningKeyForTesting> GetTestKey1() { - constexpr int kFakeKeyVersion = 5; + static constexpr int kFakeKeyVersion = 5; return std::make_unique<DMSigningKeyForTesting>( kSigningKey1, kSigningKey1Signature, kFakeKeyVersion, "example.com"); } std::unique_ptr<DMSigningKeyForTesting> GetTestKey2() { - constexpr int kFakeKeyVersion = 7; + static constexpr int kFakeKeyVersion = 7; return std::make_unique<DMSigningKeyForTesting>( kSigningKey2, kSigningKey2Signature, kFakeKeyVersion, "example.com"); }
diff --git a/chrome/updater/ipc/proxy_impl_base_win.h b/chrome/updater/ipc/proxy_impl_base_win.h index 6abf32c..016ab9e 100644 --- a/chrome/updater/ipc/proxy_impl_base_win.h +++ b/chrome/updater/ipc/proxy_impl_base_win.h
@@ -74,7 +74,7 @@ // normal operation and retrying on registration issues does not help. const auto create_server = [](REFCLSID clsid) -> HResultOr<Microsoft::WRL::ComPtr<IUnknown>> { - constexpr int kNumTries = 2; + static constexpr int kNumTries = 2; HRESULT hr = E_FAIL; for (int i = 0; i != kNumTries; ++i) { Microsoft::WRL::ComPtr<IUnknown> server;
diff --git a/chrome/updater/ipc/update_service_proxy_win.cc b/chrome/updater/ipc/update_service_proxy_win.cc index fd727838..6b6a3c8e 100644 --- a/chrome/updater/ipc/update_service_proxy_win.cc +++ b/chrome/updater/ipc/update_service_proxy_win.cc
@@ -323,7 +323,7 @@ if (FAILED(hr)) { return hr; } - constexpr int kMaxTries = 2; + static constexpr int kMaxTries = 2; for (int try_count = 0; try_count < kMaxTries; ++try_count) { HResultOr<UpdateService::AppState> service_app_states = IUpdaterAppStateToAppState(app_state);
diff --git a/chrome/updater/mac/install_from_archive.mm b/chrome/updater/mac/install_from_archive.mm index 92db790e..bea44df 100644 --- a/chrome/updater/mac/install_from_archive.mm +++ b/chrome/updater/mac/install_from_archive.mm
@@ -130,7 +130,7 @@ return false; } - constexpr int kExecutableMask = base::FILE_PERMISSION_EXECUTE_BY_USER; + static constexpr int kExecutableMask = base::FILE_PERMISSION_EXECUTE_BY_USER; return (permissions & kExecutableMask) == kExecutableMask; } @@ -230,7 +230,7 @@ std::string output; base::Time deadline = base::Time::Now() + timeout; - constexpr size_t kBufferSize = 1024; + static constexpr size_t kBufferSize = 1024; base::CheckedNumeric<size_t> total_bytes_read = 0; ssize_t read_this_pass = 0; do {
diff --git a/chrome/updater/mac/setup/keystone.mm b/chrome/updater/mac/setup/keystone.mm index 6e356992..2b32ebb5 100644 --- a/chrome/updater/mac/setup/keystone.mm +++ b/chrome/updater/mac/setup/keystone.mm
@@ -154,11 +154,11 @@ // For system installs, set file permissions to be drwxr-xr-x. if (IsSystemInstall(scope)) { - constexpr int kPermissionsMask = base::FILE_PERMISSION_USER_MASK | - base::FILE_PERMISSION_READ_BY_GROUP | - base::FILE_PERMISSION_EXECUTE_BY_GROUP | - base::FILE_PERMISSION_READ_BY_OTHERS | - base::FILE_PERMISSION_EXECUTE_BY_OTHERS; + static constexpr int kPermissionsMask = + base::FILE_PERMISSION_USER_MASK | base::FILE_PERMISSION_READ_BY_GROUP | + base::FILE_PERMISSION_EXECUTE_BY_GROUP | + base::FILE_PERMISSION_READ_BY_OTHERS | + base::FILE_PERMISSION_EXECUTE_BY_OTHERS; if (!base::SetPosixFilePermissions(dest_path.DirName(), kPermissionsMask) || !base::SetPosixFilePermissions(dest_path, kPermissionsMask)) { LOG(ERROR) << "Failed to set permissions to drwxr-xr-x at " @@ -206,10 +206,10 @@ } // namespace bool CreateEmptyPlistFile(const base::FilePath& file_path) { - constexpr int kPermissionsMask = base::FILE_PERMISSION_READ_BY_USER | - base::FILE_PERMISSION_WRITE_BY_USER | - base::FILE_PERMISSION_READ_BY_GROUP | - base::FILE_PERMISSION_READ_BY_OTHERS; + static constexpr int kPermissionsMask = base::FILE_PERMISSION_READ_BY_USER | + base::FILE_PERMISSION_WRITE_BY_USER | + base::FILE_PERMISSION_READ_BY_GROUP | + base::FILE_PERMISSION_READ_BY_OTHERS; const base::FilePath dir = file_path.DirName(); if (!base::PathExists(dir)) { base::File::Error error;
diff --git a/chrome/updater/mac/setup/keystone_unittest.mm b/chrome/updater/mac/setup/keystone_unittest.mm index 3979ab8..697f5b78 100644 --- a/chrome/updater/mac/setup/keystone_unittest.mm +++ b/chrome/updater/mac/setup/keystone_unittest.mm
@@ -48,10 +48,10 @@ }; TEST_F(KeystoneTest, CreateEmptyPlistFile) { - constexpr int kPermissionsMask = base::FILE_PERMISSION_READ_BY_USER | - base::FILE_PERMISSION_WRITE_BY_USER | - base::FILE_PERMISSION_READ_BY_GROUP | - base::FILE_PERMISSION_READ_BY_OTHERS; + static constexpr int kPermissionsMask = base::FILE_PERMISSION_READ_BY_USER | + base::FILE_PERMISSION_WRITE_BY_USER | + base::FILE_PERMISSION_READ_BY_GROUP | + base::FILE_PERMISSION_READ_BY_OTHERS; base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
diff --git a/chrome/updater/mac/setup/mac_setup.mm b/chrome/updater/mac/setup/mac_setup.mm index f8ec355..9fa1aa1 100644 --- a/chrome/updater/mac/setup/mac_setup.mm +++ b/chrome/updater/mac/setup/mac_setup.mm
@@ -72,11 +72,11 @@ // For system installs, set file permissions to be drwxr-xr-x if (IsSystemInstall(scope)) { - constexpr int kPermissionsMask = base::FILE_PERMISSION_USER_MASK | - base::FILE_PERMISSION_READ_BY_GROUP | - base::FILE_PERMISSION_EXECUTE_BY_GROUP | - base::FILE_PERMISSION_READ_BY_OTHERS | - base::FILE_PERMISSION_EXECUTE_BY_OTHERS; + static constexpr int kPermissionsMask = + base::FILE_PERMISSION_USER_MASK | base::FILE_PERMISSION_READ_BY_GROUP | + base::FILE_PERMISSION_EXECUTE_BY_GROUP | + base::FILE_PERMISSION_READ_BY_OTHERS | + base::FILE_PERMISSION_EXECUTE_BY_OTHERS; if (!base::SetPosixFilePermissions(base_install_dir->DirName(), kPermissionsMask) || !base::SetPosixFilePermissions(*base_install_dir, kPermissionsMask) ||
diff --git a/chrome/updater/policy/dm_policy_manager_unittest.cc b/chrome/updater/policy/dm_policy_manager_unittest.cc index 320abb16..4d16b52 100644 --- a/chrome/updater/policy/dm_policy_manager_unittest.cc +++ b/chrome/updater/policy/dm_policy_manager_unittest.cc
@@ -252,7 +252,7 @@ omaha_settings.mutable_application_settings()->Add(std::move(chrome)); // App1 policies. - constexpr char kApp1[] = "app1.chromium.org"; + static constexpr char kApp1[] = "app1.chromium.org"; ::wireless_android_enterprise_devicemanagement::ApplicationSettings app1; app1.set_app_guid(kApp1); app1.set_bundle_identifier(kApp1); @@ -264,7 +264,7 @@ omaha_settings.mutable_application_settings()->Add(std::move(app1)); // App2 policies. - constexpr char kApp2[] = "app2.chromium.org"; + static constexpr char kApp2[] = "app2.chromium.org"; ::wireless_android_enterprise_devicemanagement::ApplicationSettings app2; app2.set_app_guid(kApp2); app2.set_install(
diff --git a/chrome/updater/policy/policy_manager.cc b/chrome/updater/policy/policy_manager.cc index e454ce2..ed3f2be 100644 --- a/chrome/updater/policy/policy_manager.cc +++ b/chrome/updater/policy/policy_manager.cc
@@ -65,7 +65,7 @@ PolicyManager::PolicyManager(base::Value::Dict policies) : policies_(std::move(policies)) { - constexpr size_t kInstallAppPrefixLength = + static constexpr size_t kInstallAppPrefixLength = std::string_view(kInstallAppPrefix).length(); std::ranges::for_each(policies_, [&](const auto& policy) { const std::string policy_name = policy.first;
diff --git a/chrome/updater/tag.cc b/chrome/updater/tag.cc index 781c654..0a6cf86 100644 --- a/chrome/updater/tag.cc +++ b/chrome/updater/tag.cc
@@ -646,7 +646,7 @@ // Loads up to the last 80K bytes from `filename`. std::vector<uint8_t> ReadFileTail(const base::FilePath& filename) { - constexpr int64_t kMaxBytesToRead = 81920; // 80K + static constexpr int64_t kMaxBytesToRead = 81920; // 80K base::File file(filename, base::File::FLAG_OPEN | base::File::FLAG_READ); if (!file.IsValid()) {
diff --git a/chrome/updater/test/request_matcher.cc b/chrome/updater/test/request_matcher.cc index f6a9c3c..b1fa0e7 100644 --- a/chrome/updater/test/request_matcher.cc +++ b/chrome/updater/test/request_matcher.cc
@@ -229,7 +229,7 @@ const std::vector<FormExpectations>& form_expections) { return base::BindLambdaForTesting([form_expections]( const HttpRequest& request) { - constexpr char kMultifpartBoundaryPrefix[] = + static constexpr char kMultifpartBoundaryPrefix[] = "multipart/form-data; boundary="; if (!request.headers.contains("Content-Type")) { ADD_FAILURE() << "Content-Type header not found, which is expected "
diff --git a/chrome/updater/test/run_all_unittests.cc b/chrome/updater/test/run_all_unittests.cc index 7b3d83ba..fcdede8 100644 --- a/chrome/updater/test/run_all_unittests.cc +++ b/chrome/updater/test/run_all_unittests.cc
@@ -117,7 +117,7 @@ private: // Notifies the processes that the environment has been changed to reload it. static void BroadcastEnvironmentChange() { - constexpr int kTimeOutMilliSeconds = 100; + static constexpr int kTimeOutMilliSeconds = 100; DWORD_PTR result = 0; ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, reinterpret_cast<LPARAM>(L"Environment"), SMTO_NORMAL,
diff --git a/chrome/updater/test/test_installer/main.cc b/chrome/updater/test/test_installer/main.cc index 92a56b8..761afc3 100644 --- a/chrome/updater/test/test_installer/main.cc +++ b/chrome/updater/test/test_installer/main.cc
@@ -101,7 +101,7 @@ } int RunAllResourceScripts() { - constexpr char kScriptResourceNameSwitch[] = "script_resource_name"; + static constexpr char kScriptResourceNameSwitch[] = "script_resource_name"; base::ScopedTempDir working_dir; if (!working_dir.CreateUniqueTempDir()) {
diff --git a/chrome/updater/test/unit_test_util.cc b/chrome/updater/test/unit_test_util.cc index e29f4a0..94b2cbb1 100644 --- a/chrome/updater/test/unit_test_util.cc +++ b/chrome/updater/test/unit_test_util.cc
@@ -416,7 +416,7 @@ bool WaitFor(base::FunctionRef<bool()> predicate, base::FunctionRef<void()> still_waiting) { - constexpr base::TimeDelta kOutputInterval = base::Seconds(10); + static constexpr base::TimeDelta kOutputInterval = base::Seconds(10); auto notify_next = base::TimeTicks::Now() + kOutputInterval; const auto deadline = base::TimeTicks::Now() + TestTimeouts::action_timeout(); while (base::TimeTicks::Now() < deadline) {
diff --git a/chrome/updater/test/unit_test_util_unittest.cc b/chrome/updater/test/unit_test_util_unittest.cc index 5ac7bb0b..8af5308 100644 --- a/chrome/updater/test/unit_test_util_unittest.cc +++ b/chrome/updater/test/unit_test_util_unittest.cc
@@ -91,7 +91,7 @@ // Terminate the long-lived processes, expect to find them not running, then // inspect their exit code. - constexpr int kExitCode = 12345; + static constexpr int kExitCode = 12345; EXPECT_FALSE(WaitForProcessesToExit(kTestProcessExecutableName, base::Milliseconds(1))); EXPECT_TRUE(KillProcesses(kTestProcessExecutableName, kExitCode));
diff --git a/chrome/updater/test/unit_test_util_win.cc b/chrome/updater/test/unit_test_util_win.cc index 62b7496..97d9c7377 100644 --- a/chrome/updater/test/unit_test_util_win.cc +++ b/chrome/updater/test/unit_test_util_win.cc
@@ -111,7 +111,7 @@ void SetupCmdExe(UpdaterScope scope, base::CommandLine& cmd_exe_command_line, base::ScopedTempDir& temp_programfiles_dir) { - constexpr wchar_t kCmdExe[] = L"cmd.exe"; + static constexpr wchar_t kCmdExe[] = L"cmd.exe"; base::FilePath system_path; ASSERT_TRUE(base::PathService::Get(base::DIR_SYSTEM, &system_path));
diff --git a/chrome/updater/tools/updater_util.cc b/chrome/updater/tools/updater_util.cc index 46d6ce7..6280067 100644 --- a/chrome/updater/tools/updater_util.cc +++ b/chrome/updater/tools/updater_util.cc
@@ -259,7 +259,7 @@ void PrintCachedPolicyInfo( const device_management_storage::CachedPolicyInfo& cached_info) { - constexpr size_t kPrintWidth = 16; + static constexpr size_t kPrintWidth = 16; std::cout << "Cached policy info:" << std::endl; std::cout << " Key version: " << cached_info.key_version() << std::endl;
diff --git a/chrome/updater/util/mac_util.mm b/chrome/updater/util/mac_util.mm index 340bc38..a78a526 100644 --- a/chrome/updater/util/mac_util.mm +++ b/chrome/updater/util/mac_util.mm
@@ -239,9 +239,9 @@ } bool SetFilePermissionsRecursive(const base::FilePath& path) { - constexpr mode_t executable_mode = + static constexpr mode_t executable_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; - constexpr mode_t normal_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; + static constexpr mode_t normal_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; struct stat stat_buf; if (lstat(path.value().c_str(), &stat_buf) != 0) { VPLOG(2) << "Couldn't stat: " << path.value();
diff --git a/chrome/updater/util/util.cc b/chrome/updater/util/util.cc index d802397..10ac2ae5 100644 --- a/chrome/updater/util/util.cc +++ b/chrome/updater/util/util.cc
@@ -227,7 +227,7 @@ #if BUILDFLAG(IS_WIN) // Enable Event Tracing for Windows. // {4D7D9607-78B6-4583-A188-2136AB85F5F1} - constexpr GUID kUpdaterETWProviderName = { + static constexpr GUID kUpdaterETWProviderName = { 0x4d7d9607, 0x78b6, 0x4583,
diff --git a/chrome/updater/util/win_util.cc b/chrome/updater/util/win_util.cc index de7baa0..0af950d 100644 --- a/chrome/updater/util/win_util.cc +++ b/chrome/updater/util/win_util.cc
@@ -108,7 +108,7 @@ if (!authority) { return E_FAIL; } - constexpr SID_IDENTIFIER_AUTHORITY kMandatoryLabelAuth = + static constexpr SID_IDENTIFIER_AUTHORITY kMandatoryLabelAuth = SECURITY_MANDATORY_LABEL_AUTHORITY; if (UNSAFE_TODO(std::memcmp(authority, &kMandatoryLabelAuth, sizeof(SID_IDENTIFIER_AUTHORITY)))) { @@ -759,9 +759,10 @@ bool CompareOSVersions(const OSVERSIONINFOEX& os_version, BYTE oper) { CHECK(oper); - constexpr DWORD kOSTypeMask = VER_MAJORVERSION | VER_MINORVERSION | - VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR; - constexpr DWORD kBuildTypeMask = VER_BUILDNUMBER; + static constexpr DWORD kOSTypeMask = VER_MAJORVERSION | VER_MINORVERSION | + VER_SERVICEPACKMAJOR | + VER_SERVICEPACKMINOR; + static constexpr DWORD kBuildTypeMask = VER_BUILDNUMBER; // If the OS and the service pack match, return the build number comparison. return CompareOSVersionsInternal(os_version, kOSTypeMask, VER_EQUAL) @@ -1449,7 +1450,7 @@ std::wstring StringFromGuid(const GUID& guid) { // {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} - constexpr int kGuidStringCharacters = + static constexpr int kGuidStringCharacters = 1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1 + 1; wchar_t guid_string[kGuidStringCharacters] = {}; CHECK_NE(::StringFromGUID2(guid, guid_string, kGuidStringCharacters), 0); @@ -1516,7 +1517,7 @@ return false; } - constexpr uint32_t kMaxQueryConfigBufferBytes = 8 * 1024; + static constexpr uint32_t kMaxQueryConfigBufferBytes = 8 * 1024; auto buffer = std::make_unique<uint8_t[]>(kMaxQueryConfigBufferBytes); DWORD bytes_needed_ignored = 0; QUERY_SERVICE_CONFIG* service_config =
diff --git a/chrome/updater/util/win_util_unittest.cc b/chrome/updater/util/win_util_unittest.cc index 80d08588..1058a7a5 100644 --- a/chrome/updater/util/win_util_unittest.cc +++ b/chrome/updater/util/win_util_unittest.cc
@@ -385,7 +385,7 @@ } TEST(WinUtil, ForEachRegistryRunValueWithPrefix) { - constexpr int kRunEntries = 6; + static constexpr int kRunEntries = 6; const std::wstring kRunEntryPrefix(base::UTF8ToWide(test::GetTestName())); base::win::RegKey key; @@ -411,7 +411,7 @@ } TEST(WinUtil, DeleteRegValue) { - constexpr int kRegValues = 6; + static constexpr int kRegValues = 6; const std::wstring kRegValuePrefix(base::UTF8ToWide(test::GetTestName())); base::win::RegKey key; @@ -436,7 +436,7 @@ return; } - constexpr int kNumServices = 6; + static constexpr int kNumServices = 6; const std::wstring kServiceNamePrefix(base::UTF8ToWide(test::GetTestName())); for (int count = 0; count < kNumServices; ++count) { @@ -462,7 +462,7 @@ return; } - constexpr int kNumServices = 6; + static constexpr int kNumServices = 6; const std::wstring kServiceNamePrefix(base::UTF8ToWide(test::GetTestName())); for (int count = 0; count < kNumServices; ++count) {
diff --git a/chrome/updater/win/app_command_runner.cc b/chrome/updater/win/app_command_runner.cc index b521226..12cca54 100644 --- a/chrome/updater/win/app_command_runner.cc +++ b/chrome/updater/win/app_command_runner.cc
@@ -70,10 +70,11 @@ HRESULT LoadLegacyProcessLauncherFormat(const std::wstring& app_id, const std::wstring& command_id, std::wstring& command_format) { - constexpr wchar_t kAllowedLegacyProcessLauncherAppNamePrefix[] = + static constexpr wchar_t kAllowedLegacyProcessLauncherAppNamePrefix[] = L"" BROWSER_PRODUCT_NAME_STRING; - constexpr char kAllowedLegacyProcessLauncherMaxAppVersion[] = "110.0.5435.0"; - constexpr wchar_t kAllowedLegacyProcessLauncherCommandId[] = L"cmd"; + static constexpr char kAllowedLegacyProcessLauncherMaxAppVersion[] = + "110.0.5435.0"; + static constexpr wchar_t kAllowedLegacyProcessLauncherCommandId[] = L"cmd"; std::wstring pv; std::wstring name; @@ -301,7 +302,7 @@ return std::nullopt; } - constexpr wchar_t kQuotableCharacters[] = L" \t\\\""; + static constexpr wchar_t kQuotableCharacters[] = L" \t\\\""; formatted_command_line.append( formatted_parameter->find_first_of(kQuotableCharacters) == std::wstring::npos
diff --git a/chrome/updater/win/installer/configuration.cc b/chrome/updater/win/installer/configuration.cc index 8a860123c2..7d44614 100644 --- a/chrome/updater/win/installer/configuration.cc +++ b/chrome/updater/win/installer/configuration.cc
@@ -19,7 +19,7 @@ // Returns true if GoogleUpdateIsMachine=1 is present in the environment. bool GetGoogleUpdateIsMachineEnvVar() { - constexpr DWORD kBufferSize = 2; + static constexpr DWORD kBufferSize = 2; StackString<kBufferSize> value; const auto length = ::GetEnvironmentVariableW(L"GoogleUpdateIsMachine", value.get(), kBufferSize);
diff --git a/chrome/updater/win/installer/pe_resource.cc b/chrome/updater/win/installer/pe_resource.cc index fb4e3dc..e7268c7 100644 --- a/chrome/updater/win/installer/pe_resource.cc +++ b/chrome/updater/win/installer/pe_resource.cc
@@ -48,7 +48,7 @@ // Don't write all of the data at once because this can lead to kernel // address-space exhaustion on 32-bit Windows (see https://crbug.com/1001022 // for details). - constexpr size_t kMaxWriteAmount = 8 * 1024 * 1024; + static constexpr size_t kMaxWriteAmount = 8 * 1024 * 1024; for (size_t total_written = 0; total_written < data_span.size(); /**/) { const size_t write_amount = std::min(kMaxWriteAmount, data_span.size() - total_written);
diff --git a/chrome/updater/win/manifest_util.cc b/chrome/updater/win/manifest_util.cc index a744863..a98875a 100644 --- a/chrome/updater/win/manifest_util.cc +++ b/chrome/updater/win/manifest_util.cc
@@ -63,7 +63,7 @@ return std::nullopt; } - constexpr int64_t kMaxManifestSize = 1024 * 1024; + static constexpr int64_t kMaxManifestSize = 1024 * 1024; if (file_size.value() > kMaxManifestSize) { VLOG(2) << "Manifest file is too large."; return std::nullopt;
diff --git a/chrome/updater/win/task_scheduler_unittest.cc b/chrome/updater/win/task_scheduler_unittest.cc index 0207698..5583f06 100644 --- a/chrome/updater/win/task_scheduler_unittest.cc +++ b/chrome/updater/win/task_scheduler_unittest.cc
@@ -490,7 +490,7 @@ GetUpdaterScopeForTesting(), /*use_task_subfolders=*/false); ASSERT_TRUE(task_scheduler); - constexpr int kNumTasks = 6; + static constexpr int kNumTasks = 6; const std::wstring kTaskNamePrefix(base::UTF8ToWide(test::GetTestName())); for (int count = 0; count < kNumTasks; ++count) { @@ -512,7 +512,7 @@ GetUpdaterScopeForTesting(), use_task_subfolders); ASSERT_TRUE(task_scheduler); - constexpr int kNumTasks = 6; + static constexpr int kNumTasks = 6; const std::wstring kTaskNamePrefix(base::UTF8ToWide(test::GetTestName())); for (int count = 0; count < kNumTasks; ++count) {
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 5fa2675..148a643 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -16291.0.0-1069055 \ No newline at end of file +16289.0.0-1068983 \ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index f8c6598..4f786b2 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -105,9 +105,6 @@ # b/409349162 "inputs.PhysicalKeyboardKoreanTyping@jacuzzi", - # b/419598394 - "dlp.DataLeakPreventionRulesListFilesUSB.ash_blocked@brya", - # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE. ]
diff --git a/clank b/clank index c3f13e0..180ea8e 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit c3f13e04659dc7e088022d2ea2478a036ea41011 +Subproject commit 180ea8ed2b2e73fb52d4201a021d0acd2801c05b
diff --git a/components/attribution_reporting/source_registration.cc b/components/attribution_reporting/source_registration.cc index ac9870c..008b8a6 100644 --- a/components/attribution_reporting/source_registration.cc +++ b/components/attribution_reporting/source_registration.cc
@@ -65,6 +65,8 @@ /*exclusive_max=*/25 + 1); static_assert(attribution_reporting::kMaxAggregatableNamedBudgetsPerSource == 25); + base::UmaHistogramEnumeration("Conversions.TriggerDataMatchingRegistration", + result.trigger_data_matching); } void RecordSourceRegistrationError(SourceRegistrationError error) {
diff --git a/components/attribution_reporting/source_registration_unittest.cc b/components/attribution_reporting/source_registration_unittest.cc index 6c6a257..755db55 100644 --- a/components/attribution_reporting/source_registration_unittest.cc +++ b/components/attribution_reporting/source_registration_unittest.cc
@@ -389,6 +389,9 @@ if (source.has_value()) { histograms.ExpectTotalCount(kSourceRegistrationErrorMetric, 0); + histograms.ExpectUniqueSample( + "Conversions.TriggerDataMatchingRegistration", + static_cast<int>(source->trigger_data_matching), 1); } else { histograms.ExpectUniqueSample(kSourceRegistrationErrorMetric, source.error(), 1);
diff --git a/components/attribution_reporting/trigger_config.cc b/components/attribution_reporting/trigger_config.cc index c89f5a4..e3767df 100644 --- a/components/attribution_reporting/trigger_config.cc +++ b/components/attribution_reporting/trigger_config.cc
@@ -14,6 +14,7 @@ #include "base/check.h" #include "base/containers/flat_set.h" #include "base/containers/flat_tree.h" +#include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "base/types/expected.h" #include "base/types/expected_macros.h" @@ -144,8 +145,12 @@ } // `std::next()` is constant-time due to the underlying iterator being // random-access. - return *std::next(trigger_data_.begin(), - trigger_data % trigger_data_.size()); + const uint32_t out = *std::next(trigger_data_.begin(), + trigger_data % trigger_data_.size()); + base::UmaHistogramBoolean( + "Conversions.TriggerDataMatchingModulusSameInputOutput", + trigger_data == out); + return out; } }
diff --git a/components/attribution_reporting/trigger_config_unittest.cc b/components/attribution_reporting/trigger_config_unittest.cc index 4179e05..71b36be2 100644 --- a/components/attribution_reporting/trigger_config_unittest.cc +++ b/components/attribution_reporting/trigger_config_unittest.cc
@@ -10,6 +10,7 @@ #include <utility> #include "base/test/gmock_expected_support.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/values_test_util.h" #include "base/types/expected.h" #include "base/values.h" @@ -322,15 +323,21 @@ const struct { uint64_t trigger_data; std::optional<uint32_t> expected; + bool expected_metric_value; } kTestCases[] = { - {0, 0}, {1, 1}, {2, 2}, {3, 0}, {4, 1}, {5, 2}, + {0, 0, true}, {1, 1, true}, {2, 2, true}, + {3, 0, false}, {4, 1, false}, {5, 2, false}, }; for (const auto& test_case : kTestCases) { + base::HistogramTester histograms; SCOPED_TRACE(test_case.trigger_data); EXPECT_EQ(kSet.find(test_case.trigger_data, TriggerDataMatching::kModulus), test_case.expected); + histograms.ExpectUniqueSample( + "Conversions.TriggerDataMatchingModulusSameInputOutput", + test_case.expected_metric_value, 1); } }
diff --git a/components/attribution_reporting/trigger_data_matching.mojom b/components/attribution_reporting/trigger_data_matching.mojom index 32201fd..2accdba 100644 --- a/components/attribution_reporting/trigger_data_matching.mojom +++ b/components/attribution_reporting/trigger_data_matching.mojom
@@ -7,6 +7,10 @@ // Controls how trigger data is matched against a source's trigger specs. // Corresponds to // https://wicg.github.io/attribution-reporting-api/#trigger-data-matching-mode +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +// +// LINT.IfChange(TriggerDataMatching) enum TriggerDataMatching { // Trigger data is taken modulo the default trigger data cardinality. kModulus = 0, @@ -14,3 +18,4 @@ // Otherwise, no event-level attribution takes place. kExact = 1, }; +// LINT.ThenChange(//tools/metrics/histograms/metadata/attribution_reporting/enums.xml:ConversionTriggerDataMatching)
diff --git a/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/EmbeddableSettingsPage.java b/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/EmbeddableSettingsPage.java index 322cb5b8..809c4c1 100644 --- a/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/EmbeddableSettingsPage.java +++ b/components/browser_ui/settings/android/java/src/org/chromium/components/browser_ui/settings/EmbeddableSettingsPage.java
@@ -30,11 +30,4 @@ * <p>The activity will observe changes to this value and update the UI as necessary. */ ObservableSupplier<String> getPageTitle(); - - @Override - default @AnimationType int getAnimationType() { - // TODO(crbug.com/404074032): Each leaf subclass should override this method to use - // PROPERTY animation with auditing. - return AnimationType.TWEEN; - } }
diff --git a/components/browser_ui/settings/android/widget/test_support_java/src/org/chromium/components/browser_ui/settings/PlaceholderSettingsForTest.java b/components/browser_ui/settings/android/widget/test_support_java/src/org/chromium/components/browser_ui/settings/PlaceholderSettingsForTest.java index 06d5355..eeca79e2 100644 --- a/components/browser_ui/settings/android/widget/test_support_java/src/org/chromium/components/browser_ui/settings/PlaceholderSettingsForTest.java +++ b/components/browser_ui/settings/android/widget/test_support_java/src/org/chromium/components/browser_ui/settings/PlaceholderSettingsForTest.java
@@ -30,4 +30,11 @@ public ObservableSupplier<String> getPageTitle() { return mPageTitle; } + + @Override + public @AnimationType int getAnimationType() { + // TODO(crbug.com/404074032): Each leaf subclass should override this method to use + // PROPERTY animation with auditing. + return AnimationType.TWEEN; + } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java index 4980bb8..54d2a75 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ClipDrawableProgressBar.java
@@ -55,6 +55,7 @@ @Nullable private ColorDrawable mForegroundColorDrawable; @Nullable private GradientDrawable mForegroundGradientDrawable; @Nullable private GradientDrawable mBackgroundGradientDrawable; + @Nullable private GradientDrawable mEndCapCircleDrawable; private int mForegroundColor; private int mBackgroundColor; protected int mProgressBarHeight; @@ -72,6 +73,7 @@ public ClipDrawableProgressBar(Context context, AttributeSet attrs) { super(context, attrs); + setScaleType(ScaleType.FIT_XY); // Ensure the drawable fills the ImageView mDesiredVisibility = getVisibility(); mForegroundColor = SemanticColorUtils.getProgressBarForeground(getContext()); @@ -91,27 +93,38 @@ private void initializeDrawables() { if (useGradientDrawable()) { mForegroundGradientDrawable = createGradientDrawable(mForegroundColor, - mProgressBarHeight / 2); - ClipDrawable foregroundClipDrawable = - new ClipDrawable(mForegroundGradientDrawable, Gravity.START, - ClipDrawable.HORIZONTAL); + GradientDrawable.RECTANGLE); + mForegroundGradientDrawable.setCornerRadius((float) mProgressBarHeight / 2); + ClipDrawable foregroundClipDrawable = new ClipDrawable(mForegroundGradientDrawable, + Gravity.START, ClipDrawable.HORIZONTAL); mBackgroundGradientDrawable = createGradientDrawable(mBackgroundColor, - mProgressBarHeight / 2); + GradientDrawable.RECTANGLE); + mBackgroundGradientDrawable.setCornerRadius((float) mProgressBarHeight / 2); ClipDrawable backgroundClipDrawable = new ClipDrawable( mBackgroundGradientDrawable, Gravity.END, ClipDrawable.HORIZONTAL); // Background will be fully visible. backgroundClipDrawable.setLevel(CLIP_DRAWABLE_MAX); - // A layerDrawable with the 2 moving components, foreground and background. - Drawable[] layers = {foregroundClipDrawable, backgroundClipDrawable}; + // Create the end circular stop indicator + mEndCapCircleDrawable = createGradientDrawable(mForegroundColor, GradientDrawable.OVAL); + mEndCapCircleDrawable.setSize(mProgressBarHeight, mProgressBarHeight); - setImageDrawable(new LayerDrawable(layers)); + // A layerDrawable with the 2 moving components, foreground and background, and the + // end stop indicator. Layers are drawn in the order they are added to the array, + // with the last one appearing on top. + Drawable[] layers = + {foregroundClipDrawable, backgroundClipDrawable, mEndCapCircleDrawable}; + LayerDrawable layerDrawable = new LayerDrawable(layers); + + // The circle (layer 2) will be drawn at the right end of the progress bar. + layerDrawable.setLayerGravity(2, Gravity.END | Gravity.CENTER_VERTICAL); + + setImageDrawable(layerDrawable); } else { mForegroundColorDrawable = new ColorDrawable(mForegroundColor); - setImageDrawable( - new ClipDrawable(mForegroundColorDrawable, Gravity.START, - ClipDrawable.HORIZONTAL)); + setImageDrawable(new ClipDrawable(mForegroundColorDrawable, Gravity.START, + ClipDrawable.HORIZONTAL)); } } @@ -121,11 +134,10 @@ * @param color The color to set for the drawable. * @return A new {@link GradientDrawable} instance. */ - private static GradientDrawable createGradientDrawable(int color, int cornerRadius) { + private static GradientDrawable createGradientDrawable(int color, int shape) { GradientDrawable drawable = new GradientDrawable(); - drawable.setShape(GradientDrawable.RECTANGLE); + drawable.setShape(shape); drawable.setColor(color); - drawable.setCornerRadius(cornerRadius); return drawable; } @@ -292,8 +304,11 @@ * @param color The new color of the progress bar foreground. */ public void setForegroundColor(int color) { - if (useGradientDrawable() && mForegroundGradientDrawable != null) { + if (useGradientDrawable()) { + assert mForegroundGradientDrawable != null; + assert mEndCapCircleDrawable != null; mForegroundGradientDrawable.setColor(color); + mEndCapCircleDrawable.setColor(color); } else { assert mForegroundColorDrawable != null; mForegroundColorDrawable.setColor(color);
diff --git a/components/browsing_data/core/browsing_data_utils.h b/components/browsing_data/core/browsing_data_utils.h index 61e3057..969890bd3 100644 --- a/components/browsing_data/core/browsing_data_utils.h +++ b/components/browsing_data/core/browsing_data_utils.h
@@ -126,7 +126,7 @@ kKeyboardEntryPointSelected = 31, kMaxValue = kKeyboardEntryPointSelected, }; -// LINT.ThenChange(//tools/metrics/histograms/enums.xml:DeleteBrowsingDataDialogAction) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:DeleteBrowsingDataDialogAction) // Calculate the begin time for the deletion range specified by |time_period|. base::Time CalculateBeginDeleteTime(TimePeriod time_period);
diff --git a/components/constrained_window/constrained_window_views.cc b/components/constrained_window/constrained_window_views.cc index 6e91ffc..4421cf1 100644 --- a/components/constrained_window/constrained_window_views.cc +++ b/components/constrained_window/constrained_window_views.cc
@@ -297,6 +297,13 @@ web_modal::ModalDialogHost* const dialog_host = manager->delegate()->GetWebContentsModalDialogHost(); + CHECK(dialog_host); + + // Use desktop widget so that it is not constrained by the boundary of the + // host window. + dialog->set_use_desktop_widget_override( + !dialog_host->ShouldDialogBoundsConstrainedByHost()); + views::Widget* widget = views::DialogDelegate::CreateDialogWidget( dialog, gfx::NativeWindow(), dialog_host->GetHostView()); std::unique_ptr<ModalDialogHostObserver> observer =
diff --git a/components/content_settings/core/browser/cookie_settings.h b/components/content_settings/core/browser/cookie_settings.h index 319f7f5..5b81960 100644 --- a/components/content_settings/core/browser/cookie_settings.h +++ b/components/content_settings/core/browser/cookie_settings.h
@@ -52,7 +52,7 @@ kLimited = 3, kMaxValue = kLimited, }; -// LINT.ThenChange(/tools/metrics/histograms/enums.xml:CookieControlsMode, /chrome/browser/resources/settings/site_settings/constants.ts:CookieControlsMode) +// LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:CookieControlsMode, //chrome/browser/resources/settings/site_settings/constants.ts:CookieControlsMode) // Default value for |extension_scheme|. const char kDummyExtensionScheme[] = ":no-extension-scheme:";
diff --git a/components/content_settings/core/common/content_settings_pattern.h b/components/content_settings/core/common/content_settings_pattern.h index 06e3fb49..3e3451a 100644 --- a/components/content_settings/core/common/content_settings_pattern.h +++ b/components/content_settings/core/common/content_settings_pattern.h
@@ -103,7 +103,7 @@ // *:443 etc. kMaxValue = kCustomScope }; - // LINT.ThenChange(//tools/metrics/histograms/enums.xml:ContentSettingPatternScope) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:ContentSettingPatternScope) struct PatternParts { PatternParts();
diff --git a/components/enterprise/connectors/core/BUILD.gn b/components/enterprise/connectors/core/BUILD.gn index 95bc0a1..15fae97 100644 --- a/components/enterprise/connectors/core/BUILD.gn +++ b/components/enterprise/connectors/core/BUILD.gn
@@ -4,6 +4,10 @@ import("//build/config/features.gni") import("//components/enterprise/buildflags/buildflags.gni") +if (is_android) { + import("//build/config/android/config.gni") + import("//build/config/android/rules.gni") +} source_set("core") { sources = [ @@ -145,3 +149,15 @@ "//url", ] } + +if (is_android) { + android_library("connectors_java_enums") { + srcjar_deps = [ ":connectors_java_enums_srcjar" ] + + deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ] + } + + java_cpp_enum("connectors_java_enums_srcjar") { + sources = [ "common.h" ] + } +}
diff --git a/components/enterprise/connectors/core/common.h b/components/enterprise/connectors/core/common.h index 9fbda14..196d6937 100644 --- a/components/enterprise/connectors/core/common.h +++ b/components/enterprise/connectors/core/common.h
@@ -89,6 +89,7 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. Keep this enum in sync with // EnterpriseReportingEventType in enums.xml. +// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.enterprise.connectors enum class EnterpriseReportingEventType { kUnknownEvent = 0, kPasswordReuseEvent = 1,
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java index 33cd6e3..ba8fa2df 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -79,17 +79,29 @@ } public boolean isEnabled(boolean isInDesktopWindowingMode) { + if (!isEnabled()) { + return false; + } + String featureString = getFieldTrialParamByFeatureAsString(PARAM_NAME); - // Arbitrary way to enable the feature (e.g. for testing). - boolean isEnabled = isEnabled(); // The feature is supposed to work for desktop windowing only. - boolean isValidDesktopWindowingMode = - featureString.equals(DESKTOP_WM_FIELD) && isInDesktopWindowingMode; - // The feature is supposed to work independently of windowing mode. - boolean isValidAllWindowingMode = featureString.equals(ALL_WM_FIELD); + if (featureString.equals(DESKTOP_WM_FIELD) && isInDesktopWindowingMode) { + return true; + } - return isEnabled || isValidDesktopWindowingMode || isValidAllWindowingMode; + // The feature is supposed to work independently of windowing mode. + if (featureString.equals(ALL_WM_FIELD)) { + return true; + } + + // Enabled for testing. Also corresponds to the "Enabled" option in chrome://flags. + if (featureString.isEmpty()) { + return true; + } + + // Feature is enabled but a wrong param was specified. + return false; } } }
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 5c8945ac..7fe626f 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -98,8 +98,8 @@ IPHExtensionsZeroStatePromoVariant, kIPHExtensionsZeroStatePromoVariantParam, &feature_engagement::kIPHExtensionsZeroStatePromoFeature, - "iph-variant", - IPHExtensionsZeroStatePromoVariant::kCustomUiChipIph, + "x_iph-variant", + IPHExtensionsZeroStatePromoVariant::kCustomActionIph, &kIPHExtensionsZeroStatePromoVariantOptions); #endif BASE_FEATURE(kIPHFocusHelpBubbleScreenReaderPromoFeature,
diff --git a/components/live_caption/views/translation_view_wrapper_base.cc b/components/live_caption/views/translation_view_wrapper_base.cc index 781ed122..f26ca9ad 100644 --- a/components/live_caption/views/translation_view_wrapper_base.cc +++ b/components/live_caption/views/translation_view_wrapper_base.cc
@@ -7,6 +7,8 @@ #include <cstddef> #include <memory> +#include "base/check.h" +#include "base/check_op.h" #include "base/feature_list.h" #include "components/language/core/common/language_util.h" #include "components/live_caption/caption_bubble_settings.h" @@ -33,17 +35,25 @@ #include "ui/views/view.h" namespace captions { +namespace { -class LanguageTextButton : public views::MdTextButton { +void InitButton(views::MdTextButton* button, views::Label* label) { + button->SetCustomPadding(kLanguageButtonInsets); + label->SetMultiLine(false); + button->SetImageLabelSpacing(kLanguageButtonImageLabelSpacing); + button->SetBgColorIdOverride(ui::kColorLiveCaptionBubbleButtonBackground); + button->SetPaintToLayer(); +} + +} // namespace + +class LanguageTextButton : public views::MdTextButton, + public TranslationViewWrapperBase::LanguageButton { METADATA_HEADER(LanguageTextButton, views::MdTextButton) public: explicit LanguageTextButton(views::MdTextButton::PressedCallback callback) : views::MdTextButton(std::move(callback)) { - SetCustomPadding(kLanguageButtonInsets); - label()->SetMultiLine(false); - SetImageLabelSpacing(kLanguageButtonImageLabelSpacing); - SetBgColorIdOverride(ui::kColorLiveCaptionBubbleButtonBackground); - SetPaintToLayer(); + InitButton(GetMdTextButton(), GetLabel()); } LanguageTextButton(const LanguageTextButton&) = delete; @@ -54,28 +64,24 @@ return ui::mojom::CursorType::kHand; } - void SetTextScaleFactor(double text_scale_factor) { - SetFocusRingCornerRadius(text_scale_factor * kLineHeightDip / 2); - } + views::MdTextButton* GetMdTextButton() override { return this; } - views::Label* GetLabel() { return label(); } + views::Label* GetLabel() override { return label(); } }; BEGIN_METADATA(LanguageTextButton) END_METADATA -class LanguageDropdownButton : public views::MdTextButtonWithDownArrow { +class LanguageDropdownButton + : public views::MdTextButtonWithDownArrow, + public TranslationViewWrapperBase::LanguageButton { METADATA_HEADER(LanguageDropdownButton, views::MdTextButtonWithDownArrow) public: LanguageDropdownButton( views::MdTextButtonWithDownArrow::PressedCallback callback, std::u16string label_text) : views::MdTextButtonWithDownArrow(std::move(callback), label_text) { - SetCustomPadding(kLanguageButtonInsets); - label()->SetMultiLine(false); - SetImageLabelSpacing(kLanguageButtonImageLabelSpacing); - SetBgColorIdOverride(ui::kColorLiveCaptionBubbleButtonBackground); - SetPaintToLayer(); + InitButton(GetMdTextButton(), GetLabel()); } LanguageDropdownButton(const LanguageDropdownButton&) = delete; @@ -86,11 +92,9 @@ return ui::mojom::CursorType::kHand; } - void SetTextScaleFactor(double text_scale_factor) { - SetFocusRingCornerRadius(text_scale_factor * kLineHeightDip / 2); - } + views::MdTextButton* GetMdTextButton() override { return this; } - views::Label* GetLabel() { return label(); } + views::Label* GetLabel() override { return label(); } }; BEGIN_METADATA(LanguageDropdownButton) @@ -134,29 +138,24 @@ translation_header_text_ = translate_indicator_container->AddChildView(std::move(translation_text)); - auto source_language_button = - std::make_unique<LanguageTextButton>(base::BindRepeating( - &TranslationViewWrapperBase::OnSourceLanguageButtonPressed, - base::Unretained(this))); - source_language_button->GetViewAccessibility().SetIsIgnored(true); - auto target_language_button = std::make_unique<LanguageDropdownButton>( - base::BindRepeating( - &TranslationViewWrapperBase::OnTargetLanguageButtonPressed, - base::Unretained(this)), - target_language_text_); - target_language_button->GetViewAccessibility().SetIsIgnored(true); - source_language_text_ = GetSourceLanguageName(); target_language_text_ = GetTargetLanguageName(); translate_indicator_container_ = translate_container->AddChildView( std::move(translate_indicator_container)); - source_language_button_ = - translate_container->AddChildView(std::move(source_language_button)); + source_language_button_index_ = AddLanguageTextButton( + translate_container, + base::BindRepeating( + &TranslationViewWrapperBase::OnSourceLanguageButtonPressed, + base::Unretained(this))); translate_arrow_icon_ = translate_container->AddChildView(std::make_unique<views::ImageView>()); - target_language_button_ = - translate_container->AddChildView(std::move(target_language_button)); + target_language_button_index_ = AddLanguageDropdownButton( + translate_container, + base::BindRepeating( + &TranslationViewWrapperBase::OnTargetLanguageButtonPressed, + base::Unretained(this)), + target_language_text_); translation_menu_model_ = std::make_unique<ui::SimpleMenuModel>(this); // Add 1 to account for unknown language option at index 0 in @@ -167,13 +166,18 @@ translation_menu_model_->AddCheckItem( i, translate_ui_languages_manager_->GetLanguageNameAt(i)); } + MaybeAddChildViews(translate_container); UpdateLanguageLabel(); delegate_->UpdateLanguageDirection(GetDisplayLanguage()); } std::vector<raw_ptr<views::View, VectorExperimental>> TranslationViewWrapperBase::GetButtons() { - return {source_language_button_.get(), target_language_button_.get()}; + std::vector<raw_ptr<views::View, VectorExperimental>> buttons; + for (auto& language_button : language_buttons_) { + buttons.push_back(language_button->GetMdTextButton()); + } + return buttons; } void TranslationViewWrapperBase::SetTextSizeAndFontFamily( @@ -182,41 +186,36 @@ translation_header_text_->SetLineHeight(kLiveTranslateLabelLineHeightDip * text_scale_factor); translation_header_text_->SetFontList(font_list); - source_language_button_->GetLabel()->SetLineHeight( - kLiveTranslateLabelLineHeightDip * text_scale_factor); - source_language_button_->GetLabel()->SetFontList(font_list); - source_language_button_->SetTextScaleFactor(text_scale_factor); - target_language_button_->GetLabel()->SetLineHeight( - kLiveTranslateLabelLineHeightDip * text_scale_factor); - target_language_button_->GetLabel()->SetFontList(font_list); - target_language_button_->SetTextScaleFactor(text_scale_factor); + for (auto& language_button : language_buttons_) { + language_button->GetLabel()->SetLineHeight( + kLiveTranslateLabelLineHeightDip * text_scale_factor); + language_button->GetLabel()->SetFontList(font_list); + language_button->GetMdTextButton()->SetFocusRingCornerRadius( + text_scale_factor * kLineHeightDip / 2); + } } void TranslationViewWrapperBase::SetTextColor( SkColor language_label_color, SkColor language_label_border_color, SkColor header_color) { - source_language_button_->SetEnabledTextColors(language_label_color); - target_language_button_->SetEnabledTextColors(language_label_color); + for (auto& language_button : language_buttons_) { + views::MdTextButton* const button = language_button->GetMdTextButton(); + button->SetEnabledTextColors(language_label_color); // On macOS whenever the caption bubble is not in main focus the button state // is set to disabled. These buttons are never disabled so it is okay to // override this state. #if BUILDFLAG(IS_MAC) - source_language_button_->SetTextColor(views::Button::STATE_DISABLED, - language_label_color); - target_language_button_->SetTextColor(views::Button::STATE_DISABLED, - language_label_color); + button->SetTextColor(views::Button::STATE_DISABLED, language_label_color); #endif - // TODO(crbug.com/40259212): The live caption bubble allows users to set - // their own color and alpha value from a predefined list. This SKColor is - // calculated during ParseNonTransparentRGBACSSColorString, however the - // equivalent ui::ColorId may not exist. To avoid needing to define around - // 40 new color ids to account for each combination, we use the deprecated - // SKColor function. - source_language_button_->SetStrokeColorOverrideDeprecated( - language_label_border_color); - target_language_button_->SetStrokeColorOverrideDeprecated( - language_label_border_color); + // TODO(crbug.com/40259212): The live caption bubble allows users to set + // their own color and alpha value from a predefined list. This SKColor is + // calculated during ParseNonTransparentRGBACSSColorString, however the + // equivalent ui::ColorId may not exist. To avoid needing to define around + // 40 new color ids to account for each combination, we use the deprecated + // SKColor function. + button->SetStrokeColorOverrideDeprecated(language_label_border_color); + } translation_header_text_->SetEnabledColor(header_color); translate_icon_->SetImage(ui::ImageModel::FromVectorIcon( vector_icons::kTranslateIcon, header_color, kLiveTranslateImageWidthDip)); @@ -228,37 +227,14 @@ } void TranslationViewWrapperBase::UpdateLanguageLabel() { - const bool live_translate_enabled = - caption_bubble_settings()->IsLiveTranslateFeatureEnabled(); // We update the language text and set it whenever live translate OR // multilingual live captions are enabled. We early out when both are // disabled. - if (!live_translate_enabled && + if (!caption_bubble_settings()->IsLiveTranslateFeatureEnabled() && !base::FeatureList::IsEnabled(media::kLiveCaptionMultiLanguage)) { return; } - - CHECK(source_language_button_ != nullptr); - if (auto_detected_source_language_) { - source_language_button_->SetText(l10n_util::GetStringFUTF16( - IDS_LIVE_CAPTION_CAPTION_LANGUAGE_AUTODETECTED, source_language_text_)); - } else { - source_language_button_->SetText(source_language_text_); - } - - if (live_translate_enabled && - caption_bubble_settings()->GetLiveTranslateEnabled()) { - if (SourceAndTargetLanguageCodeMatch() && auto_detected_source_language_) { - target_language_button_->SetText(l10n_util::GetStringFUTF16( - IDS_LIVE_CAPTION_CAPTION_LANGUAGE_AUTODETECTED, - target_language_text_)); - } else { - target_language_button_->SetText(target_language_text_); - } - SetTranslationsViewVisible(true); - } else { - SetTranslationsViewVisible(false); - } + UpdateLanguageLabelInternal(); } void TranslationViewWrapperBase::OnAutoDetectedLanguageChanged( @@ -278,30 +254,31 @@ } void TranslationViewWrapperBase::UpdateContentSize() { - source_language_button_->SetMinSize(gfx::Size()); - source_language_button_->SetPreferredSize( - source_language_button_->CalculatePreferredSize({})); - target_language_button_->SetMinSize(gfx::Size()); - target_language_button_->SetPreferredSize( - target_language_button_->CalculatePreferredSize({})); + for (auto& language_button : language_buttons_) { + views::MdTextButton* const button = language_button->GetMdTextButton(); + button->SetMinSize(gfx::Size()); + button->SetPreferredSize(button->CalculatePreferredSize({})); + } } views::Label* TranslationViewWrapperBase::GetSourceLanguageLabelForTesting() { - return views::AsViewClass<views::Label>(source_language_button_->GetLabel()); + return views::AsViewClass<views::Label>( + language_buttons_[source_language_button_index_]->GetLabel()); } views::Label* TranslationViewWrapperBase::GetTargetLanguageLabelForTesting() { - return views::AsViewClass<views::Label>(target_language_button_->GetLabel()); + return views::AsViewClass<views::Label>( + language_buttons_[target_language_button_index_]->GetLabel()); } views::MdTextButton* TranslationViewWrapperBase::GetSourceLanguageButtonForTesting() { - return source_language_button_.get(); + return source_language_button(); } views::MdTextButton* TranslationViewWrapperBase::GetTargetLanguageButtonForTesting() { - return target_language_button_.get(); + return target_language_button(); } views::View* TranslationViewWrapperBase::GetTranslateIconAndTextForTesting() { @@ -323,9 +300,72 @@ } } +void TranslationViewWrapperBase::MaybeAddChildViews( + views::View* translate_container) {} + +void TranslationViewWrapperBase::UpdateLanguageLabelInternal() { + if (auto_detected_source_language_) { + source_language_button()->SetText(l10n_util::GetStringFUTF16( + IDS_LIVE_CAPTION_CAPTION_LANGUAGE_AUTODETECTED, source_language_text_)); + } else { + source_language_button()->SetText(source_language_text_); + } + + if (caption_bubble_settings()->IsLiveTranslateFeatureEnabled() && + caption_bubble_settings()->GetLiveTranslateEnabled()) { + if (SourceAndTargetLanguageCodeMatch() && auto_detected_source_language_) { + target_language_button()->SetText(l10n_util::GetStringFUTF16( + IDS_LIVE_CAPTION_CAPTION_LANGUAGE_AUTODETECTED, + target_language_text_)); + } else { + target_language_button()->SetText(target_language_text_); + } + SetTranslationsViewVisible(true); + } else { + SetTranslationsViewVisible(false); + } +} + +int TranslationViewWrapperBase::AddLanguageTextButton( + views::View* translate_container, + views::MdTextButton::PressedCallback callback) { + auto language_button = + std::make_unique<LanguageTextButton>(std::move(callback)); + language_button->GetMdTextButton()->GetViewAccessibility().SetIsIgnored(true); + language_buttons_.push_back( + translate_container->AddChildView(std::move(language_button))); + return language_buttons_.size() - 1; +} + +int TranslationViewWrapperBase::AddLanguageDropdownButton( + views::View* translate_container, + views::MdTextButtonWithDownArrow::PressedCallback callback, + const std::u16string& label_text) { + auto language_button = + std::make_unique<LanguageDropdownButton>(std::move(callback), label_text); + language_button->GetMdTextButton()->GetViewAccessibility().SetIsIgnored(true); + language_buttons_.push_back( + translate_container->AddChildView(std::move(language_button))); + return language_buttons_.size() - 1; +} + +views::MdTextButton* TranslationViewWrapperBase::button(int index) const { + return language_buttons_.at(index)->GetMdTextButton(); +} + +views::MdTextButton* TranslationViewWrapperBase::source_language_button() + const { + return button(source_language_button_index_); +} + +views::MdTextButton* TranslationViewWrapperBase::target_language_button() + const { + return button(target_language_button_index_); +} + void TranslationViewWrapperBase::SetTranslationsViewVisible( bool live_translate_enabled) { - target_language_button_->SetVisible(live_translate_enabled); + target_language_button()->SetVisible(live_translate_enabled); translate_indicator_container_->SetVisible(live_translate_enabled); translate_arrow_icon_->SetVisible(live_translate_enabled); @@ -336,9 +376,9 @@ const bool sourceMatchesTarget = SourceAndTargetLanguageCodeMatch(); translate_indicator_container_->SetVisible(!sourceMatchesTarget); translate_arrow_icon_->SetVisible(!sourceMatchesTarget); - source_language_button_->SetVisible(!sourceMatchesTarget); + source_language_button()->SetVisible(!sourceMatchesTarget); } else { - source_language_button_->SetVisible(true); + source_language_button()->SetVisible(true); } } @@ -397,9 +437,10 @@ void TranslationViewWrapperBase::OnTargetLanguageButtonPressed() { translation_menu_runner_ = std::make_unique<views::MenuRunner>( translation_menu_model_.get(), views::MenuRunner::COMBOBOX); - const gfx::Rect& screen_bounds = target_language_button_->GetBoundsInScreen(); + const gfx::Rect& screen_bounds = + target_language_button()->GetBoundsInScreen(); translation_menu_runner_->RunMenuAt( - target_language_button_->GetWidget(), /*button_controller=*/nullptr, + target_language_button()->GetWidget(), /*button_controller=*/nullptr, screen_bounds, views::MenuAnchorPosition::kTopLeft, ui::mojom::MenuSourceType::kMouse); }
diff --git a/components/live_caption/views/translation_view_wrapper_base.h b/components/live_caption/views/translation_view_wrapper_base.h index 670f1ef..db71cb6 100644 --- a/components/live_caption/views/translation_view_wrapper_base.h +++ b/components/live_caption/views/translation_view_wrapper_base.h
@@ -14,6 +14,8 @@ #include "base/memory/weak_ptr.h" #include "components/live_caption/caption_bubble_settings.h" #include "ui/menus/simple_menu_model.h" +#include "ui/views/controls/button/md_text_button.h" +#include "ui/views/controls/button/md_text_button_with_down_arrow.h" #include "ui/views/controls/menu/menu_runner.h" namespace gfx { @@ -27,7 +29,6 @@ namespace views { class ImageView; class Label; -class MdTextButton; class View; class MenuRunner; @@ -35,9 +36,6 @@ namespace captions { -class LanguageTextButton; -class LanguageDropdownButton; - class TranslationViewWrapperBase : public ui::SimpleMenuModel::Delegate, public CaptionBubbleSettings::Observer { public: @@ -57,6 +55,19 @@ Delegate() = default; }; + class LanguageButton { + public: + LanguageButton() = default; + + LanguageButton(const LanguageButton&) = delete; + LanguageButton& operator=(const LanguageButton&) = delete; + + virtual ~LanguageButton() = default; + + virtual views::MdTextButton* GetMdTextButton() = 0; + virtual views::Label* GetLabel() = 0; + }; + TranslationViewWrapperBase(const TranslationViewWrapperBase&) = delete; TranslationViewWrapperBase& operator=(const TranslationViewWrapperBase&) = delete; @@ -93,8 +104,24 @@ virtual CaptionBubbleSettings* caption_bubble_settings() = 0; + virtual void MaybeAddChildViews(views::View* translate_container); + + virtual void UpdateLanguageLabelInternal(); + + virtual void SetTranslationsViewVisible(bool live_translate_enabled); + + int AddLanguageTextButton(views::View* translate_container, + views::MdTextButton::PressedCallback callback); + + views::MdTextButton* button(int index) const; + views::MdTextButton* source_language_button() const; + views::MdTextButton* target_language_button() const; + private: - void SetTranslationsViewVisible(bool live_translate_enabled); + int AddLanguageDropdownButton( + views::View* translate_container, + views::MdTextButtonWithDownArrow::PressedCallback callback, + const std::u16string& label_text); // ui::SimpleMenuModelDelegate: void ExecuteCommand(int target_language_code_index, int event_flags) override; @@ -124,8 +151,9 @@ translate_ui_languages_manager_; raw_ptr<views::Label> translation_header_text_; - raw_ptr<LanguageTextButton> source_language_button_; - raw_ptr<LanguageDropdownButton> target_language_button_; + int source_language_button_index_ = -1; + int target_language_button_index_ = -1; + std::vector<LanguageButton*> language_buttons_; raw_ptr<views::ImageView> translate_icon_; raw_ptr<views::View> translate_indicator_container_; std::u16string source_language_text_;
diff --git a/components/metrics/dwa/dwa_service.cc b/components/metrics/dwa/dwa_service.cc index 1b466bd..89bb8f4 100644 --- a/components/metrics/dwa/dwa_service.cc +++ b/components/metrics/dwa/dwa_service.cc
@@ -61,8 +61,8 @@ "uk", // United Kingdom }); -// Number of seconds in a week or seven days. (604800 = 7 * 24 * 60 * 60) -const int kOneWeekInSeconds = base::Days(7).InSeconds(); +// One week or seven days represented in base::TimeDelta. +const base::TimeDelta kOneWeek = base::Days(7); const size_t kMinLogQueueCount = 10; const size_t kMinLogQueueSizeBytes = 300 * 1024; // 300 KiB @@ -190,11 +190,11 @@ ::dwa::CoarseSystemInfo::GEO_DESIGNATION_ROW); } - int64_t seconds_since_install = - MetricsLog::GetCurrentTime() - - local_state.GetInt64(metrics::prefs::kInstallDate); + base::TimeDelta time_since_install = + base::Time::Now() - + base::Time::FromTimeT(local_state.GetInt64(metrics::prefs::kInstallDate)); coarse_system_info->set_client_age( - seconds_since_install < kOneWeekInSeconds + time_since_install < kOneWeek ? ::dwa::CoarseSystemInfo::CLIENT_AGE_RECENT : ::dwa::CoarseSystemInfo::CLIENT_AGE_NOT_RECENT);
diff --git a/components/omnibox/browser/autocomplete_classifier.cc b/components/omnibox/browser/autocomplete_classifier.cc index 27dfe1c..032936ce 100644 --- a/components/omnibox/browser/autocomplete_classifier.cc +++ b/components/omnibox/browser/autocomplete_classifier.cc
@@ -62,7 +62,7 @@ .show_recently_closed_tabs ? AutocompleteProvider::TYPE_RECENTLY_CLOSED_TABS : 0) | - (omnibox_feature_configs::ContextualSearch::Get().starter_pack_page + (omnibox_feature_configs::ContextualSearch::Get().show_open_lens_action ? AutocompleteProvider::TYPE_CONTEXTUAL_SEARCH : 0) | #else
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index f0538b3..f60b6c7 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -70,6 +70,7 @@ #include "components/omnibox/browser/local_history_zero_suggest_provider.h" #include "components/omnibox/browser/most_visited_sites_provider.h" #include "components/omnibox/browser/omnibox_field_trial.h" +#include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/on_device_head_provider.h" #include "components/omnibox/browser/open_tab_provider.h" #include "components/omnibox/browser/page_classification_functions.h" @@ -1442,19 +1443,22 @@ // suggestions shouldn't be shown. const bool is_lens_active = !autocomplete_provider_client()->AreLensEntrypointsVisible(); + bool mia_enabled = + omnibox_feature_configs::MiaZPS::Get().enabled && + !omnibox::IsMiaDisabledByPolicy(provider_client_->GetPrefs()); if (update_type == UpdateType::kSyncPass || update_type == UpdateType::kAsyncPass || update_type == UpdateType::kLastAsyncPassExceptDoc) { - internal_result_.SortAndCull(input_, template_url_service_, - triggered_feature_service_, is_lens_active, - old_result.default_match_to_preserve); + internal_result_.SortAndCull( + input_, template_url_service_, triggered_feature_service_, + is_lens_active, mia_enabled, old_result.default_match_to_preserve); internal_result_.TransferOldMatches(input_, &old_result.matches_to_transfer); } - internal_result_.SortAndCull(input_, template_url_service_, - triggered_feature_service_, is_lens_active, - old_result.default_match_to_preserve); + internal_result_.SortAndCull( + input_, template_url_service_, triggered_feature_service_, is_lens_active, + mia_enabled, old_result.default_match_to_preserve); if (update_type == UpdateType::kSyncPass) { StartExpireTimer(); @@ -1646,7 +1650,6 @@ } #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) - // Attach the contextual search fulfillment actions in the @page keyword mode. if (omnibox_feature_configs::ContextualSearch::Get() .contextual_zero_suggest_lens_fulfillment && input_.IsZeroSuggest()) { @@ -1656,6 +1659,8 @@ const TemplateURL* keyword_turl = AutocompleteInput::GetSubstitutingTemplateURLForInput( template_url_service_, &keyword_input); + // Attach the contextual search fulfillment actions in the @page keyword + // mode. if (keyword_turl->starter_pack_id() == TemplateURLStarterPackData::kPage) { internal_result_.AttachContextualSearchFulfillmentActionToMatches(); return;
diff --git a/components/omnibox/browser/autocomplete_grouper_sections.cc b/components/omnibox/browser/autocomplete_grouper_sections.cc index 2d8ba69e..36109b90 100644 --- a/components/omnibox/browser/autocomplete_grouper_sections.cc +++ b/components/omnibox/browser/autocomplete_grouper_sections.cc
@@ -303,7 +303,8 @@ group_configs) {} AndroidNTPZpsSection::AndroidNTPZpsSection( - omnibox::GroupConfigMap& group_configs) + omnibox::GroupConfigMap& group_configs, + bool mia_enabled) : ZpsSectionWithLocalHistory( 30, { @@ -315,14 +316,14 @@ { { omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA, - omnibox_feature_configs::MiaZPS::Get().enabled + mia_enabled ? OmniboxFieldTrial:: kOmniboxNumNtpZpsRecentSearches.Get() : 0, }, { omnibox::GROUP_MIA_RECOMMENDATIONS, - omnibox_feature_configs::MiaZPS::Get().enabled + mia_enabled ? OmniboxFieldTrial:: kOmniboxNumNtpZpsRecentSearches.Get() : 0, @@ -404,7 +405,8 @@ DesktopNTPZpsSection::DesktopNTPZpsSection( omnibox::GroupConfigMap& group_configs, - size_t limit) + size_t limit, + bool mia_enabled) : ZpsSectionWithLocalHistory( limit, { @@ -412,9 +414,8 @@ 8, { {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA, - omnibox_feature_configs::MiaZPS::Get().enabled ? 8 : 0}, - {omnibox::GROUP_MIA_RECOMMENDATIONS, - omnibox_feature_configs::MiaZPS::Get().enabled ? 8 : 0}, + mia_enabled ? 8 : 0}, + {omnibox::GROUP_MIA_RECOMMENDATIONS, mia_enabled ? 8 : 0}, {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST, 8}, }), Group(8, @@ -687,7 +688,8 @@ ZpsSection::InitFromMatches(matches); } -IOSNTPZpsSection::IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs) +IOSNTPZpsSection::IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs, + bool mia_enabled) : ZpsSectionWithLocalHistory( 26, { @@ -695,15 +697,14 @@ { {omnibox::GROUP_MOBILE_CLIPBOARD, 1}, }), - Group( - 20, - { - {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA, - omnibox_feature_configs::MiaZPS::Get().enabled ? 20 : 0}, - {omnibox::GROUP_MIA_RECOMMENDATIONS, - omnibox_feature_configs::MiaZPS::Get().enabled ? 20 : 0}, - {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST, 20}, - }), + Group(20, + { + {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA, + mia_enabled ? 20 : 0}, + {omnibox::GROUP_MIA_RECOMMENDATIONS, + mia_enabled ? 20 : 0}, + {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST, 20}, + }), Group(5, { {omnibox::GROUP_TRENDS, 5}, @@ -781,7 +782,8 @@ IOSIpadNTPZpsSection::IOSIpadNTPZpsSection( size_t trends_count, size_t total_count, - omnibox::GroupConfigMap& group_configs) + omnibox::GroupConfigMap& group_configs, + bool mia_enabled) : ZpsSectionWithLocalHistory( total_count, { @@ -793,15 +795,11 @@ { { omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA, - omnibox_feature_configs::MiaZPS::Get().enabled - ? total_count - trends_count - 1 - : 0, + mia_enabled ? total_count - trends_count - 1 : 0, }, { omnibox::GROUP_MIA_RECOMMENDATIONS, - omnibox_feature_configs::MiaZPS::Get().enabled - ? total_count - trends_count - 1 - : 0, + mia_enabled ? total_count - trends_count - 1 : 0, }, {omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST, total_count - trends_count - 1},
diff --git a/components/omnibox/browser/autocomplete_grouper_sections.h b/components/omnibox/browser/autocomplete_grouper_sections.h index af6c1a76..aff07a5 100644 --- a/components/omnibox/browser/autocomplete_grouper_sections.h +++ b/components/omnibox/browser/autocomplete_grouper_sections.h
@@ -138,7 +138,8 @@ // - up to 5 trending search suggestions. class AndroidNTPZpsSection : public ZpsSectionWithLocalHistory { public: - explicit AndroidNTPZpsSection(omnibox::GroupConfigMap& group_configs); + AndroidNTPZpsSection(omnibox::GroupConfigMap& group_configs, + bool mia_enabled); }; // Section expressing the Android ZPS limits and grouping for the SRP. @@ -172,8 +173,9 @@ // - up to 8 trending search suggestions. class DesktopNTPZpsSection : public ZpsSectionWithLocalHistory { public: - explicit DesktopNTPZpsSection(omnibox::GroupConfigMap& group_configs, - size_t limit); + DesktopNTPZpsSection(omnibox::GroupConfigMap& group_configs, + size_t limit, + bool mia_enabled); }; // Section expressing the Desktop ZPS limits and grouping for unscoped @@ -284,7 +286,7 @@ // - up to `max_trending_queries` trending suggestions. class IOSNTPZpsSection : public ZpsSectionWithLocalHistory { public: - explicit IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs); + IOSNTPZpsSection(omnibox::GroupConfigMap& group_configs, bool mia_enabled); }; // Section expressing the iPhone ZPS limits and grouping for the SRP. @@ -328,7 +330,8 @@ public: explicit IOSIpadNTPZpsSection(size_t trends_count, size_t total_count, - omnibox::GroupConfigMap& group_configs); + omnibox::GroupConfigMap& group_configs, + bool mia_enabled); }; // Section expressing the iPad ZPS limits and grouping for the SRP.
diff --git a/components/omnibox/browser/autocomplete_grouper_sections_unittest.cc b/components/omnibox/browser/autocomplete_grouper_sections_unittest.cc index 74b0b3e2..3fa02d28 100644 --- a/components/omnibox/browser/autocomplete_grouper_sections_unittest.cc +++ b/components/omnibox/browser/autocomplete_grouper_sections_unittest.cc
@@ -157,7 +157,7 @@ PSections sections; omnibox::GroupConfigMap group_configs; sections.push_back( - std::make_unique<DesktopNTPZpsSection>(group_configs, 8u)); + std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, false)); auto out_matches = Section::GroupMatches(std::move(sections), matches); VerifyMatches(out_matches, expected_relevances); }; @@ -279,6 +279,7 @@ // Tests the groups, limits, and rules for the Desktop NTP ZPS section. TEST(AutocompleteGrouperSectionsTest, DesktopNTPZpsSectionWithMIA) { auto test = [](std::vector<std::pair<int, omnibox::GroupId>> input, + bool mia_enabled, std::vector<std::pair<int, omnibox::GroupId>> output) { ACMatches in_matches; for (const auto& [relevance, group_id] : input) { @@ -287,7 +288,7 @@ PSections sections; omnibox::GroupConfigMap group_configs; sections.push_back( - std::make_unique<DesktopNTPZpsSection>(group_configs, 8u)); + std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, mia_enabled)); auto out_matches = Section::GroupMatches(std::move(sections), in_matches); VerifyMatches(out_matches, output); }; @@ -295,10 +296,6 @@ { SCOPED_TRACE( "MIA above pSuggest - local history zps takes precedence over Trends."); - omnibox_feature_configs::ScopedConfigForTesting< - omnibox_feature_configs::MiaZPS> - scoped_config; - scoped_config.Get().enabled = true; test( { // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and @@ -324,6 +321,7 @@ {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, }, + /*mia_enabled=*/true, { {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, @@ -339,10 +337,6 @@ SCOPED_TRACE( "MIA below pSuggest - Local history zps is grouped with pSuggest but " "doesn't take precedence over non-Trends."); - omnibox_feature_configs::ScopedConfigForTesting< - omnibox_feature_configs::MiaZPS> - scoped_config; - scoped_config.Get().enabled = true; test( { // remote `GROUP_PERSONALIZED_ZERO_SUGGEST` should all be added. @@ -367,6 +361,7 @@ {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, }, + /*mia_enabled=*/true, { {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, @@ -382,10 +377,6 @@ SCOPED_TRACE( "MIA and no pSuggest - Local history zps doesn't take precedence over " "non-Trends."); - omnibox_feature_configs::ScopedConfigForTesting< - omnibox_feature_configs::MiaZPS> - scoped_config; - scoped_config.Get().enabled = true; test( { // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and @@ -408,6 +399,7 @@ {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, }, + /*mia_enabled=*/true, { {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, @@ -423,10 +415,6 @@ SCOPED_TRACE( "MIA and no pSuggest - Local history zps added but doesn't take " "precedence over non-Trends."); - omnibox_feature_configs::ScopedConfigForTesting< - omnibox_feature_configs::MiaZPS> - scoped_config; - scoped_config.Get().enabled = true; test( { // `GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA` and @@ -449,6 +437,7 @@ {48, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {47, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, }, + /*mia_enabled=*/true, { {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST_WITH_MIA}, @@ -462,10 +451,6 @@ } { SCOPED_TRACE("MIA is not added if feature is disabled."); - omnibox_feature_configs::ScopedConfigForTesting< - omnibox_feature_configs::MiaZPS> - scoped_config; - scoped_config.Get().enabled = false; test( { // remote `GROUP_PERSONALIZED_ZERO_SUGGEST` should all be added. @@ -485,6 +470,7 @@ // local `GROUP_PERSONALIZED_ZERO_SUGGEST` should be added. {50, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, }, + /*mia_enabled=*/false, { {90, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, {89, omnibox::GROUP_PERSONALIZED_ZERO_SUGGEST}, @@ -506,7 +492,7 @@ PSections sections; omnibox::GroupConfigMap group_configs; sections.push_back( - std::make_unique<DesktopNTPZpsSection>(group_configs, 7u)); + std::make_unique<DesktopNTPZpsSection>(group_configs, 7u, false)); sections.push_back( std::make_unique<DesktopNTPZpsIPHSection>(group_configs)); auto out_matches = Section::GroupMatches(std::move(sections), matches); @@ -1327,7 +1313,8 @@ PSections sections; omnibox::GroupConfigMap group_configs; - sections.push_back(std::make_unique<AndroidNTPZpsSection>(group_configs)); + sections.push_back( + std::make_unique<AndroidNTPZpsSection>(group_configs, false)); auto out_matches = Section::GroupMatches(std::move(sections), matches); VerifyMatches(out_matches, expected_relevances); }; @@ -1570,7 +1557,8 @@ auto test = [](ACMatches matches, std::vector<int> expected_relevances) { PSections sections; omnibox::GroupConfigMap group_configs; - sections.push_back(std::make_unique<IOSNTPZpsSection>(group_configs)); + sections.push_back( + std::make_unique<IOSNTPZpsSection>(group_configs, false)); auto out_matches = Section::GroupMatches(std::move(sections), matches); VerifyMatches(out_matches, expected_relevances); }; @@ -1753,7 +1741,7 @@ group_configs[group4].set_side_type( omnibox::GroupConfig_SideType_SECONDARY); sections.push_back( - std::make_unique<DesktopNTPZpsSection>(group_configs, 8u)); + std::make_unique<DesktopNTPZpsSection>(group_configs, 8u, false)); sections.push_back( std::make_unique<DesktopSecondaryNTPZpsSection>(group_configs)); auto out_matches = Section::GroupMatches(std::move(sections), matches);
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index 1db2264..a70ee8b 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc
@@ -391,6 +391,7 @@ TemplateURLService* template_url_service, OmniboxTriggeredFeatureService* triggered_feature_service, bool is_lens_active, + bool mia_enabled, std::optional<AutocompleteMatch> default_match_to_preserve) { SCOPED_UMA_HISTOGRAM_TIMER_MICROS( "Omnibox.AutocompletionTime.UpdateResult.SortAndCull"); @@ -446,8 +447,8 @@ PSections sections; if constexpr (is_android) { if (omnibox::IsNTPPage(page_classification)) { - sections.push_back( - std::make_unique<AndroidNTPZpsSection>(suggestion_groups_map_)); + sections.push_back(std::make_unique<AndroidNTPZpsSection>( + suggestion_groups_map_, mia_enabled)); } else if (omnibox::IsSearchResultsPage(page_classification)) { sections.push_back( std::make_unique<AndroidSRPZpsSection>(suggestion_groups_map_)); @@ -463,8 +464,12 @@ is_lens_active ? 0u : omnibox_feature_configs::ContextualSearch::Get() .contextual_zps_limit; + // Make space for the extra Lens action. It needs to be included above + // any contextual search matches but does not count against their limit. const size_t contextual_action_limit = - contextual_zps_limit > 0u ? 1u : 0u; + omnibox_feature_configs::ContextualSearch::Get().show_open_lens_action + ? 1u + : 0u; if (omnibox::IsLensSearchbox(page_classification)) { switch (page_classification) { case OmniboxEventProto::CONTEXTUAL_SEARCHBOX: @@ -490,7 +495,7 @@ page_classification != OmniboxEventProto::NTP_REALBOX && has_iph_match; sections.push_back(std::make_unique<DesktopNTPZpsSection>( - suggestion_groups_map_, add_iph_section ? 7u : 8u)); + suggestion_groups_map_, add_iph_section ? 7u : 8u, mia_enabled)); #if BUILDFLAG(ENABLE_EXTENSIONS) // Show unscoped extension suggestions on NTP except in the realbox. if (base::FeatureList::IsEnabled( @@ -538,9 +543,6 @@ } #endif } else { - // Make space for the extra action when there is any contextual search - // budget. It needs to be included above any contextual search matches - // but does not count against their limit. sections.push_back(std::make_unique<DesktopWebURLZpsSection>( suggestion_groups_map_, max_url_suggestions)); sections.push_back(std::make_unique<DesktopWebSearchZpsSection>( @@ -564,7 +566,8 @@ if (omnibox::IsNTPPage(page_classification)) { sections.push_back(std::make_unique<IOSIpadNTPZpsSection>( - num_trending_queries, total_count, suggestion_groups_map_)); + num_trending_queries, total_count, suggestion_groups_map_, + mia_enabled)); } else if (omnibox::IsSearchResultsPage(page_classification)) { sections.push_back(std::make_unique<IOSIpadSRPZpsSection>( total_count, suggestion_groups_map_)); @@ -584,8 +587,8 @@ NOTREACHED(base::NotFatalUntil::M200); } } else if (omnibox::IsNTPPage(page_classification)) { - sections.push_back( - std::make_unique<IOSNTPZpsSection>(suggestion_groups_map_)); + sections.push_back(std::make_unique<IOSNTPZpsSection>( + suggestion_groups_map_, mia_enabled)); } else if (omnibox::IsSearchResultsPage(page_classification)) { sections.push_back( std::make_unique<IOSSRPZpsSection>(suggestion_groups_map_));
diff --git a/components/omnibox/browser/autocomplete_result.h b/components/omnibox/browser/autocomplete_result.h index 08c5283..494e4dd2 100644 --- a/components/omnibox/browser/autocomplete_result.h +++ b/components/omnibox/browser/autocomplete_result.h
@@ -124,6 +124,7 @@ TemplateURLService* template_url_service, OmniboxTriggeredFeatureService* triggered_feature_service, bool is_lens_active, + bool mia_enabled = false, std::optional<AutocompleteMatch> default_match_to_preserve = std::nullopt);
diff --git a/components/omnibox/browser/autocomplete_result_unittest.cc b/components/omnibox/browser/autocomplete_result_unittest.cc index 3a0da74..a3ee8b43 100644 --- a/components/omnibox/browser/autocomplete_result_unittest.cc +++ b/components/omnibox/browser/autocomplete_result_unittest.cc
@@ -1187,7 +1187,7 @@ // Run SortAndCull, but try to keep the first entry of last_matches on top. current_result.SortAndCull( input, &template_url_service(), triggered_feature_service(), - /*is_lens_active=*/false, *last_result.match_at(0)); + /*is_lens_active=*/false, false, *last_result.match_at(0)); AssertResultMatches(current_result, expected); };
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc index 2f70746..0846675 100644 --- a/components/omnibox/browser/document_provider.cc +++ b/components/omnibox/browser/document_provider.cc
@@ -686,16 +686,25 @@ // static std::u16string DocumentProvider::GetProductDescriptionString( const std::string& mimetype) { - if (mimetype == kDocumentMimetype) - return l10n_util::GetStringUTF16(IDS_DRIVE_SUGGESTION_DOCUMENT); - if (mimetype == kFormMimetype) - return l10n_util::GetStringUTF16(IDS_DRIVE_SUGGESTION_FORM); - if (mimetype == kSpreadsheetMimetype) - return l10n_util::GetStringUTF16(IDS_DRIVE_SUGGESTION_SPREADSHEET); - if (mimetype == kPresentationMimetype) - return l10n_util::GetStringUTF16(IDS_DRIVE_SUGGESTION_PRESENTATION); + if (mimetype == kDocumentMimetype) { + return l10n_util::GetStringUTF16( + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS); + } + if (mimetype == kFormMimetype) { + return l10n_util::GetStringUTF16( + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS); + } + if (mimetype == kSpreadsheetMimetype) { + return l10n_util::GetStringUTF16( + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS); + } + if (mimetype == kPresentationMimetype) { + return l10n_util::GetStringUTF16( + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES); + } // Fallback to "Drive" for other filetypes. - return l10n_util::GetStringUTF16(IDS_DRIVE_SUGGESTION_GENERAL); + return l10n_util::GetStringUTF16( + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE); } // static
diff --git a/components/omnibox/browser/enterprise_search_aggregator_provider.cc b/components/omnibox/browser/enterprise_search_aggregator_provider.cc index 732431f..ad6d8a2 100644 --- a/components/omnibox/browser/enterprise_search_aggregator_provider.cc +++ b/components/omnibox/browser/enterprise_search_aggregator_provider.cc
@@ -167,79 +167,80 @@ const std::string_view file_type_description; }; -// A mapping from `mime_type` to the human readable `file_type_description`. +// A mapping from `mime_type` to the human readable `file_type_description` for +// selected MIME types. // Mappings documentation: // https://developers.google.com/drive/api/guides/mime-types // https://developers.google.com/drive/api/guides/ref-export-formats -// TODO(crbug.com/402436108): Localize the following strings. -const auto kMimeTypeMapping = base::MakeFixedFlatMap<std::string_view, - std::string_view>({ - {"application/vnd.google-apps.audio", "Audio"}, - {"application/vnd.google-apps.document", "Google Docs"}, - {"application/vnd.google-apps.drive-sdk", "Third-party shortcut"}, - {"application/vnd.google-apps.drawing", "Google Drawings"}, - {"application/vnd.google-apps.file", "Google Drive file"}, - {"application/vnd.google-apps.folder", "Google Drive folder"}, - {"application/vnd.google-apps.form", "Google Forms"}, - {"application/vnd.google-apps.fusiontable", "Google Fusion Tables"}, - {"application/vnd.google-apps.jam", "Google Jamboard"}, - {"application/vnd.google-apps.mail-layout", "Email layout"}, - {"application/vnd.google-apps.map", "Google My Maps"}, - {"application/vnd.google-apps.photo", "Google Photos"}, - {"application/vnd.google-apps.presentation", "Google Slides"}, - {"application/vnd.google-apps.script", "Google Apps Script"}, - {"application/vnd.google-apps.shortcut", "Shortcut"}, - {"application/vnd.google-apps.site", "Google Sites"}, - {"application/vnd.google-apps.spreadsheet", "Google Sheets"}, - {"application/vnd.google-apps.unknown", ""}, - {"application/vnd.google-apps.vid", "MP4"}, - {"application/vnd.google-apps.video", "Video"}, - {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "Microsoft Word"}, - {"application/vnd.oasis.opendocument.text", "OpenDocument"}, - {"application/rtf", "Rich Text"}, - {"application/pdf", "PDF"}, - {"text/plain", "Plain Text"}, - {"application/zip", "ZIP"}, - {"application/epub+zip", "EPUB ZIP"}, - {"text/markdown", "Markdown"}, - {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - "Microsoft Excel"}, - {"application/x-vnd.oasis.opendocument.spreadsheet", - "OpenDocument Spreadsheet"}, - {"text/csv", "Comma Separated Values"}, - {"text/tab-separated-values", "Tab Separated Values"}, +const auto kMimeTypeMapping = base::MakeFixedFlatMap<std::string_view, int>({ + {"application/json", IDS_CONTENT_SUGGESTION_DESCRIPTION_JSON}, + {"application/rtf", IDS_CONTENT_SUGGESTION_DESCRIPTION_RICH_TEXT_FORMAT}, + {"application/pdf", IDS_CONTENT_SUGGESTION_DESCRIPTION_PDF}, + {"application/vnd.google-apps.document", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS}, + {"application/vnd.google-apps.drawing", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRAWINGS}, + {"application/vnd.google-apps.folder", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE_FOLDER}, + {"application/vnd.google-apps.form", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS}, + {"application/vnd.google-apps.jam", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_JAMBOARD}, + {"application/vnd.google-apps.photo", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_PHOTOS}, + {"application/vnd.google-apps.presentation", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES}, + {"application/vnd.google-apps.script", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_APPS_SCRIPT}, + {"application/vnd.google-apps.site", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SITES}, + {"application/vnd.google-apps.spreadsheet", + IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS}, {"application/" "vnd.openxmlformats-officedocument.presentationml.presentation", - "Microsoft PowerPoint"}, - {"application/vnd.oasis.opendocument.presentation", "ODP"}, - {"image/jpeg", "JPEG"}, - {"image/png", "PNG"}, - {"image/svg+xml", "Scalable Vector Graphics"}, - {"application/vnd.google-apps.script+json", "JSON"}, - {"video/quicktime", "Quicktime Video"}, + IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_POWERPOINT}, + {"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_EXCEL}, + {"application/vnd.openxmlformats-officedocument.wordprocessingml.document", + IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_WORD}, + {"application/vnd.oasis.opendocument.presentation", + IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_PRESENTATION}, + {"application/vnd.oasis.opendocument.spreadsheet", + IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_SPREADSHEET}, + {"application/vnd.oasis.opendocument.text", + IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_TEXT}, + {"application/zip", IDS_CONTENT_SUGGESTION_DESCRIPTION_ZIP_FILE}, + {"image/jpeg", IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_JPEG}, + {"image/png", IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_PNG}, + {"image/svg+xml", IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_SVG}, + {"text/csv", IDS_CONTENT_SUGGESTION_DESCRIPTION_COMMA_SEPARATED_VALUES}, + {"text/markdown", IDS_CONTENT_SUGGESTION_DESCRIPTION_MARKDOWN}, + {"text/plain", IDS_CONTENT_SUGGESTION_DESCRIPTION_PLAIN_TEXT}, + {"video/mp4", IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_MP4}, + {"video/quicktime", IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_QUICKTIME}, + {"video/webm", IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_WEBM}, }); // A mapping from `source_type` to the human readable `content_type_description`. -const auto kSourceTypeMapping = base::MakeFixedFlatMap<std::string_view, - std::string_view>({ - {"buganizer", "Buganizer Issue"}, - {"jira", "Jira Issue"}, - {"salesforce", "Salesforce"}, - {"slack", "Slack Message"}, +const auto kSourceTypeMapping = base::MakeFixedFlatMap<std::string_view, int>({ + {"buganizer", IDS_CONTENT_SUGGESTION_DESCRIPTION_BUGANIZER}, + {"jira", IDS_CONTENT_SUGGESTION_DESCRIPTION_JIRA}, + {"salesforce", IDS_CONTENT_SUGGESTION_DESCRIPTION_SALESFORCE}, + {"slack", IDS_CONTENT_SUGGESTION_DESCRIPTION_SLACK}, }); // Helper for converting `mime_type` and `source_type` into a human readable // string. Prioritizes `mime_type` over `source_type`. -std::string_view ContentTypeToDescription(const std::string_view& mime_type, - const std::string_view& source_type) { +std::u16string ContentTypeToDescription(const std::string_view& mime_type, + const std::string_view& source_type) { const auto mimeTypeIter = kMimeTypeMapping.find(mime_type); if (mimeTypeIter != kMimeTypeMapping.end()) { - return mimeTypeIter->second; + return l10n_util::GetStringUTF16(mimeTypeIter->second); } const auto sourceTypeIter = kSourceTypeMapping.find(source_type); - return sourceTypeIter != kSourceTypeMapping.end() ? sourceTypeIter->second - : ""; + return sourceTypeIter != kSourceTypeMapping.end() + ? l10n_util::GetStringUTF16(sourceTypeIter->second) + : std::u16string(); } // Helper for converting unix timestamp `time` into an abbreviated date. @@ -931,12 +932,11 @@ const std::u16string owner = base::UTF8ToUTF16(ptr_to_string( result.FindStringByDottedPath("document.derivedStructData.owner"))); - const std::u16string content_type_description = base::UTF8ToUTF16( - ContentTypeToDescription( - ptr_to_string(result.FindStringByDottedPath( - "document.derivedStructData.mime_type")), - ptr_to_string(result.FindStringByDottedPath( - "document.derivedStructData.source_type")))); + const std::u16string content_type_description = ContentTypeToDescription( + ptr_to_string(result.FindStringByDottedPath( + "document.derivedStructData.mime_type")), + ptr_to_string(result.FindStringByDottedPath( + "document.derivedStructData.source_type"))); return base::UTF16ToUTF8(GetLocalizedContentMetadata( last_updated, owner, content_type_description));
diff --git a/components/omnibox/browser/enterprise_search_aggregator_provider_unittest.cc b/components/omnibox/browser/enterprise_search_aggregator_provider_unittest.cc index 984ec18..15a8da69 100644 --- a/components/omnibox/browser/enterprise_search_aggregator_provider_unittest.cc +++ b/components/omnibox/browser/enterprise_search_aggregator_provider_unittest.cc
@@ -1748,7 +1748,7 @@ ASSERT_EQ(matches.size(), 3u); // Verifies use of MIME type. - EXPECT_EQ(matches[0].contents, u"Quicktime Video"); + EXPECT_EQ(matches[0].contents, u"QuickTime Video"); EXPECT_EQ(matches[0].description, u"Evolution of Dance"); EXPECT_EQ(matches[0].destination_url, GURL("https://url1/")); @@ -1758,7 +1758,7 @@ EXPECT_EQ(matches[1].destination_url, GURL("https://url2/")); // Verifies that MIME type takes precedent over source type. - EXPECT_EQ(matches[2].contents, u"PNG"); + EXPECT_EQ(matches[2].contents, u"PNG Image"); EXPECT_EQ(matches[2].description, u"Same thing we do every night, Pinky"); EXPECT_EQ(matches[2].destination_url, GURL("https://url3/")); }
diff --git a/components/omnibox/browser/omnibox_prefs.cc b/components/omnibox/browser/omnibox_prefs.cc index b8add83e..0b04bdc 100644 --- a/components/omnibox/browser/omnibox_prefs.cc +++ b/components/omnibox/browser/omnibox_prefs.cc
@@ -19,6 +19,11 @@ namespace omnibox { +namespace { +constexpr int kAIModeSearchSuggestAllowed = 0; +constexpr int kAIModeSearchSuggestDisallowed = 1; +} // namespace + void RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref( kKeywordSpaceTriggeringEnabled, true, @@ -42,6 +47,8 @@ registry->RegisterIntegerPref(kShownCountHistoryScopePromo, 0); registry->RegisterIntegerPref(kShownCountHistoryEmbeddingsScopePromo, 0); registry->RegisterIntegerPref(kFocusedSrpWebCount, 0); + registry->RegisterIntegerPref(omnibox::kAIModeSearchSuggestSettings, + kAIModeSearchSuggestAllowed); } void SetUserPreferenceForZeroSuggestCachedResponse( @@ -75,4 +82,9 @@ return value_ptr ? *value_ptr : std::string(); } +bool IsMiaDisabledByPolicy(PrefService* prefs) { + return prefs->GetInteger(omnibox::kAIModeSearchSuggestSettings) == + omnibox::kAIModeSearchSuggestDisallowed; +} + } // namespace omnibox
diff --git a/components/omnibox/browser/omnibox_prefs.h b/components/omnibox/browser/omnibox_prefs.h index 547dafc..78978db 100644 --- a/components/omnibox/browser/omnibox_prefs.h +++ b/components/omnibox/browser/omnibox_prefs.h
@@ -85,6 +85,8 @@ inline constexpr char kShownCountHistoryEmbeddingsScopePromo[] = "omnibox.shown_count_history_embeddings_scope_promo"; inline constexpr char kFocusedSrpWebCount[] = "omnibox.focused_srp_web_count"; +inline constexpr char kAIModeSearchSuggestSettings[] = + "omnibox.ai_mode_search_suggest_settings"; // Many of the prefs defined above are registered locally where they're used. // New prefs should be added here and ordered the same as they're defined above. @@ -102,6 +104,9 @@ PrefService* prefs, const std::string& page_url); +// Returns true if the MIA is disabled per the policy. +bool IsMiaDisabledByPolicy(PrefService* prefs); + } // namespace omnibox #endif // COMPONENTS_OMNIBOX_BROWSER_OMNIBOX_PREFS_H_
diff --git a/components/omnibox/common/omnibox_feature_configs.cc b/components/omnibox/common/omnibox_feature_configs.cc index 3b6cb7a..a4144fc2 100644 --- a/components/omnibox/common/omnibox_feature_configs.cc +++ b/components/omnibox/common/omnibox_feature_configs.cc
@@ -137,6 +137,8 @@ base::FeatureParam<int>(&kContextualSearchAlternativeActionLabel, "LabelIndex", 0) .Get(); + show_open_lens_action = + feature_enabled(kOmniboxContextualSearchOnFocusSuggestions); } ContextualSearch::ContextualSearch(const ContextualSearch&) = default; @@ -145,7 +147,7 @@ ContextualSearch::~ContextualSearch() = default; bool ContextualSearch::IsContextualSearchEnabled() const { - return contextual_zps_limit > 0; + return show_open_lens_action; } bool ContextualSearch::IsEnabledWithPrefetch() const {
diff --git a/components/omnibox/common/omnibox_feature_configs.h b/components/omnibox/common/omnibox_feature_configs.h index 1f9d9677..1315e286 100644 --- a/components/omnibox/common/omnibox_feature_configs.h +++ b/components/omnibox/common/omnibox_feature_configs.h
@@ -189,6 +189,9 @@ // Which alternative action label to use for lens entrypoint action. int alternative_action_label; + + // Whether the Lens entrypoint action should be shown in the Omnibox popup. + bool show_open_lens_action; }; // If enabled, allows MIA zero-prefix suggestions in NTP omnibox and realbox.
diff --git a/components/omnibox_strings.grdp b/components/omnibox_strings.grdp index ff9d990..952d911 100644 --- a/components/omnibox_strings.grdp +++ b/components/omnibox_strings.grdp
@@ -99,20 +99,107 @@ <message name="IDS_OMNIBOX_READER_MODE" desc="Text shown in the omnibox to indicate a user is viewing the reader mode view of an article."> Reader Mode </message> - <message name="IDS_DRIVE_SUGGESTION_DOCUMENT" desc="Google Docs product name, for use in omnibox Docs result descriptions."> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_BUGANIZER" desc="Buganizer issue name, for use in omnibox content suggestion descriptions."> + Buganizer Issue + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_COMMA_SEPARATED_VALUES" desc="Comma-separated values file format name, for use in omnibox content suggestion descriptions."> + Comma-Separated Values + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_APPS_SCRIPT" desc="Google Apps Script product name, for use in omnibox content suggestion descriptions."> + Google Apps Script + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS" desc="Google Docs product name, for use in omnibox content suggestion descriptions."> Google Docs </message> - <message name="IDS_DRIVE_SUGGESTION_FORM" desc="Google Docs product name, for use in omnibox Form result descriptions."> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRAWINGS" desc="Google Drawings product name, for use in omnibox content suggestion descriptions."> + Google Drawings + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE" desc="Google Drive product name shown when the file type is unknown, for use in omnibox content suggestion descriptions."> + Google Drive + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE_FOLDER" desc="Google Drive product name shown when the file is a folder, for use in omnibox content suggestion descriptions."> + Google Drive Folder + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS" desc="Google Forms product name, for use in omnibox content suggestion descriptions."> Google Forms </message> - <message name="IDS_DRIVE_SUGGESTION_SPREADSHEET" desc="Google Sheets product name, for use in omnibox Sheets result descriptions."> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_JAMBOARD" desc="Google Jamboard product name, for use in omnibox content suggestion descriptions."> + Google Jamboard + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_PHOTOS" desc="Google Photos product name, for use in omnibox content suggestion descriptions."> + Google Photos + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SITES" desc="Google Sites product name, for use in omnibox content suggestion descriptions."> + Google Sites + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS" desc="Google Sheets product name, for use in omnibox content suggestion descriptions."> Google Sheets </message> - <message name="IDS_DRIVE_SUGGESTION_PRESENTATION" desc="Google Slides product name, for use in omnibox Slides result descriptions."> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES" desc="Google Slides product name, for use in omnibox content suggestion descriptions."> Google Slides </message> - <message name="IDS_DRIVE_SUGGESTION_GENERAL" desc="Google Drive product name, for use in general omnibox Drive file result descriptions."> - Google Drive + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_JPEG" desc="JPEG image file format name, for use in omnibox content suggestion descriptions."> + JPEG Image + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_PNG" desc="PNG image file format name, for use in omnibox content suggestion descriptions."> + PNG Image + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_SVG" desc="SVG image file format name, for use in omnibox content suggestion descriptions."> + SVG Image + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_JIRA" desc="Jira issue name, for use in omnibox content suggestion descriptions."> + Jira Issue + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_JSON" desc="JSON file format name, for use in omnibox content suggestion descriptions."> + JSON + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_MARKDOWN" desc="Markdown file format name, for use in omnibox content suggestion descriptions."> + Markdown + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_EXCEL" desc="Microsoft Excel product name, for use in omnibox content suggestion descriptions."> + Microsoft Excel + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_POWERPOINT" desc="Microsoft PowerPoint product name, for use in omnibox content suggestion descriptions."> + Microsoft PowerPoint + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_WORD" desc="Microsoft Word product name, for use in omnibox content suggestion descriptions."> + Microsoft Word + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_PRESENTATION" desc="OpenDocument Presentation product name, for use in omnibox content suggestion descriptions."> + OpenDocument Presentation + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_SPREADSHEET" desc="OpenDocument Spreadsheet product name, for use in omnibox content suggestion descriptions."> + OpenDocument Spreadsheet + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_TEXT" desc="OpenDocument Text product name, for use in omnibox content suggestion descriptions."> + OpenDocument Text + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_PDF" desc="PDF file format name, for use in omnibox content suggestion descriptions."> + PDF + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_PLAIN_TEXT" desc="Plain text file format name, for use in omnibox content suggestion descriptions."> + Plain Text + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_RICH_TEXT_FORMAT" desc="Rich Text Format file format name, for use in omnibox content suggestion descriptions."> + Rich Text Format + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_SALESFORCE" desc="Salesforce product name, for use in omnibox content suggestion descriptions."> + Salesforce + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_SLACK" desc="Slack message name, for use in omnibox content suggestion descriptions."> + Slack Message + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_MP4" desc="MP4 video file format name, for use in omnibox content suggestion descriptions."> + MP4 Video + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_QUICKTIME" desc="QuickTime video file format name, for use in omnibox content suggestion descriptions."> + QuickTime Video + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_WEBM" desc="WebM video file format name, for use in omnibox content suggestion descriptions."> + WebM Video + </message> + <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_ZIP_FILE" desc="ZIP archive file format name, for use in omnibox content suggestion descriptions."> + ZIP Archive </message> <message name="IDS_CONTENT_SUGGESTION_DESCRIPTION_TEMPLATE" desc="Product description for Google Drive omnibox results."> <ph name="RESULT_MODIFIED_DATE">$1<ex>12/31/2018</ex></ph> - <ph name="RESULT_OWNER">$2<ex>First Last</ex></ph> - <ph name="RESULT_PRODUCT_SOURCE">$3<ex>Google Docs</ex></ph>
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_BUGANIZER.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_BUGANIZER.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_BUGANIZER.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_COMMA_SEPARATED_VALUES.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_COMMA_SEPARATED_VALUES.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_COMMA_SEPARATED_VALUES.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_EXCEL.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_EXCEL.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_EXCEL.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_APPS_SCRIPT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_APPS_SCRIPT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_APPS_SCRIPT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DOCS.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRAWINGS.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRAWINGS.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRAWINGS.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE_FOLDER.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE_FOLDER.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_DRIVE_FOLDER.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_FORMS.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_JAMBOARD.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_JAMBOARD.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_JAMBOARD.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_PHOTOS.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_PHOTOS.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_PHOTOS.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SHEETS.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SITES.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SITES.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SITES.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_GOOGLE_SLIDES.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_JPEG.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_JPEG.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_JPEG.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_PNG.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_PNG.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_PNG.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_SVG.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_SVG.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_IMAGE_SVG.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JIRA.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JIRA.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JIRA.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JSON.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JSON.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_JSON.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MARKDOWN.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MARKDOWN.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MARKDOWN.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_EXCEL.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_EXCEL.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_EXCEL.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_POWERPOINT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_POWERPOINT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_POWERPOINT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_WORD.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_WORD.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_MS_WORD.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_PRESENTATION.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_PRESENTATION.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_PRESENTATION.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_SPREADSHEET.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_SPREADSHEET.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_SPREADSHEET.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_TEXT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_TEXT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_OPEN_DOCUMENT_TEXT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PDF.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PDF.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PDF.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PLAIN_TEXT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PLAIN_TEXT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_PLAIN_TEXT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_POWERPOINT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_POWERPOINT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_POWERPOINT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_RICH_TEXT_FORMAT.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_RICH_TEXT_FORMAT.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_RICH_TEXT_FORMAT.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SALESFORCE.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SALESFORCE.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SALESFORCE.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SLACK.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SLACK.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_SLACK.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_MP4.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_MP4.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_MP4.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_QUICKTIME.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_QUICKTIME.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_QUICKTIME.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_WEBM.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_WEBM.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_VIDEO_WEBM.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_WORD.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_WORD.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_WORD.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_ZIP_FILE.png.sha1 b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_ZIP_FILE.png.sha1 new file mode 100644 index 0000000..c118838 --- /dev/null +++ b/components/omnibox_strings_grdp/IDS_CONTENT_SUGGESTION_DESCRIPTION_ZIP_FILE.png.sha1
@@ -0,0 +1 @@ +bbfab3e4562cfcf9f2bc29536fe36422fee14cc6 \ No newline at end of file
diff --git a/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc b/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc index 355e260..8052513 100644 --- a/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc +++ b/components/optimization_guide/core/model_execution/on_device_model_service_controller.cc
@@ -15,6 +15,7 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_functions.h" +#include "base/metrics/metrics_hashes.h" #include "base/notreached.h" #include "base/strings/strcat.h" #include "base/task/thread_pool.h" @@ -125,6 +126,12 @@ reason); } +void RecordOnDeviceLoadModelResult( + on_device_model::mojom::LoadModelResult result) { + base::UmaHistogramEnumeration( + "OptimizationGuide.ModelExecution.OnDeviceBaseModelLoadResult", result); +} + } // namespace OnDeviceModelServiceController::OnDeviceModelServiceController( @@ -513,6 +520,9 @@ remote_.reset_on_idle_timeout(has_direct_use_ ? features::GetOnDeviceModelIdleTimeout() : base::TimeDelta()); + base::UmaHistogramSparse( + "OptimizationGuide.ModelExecution.OnDeviceBaseModelLoadVersion", + base::HashMetricName(model_metadata_->version())); return remote_; } @@ -547,7 +557,7 @@ } controller_->service_client_.Get()->LoadModel( std::move(params), std::move(model), - base::DoNothingAs<void(on_device_model::mojom::LoadModelResult)>()); + base::BindOnce(&RecordOnDeviceLoadModelResult)); controller_->service_client_.RemovePendingUsage(); }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesSettings.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesSettings.java index 94692b65..127b1d8 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesSettings.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesSettings.java
@@ -237,12 +237,17 @@ long expiration) { if (controlsState == CookieControlsState.ACTIVE_TP || controlsState == CookieControlsState.PAUSED_TP) { - // TODO(crbug.com/388294499): Add support for TP UI. + updateTrackingProtectionState(); } else { update3pcState(controlsState, enforcement, expiration); } } + public void updateTrackingProtectionState() { + // TODO(crbug.com/388294499): Add support for TP UI. + mCookieSwitch.setVisible(false); + } + public void update3pcState( @CookieControlsState int controlsState, @CookieControlsEnforcement int enforcement,
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml index f6eb06a..7242a777 100644 --- a/components/policy/resources/templates/policies.yaml +++ b/components/policy/resources/templates/policies.yaml
@@ -1364,6 +1364,7 @@ 1363: TLS13EarlyDataEnabled 1364: LocalNetworkAccessRestrictionsEnabled 1365: PrefetchWithServiceWorkerEnabled + 1366: AIModeSearchSuggestSettings atomic_groups: 1: Homepage
diff --git a/components/policy/resources/templates/policy_definitions/GenerativeAI/AIModeSearchSuggestSettings.yaml b/components/policy/resources/templates/policy_definitions/GenerativeAI/AIModeSearchSuggestSettings.yaml new file mode 100644 index 0000000..b5c10b7 --- /dev/null +++ b/components/policy/resources/templates/policy_definitions/GenerativeAI/AIModeSearchSuggestSettings.yaml
@@ -0,0 +1,40 @@ +caption: Settings for AI Mode Search recommendations in the address bar and new tab page search box + +desc: |- + This policy controls the AI Mode recommendations section in the address bar and the new tab page search box. + + This feature is available to all users with Google as their default search engine, unless it is disabled by this policy. + + If the policy is unset, its behavior is determined by the <ph name="GEN_AI_DEFAULT_SETTINGS_POLICY_NAME">GenAiDefaultSettings</ph> policy. + + When policy is set to 0 - Enabled or not set, the feature will be available to users. When policy is set to 1 - Disabled, the feature will not be available. + + 0 = Allow the feature to be used + 1 = Do not allow the feature. + +default: 0 +example_value: 1 +features: + dynamic_refresh: true + per_profile: true +items: +- caption: Allow AI Mode recommendations. + name: Allowed + value: 0 +- caption: Do not allow AI Mode recommendations. + name: Disabled + value: 1 +owners: +- file://components/omnibox/OWNERS +schema: + enum: + - 0 + - 1 + type: integer +supported_on: +- android:138- +- ios:138- +- chrome.*:138- +- chrome_os:138- +tags: [] +type: int-enum
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterExtensionAttributionEnabled.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterExtensionAttributionEnabled.yaml index dc6edd77..8abc043 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterExtensionAttributionEnabled.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPFooterExtensionAttributionEnabled.yaml
@@ -16,9 +16,9 @@ - chrome.*:138- - chrome_os:138- items: -- caption: Enable extension theme attribution on NTP Footer +- caption: Enable extension attribution on NTP Footer value: true -- caption: Disable extension theme attribution on NTP Footer +- caption: Disable extension attribution on NTP Footer value: false owners: - file://components/policy/OWNERS
diff --git a/components/policy/test/data/pref_mapping/AIModeSearchSuggestSettings.json b/components/policy/test/data/pref_mapping/AIModeSearchSuggestSettings.json new file mode 100644 index 0000000..152ef6c --- /dev/null +++ b/components/policy/test/data/pref_mapping/AIModeSearchSuggestSettings.json
@@ -0,0 +1,20 @@ +[ + { + "os": [ + "android", + "win", + "linux", + "mac", + "chromeos" + ], + "simple_policy_pref_mapping_test": { + "pref_name": "omnibox.ai_mode_search_suggest_settings", + "default_value": 0, + "default_for_enterprise_users": 0, + "values_to_test": [ + 1, + 0 + ] + } + } +] \ No newline at end of file
diff --git a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json index 57a5d4e..a287d78 100644 --- a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json +++ b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
@@ -14,6 +14,9 @@ "devtools.gen_ai_settings": { "value": 0 }, + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + }, "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": { "value": 0 }, @@ -42,6 +45,9 @@ "devtools.gen_ai_settings": { "value": 1 }, + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + }, "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": { "value": 1 }, @@ -70,6 +76,9 @@ "devtools.gen_ai_settings": { "value": 2 }, + "omnibox.ai_mode_search_suggest_settings": { + "value": 1 + }, "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": { "value": 2 }, @@ -96,6 +105,9 @@ "devtools.gen_ai_settings": { "default_value": 0 }, + "omnibox.ai_mode_search_suggest_settings": { + "default_value": 0 + }, "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": { "default_value": 0 }, @@ -181,6 +193,9 @@ "devtools.gen_ai_settings": { "value": 0 }, + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + }, "optimization_guide.model_execution.autofill_prediction_improvements_enterprise_policy_allowed": { "value": 0 }, @@ -332,6 +347,45 @@ "os": [ "android" ], - "reason_for_missing_test": "No covered GenAI policies are currently supported on Android." + "policy_pref_mapping_tests": [ + { + "policies": { + "GenAiDefaultSettings": 0 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + } + } + }, + { + "policies": { + "GenAiDefaultSettings": 1 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + } + } + }, + { + "policies": { + "GenAiDefaultSettings": 2 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 1 + } + } + }, + { + "policies": {}, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "default_value": 0 + } + } + } + ] } ]
diff --git a/components/privacy_sandbox/privacy_sandbox_survey_service.h b/components/privacy_sandbox/privacy_sandbox_survey_service.h index 7dc249b..e96778e 100644 --- a/components/privacy_sandbox/privacy_sandbox_survey_service.h +++ b/components/privacy_sandbox/privacy_sandbox_survey_service.h
@@ -22,7 +22,7 @@ kInvalidSurveyConfig = 4, // Failed to initialize survey config. kMaxValue = kInvalidSurveyConfig, }; - // LINT.ThenChange(/tools/metrics/histograms/enums.xml) + // LINT.ThenChange(/tools/metrics/histograms/metadata/privacy/enums.xml) }; } // namespace privacy_sandbox
diff --git a/components/tabs/OWNERS b/components/tabs/OWNERS index 66eaeac8..7737b31 100644 --- a/components/tabs/OWNERS +++ b/components/tabs/OWNERS
@@ -1,4 +1,5 @@ dfried@chromium.org dpenning@chromium.org dljames@chromium.org +erikchen@chromium.org shibalik@chromium.org
diff --git a/components/tabs/public/tab_interface.h b/components/tabs/public/tab_interface.h index 42745a8a..a037fb73 100644 --- a/components/tabs/public/tab_interface.h +++ b/components/tabs/public/tab_interface.h
@@ -72,6 +72,25 @@ static TabInterface* MaybeGetFromContents(content::WebContents* web_contents); // Returns a weak pointer to `this`. + // + // WARNING: Many uses of base::WeakPtr are inappropriate and lead to bugs. + // An appropriate use case is as a variable passed to an asynchronously + // invoked PostTask. + // An inappropriate use case is to store as a member of an object that can + // outlive TabInterface. This leads to inconsistent state machines. + // For example (don't do this): + // class FooOutlivesTab{ + // base::WeakPtr<TabInterface> tab_; + // // Conceptually, this member should only be set if tab_ is set. + // std::optional<SkColor> color_of_tab_; + // }; + // For example (do this): + // class FooOutlivesTab { + // // Use RegisterWillDetach() to clear both tab_ and color_of_tab_ prior + // // to tab_ destruction. + // raw_ptr<TabInterface> tab_; + // std::optional<SkColor> color_of_tab_; + // }; virtual base::WeakPtr<TabInterface> GetWeakPtr() = 0; // When a tab is in the background, the WebContents may be discarded to save
diff --git a/components/user_education/common/feature_promo/feature_promo_specification.cc b/components/user_education/common/feature_promo/feature_promo_specification.cc index aeb55b1d..bf24ec5 100644 --- a/components/user_education/common/feature_promo/feature_promo_specification.cc +++ b/components/user_education/common/feature_promo/feature_promo_specification.cc
@@ -81,10 +81,10 @@ // code for your new Custom UI promo. // // Add the text names of allowlisted rotating promos here: - // static constexpr auto kAllowedPromoNames = - // base::MakeFixedFlatSet<std::string_view>({ }); - // return kAllowedPromoNames.contains(promo_feature.name); - return false; + static constexpr auto kAllowedPromoNames = + base::MakeFixedFlatSet<std::string_view>( + {"IPH_ExtensionsZeroStatePromo"}); + return kAllowedPromoNames.contains(promo_feature.name); } bool IsAllowedLegacyPromo(const base::Feature& promo_feature) {
diff --git a/components/user_education/common/feature_promo/impl/feature_promo_controller_25.cc b/components/user_education/common/feature_promo/impl/feature_promo_controller_25.cc index a97edc5..158b3853 100644 --- a/components/user_education/common/feature_promo/impl/feature_promo_controller_25.cc +++ b/components/user_education/common/feature_promo/impl/feature_promo_controller_25.cc
@@ -383,9 +383,6 @@ : FeaturePromoClosedReason::kOverrideForPrecedence); } - // If the session policy allows overriding other help bubbles, close them. - CloseHelpBubbleIfPresent(anchor_element->context()); - // TODO(crbug.com/40200981): Currently this must be called before // ShouldTriggerHelpUI() below. See bug for details. if (build_params.spec->promo_type() != @@ -403,6 +400,9 @@ return FeaturePromoResult::kBlockedByConfig; } + // If the session policy allows overriding other help bubbles, close them. + CloseHelpBubbleIfPresent(anchor_element->context()); + // Store the current promo. set_current_promo(std::move(lifecycle));
diff --git a/components/variations/variations_seed_store.cc b/components/variations/variations_seed_store.cc index c283c8e..252b9e5c 100644 --- a/components/variations/variations_seed_store.cc +++ b/components/variations/variations_seed_store.cc
@@ -78,9 +78,11 @@ constexpr int kSendPlatformSafeSeedMaxAttempts = 2; #endif // BUILDFLAG(IS_CHROMEOS) +// LINT.IfChange // The name of the seed file that stores the latest seed data. const base::FilePath::CharType kSeedFilename[] = FILE_PATH_LITERAL("VariationsSeedV1"); +// LINT.ThenChange(/testing/scripts/variations_seed_access_helper.py, /components/variations/variations_seed_store.cc, /components/variations/service/variations_field_trial_creator_unittest.cc, /chrome/browser/metrics/variations/variations_safe_mode_end_to_end_browsertest.cc) // Returns true if |signature| is empty and if the command-line flag to accept // empty seed signature is specified.
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc index 1aa65225..0a61597 100644 --- a/components/viz/common/features.cc +++ b/components/viz/common/features.cc
@@ -39,14 +39,14 @@ // involvement. For now, this applies only to top controls. BASE_FEATURE(kAndroidBrowserControlsInViz, "AndroidBrowserControlsInViz", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // If this flag is enabled, AndroidBrowserControlsInViz and // BottomControlsRefactor with the "Dispatch yOffset" variation must also be // enabled. BASE_FEATURE(kAndroidBcivBottomControls, "AndroidBcivBottomControls", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_ANDROID)
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc index eef09f8f..e045d5c 100644 --- a/components/viz/service/display/surface_aggregator.cc +++ b/components/viz/service/display/surface_aggregator.cc
@@ -841,8 +841,6 @@ if (referenced_surfaces_.count(surface_id)) return; - ++stats_->copied_surface_count; - // If we are stretching content to fill the SurfaceDrawQuad, or if the device // scale factor mismatches between content and SurfaceDrawQuad, we appply an @@ -1506,8 +1504,6 @@ return; } - ++stats_->copied_surface_count; - const gfx::Transform surface_transform = IsRootSurface(surface) ? root_surface_transform_ : gfx::Transform(); @@ -1998,7 +1994,6 @@ return gfx::Rect(); DebugLogSurface(surface, resolved_frame.WillDraw()); - ++stats_->prewalked_surface_count; auto& root_resolved_pass = resolved_frame.GetRootRenderPassData(); if (parent_pass) { @@ -2359,12 +2354,6 @@ } void SurfaceAggregator::RecordStatHistograms() { - UMA_HISTOGRAM_COUNTS_100( - "Compositing.SurfaceAggregator.PrewalkedSurfaceCount", - stats_->prewalked_surface_count); - UMA_HISTOGRAM_COUNTS_100("Compositing.SurfaceAggregator.CopiedSurfaceCount", - stats_->copied_surface_count); - UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES( "Compositing.SurfaceAggregator.PrewalkUs", stats_->prewalk_time, kHistogramMinTime, kHistogramMaxTime, kHistogramTimeBuckets);
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h index 2644b4a..3c385138 100644 --- a/components/viz/service/display/surface_aggregator.h +++ b/components/viz/service/display/surface_aggregator.h
@@ -133,8 +133,6 @@ struct PrewalkResult; struct AggregateStatistics { - int prewalked_surface_count = 0; - int copied_surface_count = 0; // True if the current frame contains a pixel-moving foreground filter // render pass. bool has_pixel_moving_filter = false;
diff --git a/components/web_modal/modal_dialog_host.cc b/components/web_modal/modal_dialog_host.cc index b05fa83c..1b02f9a 100644 --- a/components/web_modal/modal_dialog_host.cc +++ b/components/web_modal/modal_dialog_host.cc
@@ -16,4 +16,11 @@ return true; } +bool ModalDialogHost::ShouldDialogBoundsConstrainedByHost() { + // Please consult with //constrained_window OWNERS if you intend to release + // the bounds constraint for your WebContents container (i.e. returning + // false from this function). + return true; +} + } // namespace web_modal
diff --git a/components/web_modal/modal_dialog_host.h b/components/web_modal/modal_dialog_host.h index 51ed6bc..c618c00 100644 --- a/components/web_modal/modal_dialog_host.h +++ b/components/web_modal/modal_dialog_host.h
@@ -34,11 +34,19 @@ // Returns the view against which the dialog is positioned and parented. virtual gfx::NativeView GetHostView() const = 0; + // Gets the position for the dialog in coordinates relative to the host view. virtual gfx::Point GetDialogPosition(const gfx::Size& size) = 0; + // Returns whether a dialog currently about to be shown should be activated. virtual bool ShouldActivateDialog() const; + // Returns true if the web modal dialog should be constrained within the + // bounds of the modal host. True by default. Please consult with + // //constrained_window OWNERS if you intend to release the bounds constraint + // for your WebContents container (i.e. returning false from this function). + virtual bool ShouldDialogBoundsConstrainedByHost(); + // Add/remove observer. The host must implement these methods, store the // observers in a list, and call OnHostDestroying() on each before host // destruction. See https://crbug.com/1170577
diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc index 3b7c020..b5a87aa 100644 --- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc +++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/functional/callback_helpers.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/version.h" #include "build/build_config.h"
diff --git a/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc b/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc index 62d57b19..e649ec0 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_fuchsia.cc
@@ -5,6 +5,7 @@ #include "content/browser/accessibility/accessibility_tree_formatter_fuchsia.h" #include "base/notreached.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/values.h"
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc index 56b86d5..957a21f5 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.cc +++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -23,6 +23,7 @@ #include "base/feature_list.h" #include "base/hash/hash.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/timer/elapsed_timer.h"
diff --git a/content/browser/aggregation_service/aggregation_service_network_fetcher_impl.cc b/content/browser/aggregation_service/aggregation_service_network_fetcher_impl.cc index e07a5ee..529ee8c 100644 --- a/content/browser/aggregation_service/aggregation_service_network_fetcher_impl.cc +++ b/content/browser/aggregation_service/aggregation_service_network_fetcher_impl.cc
@@ -15,6 +15,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_number_conversions.h" #include "base/time/clock.h" #include "base/time/time.h" #include "content/browser/aggregation_service/public_key_parsing_utils.h"
diff --git a/content/browser/attribution_reporting/attribution_resolver_unittest.cc b/content/browser/attribution_reporting/attribution_resolver_unittest.cc index e7a75fc8..1b40504 100644 --- a/content/browser/attribution_reporting/attribution_resolver_unittest.cc +++ b/content/browser/attribution_reporting/attribution_resolver_unittest.cc
@@ -23,6 +23,7 @@ #include "base/functional/callback.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h"
diff --git a/content/browser/attribution_reporting/interop/runner.cc b/content/browser/attribution_reporting/interop/runner.cc index a636bd2..ef73f49 100644 --- a/content/browser/attribution_reporting/interop/runner.cc +++ b/content/browser/attribution_reporting/interop/runner.cc
@@ -29,6 +29,7 @@ #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_traits.h"
diff --git a/content/browser/back_forward_cache_basics_browsertest.cc b/content/browser/back_forward_cache_basics_browsertest.cc index 1d04ba9..82b91b4 100644 --- a/content/browser/back_forward_cache_basics_browsertest.cc +++ b/content/browser/back_forward_cache_basics_browsertest.cc
@@ -4,6 +4,7 @@ #include <array> +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "content/browser/back_forward_cache_browsertest.h"
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc index 81c2a95..1e03339 100644 --- a/content/browser/back_forward_cache_browsertest.cc +++ b/content/browser/back_forward_cache_browsertest.cc
@@ -16,6 +16,7 @@ #include "base/memory/raw_ptr.h" #include "base/metrics/metrics_hashes.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/system/sys_info.h" #include "base/task/common/task_annotator.h" #include "base/task/single_thread_task_runner.h"
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc index 38f54aa..766e867 100644 --- a/content/browser/back_forward_cache_features_browsertest.cc +++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/containers/contains.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/threading/platform_thread.h" #include "base/time/time.h"
diff --git a/content/browser/back_forward_cache_network_request_browsertest.cc b/content/browser/back_forward_cache_network_request_browsertest.cc index 9922da8..57f1a6e 100644 --- a/content/browser/back_forward_cache_network_request_browsertest.cc +++ b/content/browser/back_forward_cache_network_request_browsertest.cc
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "build/build_config.h" #include "content/browser/back_forward_cache_browsertest.h" +#include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" +#include "build/build_config.h" #include "content/browser/renderer_host/navigation_request.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/test/browser_test.h"
diff --git a/content/browser/background_fetch/background_fetch_test_base.cc b/content/browser/background_fetch/background_fetch_test_base.cc index f427fde..2843ddb 100644 --- a/content/browser/background_fetch/background_fetch_test_base.cc +++ b/content/browser/background_fetch/background_fetch_test_base.cc
@@ -5,6 +5,7 @@ #include "content/browser/background_fetch/background_fetch_test_base.h" #include <stdint.h> + #include <map> #include <memory> #include <utility> @@ -17,6 +18,7 @@ #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "content/browser/background_fetch/background_fetch_registration_id.h" #include "content/browser/service_worker/service_worker_context_core.h"
diff --git a/content/browser/background_fetch/storage/database_task.cc b/content/browser/background_fetch/storage/database_task.cc index 39fb241..d40f883 100644 --- a/content/browser/background_fetch/storage/database_task.cc +++ b/content/browser/background_fetch/storage/database_task.cc
@@ -11,6 +11,7 @@ #include "base/functional/bind.h" #include "base/metrics/histogram_functions.h" #include "base/observer_list.h" +#include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" #include "content/browser/background_fetch/background_fetch_data_manager.h" #include "content/browser/background_fetch/background_fetch_data_manager_observer.h"
diff --git a/content/browser/background_sync/periodic_background_sync_browsertest.cc b/content/browser/background_sync/periodic_background_sync_browsertest.cc index 5dd57be..84d2f6e2b 100644 --- a/content/browser/background_sync/periodic_background_sync_browsertest.cc +++ b/content/browser/background_sync/periodic_background_sync_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 "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/simple_test_clock.h" #include "base/time/time.h"
diff --git a/content/browser/browsing_topics/header_util_unittest.cc b/content/browser/browsing_topics/header_util_unittest.cc index 7e966d4f..13ae5d5f 100644 --- a/content/browser/browsing_topics/header_util_unittest.cc +++ b/content/browser/browsing_topics/header_util_unittest.cc
@@ -5,6 +5,7 @@ #include "content/browser/browsing_topics/header_util.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/navigation_entry.h" #include "content/public/test/navigation_simulator.h"
diff --git a/content/browser/btm/btm_bounce_detector_unittest.cc b/content/browser/btm/btm_bounce_detector_unittest.cc index 2f17336..a0fc989 100644 --- a/content/browser/btm/btm_bounce_detector_unittest.cc +++ b/content/browser/btm/btm_bounce_detector_unittest.cc
@@ -11,6 +11,7 @@ #include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h"
diff --git a/content/browser/btm/btm_database_unittest.cc b/content/browser/btm/btm_database_unittest.cc index 1153fa7..9cc97b7 100644 --- a/content/browser/btm/btm_database_unittest.cc +++ b/content/browser/btm/btm_database_unittest.cc
@@ -14,6 +14,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/path_service.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h"
diff --git a/content/browser/btm/btm_navigation_flow_detector_browsertest.cc b/content/browser/btm/btm_navigation_flow_detector_browsertest.cc index f3d0b7da1..12cf94c 100644 --- a/content/browser/btm/btm_navigation_flow_detector_browsertest.cc +++ b/content/browser/btm/btm_navigation_flow_detector_browsertest.cc
@@ -5,6 +5,7 @@ #include "content/browser/btm/btm_navigation_flow_detector.h" #include "base/base64.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/to_string.h" #include "base/test/bind.h"
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc index 6675f6c..77172b0 100644 --- a/content/browser/devtools/devtools_agent_host_impl.cc +++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -14,6 +14,7 @@ #include "base/no_destructor.h" #include "base/notreached.h" #include "base/observer_list.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "content/browser/devtools/auction_worklet_devtools_agent_host.h" #include "content/browser/devtools/dedicated_worker_devtools_agent_host.h"
diff --git a/content/browser/devtools/protocol/background_service_handler.cc b/content/browser/devtools/protocol/background_service_handler.cc index b77aa719..d34d5fe 100644 --- a/content/browser/devtools/protocol/background_service_handler.cc +++ b/content/browser/devtools/protocol/background_service_handler.cc
@@ -5,6 +5,7 @@ #include "content/browser/devtools/protocol/background_service_handler.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_number_conversions.h" #include "content/browser/renderer_host/frame_tree.h" #include "content/browser/service_worker/service_worker_version.h" #include "content/browser/storage_partition_impl.h"
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index 3fafd6f..9c9baa0 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -23,6 +23,7 @@ #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/strings/safe_sprintf.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/system/sys_info.h" #include "base/task/sequenced_task_runner.h"
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc index b85679d..87440869 100644 --- a/content/browser/devtools/protocol/tracing_handler.cc +++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -19,6 +19,7 @@ #include "base/memory/ref_counted_memory.h" #include "base/numerics/safe_conversions.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "base/time/time.h"
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc index d65d7524..7cd8e94 100644 --- a/content/browser/download/download_browsertest.cc +++ b/content/browser/download/download_browsertest.cc
@@ -33,6 +33,7 @@ #include "base/metrics/field_trial_params.h" #include "base/path_service.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h"
diff --git a/content/browser/download/download_manager_impl_unittest.cc b/content/browser/download/download_manager_impl_unittest.cc index 1bc475f..348eac03 100644 --- a/content/browser/download/download_manager_impl_unittest.cc +++ b/content/browser/download/download_manager_impl_unittest.cc
@@ -22,6 +22,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/gmock_callback_support.h"
diff --git a/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc index 39bcb65..7cd70af63 100644 --- a/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc +++ b/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc
@@ -14,6 +14,7 @@ #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" +#include "base/strings/string_number_conversions.h" #include "base/task/sequenced_task_runner.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h"
diff --git a/content/browser/find_request_manager_browsertest.cc b/content/browser/find_request_manager_browsertest.cc index 4dfc98c..40b64f0 100644 --- a/content/browser/find_request_manager_browsertest.cc +++ b/content/browser/find_request_manager_browsertest.cc
@@ -7,13 +7,15 @@ #pragma allow_unsafe_buffers #endif +#include "content/browser/find_request_manager.h" + #include "base/command_line.h" #include "base/memory/raw_ptr.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/find_in_page_client.h" -#include "content/browser/find_request_manager.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/browser/content_browser_client.h" #include "content/public/common/content_client.h"
diff --git a/content/browser/hid/hid_service_unittest.cc b/content/browser/hid/hid_service_unittest.cc index b38f049..0961952 100644 --- a/content/browser/hid/hid_service_unittest.cc +++ b/content/browser/hid/hid_service_unittest.cc
@@ -11,6 +11,7 @@ #include "base/barrier_closure.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/gmock_callback_support.h"
diff --git a/content/browser/interest_group/auction_nonce_manager.cc b/content/browser/interest_group/auction_nonce_manager.cc index faa3f80..e8878bb 100644 --- a/content/browser/interest_group/auction_nonce_manager.cc +++ b/content/browser/interest_group/auction_nonce_manager.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/feature_list.h" +#include "base/strings/string_number_conversions.h" #include "base/uuid.h" #include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/renderer_host/render_frame_host_impl.h"
diff --git a/content/browser/interest_group/auction_worklet_manager_unittest.cc b/content/browser/interest_group/auction_worklet_manager_unittest.cc index d43cfafc..2ccd3ab7 100644 --- a/content/browser/interest_group/auction_worklet_manager_unittest.cc +++ b/content/browser/interest_group/auction_worklet_manager_unittest.cc
@@ -19,6 +19,7 @@ #include "base/location.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h"
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc index 2ede831..8321b2a 100644 --- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc +++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc
@@ -9,6 +9,7 @@ #include "base/json/json_reader.h" #include "base/metrics/histogram_functions.h" #include "base/rand_util.h" +#include "base/strings/string_number_conversions.h" #include "content/browser/interest_group/interest_group_features.h" #include "content/browser/interest_group/interest_group_manager_impl.h" #include "content/browser/interest_group/interest_group_storage.pb.h"
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc index e8a61203..d72fecb 100644 --- a/content/browser/interest_group/interest_group_storage_unittest.cc +++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -18,6 +18,7 @@ #include "base/run_loop.h" #include "base/strings/escape.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h"
diff --git a/content/browser/interest_group/trusted_signals_fetcher_unittest.cc b/content/browser/interest_group/trusted_signals_fetcher_unittest.cc index 0090bc5..06873087 100644 --- a/content/browser/interest_group/trusted_signals_fetcher_unittest.cc +++ b/content/browser/interest_group/trusted_signals_fetcher_unittest.cc
@@ -23,6 +23,7 @@ #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/synchronization/lock.h"
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc index d2616227..287d602 100644 --- a/content/browser/loader/navigation_url_loader_impl.cc +++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -21,6 +21,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "components/download/public/common/download_stats.h"
diff --git a/content/browser/loader/prefetch_browsertest.cc b/content/browser/loader/prefetch_browsertest.cc index fd32a02..d11643b 100644 --- a/content/browser/loader/prefetch_browsertest.cc +++ b/content/browser/loader/prefetch_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h"
diff --git a/content/browser/media/capture/sub_capture_target_id_web_contents_helper.cc b/content/browser/media/capture/sub_capture_target_id_web_contents_helper.cc index 107b20c..838696c 100644 --- a/content/browser/media/capture/sub_capture_target_id_web_contents_helper.cc +++ b/content/browser/media/capture/sub_capture_target_id_web_contents_helper.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/functional/callback.h" +#include "base/strings/string_number_conversions.h" #include "base/token.h" #include "base/uuid.h" #include "build/build_config.h"
diff --git a/content/browser/media/cdm_storage_database.cc b/content/browser/media/cdm_storage_database.cc index 70da4fd..d3fac47 100644 --- a/content/browser/media/cdm_storage_database.cc +++ b/content/browser/media/cdm_storage_database.cc
@@ -10,6 +10,7 @@ #include "base/files/file_util.h" #include "base/json/values_util.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_number_conversions.h" #include "sql/statement.h" namespace content {
diff --git a/content/browser/media/media_devices_util.cc b/content/browser/media/media_devices_util.cc index b31c5a31..9c09aac 100644 --- a/content/browser/media/media_devices_util.cc +++ b/content/browser/media/media_devices_util.cc
@@ -10,6 +10,7 @@ #include "base/command_line.h" #include "base/functional/bind.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_tokenizer.h" #include "content/browser/browser_main_loop.h"
diff --git a/content/browser/navigation_transitions/back_forward_transition_animator.cc b/content/browser/navigation_transitions/back_forward_transition_animator.cc index 99df1f0..89296c0e 100644 --- a/content/browser/navigation_transitions/back_forward_transition_animator.cc +++ b/content/browser/navigation_transitions/back_forward_transition_animator.cc
@@ -8,6 +8,7 @@ #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/numerics/ranges.h" +#include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "cc/slim/layer.h" #include "cc/slim/solid_color_layer.h"
diff --git a/content/browser/network/trust_token_browsertest.cc b/content/browser/network/trust_token_browsertest.cc index c0eea90..d875bb3 100644 --- a/content/browser/network/trust_token_browsertest.cc +++ b/content/browser/network/trust_token_browsertest.cc
@@ -9,6 +9,7 @@ #include <string_view> #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "build/build_config.h"
diff --git a/content/browser/network_service_instance_impl.cc b/content/browser/network_service_instance_impl.cc index 329eee4..fe6ac16 100644 --- a/content/browser/network_service_instance_impl.cc +++ b/content/browser/network_service_instance_impl.cc
@@ -138,19 +138,9 @@ // If this feature is enabled, the Network Service will run on its own thread // when running in-process; otherwise it will run on the IO thread. -// -// On Chrome OS, the Network Service must run on the IO thread because -// ProfileIOData and NetworkContext both try to set up NSS, which has to be -// called from the IO thread. -// TODO(crbug.com/390333881): can this chromeos-specific behavior be removed now -// too? Is there anything that still uses NSS from the network service? BASE_FEATURE(kNetworkServiceDedicatedThread, "NetworkServiceDedicatedThread", -#if BUILDFLAG(IS_CHROMEOS) - base::FEATURE_DISABLED_BY_DEFAULT -#else base::FEATURE_ENABLED_BY_DEFAULT -#endif ); base::Thread& GetNetworkServiceDedicatedThread() {
diff --git a/content/browser/performance_timeline_browsertest.cc b/content/browser/performance_timeline_browsertest.cc index 0b302a5c..c00bad6 100644 --- a/content/browser/performance_timeline_browsertest.cc +++ b/content/browser/performance_timeline_browsertest.cc
@@ -7,6 +7,7 @@ #include "base/base_paths.h" #include "base/command_line.h" #include "base/path_service.h" +#include "base/strings/string_number_conversions.h" #include "base/test/bind.h" #include "base/test/trace_event_analyzer.h" #include "components/ukm/test_ukm_recorder.h"
diff --git a/content/browser/permissions/embedded_permission_control_checker.cc b/content/browser/permissions/embedded_permission_control_checker.cc index 2848133a..9e78a112 100644 --- a/content/browser/permissions/embedded_permission_control_checker.cc +++ b/content/browser/permissions/embedded_permission_control_checker.cc
@@ -6,6 +6,7 @@ #include <string> +#include "base/strings/string_number_conversions.h" #include "content/browser/log_console_message.h" #include "third_party/blink/public/common/features_generated.h"
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc index 0b89fca..46da2b3 100644 --- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -14,6 +14,7 @@ #include "base/memory/weak_ptr.h" #include "base/notreached.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h"
diff --git a/content/browser/preloading/preloading_data_impl_unittest.cc b/content/browser/preloading/preloading_data_impl_unittest.cc index 90b72f56..495677fb 100644 --- a/content/browser/preloading/preloading_data_impl_unittest.cc +++ b/content/browser/preloading/preloading_data_impl_unittest.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "components/ukm/test_ukm_recorder.h" #include "content/browser/preloading/preloading.h"
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc index 1b65121..2057df65 100644 --- a/content/browser/preloading/prerender/prerender_browsertest.cc +++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -22,6 +22,7 @@ #include "base/run_loop.h" #include "base/scoped_observation.h" #include "base/strings/escape.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h"
diff --git a/content/browser/preloading/prerender/prerender_host_registry_unittest.cc b/content/browser/preloading/prerender/prerender_host_registry_unittest.cc index 3287a52..695e20b 100644 --- a/content/browser/preloading/prerender/prerender_host_registry_unittest.cc +++ b/content/browser/preloading/prerender/prerender_host_registry_unittest.cc
@@ -6,6 +6,7 @@ #include <cstdint> +#include "base/strings/string_number_conversions.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "content/browser/preloading/preload_pipeline_info_impl.h"
diff --git a/content/browser/preloading/prerenderer_impl_unittest.cc b/content/browser/preloading/prerenderer_impl_unittest.cc index 887dc43..f283fd5 100644 --- a/content/browser/preloading/prerenderer_impl_unittest.cc +++ b/content/browser/preloading/prerenderer_impl_unittest.cc
@@ -6,6 +6,7 @@ #include <array> +#include "base/strings/string_number_conversions.h" #include "base/test/scoped_feature_list.h" #include "content/browser/preloading/preloading_confidence.h" #include "content/browser/preloading/prerender/prerender_features.h"
diff --git a/content/browser/private_aggregation/private_aggregation_pending_contributions.h b/content/browser/private_aggregation/private_aggregation_pending_contributions.h index ed73cde6..281baab9 100644 --- a/content/browser/private_aggregation/private_aggregation_pending_contributions.h +++ b/content/browser/private_aggregation/private_aggregation_pending_contributions.h
@@ -95,7 +95,7 @@ kTruncationNotDueToUnconditionalContributions = 2, kMaxValue = kTruncationNotDueToUnconditionalContributions, }; - // LINT.ThenChange(//tools/metrics/histograms/enums.xml:PrivacySandboxPrivateAggregationTruncationResult) + // LINT.ThenChange(//tools/metrics/histograms/metadata/privacy/enums.xml:PrivacySandboxPrivateAggregationTruncationResult) // The elements of `histogram_suffixes` must outlive this object. PrivateAggregationPendingContributions(
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc index a6a1960..c714efe 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.cc +++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -19,6 +19,7 @@ #include "base/memory/weak_ptr.h" #include "base/metrics/field_trial_params.h" #include "base/rand_util.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/time/time.h"
diff --git a/content/browser/renderer_host/input/autoscroll_browsertest.cc b/content/browser/renderer_host/input/autoscroll_browsertest.cc index d8c99b0..c6e2cf7 100644 --- a/content/browser/renderer_host/input/autoscroll_browsertest.cc +++ b/content/browser/renderer_host/input/autoscroll_browsertest.cc
@@ -179,7 +179,13 @@ // See https://crbug.com/686223 We similarly don't plan on supporting // this for iOS. #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) -IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, AutoscrollFling) { +// TODO(crbug.com/419838337) Fix failing test on linux +#if BUILDFLAG(IS_LINUX) +#define MAYBE_AutoscrollFling DISABLED_AutoscrollFling +#else +#define MAYBE_AutoscrollFling AutoscrollFling +#endif +IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, MAYBE_AutoscrollFling) { LoadURL(kAutoscrollDataURL); // Start autoscroll with middle click. @@ -227,7 +233,14 @@ // Tests that the GSU and GSE events generated from the autoscroll fling have // non-zero positions in widget. -IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, GSUGSEValidPositionInWidget) { +// TODO(crbug.com/419838337) Fix failing test on linux +#if BUILDFLAG(IS_LINUX) +#define MAYBE_GSUGSEValidPositionInWidget DISABLED_GSUGSEValidPositionInWidget +#else +#define MAYBE_GSUGSEValidPositionInWidget GSUGSEValidPositionInWidget +#endif +IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, + MAYBE_GSUGSEValidPositionInWidget) { LoadURL(kAutoscrollDataURL); // Start autoscroll with middle click. @@ -293,8 +306,16 @@ // Checks that wheel scrolling does not work once the cursor has entered the // autoscroll mode. +// TODO(crbug.com/419838337) Fix failing test on linux +#if BUILDFLAG(IS_LINUX) +#define MAYBE_WheelScrollingDoesNotWorkInAutoscrollMode \ + DISABLED_WheelScrollingDoesNotWorkInAutoscrollMode +#else +#define MAYBE_WheelScrollingDoesNotWorkInAutoscrollMode \ + WheelScrollingDoesNotWorkInAutoscrollMode +#endif IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, - WheelScrollingDoesNotWorkInAutoscrollMode) { + MAYBE_WheelScrollingDoesNotWorkInAutoscrollMode) { LoadURL(kAutoscrollDataURL); // Start autoscroll with middle click. @@ -320,8 +341,16 @@ // Checks that autoscrolling still works after changing the scroll direction // when the element is fully scrolled. +// TODO(crbug.com/419838337) Fix failing test on linux +#if BUILDFLAG(IS_LINUX) +#define MAYBE_AutoscrollDirectionChangeAfterFullyScrolled \ + DISABLED_AutoscrollDirectionChangeAfterFullyScrolled +#else +#define MAYBE_AutoscrollDirectionChangeAfterFullyScrolled \ + AutoscrollDirectionChangeAfterFullyScrolled +#endif IN_PROC_BROWSER_TEST_F(AutoscrollBrowserTest, - AutoscrollDirectionChangeAfterFullyScrolled) { + MAYBE_AutoscrollDirectionChangeAfterFullyScrolled) { LoadURL(kAutoscrollDataURL); // Start autoscroll with middle click.
diff --git a/content/browser/renderer_host/input/scroll_latency_browsertest.cc b/content/browser/renderer_host/input/scroll_latency_browsertest.cc index 78c1715..5851ff4 100644 --- a/content/browser/renderer_host/input/scroll_latency_browsertest.cc +++ b/content/browser/renderer_host/input/scroll_latency_browsertest.cc
@@ -6,6 +6,7 @@ #include "base/functional/bind.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h"
diff --git a/content/browser/renderer_host/input/scroll_tracing_browsertest.cc b/content/browser/renderer_host/input/scroll_tracing_browsertest.cc index 5de6c99..bba167f 100644 --- a/content/browser/renderer_host/input/scroll_tracing_browsertest.cc +++ b/content/browser/renderer_host/input/scroll_tracing_browsertest.cc
@@ -5,6 +5,7 @@ #include <memory> #include <string_view> +#include "base/strings/string_number_conversions.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_trace_processor.h"
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc index db53193..a87f8dd7 100644 --- a/content/browser/renderer_host/navigation_controller_impl.cc +++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -930,6 +930,7 @@ void NavigationControllerImpl::Reload(ReloadType reload_type, bool check_for_repost) { + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); SCOPED_CRASH_KEY_NUMBER("nav_reentrancy_caller1", "Reload_type", (int)reload_type); SCOPED_CRASH_KEY_BOOL("nav_reentrancy_caller1", "Reload_check", @@ -1006,7 +1007,7 @@ reload_type, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, actual_navigation_start); } void NavigationControllerImpl::CancelPendingReload() { @@ -1239,7 +1240,8 @@ std::vector<base::WeakPtr<NavigationRequest>> requests = GoToIndex(index, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, + /*actual_navigation_start=*/base::TimeTicks::Now()); std::vector<base::WeakPtr<NavigationHandle>> handles; std::ranges::move(requests, std::back_inserter(handles)); return handles; @@ -1251,7 +1253,8 @@ RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string* navigation_api_key) { + const std::string* navigation_api_key, + base::TimeTicks actual_navigation_start) { TRACE_EVENT0("browser,navigation,benchmark", "NavigationControllerImpl::GoToIndex"); SCOPED_CRASH_KEY_NUMBER("nav_reentrancy_caller1", "GoToIndex_index", index); @@ -1280,9 +1283,9 @@ pending_entry_index_ = index; pending_entry_->SetTransitionType(ui::PageTransitionFromInt( pending_entry_->GetTransitionType() | ui::PAGE_TRANSITION_FORWARD_BACK)); - return NavigateToExistingPendingEntry(ReloadType::NONE, initiator_rfh, - soft_navigation_heuristics_task_id, - navigation_api_key); + return NavigateToExistingPendingEntry( + ReloadType::NONE, initiator_rfh, soft_navigation_heuristics_task_id, + navigation_api_key, actual_navigation_start); } void NavigationControllerImpl::GoToOffset(int offset) { @@ -1297,21 +1300,23 @@ int offset, RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> - soft_navigation_heuristics_task_id) { + soft_navigation_heuristics_task_id, + base::TimeTicks actual_navigation_start) { // Note: This is actually reached in unit tests. if (!CanGoToOffset(offset)) return; GoToIndex(GetIndexForOffset(offset), initiator_rfh, soft_navigation_heuristics_task_id, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, actual_navigation_start); } std::vector<base::WeakPtr<NavigationRequest>> NavigationControllerImpl::GoToIndexAndReturnAllRequests(int index) { return GoToIndex(index, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, + /*actual_navigation_start=*/base::TimeTicks::Now()); } #if BUILDFLAG(IS_ANDROID) @@ -1386,6 +1391,16 @@ base::WeakPtr<NavigationHandle> NavigationControllerImpl::LoadURLWithParams( const LoadURLParams& params) { + // For now, treat this as the actual navigation start time, even though a fair + // amount of work is done in the browser process between the various ways to + // start a navigation and reaching here (e.g., sending OpenURLParams through + // the embedder and converting them to LoadURLParams). Note that this may be + // used for some renderer-initiated navigations that go through + // RenderFrameHostImpl::OpenURL as well. + // TODO(crbug.com/385170155): Consider whether tracking this earlier work with + // an earlier start time is worthwhile for metrics. + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); + if (params.is_renderer_initiated) DCHECK(params.initiator_origin.has_value()); @@ -1432,7 +1447,7 @@ // The user initiated a load, we don't need to reload anymore. needs_reload_ = false; - return NavigateWithoutEntry(params); + return NavigateWithoutEntry(params, actual_navigation_start); } void NavigationControllerImpl::LoadOriginalRequestURL() { @@ -2745,7 +2760,8 @@ RenderFrameHostImpl* render_frame_host, mojo::PendingAssociatedRemote<mojom::NavigationClient>* navigation_client, blink::LocalFrameToken initiator_frame_token, - int initiator_process_id) { + int initiator_process_id, + base::TimeTicks actual_navigation_start) { NavigationEntryImpl* entry = GetEntryWithUniqueID(render_frame_host->nav_entry_id()); if (!entry) @@ -2760,7 +2776,7 @@ render_frame_host->frame_tree_node(), entry, frame_entry, ReloadType::NONE, false /* is_same_document_history_load */, true /* is_history_navigation_in_new_child */, initiator_frame_token, - initiator_process_id); + initiator_process_id, actual_navigation_start); if (!request) return false; @@ -2791,6 +2807,7 @@ } bool NavigationControllerImpl::ReloadFrame(FrameTreeNode* frame_tree_node) { + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); NavigationEntryImpl* entry = GetEntryAtIndex(GetCurrentEntryIndex()); if (!entry) return false; @@ -2814,7 +2831,8 @@ false /* is_same_document_history_load */, false /* is_history_navigation_in_new_child */, std::nullopt /* initiator_frame_token */, - ChildProcessHost::kInvalidUniqueID /* initiator_process_id */); + ChildProcessHost::kInvalidUniqueID /* initiator_process_id */, + actual_navigation_start); if (!request) return false; frame_tree_node->navigator().Navigate(std::move(request), reload_type); @@ -3202,7 +3220,8 @@ RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string* navigation_api_key) { + const std::string* navigation_api_key, + base::TimeTicks actual_navigation_start) { TRACE_EVENT0("navigation", "NavigationControllerImpl::NavigateToExistingPendingEntry"); DCHECK(pending_entry_); @@ -3253,7 +3272,8 @@ std::vector<std::unique_ptr<NavigationRequest>> different_document_loads; FindFramesToNavigate(root, reload_type, initiator_frame_token, initiator_process_id, soft_navigation_heuristics_task_id, - &same_document_loads, &different_document_loads); + actual_navigation_start, &same_document_loads, + &different_document_loads); if (same_document_loads.empty() && different_document_loads.empty()) { // We were unable to match any frames to navigate. This can happen if a @@ -3279,7 +3299,8 @@ ReloadType::NONE /* reload_type */, true /* is_same_document_history_load */, false /* is_history_navigation_in_new_child */, - initiator_frame_token, initiator_process_id); + initiator_frame_token, initiator_process_id, + actual_navigation_start); if (!navigation_request) { // If this navigation cannot start, delete the pending NavigationEntry. DiscardPendingEntry(false); @@ -3390,7 +3411,7 @@ root, pending_entry_, pending_entry_->GetFrameEntry(root), ReloadType::NONE, false /* is_same_document_history_load */, false /* is_history_navigation_in_new_child */, initiator_frame_token, - initiator_process_id); + initiator_process_id, actual_navigation_start); request = navigation_request->GetWeakPtr(); root->navigator().Navigate(std::move(navigation_request), ReloadType::NONE); @@ -3687,6 +3708,7 @@ int initiator_process_id, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, + base::TimeTicks actual_navigation_start, std::vector<std::unique_ptr<NavigationRequest>>* same_document_loads, std::vector<std::unique_ptr<NavigationRequest>>* different_document_loads) { DCHECK(pending_entry_); @@ -3701,7 +3723,7 @@ /*is_same_document_history_load=*/true, /*is_history_navigation_in_new_child_frame=*/false, initiator_frame_token, initiator_process_id, - soft_navigation_heuristics_task_id); + actual_navigation_start, soft_navigation_heuristics_task_id); if (navigation_request) { // Only add the request if was properly created. It's possible for the // creation to fail in certain cases, e.g. when the URL is invalid. @@ -3713,7 +3735,8 @@ frame, pending_entry_, new_item, reload_type, false /* is_same_document_history_load */, false /* is_history_navigation_in_new_child */, - initiator_frame_token, initiator_process_id); + initiator_frame_token, initiator_process_id, + actual_navigation_start); if (navigation_request) { // Only add the request if was properly created. It's possible for the // creation to fail in certain cases, e.g. when the URL is invalid. @@ -3733,12 +3756,14 @@ FindFramesToNavigate(frame->child_at(i), reload_type, initiator_frame_token, initiator_process_id, /*soft_navigation_heuristics_task_id=*/std::nullopt, - same_document_loads, different_document_loads); + actual_navigation_start, same_document_loads, + different_document_loads); } } base::WeakPtr<NavigationHandle> NavigationControllerImpl::NavigateWithoutEntry( - const LoadURLParams& params) { + const LoadURLParams& params, + base::TimeTicks actual_navigation_start) { FrameTreeNode* node = GetTargetFrameTreeNodeForNavigation(params); // Compute overrides to the LoadURLParams for |override_user_agent|, @@ -3848,22 +3873,13 @@ // RenderFrameHost to execute its BeforeUnload event, the navigation start // will be updated when the BeforeUnload ack is received. const auto navigation_start_time = base::TimeTicks::Now(); - // For now, treat this as the actual navigation start time as well, even - // though a fair amount of work is done in the browser process between the - // various ways to start a navigation and reaching here (e.g., sending - // OpenURLParams through the embedder and converting them to LoadURLParams). - // Note that this may be used for some renderer-initiated navigations that go - // through RenderFrameHostImpl::OpenURL as well. - // TODO(crbug.com/385170155): Consider whether tracking this earlier work with - // an earlier start time is worthwhile for metrics. - const auto actual_navigation_start_time = navigation_start_time; std::unique_ptr<NavigationRequest> request = CreateNavigationRequestFromLoadParams( node, params, override_user_agent, should_replace_current_entry, params.has_user_gesture, network::mojom::SourceLocation::New(), reload_type, pending_entry_, pending_entry_->GetFrameEntry(node), - actual_navigation_start_time, navigation_start_time); + actual_navigation_start, navigation_start_time); // If the navigation couldn't start, return immediately and discard the // pending NavigationEntry. @@ -4293,6 +4309,7 @@ bool is_history_navigation_in_new_child_frame, const std::optional<blink::LocalFrameToken>& initiator_frame_token, int initiator_process_id, + base::TimeTicks actual_navigation_start, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id) { DCHECK(frame_entry); @@ -4323,9 +4340,6 @@ // "Open link in new tab"). If the navigation must wait on the current // RenderFrameHost to execute its BeforeUnload event, the navigation start // will be updated when the BeforeUnload ack is received. - // TODO(crbug.com/385170155): Consider whether to track an earlier - // `actual_navigation_start` by plumbing it from the the initiator (e.g., - // for renderer-initiated history navigations, etc). base::TimeTicks navigation_start = base::TimeTicks::Now(); const auto navigation_start_system_entropy = SystemEntropyUtils::ComputeSystemEntropyForFrameTreeNode( @@ -4369,8 +4383,7 @@ entry->ConstructCommonNavigationParams( *frame_entry, request_body, dest_url, blink::mojom::Referrer::New(dest_referrer.url, dest_referrer.policy), - navigation_type, /*actual_navigation_start=*/navigation_start, - navigation_start, + navigation_type, actual_navigation_start, navigation_start, /*input_start=*/base::TimeTicks()); common_params->is_history_navigation_in_new_child_frame = is_history_navigation_in_new_child_frame; @@ -4442,6 +4455,7 @@ } void NavigationControllerImpl::LoadIfNecessary() { + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); SCOPED_CRASH_KEY_BOOL("nav_reentrancy_caller1", "LoadIf_pending", !!pending_entry_); if (!needs_reload_) @@ -4467,13 +4481,13 @@ ReloadType::NONE, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, actual_navigation_start); } else if (pending_entry_) { NavigateToExistingPendingEntry( ReloadType::NONE, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, actual_navigation_start); } else if (!GetLastCommittedEntry() ->IsInitialEntryNotForSynchronousAboutBlank()) { pending_entry_ = entries_[last_committed_entry_index_].get(); @@ -4482,7 +4496,7 @@ ReloadType::NONE, /*initiator_rfh=*/nullptr, /*soft_navigation_heuristics_task_id=*/std::nullopt, - /*navigation_api_key=*/nullptr); + /*navigation_api_key=*/nullptr, actual_navigation_start); } else { // We should never navigate to an existing initial NavigationEntry that is // the initial NavigationEntry for the initial empty document that hasn't @@ -5041,7 +5055,8 @@ RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string& key) { + const std::string& key, + base::TimeTicks actual_navigation_start) { FrameTreeNode* node = initiator_rfh->frame_tree_node(); FrameNavigationEntry* current_entry = GetLastCommittedEntry()->GetFrameEntry(node); @@ -5061,7 +5076,8 @@ if (result == HistoryNavigationAction::kStopLooking) break; if (result != HistoryNavigationAction::kKeepLooking) { - GoToIndex(i, initiator_rfh, soft_navigation_heuristics_task_id, &key); + GoToIndex(i, initiator_rfh, soft_navigation_heuristics_task_id, &key, + actual_navigation_start); return; } } @@ -5071,7 +5087,8 @@ if (result == HistoryNavigationAction::kStopLooking) break; if (result != HistoryNavigationAction::kKeepLooking) { - GoToIndex(i, initiator_rfh, soft_navigation_heuristics_task_id, &key); + GoToIndex(i, initiator_rfh, soft_navigation_heuristics_task_id, &key, + actual_navigation_start); return; } }
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h index 5fc7c654..f0653cd 100644 --- a/content/browser/renderer_host/navigation_controller_impl.h +++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -180,7 +180,8 @@ RenderFrameHostImpl* render_frame_host, mojo::PendingAssociatedRemote<mojom::NavigationClient>* navigation_client, blink::LocalFrameToken initiator_frame_token, - int initiator_process_id); + int initiator_process_id, + base::TimeTicks actual_navigation_start); // Reloads the |frame_tree_node| and returns true. In some rare cases, there // is no history related to the frame, nothing happens and this returns false. @@ -191,10 +192,12 @@ // |initiator_rfh| is the frame that requested the navigation. // |soft_navigation_heuristics_task_id| is the task in the renderer that // initiated this call (if any). + // |actual_navigation_start| is the time the navigation began, for metrics. void GoToOffsetFromRenderer(int offset, RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> - soft_navigation_heuristics_task_id); + soft_navigation_heuristics_task_id, + base::TimeTicks actual_navigation_start); // A variation of `NavigationController::GoToIndex()`, that also returns all // the created `NavigationRequest`s. If no navigation request is created, the @@ -265,11 +268,13 @@ // other history navigation. // |soft_navigation_heuristics_task_id|: The task in the renderer that // initiated this call (if any). + // |actual_navigation_start| is the time the navigation began, for metrics. void NavigateToNavigationApiKey( RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string& key); + const std::string& key, + base::TimeTicks actual_navigation_start); // Whether this is the initial navigation in an unmodified new tab. In this // case, we know there is no content displayed in the page. @@ -652,12 +657,14 @@ // If this navigation originated from the navigation API, |navigation_api_key| // will be set and indicate the navigation api key that |initiator_rfh| // asked to be navigated to. + // |actual_navigation_start| is the time the navigation began, for metrics. std::vector<base::WeakPtr<NavigationRequest>> GoToIndex( int index, RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string* navigation_api_key); + const std::string* navigation_api_key, + base::TimeTicks actual_navigation_start); // Starts a navigation to an already existing pending NavigationEntry. Returns // all the created `NavigationRequest`s. If no request was created, the @@ -668,12 +675,14 @@ // asked to be navigated to. // |soft_navigation_heuristics_task_id|: The task in the renderer that // initiated this call (if any). + // |actual_navigation_start| is the time the navigation began, for metrics. std::vector<base::WeakPtr<NavigationRequest>> NavigateToExistingPendingEntry( ReloadType reload_type, RenderFrameHostImpl* initiator_rfh, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, - const std::string* navigation_api_key); + const std::string* navigation_api_key, + base::TimeTicks actual_navigation_start); // Helper function used by FindFramesToNavigate to determine the appropriate // action to take for a particular frame while navigating to @@ -686,6 +695,7 @@ // to |pending_entry_|, starting at |frame| and exploring its children. // |same_document_loads| and |different_document_loads| will be filled with // the NavigationRequests needed to navigate to |pending_entry_|. + // |actual_navigation_start| is the time the navigation began, for metrics. // |soft_navigation_heuristics_task_id|: The task in the renderer that // initiated this call (if any). void FindFramesToNavigate( @@ -695,14 +705,17 @@ int initiator_process_id, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id, + base::TimeTicks actual_navigation_start, std::vector<std::unique_ptr<NavigationRequest>>* same_document_loads, std::vector<std::unique_ptr<NavigationRequest>>* different_document_loads); // Starts a new navigation based on |load_params|, that doesn't correspond to // an existing NavigationEntry. + // |actual_navigation_start| is the time the navigation began, for metrics. base::WeakPtr<NavigationHandle> NavigateWithoutEntry( - const LoadURLParams& load_params); + const LoadURLParams& load_params, + base::TimeTicks actual_navigation_start); // Handles a navigation to a renderer-debug URL. void HandleRendererDebugURL(FrameTreeNode* frame_tree_node, const GURL& url); @@ -764,6 +777,7 @@ bool is_history_navigation_in_new_child_frame, const std::optional<blink::LocalFrameToken>& initiator_frame_token, int initiator_process_id, + base::TimeTicks actual_navigation_start, std::optional<blink::scheduler::TaskAttributionId> soft_navigation_heuristics_task_id = std::nullopt);
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc index 14103a20..c92644dd 100644 --- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -21405,8 +21405,9 @@ // NavigateToNavigationApiKey() should not crash if the renderer manages to // call it when there is no committed origin. - controller.NavigateToNavigationApiKey(current_main_frame_host(), std::nullopt, - "key_doesnt_matter"); + controller.NavigateToNavigationApiKey( + current_main_frame_host(), std::nullopt, "key_doesnt_matter", + /*actual_navigation_start=*/base::TimeTicks::Now()); } // Tests that renderer-initiated navigation cancellation from the same JS task
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc index b9e7ef0..74e9404 100644 --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -4107,7 +4107,8 @@ // NavigateToNavigationApiKey(). No navigation should occur. controller.NavigateToNavigationApiKey( main_test_rfh(), - /*soft_navigation_heuristics_task_id=*/std::nullopt, first_key); + /*soft_navigation_heuristics_task_id=*/std::nullopt, first_key, + /*actual_navigation_start=*/base::TimeTicks::Now()); EXPECT_FALSE(controller.GetPendingEntry()); } @@ -4143,14 +4144,15 @@ main_test_rfh()->frame_tree_node()->child_at(0); controller_impl().NavigateToNavigationApiKey( subframe_node->current_frame_host(), - /*soft_navigation_heuristics_task_id=*/std::nullopt, first_main_key); + /*soft_navigation_heuristics_task_id=*/std::nullopt, first_main_key, + /*actual_navigation_start=*/base::TimeTicks::Now()); EXPECT_FALSE(controller_impl().GetPendingEntry()); // Call NavigateToNavigationApiKey() on the main frame with the key from the // main frame. This time a navigation should begin. controller_impl().NavigateToNavigationApiKey( main_test_rfh(), /*soft_navigation_heuristics_task_id=*/std::nullopt, - first_main_key); + first_main_key, /*actual_navigation_start=*/base::TimeTicks::Now()); EXPECT_TRUE(controller_impl().GetPendingEntry()); }
diff --git a/content/browser/renderer_host/navigation_request_unittest.cc b/content/browser/renderer_host/navigation_request_unittest.cc index 3ee00512..e605f7f 100644 --- a/content/browser/renderer_host/navigation_request_unittest.cc +++ b/content/browser/renderer_host/navigation_request_unittest.cc
@@ -11,6 +11,7 @@ #include "base/containers/flat_map.h" #include "base/functional/bind.h" #include "base/i18n/number_formatting.h" +#include "base/strings/string_number_conversions.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/public/browser/navigation_throttle.h"
diff --git a/content/browser/renderer_host/navigator.cc b/content/browser/renderer_host/navigator.cc index d976c08..3c736de2 100644 --- a/content/browser/renderer_host/navigator.cc +++ b/content/browser/renderer_host/navigator.cc
@@ -472,10 +472,11 @@ RenderFrameHostImpl* render_frame_host, mojo::PendingAssociatedRemote<mojom::NavigationClient>* navigation_client, blink::LocalFrameToken initiator_frame_token, - int initiator_process_id) { + int initiator_process_id, + base::TimeTicks actual_navigation_start) { return controller_.StartHistoryNavigationInNewSubframe( render_frame_host, navigation_client, initiator_frame_token, - initiator_process_id); + initiator_process_id, actual_navigation_start); } void Navigator::DidNavigate( @@ -1220,7 +1221,8 @@ if (begin_params->initiator_frame_token && frame_tree_node->navigator().StartHistoryNavigationInNewSubframe( frame_tree_node->current_frame_host(), &navigation_client, - *begin_params->initiator_frame_token, initiator_process_id)) { + *begin_params->initiator_frame_token, initiator_process_id, + common_params->actual_navigation_start)) { return; } }
diff --git a/content/browser/renderer_host/navigator.h b/content/browser/renderer_host/navigator.h index d0ef86ab..fe3ee7a 100644 --- a/content/browser/renderer_host/navigator.h +++ b/content/browser/renderer_host/navigator.h
@@ -108,7 +108,8 @@ RenderFrameHostImpl* render_frame_host, mojo::PendingAssociatedRemote<mojom::NavigationClient>* navigation_client, blink::LocalFrameToken initiator_frame_token, - int initiator_process_id); + int initiator_process_id, + base::TimeTicks actual_navigation_start); // Navigation requests -------------------------------------------------------
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index aae3b39..23cd457 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8343,6 +8343,8 @@ soft_navigation_heuristics_task_id) { OPTIONAL_TRACE_EVENT2("content", "RenderFrameHostImpl::GoToEntryAtOffset", "render_frame_host", this, "offset", offset); + // TODO(crbug.com/385170155): Pass the actual start time from the renderer. + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); // Non-user initiated navigations coming from the renderer should be ignored // if there is an ongoing browser-initiated navigation. @@ -8358,7 +8360,8 @@ // All frames are allowed to navigate the global history. if (delegate_->IsAllowedToGoToEntryAtOffset(offset)) { frame_tree_->controller().GoToOffsetFromRenderer( - offset, this, soft_navigation_heuristics_task_id); + offset, this, soft_navigation_heuristics_task_id, + actual_navigation_start); } } @@ -8366,6 +8369,9 @@ const std::string& key, bool has_user_gesture, std::optional<blink::scheduler::TaskAttributionId> task_id) { + // TODO(crbug.com/385170155): Pass the actual start time from the renderer. + base::TimeTicks actual_navigation_start = base::TimeTicks::Now(); + // Non-user initiated navigations coming from the renderer should be ignored // if there is an ongoing browser-initiated navigation. // See https://crbug.com/879965. @@ -8376,7 +8382,8 @@ frame_tree_->root()->navigation_request(), has_user_gesture)) { return; } - frame_tree_->controller().NavigateToNavigationApiKey(this, task_id, key); + frame_tree_->controller().NavigateToNavigationApiKey(this, task_id, key, + actual_navigation_start); } void RenderFrameHostImpl::NavigateEventHandlerPresenceChanged(bool present) {
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc index 03abd477..3b64a5a3 100644 --- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -827,16 +827,18 @@ histogram_tester.ExpectTotalCount( "Navigation.Timeline.TotalExcludingBeforeUnload.MainFrameOnly.Duration", 1); - // This navigation has no start adjustment or delayed start time, so there - // are no IgnoredIncorrectly metrics reported. + // This navigation has no start adjustment, but the + //`actual_navigation_start` is now recorded at an earlier time (closer to + // the start of the navigation) than the web-facing `navigation_start_time` + // in NavigateWithoutEntry, so this triggers IgnoredIncorrectly metrics. histogram_tester.ExpectTotalCount( - "Navigation.Timeline.IgnoredIncorrectly.Duration", 0); + "Navigation.Timeline.IgnoredIncorrectly.Duration", 1); histogram_tester.ExpectTotalCount( - "Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Duration", 0); + "Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Duration", 1); histogram_tester.ExpectTotalCount( - "Navigation.Timeline.IgnoredIncorrectly.Percentage", 0); + "Navigation.Timeline.IgnoredIncorrectly.Percentage", 1); histogram_tester.ExpectTotalCount( - "Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Percentage", 0); + "Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Percentage", 1); } // Disable the hang monitor, otherwise there will be a race between the // beforeunload dialog and the beforeunload hang timer.
diff --git a/content/browser/renderer_host/render_widget_host_browsertest.cc b/content/browser/renderer_host/render_widget_host_browsertest.cc index 14bc757..181f68b 100644 --- a/content/browser/renderer_host/render_widget_host_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_browsertest.cc
@@ -9,6 +9,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index 58cfd87..df4f06d9 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -25,6 +25,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/system/sys_info.h" #include "base/task/single_thread_task_runner.h"
diff --git a/content/browser/service_worker/service_worker_cache_writer.cc b/content/browser/service_worker/service_worker_cache_writer.cc index 27b9c170..1da84de 100644 --- a/content/browser/service_worker/service_worker_cache_writer.cc +++ b/content/browser/service_worker/service_worker_cache_writer.cc
@@ -12,6 +12,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/raw_ptr.h" #include "base/numerics/safe_conversions.h" +#include "base/strings/string_number_conversions.h" #include "base/task/sequenced_task_runner.h" #include "crypto/secure_hash.h" #include "crypto/sha2.h"
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 5cf4224..c6a73fa4 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -25,6 +25,7 @@ #include "base/not_fatal_until.h" #include "base/observer_list.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "base/time/default_clock.h"
diff --git a/content/browser/shared_storage/shared_storage_browsertest_base.cc b/content/browser/shared_storage/shared_storage_browsertest_base.cc index ed56f9c..1baa0e8 100644 --- a/content/browser/shared_storage/shared_storage_browsertest_base.cc +++ b/content/browser/shared_storage/shared_storage_browsertest_base.cc
@@ -22,6 +22,7 @@ #include "base/metrics/statistics_recorder.h" #include "base/run_loop.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h"
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc index bbdaeee2..d24509d 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.cc +++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -14,6 +14,7 @@ #include "base/check.h" #include "base/metrics/histogram_functions.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/timer/elapsed_timer.h"
diff --git a/content/browser/site_per_process_layout_browsertest.cc b/content/browser/site_per_process_layout_browsertest.cc index 2aae340..22213cf 100644 --- a/content/browser/site_per_process_layout_browsertest.cc +++ b/content/browser/site_per_process_layout_browsertest.cc
@@ -5,6 +5,7 @@ #include <optional> #include "base/json/json_reader.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" #include "base/test/gmock_expected_support.h"
diff --git a/content/browser/site_per_process_scroll_browsertest.cc b/content/browser/site_per_process_scroll_browsertest.cc index 8894588c..95d2335 100644 --- a/content/browser/site_per_process_scroll_browsertest.cc +++ b/content/browser/site_per_process_scroll_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 "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h"
diff --git a/content/browser/webid/digital_credentials/cross_device_request_dispatcher.cc b/content/browser/webid/digital_credentials/cross_device_request_dispatcher.cc index 9b1be32..08e372d 100644 --- a/content/browser/webid/digital_credentials/cross_device_request_dispatcher.cc +++ b/content/browser/webid/digital_credentials/cross_device_request_dispatcher.cc
@@ -7,6 +7,7 @@ #include "base/functional/bind.h" #include "base/json/json_reader.h" #include "base/json/json_writer.h" +#include "base/strings/string_number_conversions.h" #include "base/types/optional_util.h" #include "base/values.h" #include "components/device_event_log/device_event_log.h"
diff --git a/content/browser/webui/web_ui_navigation_browsertest.cc b/content/browser/webui/web_ui_navigation_browsertest.cc index 3f7caf6..e1a9d8e 100644 --- a/content/browser/webui/web_ui_navigation_browsertest.cc +++ b/content/browser/webui/web_ui_navigation_browsertest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "content/browser/child_process_security_policy_impl.h"
diff --git a/content/browser/worker_network_isolation_key_browsertest.cc b/content/browser/worker_network_isolation_key_browsertest.cc index d812265..bd259bc 100644 --- a/content/browser/worker_network_isolation_key_browsertest.cc +++ b/content/browser/worker_network_isolation_key_browsertest.cc
@@ -4,6 +4,7 @@ #include "base/path_service.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h"
diff --git a/content/public/browser/origin_trial_status_change_details.h b/content/public/browser/origin_trial_status_change_details.h index 66dfff62..00045df 100644 --- a/content/public/browser/origin_trial_status_change_details.h +++ b/content/public/browser/origin_trial_status_change_details.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/strings/string_number_conversions.h" #include "base/strings/to_string.h" #include "content/common/content_export.h" #include "services/metrics/public/cpp/ukm_source_id.h"
diff --git a/content/public/browser/permission_overrides.cc b/content/public/browser/permission_overrides.cc index 27c8485..c9e10850 100644 --- a/content/public/browser/permission_overrides.cc +++ b/content/public/browser/permission_overrides.cc
@@ -5,7 +5,9 @@ #include "content/public/browser/permission_overrides.h" #include "base/containers/contains.h" +#include "base/containers/map_util.h" #include "base/types/optional_ref.h" +#include "base/types/optional_util.h" #include "third_party/blink/public/common/permissions/permission_utils.h" namespace content { @@ -39,13 +41,13 @@ std::optional<PermissionStatus> PermissionOverrides::Get( const url::Origin& origin, blink::PermissionType permission) const { - auto current_override = overrides_.find({origin, permission}); - if (current_override == overrides_.end()) - current_override = overrides_.find({global_overrides_origin_, permission}); - if (current_override == overrides_.end()) - return std::nullopt; + const auto* status = base::FindOrNull(overrides_, {origin, permission}); + if (!status) { + status = + base::FindOrNull(overrides_, {global_overrides_origin_, permission}); + } - return current_override->second; + return base::OptionalFromPtr(status); } void PermissionOverrides::Reset(base::optional_ref<const url::Origin> origin) {
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 01c616d5..75a5d885 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1442,7 +1442,7 @@ BASE_FEATURE(kPwaNavigationCapturing, "PwaNavigationCapturing", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam<CapturingState>::Option kNavigationCapturingParams[] = {{CapturingState::kDefaultOn, "on_by_default"}, {CapturingState::kDefaultOff, "off_by_default"}, @@ -1452,7 +1452,7 @@ const base::FeatureParam<CapturingState> kNavigationCapturingDefaultState{ &kPwaNavigationCapturing, "link_capturing_state", - CapturingState::kReimplDefaultOn, &kNavigationCapturingParams}; + CapturingState::kReimplOnViaClientMode, &kNavigationCapturingParams}; const base::FeatureParam<std::string> kForcedOffCapturingAppsOnFirstNavigation{ &kPwaNavigationCapturing, "initial_nav_forced_off_apps", ""};
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java index ddbc19b2..2c81d22 100644 --- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java
@@ -207,8 +207,8 @@ StringBuilder sb = new StringBuilder(); sb.append("(function() {"); sb.append( - " return [document.documentElement.clientWidth," - + " document.documentElement.clientHeight];"); + " return [Math.round(window.visualViewport.width)," + + " Math.round(window.visualViewport.height)];"); sb.append("})();"); String jsonText = @@ -810,8 +810,7 @@ TestInputMethodManagerWrapper inputMethodManagerWrapper = TestInputMethodManagerWrapper.create(imeAdapter); imeAdapter.setInputMethodManagerWrapper(inputMethodManagerWrapper); - // Click the text field node, so that it would get focus. - DOMUtils.clickNode(webContents, nodeId); + DOMUtils.focusNode(webContents, nodeId); CriteriaHelper.pollInstrumentationThread( () -> { try {
diff --git a/content/public/test/content_mock_cert_verifier.cc b/content/public/test/content_mock_cert_verifier.cc index 985a1659..d999e15b 100644 --- a/content/public/test/content_mock_cert_verifier.cc +++ b/content/public/test/content_mock_cert_verifier.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/feature_list.h" +#include "base/strings/string_number_conversions.h" #include "content/public/browser/network_service_instance.h" #include "content/public/browser/network_service_util.h" #include "content/public/common/content_switches.h"
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc index bc4846ab..f2dcd669 100644 --- a/content/public/test/fenced_frame_test_util.cc +++ b/content/public/test/fenced_frame_test_util.cc
@@ -8,6 +8,7 @@ #include <string_view> #include <vector> +#include "base/strings/string_number_conversions.h" #include "base/test/run_until.h" #include "base/trace_event/typed_macros.h" #include "content/browser/fenced_frame/fenced_frame.h"
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc index f0b9906..91a6986 100644 --- a/content/public/test/network_service_test_helper.cc +++ b/content/public/test/network_service_test_helper.cc
@@ -22,6 +22,7 @@ #include "base/memory/weak_ptr.h" #include "base/metrics/field_trial.h" #include "base/process/process.h" +#include "base/strings/string_number_conversions.h" #include "base/task/current_thread.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h"
diff --git a/content/public/test/slow_download_http_response.cc b/content/public/test/slow_download_http_response.cc index d44896c..9b0df18 100644 --- a/content/public/test/slow_download_http_response.cc +++ b/content/public/test/slow_download_http_response.cc
@@ -5,6 +5,7 @@ #include "content/public/test/slow_download_http_response.h" #include "base/functional/bind.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/task/single_thread_task_runner.h" #include "base/test/bind.h"
diff --git a/content/public/test/url_loader_interceptor.cc b/content/public/test/url_loader_interceptor.cc index 8575b40..22ed743 100644 --- a/content/public/test/url_loader_interceptor.cc +++ b/content/public/test/url_loader_interceptor.cc
@@ -17,6 +17,7 @@ #include "base/path_service.h" #include "base/run_loop.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/synchronization/lock.h" #include "base/test/bind.h" #include "base/threading/thread_restrictions.h"
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc index d0d6b8e..726b75e 100644 --- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc +++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -10,6 +10,7 @@ #include <vector> #include "base/containers/adapters.h" +#include "base/strings/string_number_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "content/public/renderer/plugin_ax_tree_action_target_adapter.h"
diff --git a/content/renderer/sandbox_mac_v2_unittest.mm b/content/renderer/sandbox_mac_v2_unittest.mm index d94e819..ec2754f 100644 --- a/content/renderer/sandbox_mac_v2_unittest.mm +++ b/content/renderer/sandbox_mac_v2_unittest.mm
@@ -19,6 +19,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/mac/mac_util.h" #include "base/process/kill.h" +#include "base/strings/string_number_conversions.h" #include "base/system/sys_info.h" #include "base/test/multiprocess_test.h" #include "base/test/test_timeouts.h"
diff --git a/content/services/auction_worklet/for_debugging_only_bindings.cc b/content/services/auction_worklet/for_debugging_only_bindings.cc index f346f4c..a775193f 100644 --- a/content/services/auction_worklet/for_debugging_only_bindings.cc +++ b/content/services/auction_worklet/for_debugging_only_bindings.cc
@@ -13,6 +13,7 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/auction_v8_logger.h" #include "content/services/auction_worklet/webidl_compat.h"
diff --git a/content/services/auction_worklet/seller_lazy_filler.cc b/content/services/auction_worklet/seller_lazy_filler.cc index 5783373..88e6a75e 100644 --- a/content/services/auction_worklet/seller_lazy_filler.cc +++ b/content/services/auction_worklet/seller_lazy_filler.cc
@@ -9,6 +9,7 @@ #include <vector> #include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/auction_worklet_util.h" #include "gin/converter.h"
diff --git a/content/services/auction_worklet/seller_worklet_unittest.cc b/content/services/auction_worklet/seller_worklet_unittest.cc index 1bde1b9..9c4f6d2e 100644 --- a/content/services/auction_worklet/seller_worklet_unittest.cc +++ b/content/services/auction_worklet/seller_worklet_unittest.cc
@@ -16,6 +16,7 @@ #include "base/feature_list.h" #include "base/functional/bind.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind.h"
diff --git a/content/services/auction_worklet/trusted_kvv2_signals_unittest.cc b/content/services/auction_worklet/trusted_kvv2_signals_unittest.cc index d29a50c..addd09c 100644 --- a/content/services/auction_worklet/trusted_kvv2_signals_unittest.cc +++ b/content/services/auction_worklet/trusted_kvv2_signals_unittest.cc
@@ -12,6 +12,7 @@ #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/bind.h"
diff --git a/content/services/auction_worklet/trusted_signals.cc b/content/services/auction_worklet/trusted_signals.cc index 7add1066..8188d4df 100644 --- a/content/services/auction_worklet/trusted_signals.cc +++ b/content/services/auction_worklet/trusted_signals.cc
@@ -20,6 +20,7 @@ #include "base/memory/ptr_util.h" #include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/task/sequenced_task_runner.h" #include "content/common/features.h"
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc index d2abc51..c214d289 100644 --- a/content/shell/app/shell_main_delegate.cc +++ b/content/shell/app/shell_main_delegate.cc
@@ -19,6 +19,7 @@ #include "base/logging.h" #include "base/path_service.h" #include "base/process/current_process.h" +#include "base/strings/string_number_conversions.h" #include "base/trace_event/trace_log.h" #include "build/build_config.h" #include "components/crash/core/common/crash_key.h"
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc index 76b167d..4d24638 100644 --- a/content/test/navigation_simulator_impl.cc +++ b/content/test/navigation_simulator_impl.cc
@@ -1351,7 +1351,8 @@ static_cast<NavigationControllerImpl&>(web_contents_->GetController()) .GoToOffsetFromRenderer( session_history_offset_, render_frame_host_, - /*soft_navigation_heuristics_task_id=*/std::nullopt); + /*soft_navigation_heuristics_task_id=*/std::nullopt, + /*actual_navigation_start=*/base::TimeTicks::Now()); request_ = render_frame_host_->frame_tree_node()->navigation_request(); return true; }
diff --git a/crypto/hash.cc b/crypto/hash.cc index 1edc76eb..f588d3a 100644 --- a/crypto/hash.cc +++ b/crypto/hash.cc
@@ -18,6 +18,8 @@ return EVP_sha1(); case HashKind::kSha256: return EVP_sha256(); + case HashKind::kSha384: + return EVP_sha384(); case HashKind::kSha512: return EVP_sha512(); }
diff --git a/crypto/hash.h b/crypto/hash.h index 6a812bbb..78b6cbe 100644 --- a/crypto/hash.h +++ b/crypto/hash.h
@@ -19,6 +19,7 @@ inline constexpr size_t kSha1Size = 20; inline constexpr size_t kSha256Size = 32; +inline constexpr size_t kSha384Size = 48; inline constexpr size_t kSha512Size = 64; // Unless your code needs to be generic over HashKind, use one of these @@ -40,6 +41,7 @@ enum HashKind { kSha1, kSha256, + kSha384, kSha512, }; @@ -49,6 +51,8 @@ return kSha1Size; case kSha256: return kSha256Size; + case kSha384: + return kSha384Size; case kSha512: return kSha512Size; }
diff --git a/crypto/hash_unittest.cc b/crypto/hash_unittest.cc index 4f64735..b40dd81 100644 --- a/crypto/hash_unittest.cc +++ b/crypto/hash_unittest.cc
@@ -58,6 +58,26 @@ } } +TEST(HashTest, Sha384) { + // FIPS 180-4 "SHA384ShortMsg" test vector: + TestCase c = { + .message = "e1bb967b5d379a4aa39050274d09bd93", + .digest = + "3b04f96965ad2fbabd4df25d5d8c95589d069c312ee48539090b2d7b495d2446c31e" + "b2b8f8ffb3012bdce065323d9f48", + }; + + std::vector<uint8_t> message; + std::array<uint8_t, 48> digest; + PrepareTestCase(c, &message, digest); + + std::vector<uint8_t> computed_digest( + crypto::hash::DigestSizeForHashKind(crypto::hash::kSha384)); + crypto::hash::Hash(crypto::hash::kSha384, base::as_byte_span(message), + computed_digest); + EXPECT_EQ(base::as_byte_span(digest), base::as_byte_span(computed_digest)); +} + TEST(HashTest, Sha512) { const auto cases = std::to_array<TestCase>( {// FIPS 180-4 "SHA512ShortMsg" test vector:
diff --git a/crypto/hmac.cc b/crypto/hmac.cc index 7143174..72d918e6 100644 --- a/crypto/hmac.cc +++ b/crypto/hmac.cc
@@ -118,6 +118,8 @@ return EVP_sha1(); case crypto::hash::HashKind::kSha256: return EVP_sha256(); + case crypto::hash::HashKind::kSha384: + return EVP_sha384(); case crypto::hash::HashKind::kSha512: return EVP_sha512(); }
diff --git a/crypto/hmac_unittest.cc b/crypto/hmac_unittest.cc index 0e512f5..2168048 100644 --- a/crypto/hmac_unittest.cc +++ b/crypto/hmac_unittest.cc
@@ -394,6 +394,24 @@ EXPECT_FALSE(crypto::hmac::VerifySha256(key, data, result)); } +TEST(HMACTest, OneShotSha384) { + // RFC 4231 test case 3: + std::vector<uint8_t> key(20, 0xaa); + std::vector<uint8_t> data(50, 0xdd); + std::vector<uint8_t> expected; + CHECK( + base::HexStringToBytes("88062608d3e6ad8a0aa2ace014c8a86f0aa635d947ac9febe" + "83ef4e55966144b2a5ab39dc13814b94e3ab6e101a34f27", + &expected)); + + std::array<uint8_t, crypto::hash::kSha384Size> result; + crypto::hmac::Sign(crypto::hash::kSha384, key, data, result); + EXPECT_EQ(base::as_byte_span(result), base::as_byte_span(expected)); + EXPECT_TRUE(crypto::hmac::Verify(crypto::hash::kSha384, key, data, result)); + result[0] ^= 0x01; + EXPECT_FALSE(crypto::hmac::Verify(crypto::hash::kSha384, key, data, result)); +} + TEST(HMACTest, OneShotSha512) { // RFC 4231 test case 3: std::vector<uint8_t> key(20, 0xaa);
diff --git a/device/vr/android/arcore/ar_compositor_frame_sink.cc b/device/vr/android/arcore/ar_compositor_frame_sink.cc index d71d654c..01d7be8 100644 --- a/device/vr/android/arcore/ar_compositor_frame_sink.cc +++ b/device/vr/android/arcore/ar_compositor_frame_sink.cc
@@ -447,16 +447,17 @@ /*nearest_neighbor=*/false, /*secure_output_only=*/false, gfx::ProtectedVideoType::kClear); - auto renderer_resource = viz::TransferableResource::MakeGpu( + viz::TransferableResource::MetadataOverride render_resource_overrides = { + .is_overlay_candidate = false, + .origin = frame_type == FrameType::kHasWebGlContent + ? kBottomLeft_GrSurfaceOrigin + : kTopLeft_GrSurfaceOrigin, + }; + + auto renderer_resource = viz::TransferableResource::Make( renderer_buffer->shared_image, - renderer_buffer->shared_image->GetTextureTarget(), - renderer_buffer->sync_token, renderer_buffer->size, - viz::SinglePlaneFormat::kRGBA_8888, - /*is_overlay_candidate=*/false, - viz::TransferableResource::ResourceSource::kAR); - renderer_resource.origin = frame_type == FrameType::kHasWebGlContent - ? kBottomLeft_GrSurfaceOrigin - : kTopLeft_GrSurfaceOrigin; + viz::TransferableResource::ResourceSource::kAR, + renderer_buffer->sync_token, render_resource_overrides); renderer_resource.id = renderer_buffer->id; id_to_frame_map_[renderer_buffer->id] = xr_frame; @@ -490,15 +491,17 @@ /*nearest_neighbor=*/false, /*secure_output_only=*/false, gfx::ProtectedVideoType::kClear); + + viz::TransferableResource::MetadataOverride camera_resource_overrides = { + .is_overlay_candidate = false, + .origin = kBottomLeft_GrSurfaceOrigin, + }; + // Additionally append to the resource_list - auto camera_resource = viz::TransferableResource::MakeGpu( + auto camera_resource = viz::TransferableResource::Make( camera_buffer->shared_image, - camera_buffer->shared_image->GetTextureTarget(), - camera_buffer->sync_token, camera_buffer->size, - viz::SinglePlaneFormat::kRGBA_8888, - /*is_overlay_candidate=*/false, - viz::TransferableResource::ResourceSource::kAR); - camera_resource.origin = kBottomLeft_GrSurfaceOrigin; + viz::TransferableResource::ResourceSource::kAR, camera_buffer->sync_token, + camera_resource_overrides); camera_resource.id = camera_buffer->id; id_to_frame_map_[camera_buffer->id] = xr_frame;
diff --git a/device/vr/android/arcore/ar_image_transport.cc b/device/vr/android/arcore/ar_image_transport.cc index 787e712..c90119c 100644 --- a/device/vr/android/arcore/ar_image_transport.cc +++ b/device/vr/android/arcore/ar_image_transport.cc
@@ -62,7 +62,7 @@ // Sanity checks for the camera image buffer. DCHECK(camera_image_shared_buffer->shared_image); DCHECK(camera_image_shared_buffer->local_eglimage.is_valid()); - DCHECK_EQ(camera_image_shared_buffer->size, frame_size); + DCHECK_EQ(camera_image_shared_buffer->shared_image->size(), frame_size); // Temporarily change drawing buffer to the camera image buffer. if (!camera_image_fbo_) {
diff --git a/device/vr/android/web_xr_presentation_state.h b/device/vr/android/web_xr_presentation_state.h index 2cd6352..782e9e3 100644 --- a/device/vr/android/web_xr_presentation_state.h +++ b/device/vr/android/web_xr_presentation_state.h
@@ -92,8 +92,6 @@ WebXrSharedBuffer(); ~WebXrSharedBuffer(); - gfx::Size size = {0, 0}; - // This owns a single reference to an AHardwareBuffer object. base::android::ScopedHardwareBufferHandle scoped_ahb_handle;
diff --git a/device/vr/android/xr_image_transport_base.cc b/device/vr/android/xr_image_transport_base.cc index 4778a7ab..d43b36b 100644 --- a/device/vr/android/xr_image_transport_base.cc +++ b/device/vr/android/xr_image_transport_base.cc
@@ -85,7 +85,7 @@ WebXrSharedBuffer* buffer) { CHECK(IsOnGlThread()); - if (buffer->size == size) { + if (buffer->shared_image && buffer->shared_image->size() == size) { return false; } @@ -140,7 +140,8 @@ DVLOG(2) << ": CreateSharedImage, mailbox=" << buffer->shared_image->mailbox().ToDebugString() - << ", SyncToken=" << buffer->sync_token.ToDebugString(); + << ", SyncToken=" << buffer->sync_token.ToDebugString() + << ", size=" << size.ToString(); // Create an EGLImage for the buffer. auto egl_image = @@ -162,10 +163,6 @@ glEGLImageTargetTexture2DOES(buffer->local_texture.target, egl_image.get()); buffer->local_eglimage = std::move(egl_image); - // Save size to avoid resize next time. - DVLOG(1) << __func__ << ": resized to " << size.width() << "x" - << size.height(); - buffer->size = size; return true; } @@ -195,7 +192,7 @@ // Sanity check that the lazily created/resized buffer looks valid. DCHECK(shared_buffer->shared_image); DCHECK(shared_buffer->local_eglimage.is_valid()); - DCHECK_EQ(shared_buffer->size, frame_size); + DCHECK_EQ(shared_buffer->shared_image->size(), frame_size); // We don't need to create a sync token here. ResizeSharedBuffer has created // one on reallocation, including initial buffer creation, and we can use
diff --git a/docs/adding_to_third_party.md b/docs/adding_to_third_party.md index 50c7ffd..1e0eb4c 100644 --- a/docs/adding_to_third_party.md +++ b/docs/adding_to_third_party.md
@@ -162,25 +162,7 @@ ### Pulling the code via DEPS -If the code is in a Git repo that you want to mirror, please file an [infra git -ticket](https://bugs.chromium.org/p/chromium/issues/entry?template=Infra-Git) -to get the repo mirrored onto chromium.googlesource.com; we don't allow direct -dependencies on non-Google-hosted repositories, so that we can still build -if an external repository goes down. - -Once the mirror is set up, add an entry to [//DEPS](../DEPS) so that gclient -will pull it in. If the code is only needed on some platforms, add a condition -to the deps entry so that developers on other platforms don't pull in things -they don't need. - -Follow the [standard directory structure](#standard-dep-structure) when creating -a directory for your dependency. If you have a wrong path in -DEPS and want to change the path of the existing library in DEPS, please ask the -infrastructure team before committing the change. - -Lastly, add the new directory to Chromium's `//third_party/.gitignore`, so that -it won't show up as untracked files when you run `git status` on the main -repository. +See [here](/docs/dependencies.md#adding-dependencies). ### Checking in the code directly
diff --git a/docs/git_submodules.md b/docs/git_submodules.md index 9347639..c9311cb 100644 --- a/docs/git_submodules.md +++ b/docs/git_submodules.md
@@ -10,7 +10,7 @@ [TOC] -## A quick introduction to Git submoduldes +## A quick introduction to Git submodules [Git submodules](https://git-scm.com/docs/gitsubmodules) are managed via the combination of `.gitmodules` files and gitlinks. `.gitmodules` is a text file
diff --git a/extensions/browser/api/socket/app_firewall_hole_manager.cc b/extensions/browser/api/socket/app_firewall_hole_manager.cc index 9672daf..dd2bb38 100644 --- a/extensions/browser/api/socket/app_firewall_hole_manager.cc +++ b/extensions/browser/api/socket/app_firewall_hole_manager.cc
@@ -86,15 +86,13 @@ void AppFirewallHole::SetVisible(bool app_visible) { app_visible_ = app_visible; - if (app_visible_) { - if (!firewall_hole_) { - chromeos::FirewallHole::Open( - type_, port_, "" /*all interfaces*/, - base::BindOnce(&AppFirewallHole::OnFirewallHoleOpened, - weak_factory_.GetWeakPtr())); - } - } else { + if (!app_visible_) { firewall_hole_.reset(); + } else if (!firewall_hole_) { + chromeos::FirewallHole::Open( + type_, port_, /*all interfaces=*/"", + base::BindOnce(&AppFirewallHole::OnFirewallHoleOpened, + weak_factory_.GetWeakPtr())); } }
diff --git a/extensions/browser/api/socket/app_firewall_hole_manager.h b/extensions/browser/api/socket/app_firewall_hole_manager.h index 4fcdd92..fd32bcc 100644 --- a/extensions/browser/api/socket/app_firewall_hole_manager.h +++ b/extensions/browser/api/socket/app_firewall_hole_manager.h
@@ -91,7 +91,7 @@ raw_ptr<content::BrowserContext> context_; base::ScopedObservation<AppWindowRegistry, AppWindowRegistry::Observer> observation_{this}; - std::multimap<std::string, raw_ptr<AppFirewallHole, CtnExperimental>> + std::multimap<ExtensionId, raw_ptr<AppFirewallHole, CtnExperimental>> tracked_holes_; base::WeakPtrFactory<AppFirewallHoleManager> weak_factory_{this};
diff --git a/extensions/browser/extension_function.h b/extensions/browser/extension_function.h index ec053c3d..5ca5c7ee 100644 --- a/extensions/browser/extension_function.h +++ b/extensions/browser/extension_function.h
@@ -400,6 +400,9 @@ bool is_from_service_worker() const { return worker_id_.has_value(); } + bool did_initialize() const { return did_initialize_; } + void set_did_initialize() { did_initialize_ = true; } + ResponseType* response_type() const { return response_type_.get(); } // Whether this function has responded. @@ -669,6 +672,11 @@ // returning. Usually we want to kill the message sending process. bool bad_message_ = false; + // Set to true when an extension function is created successfully without + // error. This implies all setup state should be valid on the function for + // some assertions made during destruction. + bool did_initialize_ = false; + // Set to true when RunWithValidation() is called, to look for callers using // the method more than once on a single ExtensionFunction. Note that some // ExtensionFunction objects may be created but not run, for example due to
diff --git a/extensions/browser/extension_function_dispatcher.cc b/extensions/browser/extension_function_dispatcher.cc index eb98168a..742acc3 100644 --- a/extensions/browser/extension_function_dispatcher.cc +++ b/extensions/browser/extension_function_dispatcher.cc
@@ -399,6 +399,8 @@ function->extension(), Activity::API_FUNCTION, function->name()); } + function->set_did_initialize(); + if (violation_error.empty()) { // See crbug.com/39178. ExtensionsBrowserClient::Get()->PermitExternalProtocolHandler(); @@ -484,7 +486,9 @@ ProcessManager* process_manager = ProcessManager::Get(browser_context_); if (extension_function.is_from_service_worker()) { - CHECK(extension_function.request_uuid().is_valid()); + if (extension_function.did_initialize()) { + CHECK(extension_function.request_uuid().is_valid()); + } CHECK(extension_function.worker_id()); extension_function.ResetServiceWorkerKeepalive();
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json index 744830b..d75a9505 100644 --- a/extensions/common/api/_api_features.json +++ b/extensions/common/api/_api_features.json
@@ -360,6 +360,7 @@ "chrome://shopping-insights-side-panel.top-chrome/*", "chrome://eche-app/*", "chrome://extensions/*", + "chrome://extensions-zero-state/*", "chrome://file-manager/*", "chrome://glic/*", "chrome://help-app/*",
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index 607bc7c..84b3afc 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -282,7 +282,11 @@ "description": "Disable D3D11 on older nVidia drivers", "cr_bugs": [349929], "os": { - "type": "win" + "type": "win", + "version": { + "op": "<", + "value": "10.0.22000.0" + } }, "vendor_id": "0x10de", "driver_version": { @@ -327,7 +331,11 @@ "description": "Disable use of Direct3D 11 on Matrox video cards", "cr_bugs": [395861], "os": { - "type": "win" + "type": "win", + "version": { + "op": "<", + "value": "10.0.22000.0" + } }, "vendor_id": "0x102b", "features": [ @@ -339,7 +347,11 @@ "description": "Disable use of Direct3D 11 on older AMD drivers", "cr_bugs": [402134], "os": { - "type": "win" + "type": "win", + "version": { + "op": "<", + "value": "10.0.22000.0" + } }, "vendor_id": "0x1002", "driver_version": { @@ -383,7 +395,11 @@ "description": "Old Intel drivers cannot reliably support D3D11", "cr_bugs": [363721], "os": { - "type": "win" + "type": "win", + "version": { + "op": "<", + "value": "10.0.22000.0" + } }, "vendor_id": "0x8086", "driver_version": {
diff --git a/infra/config/generated/builder-owners/clank-engprod@google.com.txt b/infra/config/generated/builder-owners/clank-engprod@google.com.txt index 34e424b1..3f9ccfa 100644 --- a/infra/config/generated/builder-owners/clank-engprod@google.com.txt +++ b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
@@ -22,9 +22,7 @@ ci/android-14-tablet-landscape-arm64-rel ci/android-14-x64-fyi-rel ci/android-14-x64-rel -ci/android-15-tablet-landscape-x64-dbg-tests ci/android-15-tablet-landscape-x64-rel -ci/android-15-tablet-x64-dbg-tests ci/android-15-tablet-x64-rel ci/android-15-x64-fyi-rel ci/android-15-x64-rel @@ -60,9 +58,7 @@ try/android-14-tablet-landscape-arm64-rel try/android-14-x64-fyi-rel try/android-14-x64-rel -try/android-15-tablet-landscape-x64-dbg try/android-15-tablet-landscape-x64-rel -try/android-15-tablet-x64-dbg try/android-15-tablet-x64-rel try/android-15-x64-fyi-rel try/android-15-x64-rel
diff --git "a/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/properties.json" index 500632d..b6fd9cc 100644 --- "a/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/properties.json"
@@ -150,78 +150,6 @@ { "builder_id": { "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", "builder": "android-webview-12-x64-dbg-tests", "project": "chromium" }, @@ -318,16 +246,6 @@ }, { "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - }, - { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - }, - { - "bucket": "ci", "builder": "android-webview-12-x64-dbg-tests", "project": "chromium" }, @@ -351,14 +269,6 @@ "group": "tryserver.chromium.android" }, { - "builder": "android-15-tablet-landscape-x64-dbg", - "group": "tryserver.chromium.android" - }, - { - "builder": "android-15-tablet-x64-dbg", - "group": "tryserver.chromium.android" - }, - { "builder": "android-webview-12-x64-dbg", "group": "tryserver.chromium.android" },
diff --git "a/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/targets/chromium.android.json" "b/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/targets/chromium.android.json" index baa163d..94a79e83 100644 --- "a/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/targets/chromium.android.json" +++ "b/infra/config/generated/builders/ci/Android x64 Builder \050dbg\051/targets/chromium.android.json"
@@ -3119,3244 +3119,5 @@ "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" } ] - }, - "android-15-tablet-landscape-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet_landscape.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - } - ] - }, - "android-15-tablet-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "absl_hardening_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "absl_hardening_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "absl_hardening_tests", - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-InstallableManagerBrowserTest.CheckManifestWithIconThatIsTooSmall", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_sync_integration_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_sync_integration_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_webview_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_webview_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" - }, - { - "args": [ - "-v", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "angle_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_common_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_common_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_common_unittests", - "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_heap_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_heap_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_heap_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_platform_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_platform_unittests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_platform_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_crypto_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_crypto_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_crypto_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_ssl_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_ssl_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_ssl_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "capture_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "capture_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cast_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cast_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cast_unittests", - "test_id_prefix": "ninja://media/cast:cast_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cc_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cc_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_unit_test_apk.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "components_browsertests", - "test_id_prefix": "ninja://components:components_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.content_browsertests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "experiment_percentage": 100, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 40 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_shell_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crashpad_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crashpad_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crypto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crypto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crypto_unittests", - "test_id_prefix": "ninja://crypto:crypto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "device_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "device_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "device_unittests", - "test_id_prefix": "ninja://device:device_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "display_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "display_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "env_chromium_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "env_chromium_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "env_chromium_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "events_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "events_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "fuzzing_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "fuzzing_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "fuzzing_unittests", - "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gcm_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gcm_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gcm_unit_tests", - "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gfx_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gfx_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gin_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gin_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gin_unittests", - "test_id_prefix": "ninja://gin:gin_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "google_apis_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "google_apis_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "google_apis_unittests", - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gpu_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gpu_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gwp_asan_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gwp_asan_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gwp_asan_unittests", - "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ipc_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ipc_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ipc_tests", - "test_id_prefix": "ninja://ipc:ipc_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "latency_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "latency_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "latency_unittests", - "test_id_prefix": "ninja://ui/latency:latency_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "leveldb_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "leveldb_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "leveldb_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "libjingle_xmpp_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "libjingle_xmpp_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "libjingle_xmpp_unittests", - "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "liburlpattern_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "liburlpattern_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "liburlpattern_unittests", - "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "media_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "media_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "media_unittests", - "test_id_prefix": "ninja://media:media_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "midi_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "midi_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "midi_unittests", - "test_id_prefix": "ninja://media/midi:midi_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_unittests", - "test_id_prefix": "ninja://mojo:mojo_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "net_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "net_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "net_unittests", - "test_id_prefix": "ninja://net:net_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "perfetto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "perfetto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sandbox_linux_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sandbox_linux_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "services_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "services_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "services_unittests", - "test_id_prefix": "ninja://services:services_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "shell_dialogs_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "shell_dialogs_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "shell_dialogs_unittests", - "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "skia_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "skia_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "skia_unittests", - "test_id_prefix": "ninja://skia:skia_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sql_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sql_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sql_unittests", - "test_id_prefix": "ninja://sql:sql_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "storage_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "storage_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "storage_unittests", - "test_id_prefix": "ninja://storage:storage_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "system_webview_shell_layout_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "system_webview_shell_layout_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "system_webview_shell_layout_test_apk", - "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "trichrome_chrome_bundle_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "trichrome_chrome_bundle_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "trichrome_chrome_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_android_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_android_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_base_unittests", - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_touch_selection_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_touch_selection_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_touch_selection_unittests", - "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "url_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "url_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "url_unittests", - "test_id_prefix": "ninja://url:url_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" - }, - { - "args": [ - "--webview-process-mode=multiple", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_instrumentation_test_apk_multiple_process_mode" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_instrumentation_test_apk_multiple_process_mode", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 5 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_ui_test_app_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_ui_test_app_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "webview_ui_test_app_test_apk", - "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "wtf_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "wtf_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "wtf_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "zlib_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "zlib_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "zlib_unittests", - "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" - } - ] } } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/properties.json b/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/properties.json deleted file mode 100644 index 91b12273..0000000 --- a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/properties.json +++ /dev/null
@@ -1,102 +0,0 @@ -{ - "$build/chromium_tests_builder_config": { - "builder_config": { - "builder_db": { - "entries": [ - { - "builder_id": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "COMPILE_AND_TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - } - ] - }, - "builder_ids": [ - { - "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - } - ], - "mirroring_builder_group_and_names": [ - { - "builder": "android-15-tablet-landscape-x64-dbg", - "group": "tryserver.chromium.android" - } - ], - "retry_failed_shards": true, - "retry_invalid_shards": true, - "targets_spec_directory": "src/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/targets" - } - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "chromium.android", - "recipe": "chromium" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/targets/chromium.android.json b/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/targets/chromium.android.json deleted file mode 100644 index 4989ed5f..0000000 --- a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-dbg-tests/targets/chromium.android.json +++ /dev/null
@@ -1,114 +0,0 @@ -{ - "android-15-tablet-landscape-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet_landscape.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - } - ] - } -} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-rel/properties.json b/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-rel/properties.json index cae8b067..8b0577f 100644 --- a/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-rel/properties.json +++ b/infra/config/generated/builders/ci/android-15-tablet-landscape-x64-rel/properties.json
@@ -77,5 +77,11 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium" + "gardener_rotations": [ + "android" + ], + "recipe": "chromium", + "sheriff_rotations": [ + "android" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/properties.json b/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/properties.json deleted file mode 100644 index fea9a94..0000000 --- a/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/properties.json +++ /dev/null
@@ -1,102 +0,0 @@ -{ - "$build/chromium_tests_builder_config": { - "builder_config": { - "builder_db": { - "entries": [ - { - "builder_id": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "COMPILE_AND_TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - } - ] - }, - "builder_ids": [ - { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - } - ], - "mirroring_builder_group_and_names": [ - { - "builder": "android-15-tablet-x64-dbg", - "group": "tryserver.chromium.android" - } - ], - "retry_failed_shards": true, - "retry_invalid_shards": true, - "targets_spec_directory": "src/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/targets" - } - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "chromium.android", - "recipe": "chromium" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/targets/chromium.android.json b/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/targets/chromium.android.json deleted file mode 100644 index d92496ea..0000000 --- a/infra/config/generated/builders/ci/android-15-tablet-x64-dbg-tests/targets/chromium.android.json +++ /dev/null
@@ -1,3129 +0,0 @@ -{ - "android-15-tablet-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "absl_hardening_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "absl_hardening_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "absl_hardening_tests", - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-InstallableManagerBrowserTest.CheckManifestWithIconThatIsTooSmall", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_sync_integration_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_sync_integration_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_webview_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_webview_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" - }, - { - "args": [ - "-v", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "angle_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_common_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_common_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_common_unittests", - "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_heap_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_heap_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_heap_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_platform_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_platform_unittests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_platform_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_crypto_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_crypto_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_crypto_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_ssl_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_ssl_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_ssl_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "capture_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "capture_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cast_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cast_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cast_unittests", - "test_id_prefix": "ninja://media/cast:cast_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cc_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cc_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_unit_test_apk.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "components_browsertests", - "test_id_prefix": "ninja://components:components_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.content_browsertests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "experiment_percentage": 100, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 40 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_shell_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crashpad_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crashpad_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crypto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crypto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crypto_unittests", - "test_id_prefix": "ninja://crypto:crypto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "device_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "device_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "device_unittests", - "test_id_prefix": "ninja://device:device_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "display_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "display_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "env_chromium_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "env_chromium_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "env_chromium_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "events_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "events_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "fuzzing_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "fuzzing_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "fuzzing_unittests", - "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gcm_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gcm_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gcm_unit_tests", - "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gfx_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gfx_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gin_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gin_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gin_unittests", - "test_id_prefix": "ninja://gin:gin_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "google_apis_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "google_apis_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "google_apis_unittests", - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gpu_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gpu_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gwp_asan_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gwp_asan_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gwp_asan_unittests", - "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ipc_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ipc_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ipc_tests", - "test_id_prefix": "ninja://ipc:ipc_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "latency_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "latency_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "latency_unittests", - "test_id_prefix": "ninja://ui/latency:latency_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "leveldb_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "leveldb_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "leveldb_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "libjingle_xmpp_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "libjingle_xmpp_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "libjingle_xmpp_unittests", - "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "liburlpattern_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "liburlpattern_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "liburlpattern_unittests", - "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "media_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "media_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "media_unittests", - "test_id_prefix": "ninja://media:media_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "midi_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "midi_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "midi_unittests", - "test_id_prefix": "ninja://media/midi:midi_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_unittests", - "test_id_prefix": "ninja://mojo:mojo_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "net_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "net_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "net_unittests", - "test_id_prefix": "ninja://net:net_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "perfetto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "perfetto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sandbox_linux_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sandbox_linux_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "services_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "services_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "services_unittests", - "test_id_prefix": "ninja://services:services_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "shell_dialogs_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "shell_dialogs_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "shell_dialogs_unittests", - "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "skia_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "skia_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "skia_unittests", - "test_id_prefix": "ninja://skia:skia_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sql_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sql_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sql_unittests", - "test_id_prefix": "ninja://sql:sql_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "storage_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "storage_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "storage_unittests", - "test_id_prefix": "ninja://storage:storage_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "system_webview_shell_layout_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "system_webview_shell_layout_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "system_webview_shell_layout_test_apk", - "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "trichrome_chrome_bundle_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "trichrome_chrome_bundle_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "trichrome_chrome_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_android_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_android_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_base_unittests", - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_touch_selection_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_touch_selection_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_touch_selection_unittests", - "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "url_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "url_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "url_unittests", - "test_id_prefix": "ninja://url:url_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" - }, - { - "args": [ - "--webview-process-mode=multiple", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_instrumentation_test_apk_multiple_process_mode" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_instrumentation_test_apk_multiple_process_mode", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 5 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_ui_test_app_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_ui_test_app_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "webview_ui_test_app_test_apk", - "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "wtf_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "wtf_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "wtf_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "zlib_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "zlib_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "zlib_unittests", - "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" - } - ] - } -} \ No newline at end of file
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json index ee97ded..8917fd27 100644 --- a/infra/config/generated/builders/gn_args_locations.json +++ b/infra/config/generated/builders/gn_args_locations.json
@@ -579,9 +579,7 @@ "android-14-x64-fyi-rel": "try/android-14-x64-fyi-rel/gn-args.json", "android-14-x64-rel": "try/android-14-x64-rel/gn-args.json", "android-15-chrome-wpt-fyi-rel": "try/android-15-chrome-wpt-fyi-rel/gn-args.json", - "android-15-tablet-landscape-x64-dbg": "try/android-15-tablet-landscape-x64-dbg/gn-args.json", "android-15-tablet-landscape-x64-rel": "try/android-15-tablet-landscape-x64-rel/gn-args.json", - "android-15-tablet-x64-dbg": "try/android-15-tablet-x64-dbg/gn-args.json", "android-15-tablet-x64-rel": "try/android-15-tablet-x64-rel/gn-args.json", "android-15-webview-wpt-fyi-rel": "try/android-15-webview-wpt-fyi-rel/gn-args.json", "android-15-x64-fyi-rel": "try/android-15-x64-fyi-rel/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/gn-args.json b/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/gn-args.json deleted file mode 100644 index 61e182bd..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/gn-args.json +++ /dev/null
@@ -1,19 +0,0 @@ -{ - "gn_args": { - "android_static_analysis": "on", - "debuggable_apks": false, - "enable_android_secondary_abi": true, - "ffmpeg_branding": "Chrome", - "is_component_build": true, - "is_debug": true, - "proprietary_codecs": true, - "symbol_level": 1, - "system_webview_package_name": "com.google.android.webview.debug", - "system_webview_shell_package_name": "org.chromium.my_webview_shell", - "target_cpu": "x64", - "target_os": "android", - "use_reclient": false, - "use_remoteexec": true, - "use_siso": true - } -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/properties.json b/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/properties.json deleted file mode 100644 index febdde9..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/properties.json +++ /dev/null
@@ -1,118 +0,0 @@ -{ - "$build/chromium_tests_builder_config": { - "builder_config": { - "additional_exclusions": [ - "infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/gn-args.json" - ], - "builder_db": { - "entries": [ - { - "builder_id": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "COMPILE_AND_TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - } - ] - }, - "builder_ids": [ - { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - ], - "builder_ids_in_scope_for_testing": [ - { - "bucket": "ci", - "builder": "android-15-tablet-landscape-x64-dbg-tests", - "project": "chromium" - } - ], - "targets_spec_directory": "src/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/targets" - } - }, - "$build/siso": { - "configs": [ - "builder", - "remote-link" - ], - "enable_cloud_monitoring": true, - "enable_cloud_profiler": true, - "enable_cloud_trace": true, - "experiments": [], - "metrics_project": "chromium-reclient-metrics", - "output_local_strategy": "greedy", - "project": "rbe-chromium-untrusted", - "remote_jobs": 150 - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "tryserver.chromium.android", - "recipe": "chromium_trybot" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/targets/chromium.android.json deleted file mode 100644 index 85c55688..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-landscape-x64-dbg/targets/chromium.android.json +++ /dev/null
@@ -1,115 +0,0 @@ -{ - "Android x64 Builder (dbg)": {}, - "android-15-tablet-landscape-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet_landscape.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet_landscape.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet_landscape", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet_landscape", - "path": ".android_emulator/android_35_google_apis_x64_tablet_landscape" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet_landscape" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - } - ] - } -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/gn-args.json b/infra/config/generated/builders/try/android-15-tablet-x64-dbg/gn-args.json deleted file mode 100644 index 61e182bd..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/gn-args.json +++ /dev/null
@@ -1,19 +0,0 @@ -{ - "gn_args": { - "android_static_analysis": "on", - "debuggable_apks": false, - "enable_android_secondary_abi": true, - "ffmpeg_branding": "Chrome", - "is_component_build": true, - "is_debug": true, - "proprietary_codecs": true, - "symbol_level": 1, - "system_webview_package_name": "com.google.android.webview.debug", - "system_webview_shell_package_name": "org.chromium.my_webview_shell", - "target_cpu": "x64", - "target_os": "android", - "use_reclient": false, - "use_remoteexec": true, - "use_siso": true - } -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/properties.json b/infra/config/generated/builders/try/android-15-tablet-x64-dbg/properties.json deleted file mode 100644 index 6f5a616..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/properties.json +++ /dev/null
@@ -1,118 +0,0 @@ -{ - "$build/chromium_tests_builder_config": { - "builder_config": { - "additional_exclusions": [ - "infra/config/generated/builders/try/android-15-tablet-x64-dbg/gn-args.json" - ], - "builder_db": { - "entries": [ - { - "builder_id": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "COMPILE_AND_TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - } - } - }, - { - "builder_id": { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - }, - "builder_spec": { - "build_gs_bucket": "chromium-android-archive", - "builder_group": "chromium.android", - "execution_mode": "TEST", - "legacy_android_config": { - "config": "base_config" - }, - "legacy_chromium_config": { - "apply_configs": [ - "mb" - ], - "build_config": "Debug", - "config": "main_builder", - "target_arch": "intel", - "target_bits": 64, - "target_platform": "android" - }, - "legacy_gclient_config": { - "apply_configs": [ - "android" - ], - "config": "chromium" - }, - "parent": { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - } - } - ] - }, - "builder_ids": [ - { - "bucket": "ci", - "builder": "Android x64 Builder (dbg)", - "project": "chromium" - } - ], - "builder_ids_in_scope_for_testing": [ - { - "bucket": "ci", - "builder": "android-15-tablet-x64-dbg-tests", - "project": "chromium" - } - ], - "targets_spec_directory": "src/infra/config/generated/builders/try/android-15-tablet-x64-dbg/targets" - } - }, - "$build/siso": { - "configs": [ - "builder", - "remote-link" - ], - "enable_cloud_monitoring": true, - "enable_cloud_profiler": true, - "enable_cloud_trace": true, - "experiments": [], - "metrics_project": "chromium-reclient-metrics", - "output_local_strategy": "greedy", - "project": "rbe-chromium-untrusted", - "remote_jobs": 150 - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "tryserver.chromium.android", - "recipe": "chromium_trybot" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-15-tablet-x64-dbg/targets/chromium.android.json deleted file mode 100644 index 61c9e56..0000000 --- a/infra/config/generated/builders/try/android-15-tablet-x64-dbg/targets/chromium.android.json +++ /dev/null
@@ -1,3130 +0,0 @@ -{ - "Android x64 Builder (dbg)": {}, - "android-15-tablet-x64-dbg-tests": { - "gtest_tests": [ - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "absl_hardening_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "absl_hardening_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "absl_hardening_tests", - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-InstallableManagerBrowserTest.CheckManifestWithIconThatIsTooSmall", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_sync_integration_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_sync_integration_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_webview_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_webview_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" - }, - { - "args": [ - "-v", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "angle_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_common_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_common_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_common_unittests", - "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_heap_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_heap_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_heap_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_platform_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_platform_unittests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_platform_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_crypto_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_crypto_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_crypto_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_ssl_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_ssl_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_ssl_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "capture_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "capture_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cast_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cast_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cast_unittests", - "test_id_prefix": "ninja://media/cast:cast_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cc_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cc_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_unit_test_apk.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "components_browsertests", - "test_id_prefix": "ninja://components:components_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.content_browsertests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "experiment_percentage": 100, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 40 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_shell_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crashpad_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crashpad_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crypto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crypto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crypto_unittests", - "test_id_prefix": "ninja://crypto:crypto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "device_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "device_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "device_unittests", - "test_id_prefix": "ninja://device:device_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "display_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "display_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "env_chromium_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "env_chromium_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "env_chromium_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "events_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "events_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "fuzzing_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "fuzzing_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "fuzzing_unittests", - "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gcm_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gcm_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gcm_unit_tests", - "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gfx_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gfx_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gin_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gin_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gin_unittests", - "test_id_prefix": "ninja://gin:gin_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "google_apis_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "google_apis_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "google_apis_unittests", - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gpu_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gpu_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gwp_asan_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gwp_asan_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gwp_asan_unittests", - "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ipc_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ipc_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ipc_tests", - "test_id_prefix": "ninja://ipc:ipc_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "latency_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "latency_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "latency_unittests", - "test_id_prefix": "ninja://ui/latency:latency_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "leveldb_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "leveldb_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "leveldb_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "libjingle_xmpp_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "libjingle_xmpp_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "libjingle_xmpp_unittests", - "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "liburlpattern_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "liburlpattern_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "liburlpattern_unittests", - "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "media_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "media_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "media_unittests", - "test_id_prefix": "ninja://media:media_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "midi_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "midi_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "midi_unittests", - "test_id_prefix": "ninja://media/midi:midi_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_unittests", - "test_id_prefix": "ninja://mojo:mojo_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "net_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "net_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "net_unittests", - "test_id_prefix": "ninja://net:net_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "perfetto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "perfetto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sandbox_linux_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sandbox_linux_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "services_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "services_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "services_unittests", - "test_id_prefix": "ninja://services:services_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "shell_dialogs_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "shell_dialogs_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "shell_dialogs_unittests", - "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "skia_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "skia_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "skia_unittests", - "test_id_prefix": "ninja://skia:skia_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sql_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sql_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sql_unittests", - "test_id_prefix": "ninja://sql:sql_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "storage_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "storage_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "storage_unittests", - "test_id_prefix": "ninja://storage:storage_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "system_webview_shell_layout_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "system_webview_shell_layout_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "system_webview_shell_layout_test_apk", - "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "trichrome_chrome_bundle_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "trichrome_chrome_bundle_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "trichrome_chrome_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_android_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_android_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_base_unittests", - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_touch_selection_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_touch_selection_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_touch_selection_unittests", - "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "url_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "url_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "url_unittests", - "test_id_prefix": "ninja://url:url_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" - }, - { - "args": [ - "--webview-process-mode=multiple", - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_instrumentation_test_apk_multiple_process_mode" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_instrumentation_test_apk_multiple_process_mode", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 5 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_ui_test_app_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_ui_test_app_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "webview_ui_test_app_test_apk", - "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "wtf_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "wtf_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "wtf_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" - }, - { - "args": [ - "--avd-config=../../tools/android/avd/proto/android_35_google_apis_x64_tablet.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_35_google_apis_x64_tablet", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "zlib_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "zlib_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_35_google_apis_x64_tablet", - "path": ".android_emulator/android_35_google_apis_x64_tablet" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_35_google_apis_x64_tablet" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "zlib_unittests", - "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" - } - ] - } -} \ No newline at end of file
diff --git a/infra/config/generated/cq-usage/mega_cq_bots.txt b/infra/config/generated/cq-usage/mega_cq_bots.txt index 7cfee42..7bd1e5c5 100644 --- a/infra/config/generated/cq-usage/mega_cq_bots.txt +++ b/infra/config/generated/cq-usage/mega_cq_bots.txt
@@ -8,6 +8,7 @@ chromium/try/android-13-x64-rel chromium/try/android-14-arm64-rel chromium/try/android-14-tablet-landscape-arm64-rel +chromium/try/android-15-tablet-landscape-x64-rel chromium/try/android-15-x64-rel chromium/try/android-arm-compile-dbg chromium/try/android-arm64-rel
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json index 7ee9cf9..bd8b20eb 100644 --- a/infra/config/generated/health-specs/health-specs.json +++ b/infra/config/generated/health-specs/health-specs.json
@@ -6752,27 +6752,6 @@ } ] }, - "android-15-tablet-landscape-x64-dbg-tests": { - "contact_team_email": "clank-engprod@google.com", - "problem_specs": [ - { - "name": "Unhealthy", - "period_days": 7, - "score": 5, - "thresholds": { - "_default": "_default" - } - }, - { - "name": "Low Value", - "period_days": 90, - "score": 1, - "thresholds": { - "_default": "_default" - } - } - ] - }, "android-15-tablet-landscape-x64-rel": { "contact_team_email": "clank-engprod@google.com", "problem_specs": [ @@ -6794,27 +6773,6 @@ } ] }, - "android-15-tablet-x64-dbg-tests": { - "contact_team_email": "clank-engprod@google.com", - "problem_specs": [ - { - "name": "Unhealthy", - "period_days": 7, - "score": 5, - "thresholds": { - "_default": "_default" - } - }, - { - "name": "Low Value", - "period_days": 90, - "score": 1, - "thresholds": { - "_default": "_default" - } - } - ] - }, "android-15-tablet-x64-rel": { "contact_team_email": "clank-engprod@google.com", "problem_specs": [
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index d742cca..e89e0ff 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -887,21 +887,11 @@ disable_reuse_footers: "Include-Ci-Only-Tests" } builders { - name: "chromium/try/android-15-tablet-landscape-x64-dbg" - includable_only: true - disable_reuse_footers: "Include-Ci-Only-Tests" - } - builders { name: "chromium/try/android-15-tablet-landscape-x64-rel" includable_only: true disable_reuse_footers: "Include-Ci-Only-Tests" } builders { - name: "chromium/try/android-15-tablet-x64-dbg" - includable_only: true - disable_reuse_footers: "Include-Ci-Only-Tests" - } - builders { name: "chromium/try/android-15-tablet-x64-rel" includable_only: true disable_reuse_footers: "Include-Ci-Only-Tests"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 3dfff16..3a6dc876 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -4726,7 +4726,7 @@ use_invocation_timestamp: true } } - description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-dbg\">android-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-landscape-x64-dbg\">android-12l-landscape-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-x64-dbg\">android-12l-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-15-tablet-landscape-x64-dbg\">android-15-tablet-landscape-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-15-tablet-x64-dbg\">android-15-tablet-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-dbg\">android-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-landscape-x64-dbg\">android-12l-landscape-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-x64-dbg\">android-12l-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38318,116 +38318,6 @@ } } builders { - name: "android-15-tablet-landscape-x64-dbg-tests" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "free_space:standard" - dimensions: "os:Ubuntu-22.04" - dimensions: "pool:luci.chromium.ci" - 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/ci/android-15-tablet-landscape-x64-dbg-tests/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "chromium.android",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' - '}' - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "chromium.use_per_builder_build_dir_name" - value: 100 - } - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "ci_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+" - } - } - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "blink_web_tests_ci_test_results" - test_results { - predicate { - test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - description_html: "Run chromium tests on Android 15 tablet emulators in Landscape mode.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-15-tablet-landscape-x64-dbg\">android-15-tablet-landscape-x64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" - shadow_builder_adjustments { - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - pool: "luci.chromium.try" - dimensions: "free_space:" - dimensions: "pool:luci.chromium.try" - } - contact_team_email: "clank-engprod@google.com" - custom_metric_definitions { - name: "/chrome/infra/browser/builds/cached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"true\"" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" - predicates: "has(build.output.properties.ran_tests_retry_shard)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" - predicates: "has(build.output.properties.ran_tests_without_patch)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/uncached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"false\"" - } - } - builders { name: "android-15-tablet-landscape-x64-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -38465,8 +38355,14 @@ ' }' ' },' ' "builder_group": "chromium.android",' + ' "gardener_rotations": [' + ' "android"' + ' ],' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "android"' + ' ]' '}' execution_timeout_secs: 14400 build_numbers: YES @@ -38539,116 +38435,6 @@ } } builders { - name: "android-15-tablet-x64-dbg-tests" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "free_space:standard" - dimensions: "os:Ubuntu-22.04" - dimensions: "pool:luci.chromium.ci" - 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/ci/android-15-tablet-x64-dbg-tests/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "chromium.android",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' - '}' - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "chromium.use_per_builder_build_dir_name" - value: 100 - } - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "ci_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_ci_test_results" - test_results { - predicate { - test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+" - } - } - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "blink_web_tests_ci_test_results" - test_results { - predicate { - test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - description_html: "Run chromium tests on Android 15 tablet emulators.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-15-tablet-x64-dbg\">android-15-tablet-x64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" - shadow_builder_adjustments { - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - pool: "luci.chromium.try" - dimensions: "free_space:" - dimensions: "pool:luci.chromium.try" - } - contact_team_email: "clank-engprod@google.com" - custom_metric_definitions { - name: "/chrome/infra/browser/builds/cached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"true\"" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" - predicates: "has(build.output.properties.ran_tests_retry_shard)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" - predicates: "has(build.output.properties.ran_tests_without_patch)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/uncached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"false\"" - } - } - builders { name: "android-15-tablet-x64-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -82715,118 +82501,6 @@ } } builders { - name: "android-15-tablet-landscape-x64-dbg" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "free_space:standard" - dimensions: "os:Ubuntu-22.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-15-tablet-landscape-x64-dbg/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 - } - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "chromium.use_per_builder_build_dir_name" - value: 100 - } - experiments { - key: "luci.buildbucket.canary_software" - 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|content)/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/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-15-tablet-landscape-x64-dbg-tests\">android-15-tablet-landscape-x64-dbg-tests</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" - contact_team_email: "clank-engprod@google.com" - custom_metric_definitions { - name: "/chrome/infra/browser/builds/cached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"true\"" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" - predicates: "has(build.output.properties.ran_tests_retry_shard)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" - predicates: "has(build.output.properties.ran_tests_without_patch)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/uncached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"false\"" - } - } - builders { name: "android-15-tablet-landscape-x64-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -82939,118 +82613,6 @@ } } builders { - name: "android-15-tablet-x64-dbg" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "free_space:standard" - dimensions: "os:Ubuntu-22.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-15-tablet-x64-dbg/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 - } - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "chromium.use_per_builder_build_dir_name" - value: 100 - } - experiments { - key: "luci.buildbucket.canary_software" - 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|content)/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/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-15-tablet-x64-dbg-tests\">android-15-tablet-x64-dbg-tests</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" - contact_team_email: "clank-engprod@google.com" - custom_metric_definitions { - name: "/chrome/infra/browser/builds/cached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"true\"" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" - predicates: "has(build.output.properties.ran_tests_retry_shard)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" - predicates: "has(build.output.properties.ran_tests_without_patch)" - } - custom_metric_definitions { - name: "/chrome/infra/browser/builds/uncached_count" - predicates: "has(build.output.properties.is_cached)" - predicates: "string(build.output.properties.is_cached) == \"false\"" - } - } - builders { name: "android-15-tablet-x64-rel" 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 66cd2dd5..e136604 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -3491,6 +3491,11 @@ short_name: "13" } builders { + name: "buildbucket/luci.chromium.ci/android-15-tablet-landscape-x64-rel" + category: "chromium.android|builder_tester|x64" + short_name: "15T-L" + } + builders { name: "buildbucket/luci.chromium.ci/android-10-x86-rel" category: "chromium.android|builder_tester|x86" short_name: "10" @@ -3995,6 +4000,11 @@ short_name: "13" } builders { + name: "buildbucket/luci.chromium.ci/android-15-tablet-landscape-x64-rel" + category: "chromium.android|builder_tester|x64" + short_name: "15T-L" + } + builders { name: "buildbucket/luci.chromium.ci/android-10-x86-rel" category: "chromium.android|builder_tester|x86" short_name: "10" @@ -8696,16 +8706,6 @@ short_name: "12L-L" } builders { - name: "buildbucket/luci.chromium.ci/android-15-tablet-x64-dbg-tests" - category: "tester|tablet" - short_name: "15T" - } - builders { - name: "buildbucket/luci.chromium.ci/android-15-tablet-landscape-x64-dbg-tests" - category: "tester|tablet" - short_name: "15T-L" - } - builders { name: "buildbucket/luci.chromium.ci/Android WebView O (dbg)" category: "tester|webview" short_name: "O" @@ -26143,15 +26143,9 @@ name: "buildbucket/luci.chromium.try/android-15-chrome-wpt-fyi-rel" } builders { - name: "buildbucket/luci.chromium.try/android-15-tablet-landscape-x64-dbg" - } - builders { name: "buildbucket/luci.chromium.try/android-15-tablet-landscape-x64-rel" } builders { - name: "buildbucket/luci.chromium.try/android-15-tablet-x64-dbg" - } - builders { name: "buildbucket/luci.chromium.try/android-15-tablet-x64-rel" } builders { @@ -27693,15 +27687,9 @@ name: "buildbucket/luci.chromium.try/android-15-chrome-wpt-fyi-rel" } builders { - name: "buildbucket/luci.chromium.try/android-15-tablet-landscape-x64-dbg" - } - builders { name: "buildbucket/luci.chromium.try/android-15-tablet-landscape-x64-rel" } builders { - name: "buildbucket/luci.chromium.try/android-15-tablet-x64-dbg" - } - builders { name: "buildbucket/luci.chromium.try/android-15-tablet-x64-rel" } builders {
diff --git a/infra/config/generated/luci/luci-notify.cfg b/infra/config/generated/luci/luci-notify.cfg index fff7ca59..3c313b7b 100644 --- a/infra/config/generated/luci/luci-notify.cfg +++ b/infra/config/generated/luci/luci-notify.cfg
@@ -2020,6 +2020,25 @@ } builders { bucket: "ci" + name: "android-15-tablet-landscape-x64-rel" + repository: "https://chromium.googlesource.com/chromium/src" + } + tree_closers { + tree_status_host: "chromium-status.appspot.com" + failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|generate_build_files|runhooks|update|\\w*nocompile_test)\\b" + } +} +notifiers { + notifications { + on_occurrence: FAILURE + failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|generate_build_files|runhooks|update|\\w*nocompile_test)\\b" + email { + rotation_urls: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff" + } + template: "tree_closure_email_template" + } + builders { + bucket: "ci" name: "android-15-x64-rel" repository: "https://chromium.googlesource.com/chromium/src" }
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 3b5449d..74f480d0 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3394,15 +3394,6 @@ } } job { - id: "android-15-tablet-landscape-x64-dbg-tests" - realm: "ci" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "ci" - builder: "android-15-tablet-landscape-x64-dbg-tests" - } -} -job { id: "android-15-tablet-landscape-x64-rel" realm: "ci" buildbucket { @@ -3412,15 +3403,6 @@ } } job { - id: "android-15-tablet-x64-dbg-tests" - realm: "ci" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "ci" - builder: "android-15-tablet-x64-dbg-tests" - } -} -job { id: "android-15-tablet-x64-rel" realm: "ci" buildbucket {
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg index f94c5cf..aff58f10 100644 --- a/infra/config/generated/luci/realms.cfg +++ b/infra/config/generated/luci/realms.cfg
@@ -243,8 +243,6 @@ values: "android-12-x64-fyi-rel" values: "android-12l-landscape-x64-dbg-tests" values: "android-12l-x64-dbg-tests" - values: "android-15-tablet-landscape-x64-dbg-tests" - values: "android-15-tablet-x64-dbg-tests" values: "android-cronet-x64-dbg-12-tests" values: "android-cronet-x64-dbg-13-tests" values: "android-cronet-x64-dbg-14-tests"
diff --git a/infra/config/generated/sheriff-rotations/android.txt b/infra/config/generated/sheriff-rotations/android.txt index ba8a9a0..0fb53a0 100644 --- a/infra/config/generated/sheriff-rotations/android.txt +++ b/infra/config/generated/sheriff-rotations/android.txt
@@ -18,6 +18,7 @@ ci/android-13-x64-rel ci/android-14-arm64-rel ci/android-14-tablet-landscape-arm64-rel +ci/android-15-tablet-landscape-x64-rel ci/android-15-x64-rel ci/android-androidx-packager ci/android-bfcache-rel
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index 97ebfab..2e737b5d 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -4491,9 +4491,7 @@ targets_settings = targets.settings( os_type = targets.os_type.ANDROID, ), - # TODO(crbug.com/376748979 ): Enable gardening once tests are stable - gardener_rotations = args.ignore_default(None), - # tree_closing = True, + tree_closing = True, console_view_entry = consoles.console_view_entry( category = "builder_tester|x64", short_name = "15T-L", @@ -4629,176 +4627,6 @@ execution_timeout = 4 * time.hour, ) -ci.thin_tester( - name = "android-15-tablet-x64-dbg-tests", - description_html = "Run chromium tests on Android 15 tablet emulators.", - triggered_by = ["Android x64 Builder (dbg)"], - builder_spec = builder_config.builder_spec( - execution_mode = builder_config.execution_mode.TEST, - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = [ - "android", - ], - ), - chromium_config = builder_config.chromium_config( - config = "main_builder", - apply_configs = ["mb"], - build_config = builder_config.build_config.DEBUG, - target_arch = builder_config.target_arch.INTEL, - target_bits = 64, - target_platform = builder_config.target_platform.ANDROID, - ), - android_config = builder_config.android_config( - config = "base_config", - ), - build_gs_bucket = "chromium-android-archive", - ), - targets = targets.bundle( - targets = [ - "android_lff_emulator_gtests", - ], - mixins = [ - "15-tablet-x64-emulator", - "emulator-8-cores", - "has_native_resultdb_integration", - "linux-jammy", - "x86-64", - ], - per_test_modifications = { - "android_browsertests": targets.mixin( - args = [ - # https://crbug.com/375086487 - "--gtest_filter=-InstallableManagerBrowserTest.CheckManifestWithIconThatIsTooSmall", - ], - swarming = targets.swarming( - shards = 6, - ), - ), - "base_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - ], - ), - "content_browsertests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.content_browsertests.filter", - ], - # TODO(crbug.com/388525813) Remove experiment once suite is stable - experiment_percentage = 100, - swarming = targets.swarming( - shards = 40, - ), - ), - "chrome_public_test_apk": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - ], - ), - "chrome_public_unit_test_apk": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet.chrome_public_unit_test_apk.filter", - ], - ), - "content_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - ], - ), - "perfetto_unittests": targets.mixin( - args = [ - # TODO(crbug.com/40201873): Fix the failed test - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - ], - ), - "gl_tests_validating": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - ], - ), - "gwp_asan_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - ], - ), - "unit_tests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - ], - ), - }, - ), - targets_settings = targets.settings( - os_type = targets.os_type.ANDROID, - ), - # TODO(crbug.com/376748979 ): Enable gardening once tests are stable - gardener_rotations = args.ignore_default(None), - console_view_entry = consoles.console_view_entry( - category = "tester|tablet", - short_name = "15T", - ), - contact_team_email = "clank-engprod@google.com", -) - -ci.thin_tester( - name = "android-15-tablet-landscape-x64-dbg-tests", - description_html = "Run chromium tests on Android 15 tablet emulators " + - "in Landscape mode.", - triggered_by = ["Android x64 Builder (dbg)"], - builder_spec = builder_config.builder_spec( - execution_mode = builder_config.execution_mode.TEST, - gclient_config = builder_config.gclient_config( - config = "chromium", - apply_configs = [ - "android", - ], - ), - chromium_config = builder_config.chromium_config( - config = "main_builder", - apply_configs = ["mb"], - build_config = builder_config.build_config.DEBUG, - target_arch = builder_config.target_arch.INTEL, - target_bits = 64, - target_platform = builder_config.target_platform.ANDROID, - ), - android_config = builder_config.android_config( - config = "base_config", - ), - build_gs_bucket = "chromium-android-archive", - ), - targets = targets.bundle( - targets = [ - "android_lff_landscape_emulator_gtests", - ], - mixins = [ - "15-tablet-landscape-x64-emulator", - "emulator-8-cores", - "has_native_resultdb_integration", - "linux-jammy", - "x86-64", - ], - per_test_modifications = { - "chrome_public_test_apk": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_tablet_landscape.chrome_public_test_apk.filter", - "--emulator-debug-tags=all", - ], - ), - }, - ), - targets_settings = targets.settings( - os_type = targets.os_type.ANDROID, - ), - # TODO(crbug.com/376748979 ): Enable gardening once tests are stable - gardener_rotations = args.ignore_default(None), - console_view_entry = consoles.console_view_entry( - category = "tester|tablet", - short_name = "15T-L", - ), - contact_team_email = "clank-engprod@google.com", -) - ci.builder( name = "android-webview-13-x64-hostside-rel", branch_selector = branches.selector.ANDROID_BRANCHES,
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 9c906bb..9aabb6e9 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -389,38 +389,6 @@ ) try_.builder( - name = "android-15-tablet-x64-dbg", - mirrors = [ - "ci/Android x64 Builder (dbg)", - "ci/android-15-tablet-x64-dbg-tests", - ], - gn_args = gn_args.config( - configs = [ - "ci/Android x64 Builder (dbg)", - "debug_try_builder", - ], - ), - contact_team_email = "clank-engprod@google.com", - siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ, -) - -try_.builder( - name = "android-15-tablet-landscape-x64-dbg", - mirrors = [ - "ci/Android x64 Builder (dbg)", - "ci/android-15-tablet-landscape-x64-dbg-tests", - ], - gn_args = gn_args.config( - configs = [ - "ci/Android x64 Builder (dbg)", - "debug_try_builder", - ], - ), - contact_team_email = "clank-engprod@google.com", - siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ, -) - -try_.builder( name = "android-arm-compile-dbg", branch_selector = branches.selector.ANDROID_BRANCHES, mirrors = ["ci/Android arm Builder (dbg)"],
diff --git a/ios/build/tools/setup-gn.py b/ios/build/tools/setup-gn.py index f6b38b38..1b2ffdd2 100755 --- a/ios/build/tools/setup-gn.py +++ b/ios/build/tools/setup-gn.py
@@ -152,8 +152,16 @@ args.append( ('target_environment', self.TARGET_ENVIRONMENT_VALUES[self._target])) args.append(('target_platform', self.TARGET_PLATFORM_VALUES[self._target])) - if self.TARGET_PLATFORM_VALUES[self._target] == '"tvos"': + + use_blink = self._settings.getboolean('gn_args', 'use_blink') + + if self.TARGET_PLATFORM_VALUES[self._target] == '"tvos"' and not use_blink: args.append(('use_blink', True)) + use_blink = True + + has_symbol_level = self._settings.has_option('gn_args', 'symbol_level') + if use_blink and is_optim and not has_symbol_level: + args.append(('symbol_level', 1)) # Add user overrides after the other configurations so that they can # refer to them and override them.
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn index 63d248b..016df0d7 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/BUILD.gn
@@ -37,6 +37,7 @@ "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils", "//ios/chrome/browser/authentication/ui_bundled/signin:constants", "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_in_progress", "//ios/chrome/browser/authentication/ui_bundled/signout_action_sheet", "//ios/chrome/browser/authentication/ui_bundled/trusted_vault_reauthentication", "//ios/chrome/browser/ntp/ui_bundled:feature_flags",
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm index ed817a73..4e2f3f4 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_coordinator.mm
@@ -29,6 +29,7 @@ #import "ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.h" #import "ios/chrome/browser/authentication/ui_bundled/continuation.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" #import "ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator_delegate.h" @@ -127,6 +128,9 @@ GURL _url; TrustedVaultReauthenticationCoordinator* _trustedVaultReauthenticationCoordinator; + // While this value is set, the scene state considers the sign-in to be in + // progress. + std::unique_ptr<SigninInProgress> _signinInProgress; } - (instancetype)initWithBaseViewController:(UIViewController*)viewController @@ -354,6 +358,7 @@ - (AuthenticationFlow*)authenticationFlow:(id<SystemIdentity>)identity anchorRect:(CGRect)anchorRect { + _signinInProgress = [self.sceneState createSigninInProgress]; AuthenticationFlow* authenticationFlow = [[AuthenticationFlow alloc] initWithBrowser:self.browser identity:identity @@ -367,6 +372,11 @@ return authenticationFlow; } +- (void)signinFinished { + CHECK(_signinInProgress, base::NotFatalUntil::M147); + _signinInProgress.reset(); +} + #pragma mark - SyncErrorSettingsCommandHandler - (void)openPassphraseDialogWithModalPresentation:(BOOL)presentModally {
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator.mm index a632a24f..112ce90 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator.mm
@@ -415,6 +415,7 @@ - (void)authenticationFlowDidSignInInSameProfileWithResult: (SigninCoordinatorResult)result { + [_delegate signinFinished]; if (_accessPoint == AccountMenuAccessPoint::kWeb && result == SigninCoordinatorResultSuccess) { GetApplicationContext()->GetLocalState()->SetBoolean( @@ -454,6 +455,7 @@ - (ChangeProfileContinuation)authenticationFlowWillChangeProfile { _authenticationFlow = nil; + [_delegate signinFinished]; switch (_accessPoint) { case AccountMenuAccessPoint::kNewTabPage: return CreateChangeProfileOpensNTPContinuation();
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_delegate.h b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_delegate.h index d3ac9db12..99756517 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_delegate.h +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_delegate.h
@@ -7,6 +7,7 @@ #import <Foundation/Foundation.h> +#import <memory> #import <string_view> #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" @@ -15,6 +16,7 @@ @class AccountMenuMediator; @class AuthenticationFlow; +class SigninInProgress; @protocol SystemIdentity; @protocol AccountMenuMediatorDelegate <NSObject> @@ -49,6 +51,8 @@ // The user tapped to open Settings page. - (void)didTapSettingsButton; +// The signin is finished. +- (void)signinFinished; @end #endif // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_ACCOUNT_MENU_ACCOUNT_MENU_MEDIATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_unittests.mm b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_unittests.mm index a93734f..28056dd 100644 --- a/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_unittests.mm +++ b/ios/chrome/browser/authentication/ui_bundled/account_menu/account_menu_mediator_unittests.mm
@@ -488,6 +488,7 @@ OCMExpect([consumer_mock_ switchingStopped]); OCMExpect([consumer_mock_ setUserInteractionsEnabled:YES]); + OCMExpect([delegate_mock_ signinFinished]); // Simulate AuthenticationFlow failure. [authentication_flow_request_helper authenticationFlowDidSignInInSameProfileWithResult: @@ -533,6 +534,7 @@ // Expect that the consumer unlocks the UI. OCMExpect([consumer_mock_ switchingStopped]); OCMExpect([consumer_mock_ setUserInteractionsEnabled:YES]); + OCMExpect([delegate_mock_ signinFinished]); [authentication_flow_request_helper authenticationFlowDidSignInInSameProfileWithResult: SigninCoordinatorResult::SigninCoordinatorResultInterrupted]; @@ -579,6 +581,7 @@ withResult:SigninCoordinatorResultSuccess signedIdentity:kSecondaryIdentity userTappedClose:NO]); + OCMExpect([delegate_mock_ signinFinished]); [authentication_flow_request_helper authenticationFlowDidSignInInSameProfileWithResult: SigninCoordinatorResultSuccess];
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/BUILD.gn index 3d5cd03..6d16f1e 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/signin/BUILD.gn
@@ -45,6 +45,7 @@ public_deps = [ ":constants" ] deps = [ ":signin_headers", + ":signin_in_progress", ":signin_protected", ":signin_screen_provider", "//components/feature_engagement/public", @@ -148,6 +149,14 @@ ] } +source_set("signin_in_progress") { + sources = [ + "signin_in_progress.h", + "signin_in_progress.mm", + ] + deps = [ "//ios/chrome/browser/shared/public/commands" ] +} + source_set("constants") { sources = [ "signin_constants.h",
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/BUILD.gn index 42d322d8..6563b1b 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/BUILD.gn
@@ -69,15 +69,19 @@ "//components/signin/public/identity_manager", "//components/signin/public/identity_manager/objc", "//components/sync_preferences:test_support", + "//ios/chrome/app/profile", "//ios/chrome/browser/authentication/ui_bundled", "//ios/chrome/browser/authentication/ui_bundled:continuation_test", "//ios/chrome/browser/authentication/ui_bundled/authentication_flow", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_in_progress", "//ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account", "//ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_sheet", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser/test:test_support", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/profile/test", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin/model", "//ios/chrome/browser/signin/model:authentication_service", "//ios/chrome/browser/signin/model:authentication_service_factory",
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator_unittest.mm index 4c52c7d1e1..0aee71c 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator_unittest.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_coordinator_unittest.mm
@@ -7,12 +7,17 @@ #import <UIKit/UIKit.h> #import "components/signin/core/browser/account_reconcilor.h" +#import "ios/chrome/app/profile/profile_state.h" #import "ios/chrome/browser/authentication/ui_bundled/authentication_test_util.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_promo_signin_mediator.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_sheet/consistency_sheet_navigation_controller.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/web/public/test/web_task_environment.h" #import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" @@ -23,9 +28,15 @@ class ConsistencyPromoSigninCoordinatorTest : public PlatformTest { public: ConsistencyPromoSigninCoordinatorTest() { + // The profile state will receive UI blocker request. They are not tested + // here, so it’s a non-strict mock. + profile_state_ = OCMClassMock([ProfileState class]); + scene_state_ = [[SceneState alloc] initWithAppState:nil]; + scene_state_.profileState = profile_state_; profile_ = TestProfileIOS::Builder().Build(); - browser_ = std::make_unique<TestBrowser>(profile_.get()); + browser_ = std::make_unique<TestBrowser>(profile_.get(), scene_state_); base_view_controller_mock_ = OCMStrictClassMock([UIViewController class]); + coordinator_ = [[ConsistencyPromoSigninCoordinator alloc] initWithBaseViewController:base_view_controller_mock_ browser:browser_.get() @@ -45,6 +56,7 @@ EXPECT_OCMOCK_VERIFY((id)base_view_controller_mock_); EXPECT_OCMOCK_VERIFY((id)consistency_default_account_coordinator_mock_); EXPECT_OCMOCK_VERIFY((id)consistency_sheet_navigation_controller_mock_); + EXPECT_OCMOCK_VERIFY((id)profile_state_); PlatformTest::TearDown(); } @@ -138,11 +150,14 @@ consistency_default_account_coordinator_mock_ = nil; ConsistencySheetNavigationController* consistency_sheet_navigation_controller_mock_ = nil; + SceneState* scene_state_; private: web::WebTaskEnvironment task_environment_; std::unique_ptr<TestProfileIOS> profile_; std::unique_ptr<TestBrowser> browser_; + // Required for UI blocker. + ProfileState* profile_state_; }; // Tests that all coordinators are stopped and delegates are set to nil when @@ -183,7 +198,10 @@ EXPECT_TRUE(signin_completion_called); EXPECT_EQ(SigninCoordinatorResultCanceledByUser, coordinator_result); EXPECT_EQ(nil, signed_in_identity); + EXPECT_TRUE(scene_state_.signinInProgress); [coordinator_ stop]; + coordinator_ = nil; + EXPECT_FALSE(scene_state_.signinInProgress); } } // namespace
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.mm index 4c82440..e5f0a3f 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.mm
@@ -18,14 +18,18 @@ #import "ios/chrome/browser/authentication/ui_bundled/signin/logging/first_run_signin_logger.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_history_sync/signin_and_history_sync_coordinator.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_screen_provider.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator.h" #import "ios/chrome/browser/authentication/ui_bundled/trusted_vault_reauthentication/trusted_vault_reauthentication_coordinator_delegate.h" #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/animated_coordinator.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/model/profile/profile_ios.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/shared/public/commands/show_signin_command.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/signin/model/chrome_account_manager_service_factory.h" @@ -33,7 +37,9 @@ using signin_metrics::AccessPoint; using signin_metrics::PromoAction; -@implementation SigninCoordinator +@implementation SigninCoordinator { + std::unique_ptr<SigninInProgress> _signinInProgress; +} - (instancetype)initWithBaseViewController:(UIViewController*)viewController browser:(Browser*)browser @@ -45,6 +51,7 @@ _contextStyle = contextStyle; _accessPoint = accessPoint; _creationTimeTicks = base::TimeTicks::Now(); + _signinInProgress = [self.sceneState createSigninInProgress]; } return self; } @@ -395,6 +402,13 @@ DCHECK(self.signinCompletion); } +#pragma mark - AnimatedCoordinator + +- (void)stopAnimated:(BOOL)animated { + _signinInProgress.reset(); + [super stopAnimated:animated]; +} + #pragma mark - Protected - (void)runCompletionWithSigninResult:(SigninCoordinatorResult)signinResult
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h b/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h new file mode 100644 index 0000000..f749c613 --- /dev/null +++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h
@@ -0,0 +1,35 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_SIGNIN_IN_PROGRESS_H_ +#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_SIGNIN_IN_PROGRESS_H_ + +#import <Foundation/Foundation.h> + +@protocol ApplicationCommands; +class SigninInProgress; + +@protocol SignInInProgressAudience <NSObject> + +// Records that an extra sign-in process started. +- (void)signInStarted; + +// Records that a sign-in is done. +- (void)signinFinished; + +@end + +// While an object of this class is alive, the SceneController knows +// a sign-in operation is in progress and blocks the UI of the other scenes. +class SigninInProgress { + public: + explicit SigninInProgress(id<SignInInProgressAudience> audience); + ~SigninInProgress(); + + private: + // The audience. + __weak id<SignInInProgressAudience> audience_; +}; + +#endif // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_SIGNIN_SIGNIN_IN_PROGRESS_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.mm b/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.mm new file mode 100644 index 0000000..25e4569 --- /dev/null +++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.mm
@@ -0,0 +1,17 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" + +#import "ios/chrome/browser/shared/public/commands/application_commands.h" + +SigninInProgress::SigninInProgress(id<SignInInProgressAudience> audience) + : audience_(audience) { + DCHECK(audience_); + [audience_ signInStarted]; +} + +SigninInProgress::~SigninInProgress() { + [audience_ signinFinished]; +}
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn index be5fb755..a5a0837d 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn +++ b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn
@@ -37,13 +37,17 @@ "//base/test:test_support", "//components/sync:test_support", "//components/sync/base:features", + "//ios/chrome/app/profile", "//ios/chrome/browser/authentication/ui_bundled:continuation_test", "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui", "//ios/chrome/browser/authentication/ui_bundled/history_sync:ui", "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_in_progress", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/model/application_context", "//ios/chrome/browser/shared/model/browser/test:test_support", "//ios/chrome/browser/shared/model/profile/test", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin/model:authentication_service", "//ios/chrome/browser/signin/model:authentication_service_factory", "//ios/chrome/browser/signin/model:fake_system_identity", @@ -53,6 +57,7 @@ "//ios/chrome/browser/sync/model:test_support", "//ios/chrome/test:test_support", "//ios/web/public/test", + "//third_party/ocmock", ] }
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm index 310e4bb..c311d9e5 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm
@@ -12,13 +12,18 @@ #import "base/test/metrics/histogram_tester.h" #import "base/test/metrics/user_action_tester.h" #import "components/sync/test/test_sync_service.h" +#import "ios/chrome/app/profile/profile_state.h" #import "ios/chrome/browser/authentication/ui_bundled/authentication_test_util.h" #import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h" #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_view_controller.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/signin/model/authentication_service.h" #import "ios/chrome/browser/signin/model/authentication_service_factory.h" #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h" @@ -30,12 +35,19 @@ #import "ios/web/public/test/web_task_environment.h" #import "testing/gtest_mac.h" #import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" // Test cases for the TwoScreensSigninCoordinator. class TwoScreensSigninCoordinatorTest : public PlatformTest { public: TwoScreensSigninCoordinatorTest() { TestProfileIOS::Builder builder; + // The profile state will receive UI blocker request. They are not tested + // here, so it’s a non-strict mock. + profile_state_ = OCMClassMock([ProfileState class]); + scene_state_ = [[SceneState alloc] initWithAppState:nil]; + scene_state_.profileState = profile_state_; builder.AddTestingFactory( AuthenticationServiceFactory::GetInstance(), AuthenticationServiceFactory::GetFactoryWithDelegate( @@ -47,7 +59,7 @@ return std::make_unique<syncer::TestSyncService>(); })); profile_ = std::move(builder).Build(); - browser_ = std::make_unique<TestBrowser>(profile_.get()); + browser_ = std::make_unique<TestBrowser>(profile_.get(), scene_state_); NSUserDefaults* standardDefaults = [NSUserDefaults standardUserDefaults]; [standardDefaults removeObjectForKey:kDisplayedSSORecallPromoCountKey]; @@ -68,6 +80,10 @@ system_identity_manager->AddIdentity(fake_identity_); } + ~TwoScreensSigninCoordinatorTest() override { + EXPECT_OCMOCK_VERIFY((id)profile_state_); + } + // Initalize coordinator_ up to start. // Expects it receives a completion with the expected_result and // expected_signin_completion_identity_ @@ -147,6 +163,7 @@ protected: // Stops the coordinator and unset it. void StopCoordinator() { + EXPECT_TRUE(scene_state_.signinInProgress); [coordinator_ stop]; coordinator_ = nil; } @@ -160,6 +177,11 @@ base::UserActionTester user_actions_; UIWindow* window_; FakeSystemIdentity* fake_identity_ = nil; + SceneState* scene_state_; + + private: + // Required for UI blocker. + ProfileState* profile_state_; }; #pragma mark - Tests @@ -191,6 +213,7 @@ histogram_tester.ExpectUniqueSample<signin_metrics::AccessPoint>( "Signin.SigninStartedAccessPoint", signin_metrics::AccessPoint::kSettings, 1); + EXPECT_FALSE(scene_state_.signinInProgress); } // Tests that the screens are not presented when the user has already signed in @@ -220,6 +243,7 @@ histogram_tester.ExpectUniqueSample<signin_metrics::AccessPoint>( "Signin.SigninStartedAccessPoint", signin_metrics::AccessPoint::kSettings, 0); + EXPECT_FALSE(scene_state_.signinInProgress); } // Tests that stopping the coordinator before it is done will interrupt it. @@ -233,6 +257,7 @@ EXPECT_FALSE(completion_block_done_); ExpectNoUpgradePromoHistogram(&histogram_tester); + EXPECT_FALSE(scene_state_.signinInProgress); } // Tests that the user can cancel without signing in. @@ -248,6 +273,7 @@ ASSERT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( base::Seconds(1), true, completion_condition)); ExpectNoUpgradePromoHistogram(&histogram_tester); + EXPECT_FALSE(scene_state_.signinInProgress); } // Tests that the user can swipe to dismiss and that a user action is recorded. @@ -270,4 +296,5 @@ EXPECT_EQ(1, user_actions_.GetActionCount("Signin_TwoScreens_SwipeDismiss")); ExpectNoUpgradePromoHistogram(&histogram_tester); + EXPECT_FALSE(scene_state_.signinInProgress); }
diff --git a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm index aa6541e..4131da89 100644 --- a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm +++ b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
@@ -220,6 +220,7 @@ #import "ios/chrome/browser/shared/public/commands/enhanced_calendar_commands.h" #import "ios/chrome/browser/shared/public/commands/feed_commands.h" #import "ios/chrome/browser/shared/public/commands/find_in_page_commands.h" +#import "ios/chrome/browser/shared/public/commands/glic_commands.h" #import "ios/chrome/browser/shared/public/commands/google_one_commands.h" #import "ios/chrome/browser/shared/public/commands/help_commands.h" #import "ios/chrome/browser/shared/public/commands/lens_overlay_commands.h" @@ -359,6 +360,7 @@ EditMenuBuilder, EnterprisePromptCoordinatorDelegate, FormInputAccessoryCoordinatorNavigator, + GlicCommands, GoogleOneCommands, MiniMapCommands, NetExportTabHelperDelegate, @@ -1108,6 +1110,7 @@ @protocol(FeedCommands), @protocol(PromosManagerCommands), @protocol(FindInPageCommands), + @protocol(GlicCommands), @protocol(ReaderModeCommands), @protocol(NewTabPageCommands), @protocol(NonModalSignInPromoCommands), @@ -2850,6 +2853,16 @@ _countryCodePickerCoordinator = nil; } +#pragma mark - GlicCommands + +- (void)startGlicFlow { + _glicCoordinator = + [[GLICCoordinator alloc] initWithBaseViewController:self.viewController + browser:self.browser]; + + [_glicCoordinator start]; +} + #pragma mark - PromosManagerCommands - (void)showPromo {
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_egtest.mm b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_egtest.mm index 4c9e2fa..ef651d8 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_egtest.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_egtest.mm
@@ -229,13 +229,7 @@ // Tests the "Remove" action of the Most Visited context menu, and the "Undo" // action. -// TODO(crbug.com/337064665): Test is flaky on simluator. Re-enable when fixed. -#if TARGET_IPHONE_SIMULATOR -#define MAYBE_testMostVisitedRemoveUndo FLAKY_testMostVisitedRemoveUndo -#else -#define MAYBE_testMostVisitedRemoveUndo testMostVisitedRemoveUndo -#endif -- (void)MAYBE_testMostVisitedRemoveUndo { +- (void)testMostVisitedRemoveUndo { [self setupMostVisitedTileLongPress]; const GURL pageURL = self.testServer->GetURL(kPageURL); NSString* pageTitle = base::SysUTF8ToNSString(kPageTitle);
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/ntp_home_egtest.mm b/ios/chrome/browser/content_suggestions/ui_bundled/ntp_home_egtest.mm index 7e12ddc3..1a233e0f 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/ntp_home_egtest.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/ntp_home_egtest.mm
@@ -312,8 +312,7 @@ } // Tests that the collections shortcut are displayed and working. -// TODO(crbug.com/387934031): Re-enable. -- (void)DISABLED_testCollectionShortcutsWithWhatsNew { +- (void)testCollectionShortcutsWithWhatsNew { AppLaunchConfiguration config = self.appConfigurationForTestCase; config.relaunch_policy = ForceRelaunchByCleanShutdown; // This ensures that the test will not fail when What's New has already been
diff --git a/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator.mm b/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator.mm index 390905b3..b8d10ea8 100644 --- a/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator.mm +++ b/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator.mm
@@ -94,12 +94,7 @@ feature_engagement::TrackerFactory::GetForProfile(self.profile); self.viewController.actionHandler = self; self.viewController.presentationController.delegate = self; - if (trigger == CredentialProviderPromoTrigger::SetUpList) { - // If this is coming from the SetUpList, force to go directly to LearnMore. - self.promoContext = CredentialProviderPromoContext::kLearnMore; - } else { - self.promoContext = CredentialProviderPromoContext::kFirstStep; - } + self.promoContext = [self promoContextFromTrigger:trigger]; [self.mediator configureConsumerWithTrigger:trigger context:self.promoContext]; self.trigger = trigger; @@ -144,7 +139,7 @@ [self presentLearnMore]; [self recordAction:IOSCredentialProviderPromoAction::kLearnMore]; } else { - OpenIOSCredentialProviderSettings(); + [self openIOSCredentialProviderSettings]; [self recordAction:IOSCredentialProviderPromoAction::kGoToSettings]; [self promoWasDismissed]; } @@ -244,4 +239,22 @@ OpenIOSCredentialProviderSettings(); } +// Returns the promo context for the given trigger. For SetUpList the first +// step is skipped because some context is already provided in the SetUpList +// item's description. But on iOS 18, the first step allows the user to enable +// the CPE directly in-app, so this is preferred. +- (CredentialProviderPromoContext)promoContextFromTrigger: + (CredentialProviderPromoTrigger)trigger { + if (trigger == CredentialProviderPromoTrigger::SetUpList) { + if (@available(iOS 18.0, *)) { + if (IOSPasskeysM2Enabled() && IsIOSExpandedTipsEnabled()) { + // Go to the first step, which allows enabling CPE in-app. + return CredentialProviderPromoContext::kFirstStep; + } + } + return CredentialProviderPromoContext::kLearnMore; + } + return CredentialProviderPromoContext::kFirstStep; +} + @end
diff --git a/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator_unittest.mm b/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator_unittest.mm index b691997..75213a0 100644 --- a/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator_unittest.mm +++ b/ios/chrome/browser/credential_provider_promo/ui_bundled/credential_provider_promo_coordinator_unittest.mm
@@ -58,9 +58,9 @@ coordinator_ = [[CredentialProviderPromoCoordinator alloc] initWithBaseViewController:nil browser:browser_.get()]; - FakeCredentialProviderPromoCoordinatorSettingsOpener* fakeDelegate = + settings_opener_delegate_ = [[FakeCredentialProviderPromoCoordinatorSettingsOpener alloc] init]; - coordinator_.settingsOpenerDelegate = fakeDelegate; + coordinator_.settingsOpenerDelegate = settings_opener_delegate_; [coordinator_ start]; credential_provider_promo_command_handler_ = HandlerForProtocol( @@ -89,6 +89,8 @@ CredentialProviderPromoCoordinator* coordinator_; id<CredentialProviderPromoCommands> credential_provider_promo_command_handler_; + FakeCredentialProviderPromoCoordinatorSettingsOpener* + settings_opener_delegate_; }; #pragma mark - Tests @@ -317,6 +319,8 @@ // Tests the flow when the trigger is the SetUpList. It should go directly to // LearnMore and the primary CTA should go to settings. TEST_F(CredentialProviderPromoCoordinatorTest, SetUpListTrigger) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature(kIOSExpandedTips); histogram_tester_->ExpectBucketCount( kIOSCredentialProviderPromoOnSetUpListHistogram, credential_provider_promo::IOSCredentialProviderPromoAction::kLearnMore, @@ -344,6 +348,46 @@ 1); } +// Tests the flow when the trigger is the SetUpList with the ExpandedTips +// feature enabled. It should go to the first step and the primary CTA should +// directly enable the CPE. +TEST_F(CredentialProviderPromoCoordinatorTest, + SetUpListTriggerWithExpandedTips) { + if (!@available(iOS 18.0, *)) { + return; + } + + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({kIOSPasskeysM2, kIOSExpandedTips}, {}); + histogram_tester_->ExpectBucketCount( + kIOSCredentialProviderPromoOnSetUpListHistogram, + credential_provider_promo::IOSCredentialProviderPromoAction::kLearnMore, + 0); + // Trigger the promo with SetUpList. The primary CTA of the promo, when + // triggered from SetUpList, is 'Turn on AutoFill'. + [credential_provider_promo_command_handler_ + showCredentialProviderPromoWithTrigger:CredentialProviderPromoTrigger:: + SetUpList]; + + // Perform the action. Coordinator will record the action 'Turn on AutoFill'. + ASSERT_TRUE([coordinator_ + conformsToProtocol:@protocol(ConfirmationAlertActionHandler)]); + [(id<ConfirmationAlertActionHandler>) + coordinator_ confirmationAlertPrimaryAction]; + + // Wait for the histogram to be logged. + EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout( + TestTimeouts::action_timeout(), ^bool() { + return histogram_tester_->GetBucketCount( + kTurnOnCredentialProviderExtensionPromptOutcomeHistogram, + false) == 1; + })); + + // Verify that only the expected metric was logged. + histogram_tester_->ExpectUniqueSample( + kTurnOnCredentialProviderExtensionPromptOutcomeHistogram, false, 1); +} + // Tests that the last action taken is recorded in local state. TEST_F(CredentialProviderPromoCoordinatorTest, LastActionTaken) { // Trigger the promo with SetUpList. The primary CTA of the promo, when
diff --git a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_coordinator.mm b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_coordinator.mm index b08a65b..5525837 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_coordinator.mm +++ b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_coordinator.mm
@@ -6,6 +6,9 @@ #import "ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.h" #import "ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/glic_commands.h" @implementation PageActionMenuCoordinator { PageActionMenuViewController* _viewController; @@ -17,7 +20,9 @@ - (void)start { _viewController = [[PageActionMenuViewController alloc] init]; _mediator = [[PageActionMenuMediator alloc] init]; - _viewController.mutator = _mediator; + id<GlicCommands> handler = + HandlerForProtocol(self.browser->GetCommandDispatcher(), GlicCommands); + _viewController.handler = handler; [self.baseViewController presentViewController:_viewController animated:YES
diff --git a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.h b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.h index ee4706b..68676390 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.h +++ b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.h
@@ -7,10 +7,8 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_mutator.h" - // The mediator for the page action menu. -@interface PageActionMenuMediator : NSObject <PageActionMenuMutator> +@interface PageActionMenuMediator : NSObject @end
diff --git a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm index 21a38d2a..1db61cc 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm +++ b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm
@@ -6,18 +6,4 @@ @implementation PageActionMenuMediator -#pragma mark - PageActionMenuMutator - -- (void)openLensOverlay { - // TODO(crbug.com/414412781): Handle this. -} - -- (void)startReaderMode { - // TODO(crbug.com/414412781): Handle this. -} - -- (void)startGlicOverlay { - // TODO(crbug.com/414412781): Handle this. -} - @end
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/BUILD.gn b/ios/chrome/browser/intelligence/page_action_menu/ui/BUILD.gn index 9ec07f2..fd710df 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/ui/BUILD.gn +++ b/ios/chrome/browser/intelligence/page_action_menu/ui/BUILD.gn
@@ -6,7 +6,6 @@ sources = [ "page_action_menu_entrypoint_view.h", "page_action_menu_entrypoint_view.mm", - "page_action_menu_mutator.h", "page_action_menu_view_controller.h", "page_action_menu_view_controller.mm", ] @@ -15,6 +14,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/intelligence/page_action_menu/ui/resources", "//ios/chrome/browser/intelligence/page_action_menu/utils", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/elements", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/util",
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_mutator.h b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_mutator.h deleted file mode 100644 index 7719615..0000000 --- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_mutator.h +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_CHROME_BROWSER_INTELLIGENCE_PAGE_ACTION_MENU_UI_PAGE_ACTION_MENU_MUTATOR_H_ -#define IOS_CHROME_BROWSER_INTELLIGENCE_PAGE_ACTION_MENU_UI_PAGE_ACTION_MENU_MUTATOR_H_ - -// The mutator protocol for the view controller to communicate with the -// mediator. -@protocol PageActionMenuMutator - -// Opens Lens overlay. -- (void)openLensOverlay; - -// Starts reader mode. -- (void)startReaderMode; - -// Starts GLIC overlay. -- (void)startGlicOverlay; - -@end - -#endif // IOS_CHROME_BROWSER_INTELLIGENCE_PAGE_ACTION_MENU_UI_PAGE_ACTION_MENU_MUTATOR_H_
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h index 46f2f864..fad1ab6 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h +++ b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h
@@ -7,13 +7,13 @@ #import <UIKit/UIKit.h> -@protocol PageActionMenuMutator; +@protocol GlicCommands; // The view controller representing the presented page action menu UI. @interface PageActionMenuViewController : UIViewController -// The mutator for communicating with the mediator. -@property(nonatomic, weak) id<PageActionMenuMutator> mutator; +// The handler for sending GLIC commands. +@property(nonatomic, weak) id<GlicCommands> handler; @end
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm index c77efdc..bd1b955c 100644 --- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm +++ b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.mm
@@ -5,8 +5,8 @@ #import "ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_view_controller.h" #import "build/branding_buildflags.h" -#import "ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_mutator.h" #import "ios/chrome/browser/intelligence/page_action_menu/utils/ai_hub_constants.h" +#import "ios/chrome/browser/shared/public/commands/glic_commands.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" @@ -219,6 +219,9 @@ UIButton* button = [UIButton buttonWithConfiguration:buttonConfiguration primaryAction:nil]; button.translatesAutoresizingMaskIntoConstraints = NO; + [button addTarget:self + action:@selector(handleGlicTapped:) + forControlEvents:UIControlEventTouchUpInside]; return button; } @@ -260,4 +263,15 @@ return button; } +#pragma mark - Private + +// Dismisses this view controller and starts the GLIC overlay. +- (void)handleGlicTapped:(UIButton*)button { + PageActionMenuViewController* __weak weakSelf = self; + [self dismissViewControllerAnimated:YES + completion:^{ + [weakSelf.handler startGlicFlow]; + }]; +} + @end
diff --git a/ios/chrome/browser/omnibox/eg_tests/omnibox_popup_egtest.mm b/ios/chrome/browser/omnibox/eg_tests/omnibox_popup_egtest.mm index d8a906b1..cc53389b 100644 --- a/ios/chrome/browser/omnibox/eg_tests/omnibox_popup_egtest.mm +++ b/ios/chrome/browser/omnibox/eg_tests/omnibox_popup_egtest.mm
@@ -580,14 +580,23 @@ @implementation HardwareKeyboardInteractionTestCase +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config = [super appConfigurationForTestCase]; + + // HW keyboard simulation does mess up the SW keyboard simulator state. + // Relaunching resets the state. + config.relaunch_policy = ForceRelaunchByCleanShutdown; + + // Disable all autocomplete providers except the verbatim and history + // providers. + omnibox::DisableAutocompleteProviders(config, 133937171); + + return config; +} + - (void)setUp { [super setUp]; - // Start a server to be able to navigate to a web page. - self.testServer->RegisterRequestHandler( - base::BindRepeating(&omnibox::OmniboxHTTPResponses)); - GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); - if (![ChromeTestCase forceRestartAndWipe]) { [ChromeEarlGrey clearBrowsingHistory]; } @@ -599,10 +608,7 @@ - (void)tearDownHelper { [OmniboxAppInterface tearDownFakeSuggestionsService]; [super tearDownHelper]; - // HW keyboard simulation does mess up the SW keyboard simulator state. - // Relaunching resets the state. - AppLaunchConfiguration config = [super appConfigurationForTestCase]; - config.relaunch_policy = ForceRelaunchByCleanShutdown; + AppLaunchConfiguration config = [self appConfigurationForTestCase]; [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; } @@ -642,8 +648,7 @@ // Tests that leading image in omnibox changes based on the suggestion // highlighted. -// TODO(crbug.com/40917341): Test is flaky on both device and simulator. -- (void)DISABLED_testOmniboxLeadingImage { +- (void)testOmniboxLeadingImage { // Start a server to be able to navigate to a web page. self.testServer->RegisterRequestHandler( base::BindRepeating(&StandardResponse)); @@ -668,14 +673,6 @@ // is done. base::test::ios::SpinRunLoopWithMinDelay(base::Seconds(1)); [ChromeEarlGrey simulatePhysicalKeyboardEvent:@"downArrow" flags:0]; - - // We expect to have the default leading image. - [ChromeEarlGrey - waitForUIElementToAppearWithMatcher: - grey_allOf(OmniboxWithLeadingImageElement( - kOmniboxLeadingImageDefaultAccessibilityIdentifier), - nil)]; - [ChromeEarlGrey simulatePhysicalKeyboardEvent:@"downArrow" flags:0]; // The popup row is a url suggestion so we expect to have the leading @@ -689,8 +686,12 @@ } // Tests that user can use the hardware keyboard to select the "link you copied" -// suggeston. +// suggestion. - (void)testHardwareKeyboardSelectLinkYouCopied { + // Start a server to be able to navigate to a web page. + self.testServer->RegisterRequestHandler( + base::BindRepeating(&omnibox::OmniboxHTTPResponses)); + GREYAssertTrue(self.testServer->Start(), @"Test server failed to start."); const GURL pageURL = self.testServer->GetURL(omnibox::PageURL(1)); // Copy link in clipboard. [ChromeEarlGrey
diff --git a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/sync_error/sync_error_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/sync_error/sync_error_infobar_banner_overlay_mediator.mm index ab7644e..0845d35 100644 --- a/ios/chrome/browser/overlays/ui_bundled/infobar_banner/sync_error/sync_error_infobar_banner_overlay_mediator.mm +++ b/ios/chrome/browser/overlays/ui_bundled/infobar_banner/sync_error/sync_error_infobar_banner_overlay_mediator.mm
@@ -77,20 +77,12 @@ [consumer setButtonText:base::SysUTF16ToNSString(delegate->GetButtonLabel( SyncErrorInfoBarDelegate::BUTTON_OK))]; - if (delegate->DisplayPasswordErrorIcon()) { - [consumer - setIconImage:DefaultSymbolTemplateWithPointSize( - kSyncPasswordErrorSymbol, kInfobarSymbolPointSize)]; - [consumer setIconBackgroundColor:[UIColor colorNamed:kRed100Color]]; - [consumer setIconImageTintColor:[UIColor colorNamed:kRedColor]]; - } else { - [consumer setIconImage:DefaultSymbolTemplateWithPointSize( - kSyncErrorSymbol, kInfobarSymbolPointSize)]; - [consumer setIconBackgroundColor:[UIColor colorNamed:kRed500Color]]; - [consumer - setIconImageTintColor:[UIColor colorNamed:kPrimaryBackgroundColor]]; - } - + // TODO(crbug.com/408165259): Use a dedicated icon in case when + // `delegate->DisplayPasswordErrorIcon()` is true. + [consumer setIconImage:DefaultSymbolTemplateWithPointSize( + kSyncErrorSymbol, kInfobarSymbolPointSize)]; + [consumer setIconBackgroundColor:[UIColor colorNamed:kRed500Color]]; + [consumer setIconImageTintColor:[UIColor colorNamed:kPrimaryBackgroundColor]]; [consumer setUseIconBackgroundTint:YES]; [consumer setPresentsModal:NO];
diff --git a/ios/chrome/browser/policy/model/BUILD.gn b/ios/chrome/browser/policy/model/BUILD.gn index 113716c..8d0139a6 100644 --- a/ios/chrome/browser/policy/model/BUILD.gn +++ b/ios/chrome/browser/policy/model/BUILD.gn
@@ -78,6 +78,7 @@ "//components/history/core/common", "//components/lens:enterprise_policy", "//components/metrics", + "//components/omnibox/browser", "//components/optimization_guide/core:features", "//components/password_manager/core/common", "//components/policy:generated",
diff --git a/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm b/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm index 26cd3f6..d8538ba 100644 --- a/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm +++ b/ios/chrome/browser/policy/model/configuration_policy_handler_list_factory.mm
@@ -23,6 +23,7 @@ #import "components/history/core/common/pref_names.h" #import "components/lens/lens_overlay_permission_utils.h" #import "components/metrics/metrics_pref_names.h" +#import "components/omnibox/browser/omnibox_prefs.h" #import "components/optimization_guide/core/feature_registry/feature_registration.h" #import "components/password_manager/core/common/password_manager_pref_names.h" #import "components/policy/core/browser/boolean_disabling_policy_handler.h" @@ -168,6 +169,9 @@ { policy::key::kProvisionalNotificationsAllowed, prefs::kProvisionalNotificationsAllowedByPolicy, base::Value::Type::BOOLEAN }, + { policy::key::kAIModeSearchSuggestSettings, + omnibox::kAIModeSearchSuggestSettings, + base::Value::Type::INTEGER }, }; // clang-format on @@ -243,8 +247,11 @@ std::vector<policy::GenAiDefaultSettingsPolicyHandler::GenAiPolicyDetails> gen_ai_default_policies; - // No GenAI policies are currently covered by GenAiDefaultSettings on iOS. - // When eligible policies are added, they will be handled here. + gen_ai_default_policies.emplace_back( + policy::key::kAIModeSearchSuggestSettings, + omnibox::kAIModeSearchSuggestSettings, + policy::GenAiDefaultSettingsPolicyHandler::PolicyValueToPrefMap( + {{0, 0}, {1, 0}, {2, 1}})); handlers->AddHandler( std::make_unique<policy::GenAiDefaultSettingsPolicyHandler>( std::move(gen_ai_default_policies)));
diff --git a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn index 2f771c4..e533356 100644 --- a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn +++ b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
@@ -108,6 +108,7 @@ "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils", "//ios/chrome/browser/authentication/ui_bundled/signin", "//ios/chrome/browser/authentication/ui_bundled/signin:features", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_in_progress", "//ios/chrome/browser/authentication/ui_bundled/signin/promo", "//ios/chrome/browser/authentication/ui_bundled/signout_action_sheet", "//ios/chrome/browser/blocking_overlay/ui_bundled",
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm index e4ebf88..d6659288 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm +++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -67,6 +67,7 @@ #import "ios/chrome/browser/authentication/ui_bundled/signin/promo/signin_fullscreen_promo_scene_agent.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h" #import "ios/chrome/browser/authentication/ui_bundled/signin_notification_infobar_delegate.h" #import "ios/chrome/browser/browser_view/ui_bundled/browser_view_controller.h" @@ -622,6 +623,14 @@ profileInitStage:profileState.initStage]; } +- (void)signinDidEnd:(SceneState*)sceneState { + if (IsSigninForcedByPolicy()) { + // Handle intents after sign-in is done when the forced sign-in policy + // is enabled. + [self handleExternalIntents]; + } +} + - (void)handleExternalIntents { if (![self canHandleIntents]) { return; @@ -965,8 +974,11 @@ // Stops the signin coordinator. // TODO(crbug.com/381444097): always use the animated. - (void)stopSigninCoordinatorAnimated:(BOOL)animated { - [self.signinCoordinator stopAnimated:animated]; + // This ensure that when the SceneController receives the `signinFinished` + // command, it does not detect the SigninCoordinator as still presented. + SigninCoordinator* signinCoordinator = self.signinCoordinator; self.signinCoordinator = nil; + [signinCoordinator stopAnimated:animated]; } // Creates, if needed, and presents saved passwords settings. Assumes all modal @@ -1617,9 +1629,9 @@ } if (IsSigninForcedByPolicy()) { - if (self.signinCoordinator) { - // Return NO because intents cannot be handled when using - // `self.signinCoordinator` for the forced sign-in prompt. + if (self.sceneState.signinInProgress) { + // Return NO because intents cannot be handled when a sign-in is in + // progress. return NO; } if (![self isSignedIn]) { @@ -3882,16 +3894,12 @@ self.signinCoordinator = nil; return; } - self.sceneState.signinInProgress = YES; - __block std::unique_ptr<ScopedUIBlocker> uiBlocker = - std::make_unique<ScopedUIBlocker>(self.sceneState); __weak __typeof(self) weakSelf = self; self.signinCoordinator.signinCompletion = ^(SigninCoordinatorResult result, id<SystemIdentity> identity) { [weakSelf signinCompletedWithResult:result identity:identity - uiBlocker:std::move(uiBlocker) completion:completion]; }; @@ -3901,23 +3909,13 @@ // Completion block for Signin coordinators. - (void)signinCompletedWithResult:(SigninCoordinatorResult)result identity:(id<SystemIdentity>)identity - uiBlocker:(std::unique_ptr<ScopedUIBlocker>)uiBlocker completion: (SigninCoordinatorCompletionCallback)completion { [self stopSigninCoordinatorAnimated:YES]; - uiBlocker.reset(); if (completion) { completion(result, identity); } - - self.sceneState.signinInProgress = NO; - - if (IsSigninForcedByPolicy()) { - // Handle intents after sign-in is done when the forced sign-in policy - // is enabled. - [self handleExternalIntents]; - } } #pragma mark - WebStateListObserving
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_state.h b/ios/chrome/browser/shared/coordinator/scene/scene_state.h index eab23243..d0976587 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_state.h +++ b/ios/chrome/browser/shared/coordinator/scene/scene_state.h
@@ -19,6 +19,7 @@ @class ProfileState; @class SceneController; @class SceneState; +class SigninInProgress; // During profile switching, it is possible that an animation is displayed // over the SceneState until the transition is complete. In that case the @@ -118,7 +119,7 @@ // YES if sign-in is in progress which covers the authentication flow and the // sign-in prompt UI. -@property(nonatomic, assign) BOOL signinInProgress; +@property(nonatomic, readonly) BOOL signinInProgress; // Accessibility identifier of the window. @property(nonatomic, copy, readonly) NSString* windowAccessibilityIdentifier; @@ -160,6 +161,10 @@ - (void)setWindowUserInterfaceStyle: (UIUserInterfaceStyle)windowUserInterfaceStyle; +// Records that an extra sign-in process started. When the returned value is +// destructed, the sign-in ended. +- (std::unique_ptr<SigninInProgress>)createSigninInProgress; + @end #endif // IOS_CHROME_BROWSER_SHARED_COORDINATOR_SCENE_SCENE_STATE_H_
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_state.mm b/ios/chrome/browser/shared/coordinator/scene/scene_state.mm index 5c9237f..9725cd8 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_state.mm +++ b/ios/chrome/browser/shared/coordinator/scene/scene_state.mm
@@ -13,6 +13,7 @@ #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/app/chrome_overlay_window.h" #import "ios/chrome/app/profile/profile_state.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_in_progress.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_controller.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_util.h" @@ -46,7 +47,7 @@ #pragma mark - SceneState -@interface SceneState () +@interface SceneState () <SignInInProgressAudience> @end @@ -68,6 +69,19 @@ // The current value of -activationLevel. SceneActivationLevel _activationLevel; + + // A UIBlocker that blocks other scenes if and only if a sign in is in + // progress. + std::unique_ptr<ScopedUIBlocker> _signinUIBlocker; + + // The number of sign-in in progress. This include both the authentication + // flow and the sign-in prompt UI. + // In normal usage, this number can be greater than one because a signin + // coordinator may open another signin coordinator. It also occurs that two + // signin coordinator are started simultaneously from different screen, for + // example due to simultaneous tap on a IPH signin promo and on the NTP’s + // identity disc. + NSInteger _numberOfSigninInProgress; } - (instancetype)initWithAppState:(AppState*)appState { @@ -124,6 +138,10 @@ self.window.overrideUserInterfaceStyle = windowUserInterfaceStyle; } +- (std::unique_ptr<SigninInProgress>)createSigninInProgress { + return std::make_unique<SigninInProgress>(self); +} + #pragma mark - Setters & Getters. - (UIWindow*)window { @@ -258,15 +276,8 @@ [_observers sceneState:self receivedUserActivity:pendingUserActivity]; } -- (void)setSigninInProgress:(BOOL)signinInProgress { - DCHECK(_signinInProgress != signinInProgress); - - _signinInProgress = signinInProgress; - if (signinInProgress) { - [_observers signinDidStart:self]; - } else { - [_observers signinDidEnd:self]; - } +- (BOOL)signinInProgress { + return _numberOfSigninInProgress > 0; } - (void)setProfileState:(ProfileState*)profileState { @@ -400,4 +411,30 @@ [userDefaults synchronize]; } +#pragma mark - SignInInProgressAudience + +- (void)signInStarted { + if (_numberOfSigninInProgress == 0) { + [_observers signinDidStart:self]; + CHECK(!_signinUIBlocker, base::NotFatalUntil::M146); + _signinUIBlocker = std::make_unique<ScopedUIBlocker>(self); + } else { + CHECK(_signinUIBlocker, base::NotFatalUntil::M146); + } + _numberOfSigninInProgress++; +} + +- (void)signinFinished { + _numberOfSigninInProgress--; + CHECK_GE(_numberOfSigninInProgress, 0, base::NotFatalUntil::M146); + if (_numberOfSigninInProgress < 0) { + _numberOfSigninInProgress = 0; + } + if (_numberOfSigninInProgress > 0) { + return; + } + _signinUIBlocker.reset(); + [_observers signinDidEnd:self]; +} + @end
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm index 4f48008e..0c4ffdbf 100644 --- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm +++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -41,6 +41,7 @@ #import "components/network_time/network_time_tracker.h" #import "components/ntp_tiles/most_visited_sites.h" #import "components/ntp_tiles/popular_sites_impl.h" +#import "components/omnibox/browser/omnibox_prefs.h" #import "components/omnibox/browser/zero_suggest_provider.h" #import "components/optimization_guide/core/model_execution/model_execution_prefs.h" #import "components/optimization_guide/core/optimization_guide_prefs.h" @@ -1029,6 +1030,8 @@ registry->RegisterTimePref(prefs::kIosSyncInfobarErrorLastDismissedTimestamp, base::Time()); + registry->RegisterIntegerPref(omnibox::kAIModeSearchSuggestSettings, 0); + // Deprecated 09/2024 (migrated to localState prefs). registry->RegisterBooleanPref(prefs::kIncognitoInterstitialEnabled, false);
diff --git a/ios/chrome/browser/shared/public/commands/BUILD.gn b/ios/chrome/browser/shared/public/commands/BUILD.gn index 79a4725e..7b520ce 100644 --- a/ios/chrome/browser/shared/public/commands/BUILD.gn +++ b/ios/chrome/browser/shared/public/commands/BUILD.gn
@@ -31,6 +31,7 @@ "find_in_page_commands.h", "generate_qr_code_command.h", "generate_qr_code_command.mm", + "glic_commands.h", "google_one_commands.h", "guided_tour_commands.h", "help_commands.h",
diff --git a/ios/chrome/browser/shared/public/commands/glic_commands.h b/ios/chrome/browser/shared/public/commands/glic_commands.h new file mode 100644 index 0000000..35ff24e4 --- /dev/null +++ b/ios/chrome/browser/shared/public/commands/glic_commands.h
@@ -0,0 +1,16 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_GLIC_COMMANDS_H_ +#define IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_GLIC_COMMANDS_H_ + +// Commands relating to the Glic flow. +@protocol GlicCommands + +// Starts the Glic flow. +- (void)startGlicFlow; + +@end + +#endif // IOS_CHROME_BROWSER_SHARED_PUBLIC_COMMANDS_GLIC_COMMANDS_H_
diff --git a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm index 82bbb5c..64e81fd 100644 --- a/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm +++ b/ios/chrome/credential_provider_extension/credential_provider_view_controller.mm
@@ -71,6 +71,7 @@ kPasswordSyncDisabled, kSignedOut, kUnsupportedAlgorithm, + kExcludedPasskey, }; @interface CredentialProviderViewController () < @@ -396,6 +397,15 @@ case PasskeyCreationEligibility::kUnsupportedAlgorithm: [self exitWithErrorCode:ASExtensionErrorCodeFailed]; return; + case PasskeyCreationEligibility::kExcludedPasskey: + // Note: ASExtensionErrorCodeMatchedExcludedCredential is iOS 18.0+ only, + // but so is the excludedCredentials array, so we can't reach this point + // if the iOS version is below 18.0, which is why there's no need for an + // else statement. + if (@available(iOS 18.0, *)) { + [self exitWithErrorCode:ASExtensionErrorCodeMatchedExcludedCredential]; + } + return; case PasskeyCreationEligibility::kCanCreateWithUserInteraction: if ([self isUsingMultiProfile]) { [self showMultiProfilePasskeyCreationDialogWithDetails: @@ -731,6 +741,11 @@ return PasskeyCreationEligibility::kUnsupportedAlgorithm; } + if ([passkeyRequestDetails + hasExcludedPasskey:self.credentialStore.credentials]) { + return PasskeyCreationEligibility::kExcludedPasskey; + } + if (passkeyRequestDetails.userVerificationRequired || !IsAutomaticPasskeyUpgradeEnabled() || [self isUsingMultiProfile]) { return PasskeyCreationEligibility::kCanCreateWithUserInteraction;
diff --git a/ios/chrome/credential_provider_extension/passkey_request_details.h b/ios/chrome/credential_provider_extension/passkey_request_details.h index a538b22b..835417f 100644 --- a/ios/chrome/credential_provider_extension/passkey_request_details.h +++ b/ios/chrome/credential_provider_extension/passkey_request_details.h
@@ -41,6 +41,10 @@ // domain and username as the passkey request. - (BOOL)hasMatchingPassword:(NSArray<id<Credential>>*)credentials; +// Returns whether a passkey from the excluded passkeys list is both in the +// credentials list and is for the same rpId as the current request. +- (BOOL)hasExcludedPasskey:(NSArray<id<Credential>>*)credentials; + // A preference for whether the authenticator should attempt to verify that it // is being used by its owner. @property(nonatomic, readonly) BOOL userVerificationRequired;
diff --git a/ios/chrome/credential_provider_extension/passkey_request_details.mm b/ios/chrome/credential_provider_extension/passkey_request_details.mm index 2ca57ee1..cbe24b9 100644 --- a/ios/chrome/credential_provider_extension/passkey_request_details.mm +++ b/ios/chrome/credential_provider_extension/passkey_request_details.mm
@@ -28,6 +28,10 @@ // credentials are allowed. @property(strong, nonatomic, readwrite) NSArray<NSData*>* allowedCredentials; +// A list of excluded credentials for this request. An empty list means no +// credentials are excluded. +@property(strong, nonatomic, readwrite) NSArray<NSData*>* excludedCredentials; + // Whether at least one signing algorithm is supported by the relying party. // Unused by assertion requests. @property(nonatomic, readwrite) BOOL algorithmIsSupported; @@ -60,6 +64,7 @@ passkeyCredentialRequestParameters.relyingPartyIdentifier; self.allowedCredentials = passkeyCredentialRequestParameters.allowedCredentials; + self.excludedCredentials = nil; self.algorithmIsSupported = NO; self.userName = nil; self.userHandle = nil; @@ -107,8 +112,18 @@ self.userName = identity.userName; self.userHandle = identity.userHandle; self.allowedCredentials = nil; + self.excludedCredentials = nil; if (@available(iOS 18.0, *)) { + if (passkeyCredentialRequest.excludedCredentials.count) { + NSMutableArray<NSData*>* excludedCredentials = [NSMutableArray array]; + for (ASAuthorizationPlatformPublicKeyCredentialDescriptor* credential in + passkeyCredentialRequest.excludedCredentials) { + [excludedCredentials addObject:credential.credentialID]; + } + self.excludedCredentials = [excludedCredentials copy]; + } + if (IsPasskeyPRFEnabled()) { _prf = [PRFData fromRequest:passkeyCredentialRequest]; } @@ -195,6 +210,21 @@ return credentialIndex != NSNotFound; } +- (BOOL)hasExcludedPasskey:(NSArray<id<Credential>>*)credentials { + if (!self.excludedCredentials.count) { + return NO; + } + + NSUInteger credentialIndex = [credentials indexOfObjectPassingTest:^BOOL( + id<Credential> credential, + NSUInteger idx, BOOL* stop) { + return credential.isPasskey && + [credential.rpId isEqualToString:self.relyingPartyIdentifier] && + [self.excludedCredentials containsObject:credential.credentialId]; + }]; + return credentialIndex != NSNotFound; +} + #pragma mark - PasskeyRequestDetails (Testing) - (instancetype)initWithURL:(NSString*)url username:(NSString*)username {
diff --git a/ios/chrome/test/data/policy/policy_test_bundle_data.filelist b/ios/chrome/test/data/policy/policy_test_bundle_data.filelist index f7d7d302..86bc0ad3 100644 --- a/ios/chrome/test/data/policy/policy_test_bundle_data.filelist +++ b/ios/chrome/test/data/policy/policy_test_bundle_data.filelist
@@ -4,6 +4,7 @@ # NOTE: this file is generated by build/ios/update_bundle_filelist.py # If it requires updating, you should get a presubmit error with # instructions on how to regenerate. Otherwise, do not edit. +//ios/chrome/test/data/policy/pref_mapping/AIModeSearchSuggestSettings.json //ios/chrome/test/data/policy/pref_mapping/AllowChromeDataInBackups.json //ios/chrome/test/data/policy/pref_mapping/AppStoreRatingEnabled.json //ios/chrome/test/data/policy/pref_mapping/AutofillAddressEnabled.json
diff --git a/ios/chrome/test/data/policy/pref_mapping/AIModeSearchSuggestSettings.json b/ios/chrome/test/data/policy/pref_mapping/AIModeSearchSuggestSettings.json new file mode 100644 index 0000000..19977f4c --- /dev/null +++ b/ios/chrome/test/data/policy/pref_mapping/AIModeSearchSuggestSettings.json
@@ -0,0 +1,15 @@ +[ + { + "os": [ + "ios" + ], + "simple_policy_pref_mapping_test": { + "pref_name": "omnibox.ai_mode_search_suggest_settings", + "default_value": 0, + "values_to_test": [ + 0, + 1 + ] + } + } +]
diff --git a/ios/chrome/test/data/policy/pref_mapping/GenAiDefaultSettings.json b/ios/chrome/test/data/policy/pref_mapping/GenAiDefaultSettings.json index eafe53d..b7117ae 100644 --- a/ios/chrome/test/data/policy/pref_mapping/GenAiDefaultSettings.json +++ b/ios/chrome/test/data/policy/pref_mapping/GenAiDefaultSettings.json
@@ -3,6 +3,45 @@ "os": [ "ios" ], - "reason_for_missing_test": "No covered GenAI policies are currently supported on iOS." + "policy_pref_mapping_tests": [ + { + "policies": { + "GenAiDefaultSettings": 0 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + } + } + }, + { + "policies": { + "GenAiDefaultSettings": 1 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 0 + } + } + }, + { + "policies": { + "GenAiDefaultSettings": 2 + }, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "value": 1 + } + } + }, + { + "policies": {}, + "prefs": { + "omnibox.ai_mode_search_suggest_settings": { + "default_value": 0 + } + } + } + ] } ]
diff --git a/ios/chrome/test/variations_smoke_test/variations_smoke_egtest.mm b/ios/chrome/test/variations_smoke_test/variations_smoke_egtest.mm index b9f991f5..e4e44d4 100644 --- a/ios/chrome/test/variations_smoke_test/variations_smoke_egtest.mm +++ b/ios/chrome/test/variations_smoke_test/variations_smoke_egtest.mm
@@ -36,7 +36,7 @@ conditionWithName:@"Waiting for variations seed fetch." block:^BOOL { BOOL variationsSeedExists = [VariationsSmokeTestAppInterface - variationsSeedInLocalStatePrefs]; + isVariationsSeedStored]; BOOL expectedLastFetchTimeCondition = !verifyFetchedInCurrentLaunch || [VariationsSmokeTestAppInterface
diff --git a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.h b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.h index a089628..55ed3ae 100644 --- a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.h +++ b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.h
@@ -10,9 +10,8 @@ // The app interface for variations smoke test. @interface VariationsSmokeTestAppInterface : NSObject -// Non-empty variations seed signature & compressed seed appears in Local State -// prefs. -+ (BOOL)variationsSeedInLocalStatePrefs; +// Non-empty variations seed signature & compressed seed are stored. ++ (BOOL)isVariationsSeedStored; // Returns true when variations seed last fetch time appears in Local State // prefs and the fetch time is after current app process start time.
diff --git a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.mm b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.mm index e250b57..7ff7ec2 100644 --- a/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.mm +++ b/ios/chrome/test/variations_smoke_test/variations_smoke_test_app_interface.mm
@@ -31,7 +31,7 @@ @implementation VariationsSmokeTestAppInterface -+ (BOOL)variationsSeedInLocalStatePrefs { ++ (BOOL)isVariationsSeedStored { variations::SeedReaderWriter* seedReaderWriter = GetApplicationContext() ->GetVariationsService()
diff --git a/ios_internal b/ios_internal index 91cadb7..6d08270 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 91cadb79a847230f66a14711e00f670580629fbc +Subproject commit 6d082702c7c77c8dc97cdf1a572a852b53e569df
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index 8d3550c..aba5c90e 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -807,13 +807,20 @@ return external_resource; } - auto transfer_resource = viz::TransferableResource::MakeGpu( - shared_image->mailbox(), shared_image->GetTextureTarget(), - video_frame->acquire_sync_token(), video_frame->coded_size(), - shared_image->format(), video_frame->metadata().allow_overlay, - viz::TransferableResource::ResourceSource::kVideo); - transfer_resource.origin = shared_image->surface_origin(); - transfer_resource.color_space = video_frame->ColorSpace(); + SkAlphaType alpha_type = + (external_resource.type == VideoFrameResourceType::RGBA_PREMULTIPLIED) + ? kPremul_SkAlphaType + : kUnpremul_SkAlphaType; + + viz::TransferableResource::MetadataOverride overrides = { + .size = video_frame->coded_size(), + .is_overlay_candidate = video_frame->metadata().allow_overlay, + .color_space = video_frame->ColorSpace(), + .alpha_type = alpha_type, + }; + auto transfer_resource = viz::TransferableResource::Make( + shared_image, viz::TransferableResource::ResourceSource::kVideo, + video_frame->acquire_sync_token(), overrides); transfer_resource.hdr_metadata = video_frame->hdr_metadata().value_or(gfx::HDRMetadata()); transfer_resource.needs_detiling = video_frame->metadata().needs_detiling; @@ -822,10 +829,6 @@ viz::TransferableResource::SynchronizationType::kGpuCommandsCompleted; } transfer_resource.ycbcr_info = video_frame->ycbcr_info(); - transfer_resource.alpha_type = - (external_resource.type == VideoFrameResourceType::RGBA_PREMULTIPLIED) - ? kPremul_SkAlphaType - : kUnpremul_SkAlphaType; #if BUILDFLAG(IS_ANDROID) transfer_resource.is_backed_by_surface_view =
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index f8c7777..5279a08 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -1231,7 +1231,6 @@ { "name": "sslmate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "steventress.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "temehu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "tobias-kluge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vortexhobbies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "willnorris.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "aiticon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -1263,7 +1262,6 @@ { "name": "mqas.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "debtkit.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "decibelios.li", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "diamante.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "domaris.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "enorekcah.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fedorapeople.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -1580,7 +1578,6 @@ { "name": "gavick.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "herocentral.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hicoria.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "id-conf.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ikkatsu-satei.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "jira.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "kirei.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3112,7 +3109,6 @@ { "name": "plirt.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qgustavor.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rentinsingapore.com.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "rideworks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "riesenweber.id.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "robi-net.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "rootservice.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3411,7 +3407,6 @@ { "name": "clickandgo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "colognegaming.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "compucorner.mx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "concentrade.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "crepererum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryptoparty.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "devdoodle.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3728,7 +3723,6 @@ { "name": "crow.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryptopartyutah.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cryptoseb.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ctoforhire.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "daemon.xin", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "daniel-steuer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "dario.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -3944,7 +3938,6 @@ { "name": "vincentcox.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "walkeryoung.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wartorngalaxy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "wealthprojector.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "wealthprojector.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "weathermyway.rocks", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "web4all.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4013,7 +4006,6 @@ { "name": "felisslovakia.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ff-bad-hoehenstadt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fhcdn.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "filoo.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "flat.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "florian-schlachter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fortress.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4308,7 +4300,6 @@ { "name": "meizufans.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "michaelcullen.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "michaelleibundgut.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "michal-kral.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "microme.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "mizd.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "monnyonle.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -4464,7 +4455,6 @@ { "name": "youyoulemon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yuyu.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "yvesx.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "zhanghao.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "zorz.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "0au.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "692b8c32.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6035,7 +6025,6 @@ { "name": "protonmail.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "protonmail.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "psxtr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "pucssa.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "pygarage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qtpower.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "qualityology.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6095,7 +6084,6 @@ { "name": "smartofficesandsmarthomes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "smet.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "smirkingwhorefromhighgarden.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "smoothics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "socialgrowing.cl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "socialhams.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "soldecom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6272,7 +6260,6 @@ { "name": "guevener.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "haku.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hashru.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "healthfoam.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "herrsmith.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "highvelocitydesign.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hikariempire.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -6519,7 +6506,6 @@ { "name": "bip.gov.sa", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bismarck.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bitshaker.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bittersweetcandybowl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blinkenlight.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bluechilli.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bookmein.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7387,7 +7373,6 @@ { "name": "twd2.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tysye.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "umisonoda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "uptimed.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "urbanesecurity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "urspringer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "usleep.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7628,7 +7613,6 @@ { "name": "vgerak.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vereinscheck.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vgropp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "veronique-schmitz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tokyo-powerstation.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "vitalismaatjes.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "volker-gropp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -7918,7 +7902,6 @@ { "name": "bluefuzz.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "brashear.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "brave.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "brinkhu.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "brokenhands.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "btcarmory.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bucket.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8103,7 +8086,6 @@ { "name": "laextra.mx", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lattyware.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lattyware.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "lavita.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lawrencemurgatroyd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lebanesearmy.gov.lb", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "leertipp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8397,7 +8379,6 @@ { "name": "bewerbungsfibel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bemsoft.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beyondalderaan.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "bilke.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "biboumail.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beijinglug.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "blichmann.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8525,7 +8506,6 @@ { "name": "fixforce.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ff-obersunzing-niedersunzing.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gearset.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "futureyouhealth.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fehngarten.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "getmdl.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fleisch.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8610,7 +8590,6 @@ { "name": "leseditionsbraquage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "livi.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "listahu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "komischkeszeug.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "klebetape.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "lirion.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "leanplando.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8685,7 +8664,6 @@ { "name": "nerdpol.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ni-mate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nhome.ba", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "nerds-gegen-stephan.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "oddnumber.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nickstories.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "notnize.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8781,7 +8759,6 @@ { "name": "seitenwaelzer.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "semox.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "skyline.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "russia.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sking.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sexy-store.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "senzaparole.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8796,7 +8773,6 @@ { "name": "sitc.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "startpage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sm.ms", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "smart-mirror.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stammtisch.domains", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "storyland.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sobieray.dyndns.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -8981,7 +8957,6 @@ { "name": "davidpearce.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cybersins.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "defuse.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "dalek.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "datenschutz-individuell.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "develux.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "defiler.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9822,7 +9797,6 @@ { "name": "sikevux.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sh-heppelmann.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "seogeek.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "sitecuatui.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sozon.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "sostacancun.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "southernmost.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -9852,7 +9826,6 @@ { "name": "texby.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stephan-matthiesen.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "thedronechart.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "stellmacher.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "swiftqueue.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tequilazor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "swisslinux.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10037,10 +10010,8 @@ { "name": "capitolpathways.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bonnsustainabilityportal.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bizedge.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "brecht.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "buricloud.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cadooz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "capitalp.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "cbdev.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "caroli.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "britishbookmakers.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10185,12 +10156,10 @@ { "name": "forestraven.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "geekpad.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fwest.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "funatic.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "funken-networks.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "geiser-family.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gittr.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "glazedmag.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "fundort.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "girvas.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "glueckskindter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "gensonline.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10561,7 +10530,6 @@ { "name": "stopthethyroidmadness.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "stkeverneparishcouncil.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "teaser-trailer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "susanna-komischke.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tangel.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tecnimotos.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tecnoarea.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10600,7 +10568,6 @@ { "name": "ueberwachungspaket.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "turkish.dating", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "urlscan.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "ukozliku.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "urban-culture.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "utw.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "tkonstantopoulos.tk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -10721,7 +10688,6 @@ { "name": "earlyyearshub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ensage.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "escael.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "eurocomcompany.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ezgif.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "faldoria.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "fantasyspectrum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12174,7 +12140,6 @@ { "name": "bc-diffusion.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bfam.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "beulen.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "andreamcnett.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bearded.sexy", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bedandbreakfast.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "bedandbreakfasteuropa.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -12475,7 +12440,6 @@ { "name": "hatarisecurity.co.ke", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "houraiteahouse.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "happyagain.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hygo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ibin.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "huahinpropertylisting.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "humpen.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -13415,7 +13379,6 @@ { "name": "numwave.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "neurocny.cloud", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "ojdip.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "orleika.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "owl.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "nephelion.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "papadopoulos.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -14389,7 +14352,6 @@ { "name": "uuit.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "v-d-p.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "v2bv.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "valika.ee", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "venturum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "venturum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "venturum.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -15367,7 +15329,6 @@ { "name": "wootware.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "5chat.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aaltocapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aioboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ait.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alice.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alpinestarmassage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -16361,7 +16322,6 @@ { "name": "tokky.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomaspatera.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toothdoc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "topicdesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torngalaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torte.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touchweb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -16553,7 +16513,6 @@ { "name": "meh.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meklon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "membershipservices.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mercury.photo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "miegl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "milania.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mitchelmore.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -16704,7 +16663,6 @@ { "name": "acsbbs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affissioni.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aireaseleaks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "akj.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexanderneng.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andycraftz.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anleitung-deutsch-lernen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17244,7 +17202,6 @@ { "name": "516422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "519422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "524022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "524922.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "534622.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "541722.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "592422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17283,7 +17240,6 @@ { "name": "645322.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "646322.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "649822.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "651422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "652422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "659422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "673422.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17359,7 +17315,6 @@ { "name": "falegname-roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fassaden-selleng.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fastcash.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "filtr.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fishgen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "francetraceur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freesoftlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17408,7 +17363,6 @@ { "name": "stuartmorris.tel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taddiestales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tcspartner.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "teesypeesy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebannerstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tir-mauperthuis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torontostarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17602,7 +17556,6 @@ { "name": "thecompany.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewagesroom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thor.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "threema.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "time.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transporta.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "traslochi-trasporti-facchinaggio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17639,7 +17592,6 @@ { "name": "alp.od.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "altes-sportamt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "altoa.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "anime-rg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antani.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antennisti.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atherosense.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -17792,7 +17744,6 @@ { "name": "rollatorweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "romanmichel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "root-space.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rudewiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rummage4property.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "salrosadohimalaia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scaffalature.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18087,7 +18038,6 @@ { "name": "envoyez.moi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "escuelabiblica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eutotal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "evoco.vc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fackovcova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fackovcova.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fackovcova.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18227,7 +18177,6 @@ { "name": "symlnk.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "talking12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tekniskakustik.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "terabyteit.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teusink.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebakery2go.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tildes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18446,7 +18395,6 @@ { "name": "reticon.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "retmig.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rolleyes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rotkreuzshop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "run-it-direct.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rvender.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sadbox.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18626,7 +18574,6 @@ { "name": "fosaudit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frprn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "g8energysolutions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gepps.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ghini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "giardiniere.bologna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "giardiniere.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18904,7 +18851,6 @@ { "name": "dyscalculia-blog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricagoura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricagourahills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "electricalmoorpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricalnewburypark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricaloakpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricalsimivalley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -18918,7 +18864,6 @@ { "name": "electricianagoura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricianagourahills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electriciancalabasas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "electriciancamarillo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricianconejovalley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electriciandosvientos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electricianhiddenhills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -19269,7 +19214,6 @@ { "name": "nginxconfig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nickplotnek.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ninth.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nshipster.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nshipster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "numerologist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openstreetmap.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -19585,7 +19529,6 @@ { "name": "whatisthe.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "whittome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "withextraveg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wohlpa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wrn.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xants.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn--5dbkjqb0d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -19638,7 +19581,6 @@ { "name": "jordhy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "josephbleroy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "k7azx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kissmycreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kzar.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lai.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lovelychalets-peisey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -20609,7 +20551,6 @@ { "name": "dulcinela.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "duncm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eelcapone.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eirb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eldevo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elizabethrominski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enalean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -20681,7 +20622,6 @@ { "name": "marjeta-gurtner.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "markandrosalind.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martin-loewer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mediabackoffice.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mediarithmics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mhadot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -21109,7 +21049,6 @@ { "name": "torontoaccesscontrol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truyenfull.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tuev-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ubcani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubuntu18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varyrentacar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verwandlung.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -21200,7 +21139,6 @@ { "name": "fs-g.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "g-ds.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaengler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gameanalytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "happybirthdaywisher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiparish.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "holycrossphl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -21553,7 +21491,6 @@ { "name": "divinemercyparishvlds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmparish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "domakidis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "domenicam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dras.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drawtwo.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drcarolynquist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -22313,7 +22250,6 @@ { "name": "3dgep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afterdwi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amazingraymond.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "antroposboutique.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "australianairbrushedtattoos.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "australiantemporarytattoos.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avaeon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -22448,8 +22384,6 @@ { "name": "adativos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "administrator.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adnolesh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "adresults.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "adresults.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alphanodes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alternative.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alternativetomeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -22641,7 +22575,6 @@ { "name": "pellet.pordenone.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "perfmatters.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pets4life.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "philipkobelt.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "php.watch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phyley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pinot.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23260,7 +23193,6 @@ { "name": "wasabiwallet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webia.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webmediaprint.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wojak.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zundapp.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "24.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7plus.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23390,7 +23322,6 @@ { "name": "windictus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xssi.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zumub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "081115.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "0x41.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1android.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4hmediaproductions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23659,11 +23590,6 @@ { "name": "intercom.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100k.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "502312.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "621162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "676812.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "721172.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "797715.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "877791.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "accreditamento.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alabordage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alfredapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23695,7 +23621,6 @@ { "name": "eenvren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eenvxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ehcommerce.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "empregosrj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enbulleiugnen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "energygenie.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "engrish.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23853,7 +23778,6 @@ { "name": "iszy.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "it-inside.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kapsalonlinds.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kidsdinefree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kiot.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kita-sun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klempin.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -23934,7 +23858,6 @@ { "name": "usamdt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uvx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "veply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "villagecardshop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ville-aime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wangqr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wardslager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -24428,7 +24351,6 @@ { "name": "ashleykaryl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autonoleggio.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "awsumchan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beansgalore.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bellezzasenzalimiti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestfotostudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billograminternal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -24581,8 +24503,6 @@ { "name": "autocartruck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "az.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aznaetelivy.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "batteryboys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "batteryboys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beboldpr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "berlin-cuisine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betor.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -24620,7 +24540,6 @@ { "name": "cakeoffencesact.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catlovingcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ce-webdesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chicback.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chirurgoplastico.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cinenote.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "civics.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -24698,7 +24617,6 @@ { "name": "infrabind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infrabond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infraplot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "insomniasec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intrepy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isaaccomputerscience.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isovideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -25738,7 +25656,6 @@ { "name": "optiker-gilde.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "partyausstatter24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pawgearlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "paymongo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pensionecani.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "perfect-privacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phpmynewsletter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -26033,7 +25950,6 @@ { "name": "everglow.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fernland.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fundkyapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gaganenterprises.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guzdek.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hannes.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hellosalmon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -28167,7 +28083,6 @@ { "name": "bridgedigest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brigittefontaine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bssolvfagen-pre-storeswa-wap.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "btc-alpha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btc-doge.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "businesspartner.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "busphotos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29250,7 +29165,6 @@ { "name": "estahl.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evntage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "extinctionrebellion.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "flokkr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "focanocliente.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freewerkt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gerinet.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29259,7 +29173,6 @@ { "name": "gregmarziomedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gse.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gt-himmel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "impresadipulizieantonella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "indexcesmad.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iplist.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ivocopro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29294,7 +29207,6 @@ { "name": "revisores.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "risounokareshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanierungskonzept.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "searx.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartpheromones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "songdew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srilankan-hope-for-children.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29357,7 +29269,6 @@ { "name": "eznetworks.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gooty.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hackerone.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haderecker.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homeandliving.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homs.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "houstonlockout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29603,7 +29514,6 @@ { "name": "hosoi-tax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idesoft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idesoft.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "idkidknow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipsum.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "irioka.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itzer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -29916,7 +29826,6 @@ { "name": "aanwp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alpharoofga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amdm.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "andersonpowerservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "antizon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anyi.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anyilin.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -30190,7 +30099,6 @@ { "name": "biblionix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biol.moscow", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brunchandmatch.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bs-herting.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buffup.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buyessayscheap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cacrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -30999,7 +30907,6 @@ { "name": "post.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "probazen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pylon.bot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qp666d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quiqd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quiqurls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radiodeutsch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -31563,11 +31470,9 @@ { "name": "choservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "citylift.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cityradiusmaps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "claudia-makeup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clearbooks.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clearlinux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cleveroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "combineconquer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "compdermcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comunal.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "confusion-band.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -32219,8 +32124,6 @@ { "name": "pilatespt.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pistonpowered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pixiin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pmccrystal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pmcorganometallix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pmcouvrie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pmcvinyladditives.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "printmet.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33416,7 +33319,6 @@ { "name": "afc-capital.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aflattr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agencybeam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agripartner.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alfiebarker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allgemeinarzt-wenta-bralla.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alluremedicalaesthetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33859,7 +33761,6 @@ { "name": "show-pro.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showmeengland.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shrsl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sigparser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "silentinstaller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "silvergoldbull.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simi-reizen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33991,7 +33892,6 @@ { "name": "antopie.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "araqnid.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arest.web.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "arganwinkel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "associazionerimborsi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atkinshealthcenter.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atmox.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34248,7 +34148,6 @@ { "name": "prodottitipicidellatoscana.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "progtime.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "q1z.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qualityfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "queensbotanical.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quest3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qvq.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -34414,7 +34313,6 @@ { "name": "cheapmarina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chsamuel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codefaq.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "confirmit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "countrymountaininn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coworkanywhere.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "criptofy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44312,7 +44210,6 @@ { "name": "studujdigital.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "summer.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "supercours.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "systemd.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taildb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "telesonicengineering.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "terraco.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44553,7 +44450,6 @@ { "name": "aoicollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arcosdequejana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asperatechnology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "asperatechnology.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asperatechnology.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bekabazar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "berksestateplanning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44844,7 +44740,6 @@ { "name": "financethrive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "financetwenty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "financewhile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "finax.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flp-pushkar.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fontnegar.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forfortcollins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44943,7 +44838,6 @@ { "name": "steiner.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sticky.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strangeelectricdreams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stratussc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swap.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sysadvisors.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "telosglobal.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -44962,7 +44856,6 @@ { "name": "voxengo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "waf.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "warszawa-pranie-dywanow.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wheyteck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wineforhelp.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "woodfarm2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xtremotivation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -45422,7 +45315,6 @@ { "name": "bss.net.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bss.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buurtkeukens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "buyer.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buzzkuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bv-driver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "byll.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46152,7 +46044,6 @@ { "name": "ndaal.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "notrero13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "npc-ts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oofishing.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "opcod3.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ortanatech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pamiers-citoyenne.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46220,7 +46111,6 @@ { "name": "tfsound.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecolourcloset.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thefarleys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tisec.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "triedandtruebytrista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trussgenius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tryin.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46318,7 +46208,6 @@ { "name": "currentcryptocurrency.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "currentcryptocurrencynews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dangeredwolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "danielaeichberger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deemasfashion.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deemasfashion.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deemasfashion.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46787,12 +46676,10 @@ { "name": "bitcoinprice.international", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoinprice.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoinprice.pizza", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bitcoinprice.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoinprice.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bitcoinslots.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blackforlife.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boringnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bracebridgechiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bredabeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bubu1.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "camerashot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -46900,7 +46787,6 @@ { "name": "milkaholic.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mobilhaber.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "modanese.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mof.gov.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "molenaar-ricardo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moneyformybeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moremindsbetter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47079,7 +46965,6 @@ { "name": "crimean-wines.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crochetkim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d-tousei.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dalliard.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dangerscience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davmimer-mercerie.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "decorpol-renovation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47148,7 +47033,6 @@ { "name": "hkl-gruppe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoistsdirect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hrlive.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "infomate360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infradot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infrapixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infrarate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -47424,7 +47308,6 @@ { "name": "hostingtg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "howtodesignwebsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "igranit.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ihorvorotnov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilasoft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imperialfenceinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "integration-mouvements-oculaires.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -48810,7 +48693,6 @@ { "name": "marc.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketingmind.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketplace.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "matejkosiarcik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "materi.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "medaboutme.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mediabola.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49025,7 +48907,6 @@ { "name": "z.cash", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zagorod.spb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zeliard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zimperium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zotan.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zubby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aboutyou.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49462,7 +49343,6 @@ { "name": "etoile-rc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "excelbroadcast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fattoriabio.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fitchdesigncompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "francoislaude.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frenchbluecottage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frosty.style", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -49818,7 +49698,6 @@ { "name": "crypt-app.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daoudi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "data-reader.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dcnews.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deenergiecentrale.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deenergiecentrale.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "degentseflikkenzoekenu.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50022,7 +49901,6 @@ { "name": "anasaci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anja-vastgoed.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anneeden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "apartamentscalpatoi.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apex-parts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apfnxg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arabi-online.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50577,7 +50455,6 @@ { "name": "pamperssamples.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paramo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parelweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "parentsguidetotheworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parenttheirpassion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peace-is-possible.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peppyflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50618,7 +50495,6 @@ { "name": "salo.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schweiz-sextreffen.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scorpioncomputers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "scoutbee.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scpsecretlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scpsecretlaboratory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scriptolab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51230,7 +51106,6 @@ { "name": "u2b.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ukrainskie-konstrukcii.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "upwardcreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "urbanbageecha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uscveteranspark.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valerieorsoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vault.spdns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51305,7 +51180,6 @@ { "name": "churchplaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "citycardgand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clearcreekcountydronepilot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cloudfree.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codecrew.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "colorpalette.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comfy.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51487,7 +51361,6 @@ { "name": "profil-doors.spb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projektentwicklung-westfalen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "propertiesmiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ps.energy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puredisinfection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quarrymill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "questforgaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51719,7 +51592,6 @@ { "name": "dc-texas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dehaanadvocatenkantoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "detulado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "deutsches-schutzportal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deve.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devflop.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devicesgadget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -51763,7 +51635,6 @@ { "name": "fietsambassade.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flemingmccullagh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flownonfiction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "foodsreborn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "foodylab.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forexox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fotklinikenvarnamo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53024,7 +52895,6 @@ { "name": "deswaffelaars.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devilbyte.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devilrecords.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "devopsbookmarks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dewerveling.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dextra.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dg-pic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -53330,7 +53200,6 @@ { "name": "everycorneroftheworld.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "everystudent.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evilduck.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "evopack.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eworldmedia.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exitoseguro.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exitreality.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -54078,7 +53947,6 @@ { "name": "lilypadwikisecret.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lindependant.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linknaarlinux.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "linksbridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linkview.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linux-share.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lipetsk-centralniy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55063,7 +54931,6 @@ { "name": "tantrabali.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tapcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "targetlonglife.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tavelbutiken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxi-doudoune.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tbi.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teahawaii.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -55598,7 +55465,6 @@ { "name": "apkfuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apknut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apktechy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "apostascomvalor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appetiser.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appetitesanonymous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appsbud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -56394,7 +56260,6 @@ { "name": "thevoga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thinkprocedural.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiffanyblooms.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "timeswiki.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topmotoric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toptravelgram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tournaments.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -57889,7 +57754,6 @@ { "name": "tmberg.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tmberg.se.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "togglename.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tongjistudents.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topmuzika.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toriko-official.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tornadoarchiv.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -58070,7 +57934,6 @@ { "name": "cugetliber.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cuongthach.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cvbp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cyberex.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybertrinity.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cynetco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyrilstoll.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -59521,7 +59384,6 @@ { "name": "esdarat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "esignandpay.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "espaiblancandorra.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "essentry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essnet.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurobeaute.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "euroflorist.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60555,7 +60417,6 @@ { "name": "shanikaonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shatabdichildrenschool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sheltongrp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shinyhappydoggy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoujochronicle.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showslot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shpori.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -60981,7 +60842,6 @@ { "name": "zuru.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "09kanagawa.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1986ventures.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "1b1.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2insights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "40010monogatari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "44ada.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62179,7 +62039,6 @@ { "name": "elmejorcortapelos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emls.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emmadreams.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "enbarra.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "entrepreneurnight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epiclawnpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essex.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62249,7 +62108,6 @@ { "name": "geosno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getahearing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gmc-mca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gogo.mn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goldensunmfg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "golfkulur.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "golyatsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62476,7 +62334,6 @@ { "name": "motiondreamatix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "msoc.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mtehe-square.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "multivpn.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mungdog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mur-parfait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mwpromotion.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62608,7 +62465,6 @@ { "name": "thoreauskalendar.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ticketunity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiendamaspatchwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "timeslive.co.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timeticket.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timeticket.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toldosecoberturasbh.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -62968,7 +62824,6 @@ { "name": "blockmomsest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blogspasest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bloodmissionsest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bluerange.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluetoothlasersers.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boardusersers.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bodrumescmagazin.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64004,7 +63859,6 @@ { "name": "lisanotes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liverpoolmoneyman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "living-legends.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "loli.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "londonjob.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "londonmoneyman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lordshaokahn.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64099,7 +63953,6 @@ { "name": "muscles.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "musiq-supreme.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "muslitocomics.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mway.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myanimo.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myelebest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myenglish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64589,7 +64442,6 @@ { "name": "virtual-assistant.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visit.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "web-industry.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "webfocus.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webinke.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weddinggram.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "whitlockconstruction.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64800,7 +64652,6 @@ { "name": "each.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eben18.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eboxtenders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ecc.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "editions-campanile.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "egbertsen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "egoclan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -64829,7 +64680,6 @@ { "name": "eurodanceperu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "europeananomalouswave.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evalinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "exemplarypainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eyecon.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fast4ever.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fastmeet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -65564,7 +65414,6 @@ { "name": "julien.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jurexcup.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kamatoycleaner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kazoohr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keio-formula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kenrick95.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kernel-error.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66029,7 +65878,6 @@ { "name": "ladyblackdiamoond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "learningsolution.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lepka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lgv-france.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "liberale-demokraten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lilawadee.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "limelightnashville.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66085,7 +65933,6 @@ { "name": "mycats.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "n4zm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nacionaltelha.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "narafood.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "narek.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nataliapearl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neoaviation.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66303,7 +66150,6 @@ { "name": "webzschema.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wecreate.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "welove.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wenchengchou.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "winnercivi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wipeoutracing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "workathomeideas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -66805,7 +66651,6 @@ { "name": "mypowerserg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "na.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nationalacademic.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "naturparadies-rheinauen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nemtilmeld.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nephrogo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nettiruletti.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71293,7 +71138,6 @@ { "name": "bibliotheka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bienenfreunde.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigart.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bighappy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigtown.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bilar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "binaries.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71468,7 +71312,6 @@ { "name": "huapood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "huisdierinfopunt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "husky-in-nood.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "i2education.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ikorekofi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "il2eu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -71679,7 +71522,6 @@ { "name": "publiweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puddingtheatre.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puroyorganico.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "puroyorganico.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pycckue.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qiaowai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qumin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -73735,7 +73577,6 @@ { "name": "superfavorite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "supersolenoid.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "surma.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "swedbank.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taberna.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taktika.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "talki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -74640,7 +74481,6 @@ { "name": "jkessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jonslife.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jouwzorgjob.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kancelyaria.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kiapartsnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kintanalodge.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kristyvonkashyyyk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75261,7 +75101,6 @@ { "name": "cazoo-dev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cazoo-test.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cazoo-test.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cazoo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cazoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "certivac.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ch-poitiers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75877,7 +75716,6 @@ { "name": "c19bromhexine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c19curcumin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c19early.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "c19favipiravir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c19fluvoxamine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c19hcq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "c19ivermectin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -75974,7 +75812,6 @@ { "name": "locationsiledyeu.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loson.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loyloy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "luxushair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maid.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "manderstam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marocfoot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -76571,7 +76408,6 @@ { "name": "blairtalbotmotors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blissfulsmile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bordercrossingux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bosquedepalabras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boumstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bracesbyberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bratt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -77749,7 +77585,6 @@ { "name": "emotality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "empadaoportugal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emtex.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "erinandken.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "erogen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essecharlie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "esthergoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78059,7 +77894,6 @@ { "name": "terraso.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tests.school", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thefantasyrooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thegasshop.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thehonoursystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thinkhealing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tieulinh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78181,7 +78015,6 @@ { "name": "d3scene.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dalat.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dc-zone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "debrunet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defelo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dermaprocollagen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "devtechgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78293,7 +78126,6 @@ { "name": "reachdigital.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "revealcellcamtracker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rmt-construction.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rumah123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sait.health", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "schittscreek.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "segdo.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78435,7 +78267,6 @@ { "name": "dodiedods.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dreamcatchers-events.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dymond.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dziseldra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eagleplanners.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eastmedo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "egdsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78481,8 +78312,6 @@ { "name": "handsonscience.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hdfreeizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hdfreex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hdmixfilim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hdsinemax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hdxxxpics.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiringopps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoast.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78662,7 +78491,6 @@ { "name": "valdor2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vcross.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verificationlink.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vianetplc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vinocapka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vipmercedes.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voice-pic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -78836,7 +78664,6 @@ { "name": "alienclicker.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alignedtoachieve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alimanaka-rabesata.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aliud.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alkel.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "all-bikes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -79311,7 +79138,6 @@ { "name": "castlevaniaspain.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catchup-enschede.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cattellar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cattiau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catto.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cauquenes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbnegocial.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80136,7 +79962,6 @@ { "name": "gill-cote-bistro.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gill-temptation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "giorgiosite.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "giuseppebuccheri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gkq.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glamorously-built.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glaserceramics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80472,7 +80297,6 @@ { "name": "infomeddnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "informasidumay.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infoternet.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ingenieriaclinica.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ingridvanderveen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inkblot.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inlineskates.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -80721,7 +80545,6 @@ { "name": "ktty.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kumo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kuncrypto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kundesjekk.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kunst-na-arbeid.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kurdishcommunityofottawa.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kurs-fotowoltaika.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -81551,7 +81374,6 @@ { "name": "robinb0s.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robinbos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robinsremembered.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "robintimmers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robkish.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robloxenthusiasts.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "robocorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82074,7 +81896,6 @@ { "name": "thevegcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewarehousefellowship.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thewhizkids.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thisisarecording.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thisisreno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thoenesfamilierecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thok.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82153,7 +81974,6 @@ { "name": "topgevelbekleding.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topnews.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topsexik.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tor.taxi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torocatala.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torsdammen.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82495,7 +82315,6 @@ { "name": "xpetit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xrdd.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xsait.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xxx-fiction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xylos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yaraab.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yardtower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82526,7 +82345,6 @@ { "name": "zagerijstraat51.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zakarpattya.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zankevich.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zanreal.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaparoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zarabotai-doma.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zarezerwuj-nocleg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82559,7 +82377,6 @@ { "name": "1001n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100beauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100fast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "100pay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "100reach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "10198.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "10628.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -82596,7 +82413,6 @@ { "name": "20plus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21ce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21domain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "21eb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21er.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21expo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "21football.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83071,7 +82887,6 @@ { "name": "convertr.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coolspeak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coomer.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cornwallda.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corridorsands.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corsohaccp.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "costi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83175,7 +82990,6 @@ { "name": "dissolution-sci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "distant.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dizkartes.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "djdavid98.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "djfrenchy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dlaces.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmautomek.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83202,7 +83016,6 @@ { "name": "drillster.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drillster.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drillster.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "drillster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drillster.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drillster.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drillster.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83355,7 +83168,6 @@ { "name": "firatcakir.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firmant.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "firstchurchmn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "firstqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fisa.net.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fishfive.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fishman.idv.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -83971,7 +83783,6 @@ { "name": "mondo.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "monkey-donkey.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mooana.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "morphed.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moserhof.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "motion-a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "motte.tattoo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84012,7 +83823,6 @@ { "name": "nataliaanderson.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nateoster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nav.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nbhwj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ncat.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nctu.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neatful.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84452,7 +84262,6 @@ { "name": "projet-pastel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "properties.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proressources.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prosvita.dp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "proweb-design.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prozoneplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psacertified.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84878,7 +84687,6 @@ { "name": "topvpn.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tortillas.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toscanaecommerce.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tot.money", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toto-realestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toulouselautrec.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touroogle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84918,7 +84726,6 @@ { "name": "uxlinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uzkalip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uzzamari.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "va-11-hall-a.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vacanze-in-montagna-dolomiti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vacanze-merano.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vaderochvind.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85158,7 +84965,6 @@ { "name": "activenl.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "activities.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "admini.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "advapacs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aegeanmep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aegee-academy.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aegee-academy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85435,7 +85241,6 @@ { "name": "gn00.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goddess.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gomovein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gorodshinspb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gpiimimika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grandlineshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greatlakesintegrativemed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85850,7 +85655,6 @@ { "name": "sloepverhuur-roggebroek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sluderno.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartagilesolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "smyrilline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snacktakos.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snz.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "socfactor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85881,7 +85685,6 @@ { "name": "svatba.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "svenskdam.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swagmoney.enterprises", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "swanvinylworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sylwiaipiotr.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "systemysportowe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taetomeister.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -85926,7 +85729,6 @@ { "name": "tommypalarsson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tommypalarsson.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tomofsweden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tooltot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toothimplantsydney.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tpedu.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradeview.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86020,7 +85822,6 @@ { "name": "zwedenautohuur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zwitserlandautohuur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zzls.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "123verhuislift.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "133335.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1naturalway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2xgraphik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86089,7 +85890,6 @@ { "name": "camella.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carbonswap.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caribbean-tekton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cbpridecenter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cgo-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chartpixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chesapeakecluttercontrol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86225,7 +86025,6 @@ { "name": "labordude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lamminhquang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lasvegasdiscountattractions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lemoniax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "level4.parts", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "logopedietaalrijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lolo17.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86267,8 +86066,6 @@ { "name": "onilacare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "online-wholesalers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "opdera.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "operationlifeline.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "operationlifeline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "optgo.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orchideemilano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "osallistuvavantaa.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86383,7 +86180,6 @@ { "name": "wyngatepta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xtom.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xtom.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yashu.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yogasuitsyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yourforcesupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zaneslaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -86854,7 +86650,6 @@ { "name": "footlettuce.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forge.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fortune-healing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "frontiersinflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fujimurado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fullintel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fundingpartner.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -87017,7 +86812,6 @@ { "name": "neshtata.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netobur.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "newage.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nextcloudcn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nft-dev-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nft-qa-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nft-uat-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88003,7 +87797,6 @@ { "name": "r-ay.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radbee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radianceswimwear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "radiometeor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "railfans.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rampeboreal.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ratemyfishtank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88256,7 +88049,6 @@ { "name": "yumtaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "z.mom", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zandmhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zanreal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zbrsk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zelandnamiru.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ziz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88347,7 +88139,6 @@ { "name": "champslearning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "checkmarx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chendhurcollections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cignium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "citymeats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clague.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cleanhortihigienizados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88460,7 +88251,6 @@ { "name": "fivegraces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flex-one.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flowerscaffe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fluidattacks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "focusbetaffiliates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "follygardens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "foreverpontiac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -88611,7 +88401,6 @@ { "name": "metu.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mianra.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "milliongrounds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "millionlearn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mmsteelny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mobox.health", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moniquevanhoutum.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89289,7 +89078,6 @@ { "name": "elderdevelopmentgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elliottwoodworking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emailing.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "emilsleker.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ericdobson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "essaandmore.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ezec.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89313,7 +89101,6 @@ { "name": "furry.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "futurygames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fwo.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gabtitui.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gatewayp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "genesiscoding.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geranium.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89717,7 +89504,6 @@ { "name": "distribuidorguarani.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "divorcemortgage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "divviup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dksh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "docguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "donquix.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dot.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89804,7 +89590,6 @@ { "name": "gmkdetailing.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "godsunchained.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goldoniclothing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gonitro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodcas.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodcas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gotravel.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89880,7 +89665,6 @@ { "name": "kadenhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kadifeli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kahoot.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kaikrups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kdo-vola.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keysix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "khronos.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90100,7 +89884,6 @@ { "name": "shinycleankitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showsnob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "siberianhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sidefx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "signrequest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sikkasoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "simplymeatsmoking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90162,7 +89945,6 @@ { "name": "theretailbulletin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theskiweek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thetechnicaldost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "theyachtweek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tjgrant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toilet-guru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totalexpert.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90329,8 +90111,6 @@ { "name": "castelflowers.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccslt.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "centralesnucleaires.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "century21.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "century21.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cesonia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chaldal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chamath.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90353,7 +90133,6 @@ { "name": "comtois.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "concor.ne.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "contrastsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "coresignal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "corsac.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "country-candles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coursesweb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90689,7 +90468,6 @@ { "name": "agiftinside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agilecoldstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrarkredit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ahbvlp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahoj.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aircgroup.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "airfaretousa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90766,7 +90544,6 @@ { "name": "alancolephotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "albertovr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "albinonderdelen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alex-werbung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexmathews.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alfa-pack.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alfapack-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -91558,7 +91335,6 @@ { "name": "sociohosting.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "solocorse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soluruse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "solware.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sommer-reitmajer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sota.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "southwesttest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92128,7 +91904,6 @@ { "name": "aff1xstavka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aff1xstavka.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affiliates-psychicsource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "affinity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affinitycu.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "affpa.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afrag.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92353,7 +92128,6 @@ { "name": "anonhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anonymfile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anonymous.com.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "anonymousemail.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anoopcnair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anoservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "answersincme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92455,7 +92229,6 @@ { "name": "articledaily.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "articulo19.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artifacthub.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "artifex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artifort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artishevski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "artmark.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92516,10 +92289,8 @@ { "name": "attomdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "attsavings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atttrainings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "atwk.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aubtu.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "auction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "audifs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audio-extractor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audio-joiner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audiobookss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92779,13 +92550,11 @@ { "name": "bigbootytube.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigbrother.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigbuild.vic.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bigcedar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bignaturals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigtitsmilf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bigtitsporn.pics", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bikemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bikerestart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bildung-mv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bildungswelt.dvag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billboardchartstars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "billetto.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92942,7 +92711,6 @@ { "name": "bodyheightweight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boerger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolbilisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bonitasoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bonjourlulu.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bonnovel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boobsgirls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -92965,7 +92733,6 @@ { "name": "braincorebismarck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brainguru.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brainguru.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "brainmanager.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brainporteindhoven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brainware-india.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brambles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93336,7 +93103,6 @@ { "name": "cmmcinfo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmrlink.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmscompany.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cmsnl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cnb1901.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cncexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93512,7 +93278,6 @@ { "name": "crimemuseum.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crimewatch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crimewatchfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "crimtan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "critfc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crmot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cron.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93617,7 +93382,6 @@ { "name": "datastar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datawrkz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "date-conference.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "datenightmovies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidbach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davison.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davisvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93678,7 +93442,6 @@ { "name": "desertharvest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "designbro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "designengineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "designstripe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desinfection-gale.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "desitorrents.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deskmoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -93965,7 +93728,6 @@ { "name": "elegantlacebridal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elektro-reibsch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elektro-wandelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elementorfa.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elementsofeducation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elettronew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elevatewebdesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94103,7 +93865,6 @@ { "name": "eventseeker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "everestbankltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evergladesfarmequipment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "everhome.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evertz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "everyademo.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94320,7 +94081,6 @@ { "name": "forbes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forbeser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "foreningssparbanken.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "foresite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forestdeclaration.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forestvets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forexclubfree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94483,7 +94243,6 @@ { "name": "gear4music.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geauxdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gebrvoit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "geckoroutes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geluidsverwachting.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generators-pro.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generix.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94667,8 +94426,6 @@ { "name": "hairytube.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hairywomen.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hairywomenpics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haitangsoshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "haitangsoushu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hakurei.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hallmarkbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hamibot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94783,7 +94540,6 @@ { "name": "highlycompressedzip.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highposthoops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highstakesdb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hillsclerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hillstohome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiltonfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hiltonsedonaresort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94816,7 +94572,6 @@ { "name": "homeoperator.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homepage-nach-preis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homerecording.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "homeslong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homeworkhelpwriters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homeworksuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homokfuvo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -94985,7 +94740,6 @@ { "name": "image.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imagequix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imdb.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "imediatoonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imeiorder.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imibo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imigrasilampung.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95448,7 +95202,6 @@ { "name": "ladyboyfiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ladyboytube.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laegemiddelstyrelsen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "laetitia-hypnocoach.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laetusinpraesens.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laget.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laguiainmobiliaria.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95653,7 +95406,6 @@ { "name": "loanscanada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lobandsmash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "localcdn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "localexpress.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "localize.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "locksoflove.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loco.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95795,13 +95547,11 @@ { "name": "maptician.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marcelovasconcelos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marcha.org.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marcypro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marebca.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mariamindbodyhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marifilmines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marijang.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketingtutor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "marketnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketresearch.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketsnerd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marketvolume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95979,7 +95729,6 @@ { "name": "miomiojoyeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mirasee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "miroslavholec.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mirrormonster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "misa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "misc.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "missingchildreneurope.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -95994,7 +95743,6 @@ { "name": "misterdomain.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mitel.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mitt.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mixedanimals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mixnmojo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mkala.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mkinfo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -96184,7 +95932,6 @@ { "name": "nakib4tech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nala.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "name.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "namecoinnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "namozagy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nanafeed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nanaya.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -96597,7 +96344,6 @@ { "name": "papaimama.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "papakarlotools.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "papascoffee.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "papayapay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "papelisimo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "papersowl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "para-sports.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -96874,7 +96620,6 @@ { "name": "posttoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pottkinder.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pp.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ppaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ppcgeeks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ppcsesco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ppf.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97022,14 +96767,12 @@ { "name": "quantfury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quantiply.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quantum.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "quantuscreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quebec.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quebecsolidaire.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "queer.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quicknode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quickrdp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quicksell.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "quickstart.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quidax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qwasar.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "r-e-a.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97091,7 +96834,6 @@ { "name": "rcprogranada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rcslt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rdn-team.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "reachum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reactheme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "read-myheromanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "readingoutpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97248,7 +96990,6 @@ { "name": "rewirenewsgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rewolucja1905.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rewriteguru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rewritertools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rexo.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reyesholdings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rg.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97280,7 +97021,6 @@ { "name": "rochesterymca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rockcult.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rockinmama.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rojavainformationcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ronandez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ronc.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rooneyholdings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97436,7 +97176,6 @@ { "name": "sciencetoymaker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scml.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "scores24.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scoresense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scorpexuke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "scotiabank.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97744,7 +97483,6 @@ { "name": "sounds-resource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "souqalsyarat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sourceadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "southlandcasino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sova-center.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soychile.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soycomocomo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97849,7 +97587,6 @@ { "name": "stgusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stgy.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stichtsevecht.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stidmobile-id.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stirringphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stitchlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stluciamirroronline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -97896,7 +97633,6 @@ { "name": "stunningafricandresses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sturents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stwcreation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "style-style.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stylight.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stylight.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stylight.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -98300,7 +98036,6 @@ { "name": "trademotion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradesecretslaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trails-end.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trainbusferry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "traintoday.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trannysurprise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -98683,7 +98418,6 @@ { "name": "vrconk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vrcosplayx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vrimmoexpress.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vriresorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vrre.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vrumcar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vse-dostavki.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -98855,7 +98589,6 @@ { "name": "wirebank.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wiredrelease.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirelessfestival.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wirelesslogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirelly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirings-diagram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wisatasingapura.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99091,7 +98824,6 @@ { "name": "1001telecommandes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1024.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1057thehog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "10pearls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "118118money.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123host.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "123moviesonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99138,7 +98870,6 @@ { "name": "2daysmood.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2one.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "3dmili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "3sisecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "401ksite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "444manualtherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "480ptvseries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99722,7 +99453,6 @@ { "name": "completed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "comsian.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "conectens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "connectedinvestors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "connexio.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "connor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "consuldat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99750,7 +99480,6 @@ { "name": "craftwarehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "craniosacralsimeoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cratexcalgary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "crax.tube", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crazynetwork.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creativemarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "credigo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99815,7 +99544,6 @@ { "name": "dattelking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dattelking.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dature.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "daunt.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidcrousehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidlouisedelman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "davidmgarvin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -99970,7 +99698,6 @@ { "name": "educationdegree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educationendowmentfoundation.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edufever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "edufever.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eduresultbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edvservice-pohl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eeagrants.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -100169,7 +99896,6 @@ { "name": "framer.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "francerent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "franchiseportal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "frankeschenfelder.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frasicelebri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fraudtoken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "free-tarot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -100408,7 +100134,6 @@ { "name": "hrreporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "huangban.org.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "huddlecamhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "huffingtonwire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hug0.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hugotech.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "humanresourcesedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -100440,7 +100165,6 @@ { "name": "ilsaperedelgusto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imaret.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "imarketly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "imgmodels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immoaval.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immobilienservice-website.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immobilo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -100592,7 +100316,6 @@ { "name": "kinde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kindernothilfe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kinecenter.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kingedwardvii.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kipa.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kirchner.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kirstengillibrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101070,7 +100793,6 @@ { "name": "noid.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "noid.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "noithatbachtin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nomerel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "noosebrigade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nopiamanual.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "normalinlinden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101345,7 +101067,6 @@ { "name": "rachaelsmaids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radarcupon.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radioevolucion.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "radiopatapoe.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radpath.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raidentawork.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rainerstoll.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101552,7 +101273,6 @@ { "name": "shoppersvineyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoprentone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shortbreakstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "shortcut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "shoutmecrunch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showmoviz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "showmyip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -101943,7 +101663,6 @@ { "name": "vande-walle.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vandersmissen.lawyer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "varmaz.men", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vasaivirarnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vcdspro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vcsc.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102265,7 +101984,6 @@ { "name": "alpa.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alpha91.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alpis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "althacare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alvaro-smith.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amaisd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ambarbyarihant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102322,7 +102040,6 @@ { "name": "august.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aussiesnus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autista.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "autopistadelitata.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autos-motos.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "auzzie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avenir-now.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102601,7 +102318,6 @@ { "name": "duckyubuntu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dudushu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dulcehome.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "durka.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dynotraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dzg-ev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "e-ticaret.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -102963,7 +102679,6 @@ { "name": "kami-riha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kampova.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kantoorartikelen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kanuking.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kassen-zero.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kasu.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kateduggan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103631,7 +103346,6 @@ { "name": "tepco2021.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tfinfo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thea-meditation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thebarclay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegreendigest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thekitchendoor.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thekitsunesden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103707,7 +103421,6 @@ { "name": "ungovernable.men", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unikimages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unipolrsa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unitingwa.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unitop.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unitycardiology.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urbanevielfalt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103828,7 +103541,6 @@ { "name": "234.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2mades.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2mp.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "365886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7203.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "740cashbuyers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "86606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103977,7 +103689,6 @@ { "name": "dachlaeufer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darrenflemingphotography.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daxo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "daymi.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dbautoservice.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dcampusbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dddd.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104170,7 +103881,6 @@ { "name": "kapaci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karakafa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keks.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kellerencompass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kerautretvian.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keyestudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kidm4k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104213,7 +103923,6 @@ { "name": "lomond.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lonelybitcoin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "luckybeantravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lukas21.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "luppa.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madinatech360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "madmoizelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104498,7 +104207,6 @@ { "name": "thepioneersgame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "therapeiacosmetics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "therhodesresidences.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thewebagent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timefracture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timelettings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timochan.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -104526,7 +104234,6 @@ { "name": "trueamateurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truechimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trueformroofing.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "trueworlds.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tsutaya-ai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "turanogluoptik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tvorog.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105289,7 +104996,6 @@ { "name": "attorneyrebeccawhittington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aubay.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audiosite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "auribus.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "austincosmetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "auto-albrecht.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "auto-delchev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105417,7 +105123,6 @@ { "name": "casacenina.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casasbandeirantes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catphysics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "catrins-kunst.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccvr6smarthome.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ceenic.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ceeteegee.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105808,7 +105513,6 @@ { "name": "francishouserecovery.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freak-waves.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frenger.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "friotemp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frontmeedia.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fruitdiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "furniturestrends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -105996,10 +105700,8 @@ { "name": "kik.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kik.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kik.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kikchat.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kingandmcgaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kinoks.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kittleapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kiyokosimmons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kk-bs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klaymemez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106064,7 +105766,6 @@ { "name": "livewebtutor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lizzymcc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ljskatt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "log.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lois-bullion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "longboatlocal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "longbsants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106115,7 +105816,6 @@ { "name": "metrobank.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "metromark.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "meuemby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "michelson.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "microdot.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mignet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mikrothink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106553,7 +106253,6 @@ { "name": "topmaxstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topprogaragedoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topsights.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tortimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "touchofjapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradition.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trakmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106609,7 +106308,6 @@ { "name": "vibromax.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "video-lab.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vilamoura-car-hire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vineeth.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitabrillanti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viviendacoomeva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vivos.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106626,7 +106324,6 @@ { "name": "watchthis-svp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "waterlandtuinen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "watto29.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wavelifesciences.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wayaberolodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "web-direct.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webhostingmagic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106769,7 +106466,6 @@ { "name": "562656.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "562956.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "563398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "563699.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "568756.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "593398.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "639063.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106921,7 +106617,6 @@ { "name": "apsreview.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aquila.earth", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arab2cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "archiweb.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "areawidepainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "areins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "areinshospitality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -106980,7 +106675,6 @@ { "name": "baroqueworksstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bartoliconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "basisvaardigheden.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "basketcase.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "batistasbakery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bayliss.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bayliss.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107150,7 +106844,6 @@ { "name": "csghomedesignbuild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cubeinstallations.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cuo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "customer2you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberfla.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybersecuritydegreeguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cybersecurityeducationguides.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107395,7 +107088,6 @@ { "name": "greatamericanuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greve-behrens.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grigoraslaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "group-galore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growth.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gruenhagenlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupoeitb.eus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107421,10 +107113,8 @@ { "name": "hanmanshijie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hanmanxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hanshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hardcore-toys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hashbl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hatinyhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hatsnet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hautemontagne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hcelite.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hdaccess.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107482,7 +107172,6 @@ { "name": "imigrant.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "indigenous.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inlomax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "inmueblescaribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insaneair.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inspireplanner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "institutoliderar.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107537,7 +107226,6 @@ { "name": "kanabun.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kanduit.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kastuvas-tau.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kat.tf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "katherineandkegan.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kelyon.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kelyon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107829,7 +107517,6 @@ { "name": "peyote.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phagyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phonevibrator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "phorcys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phparena.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "phrenology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "physicaltherapistassistantedu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107954,7 +107641,6 @@ { "name": "rxphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rybak-opt.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rybak-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ryder.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rydercragie.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rydercragie.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ryderstatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108224,7 +107910,6 @@ { "name": "wushka.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wuw.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wyriverton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xiaozonglin.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xiurenwang.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xmessy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xn----otbabmp3ae.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108342,7 +108027,6 @@ { "name": "4100.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "413504.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4222.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "42bit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "4333.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "439182.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "452895.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108615,7 +108299,6 @@ { "name": "bmskibaru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bnssigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boardgameshots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bodies.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boesckens.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bointon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolognatsrmpstrp.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108783,7 +108466,6 @@ { "name": "cyraco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "d-influencers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dacgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dachnie-reshenia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dachnyvopros.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daer.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dagestan-guide.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109536,7 +109218,6 @@ { "name": "oemparcacim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ogorodnik.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ogorodoved.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oksichemk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oldhousetonewhome.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olivier-verbois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olofly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -109910,7 +109591,6 @@ { "name": "streetwitnessing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strenge-zucht.schule", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sub-health.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "subastatutraslado.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "suckerberg.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sulakskii-canyon.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "summit-research.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -110016,9 +109696,7 @@ { "name": "traccxs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trackadblock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transanglo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "transfer-sheregesh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transfer-v-sheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "transfer-vsheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transfera-sheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transfero-sheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "transfery-sheregesh.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111147,7 +110825,6 @@ { "name": "carolinelanglois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casa-carla.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caunceohara.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cboost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbozarks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccnda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cec.org.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111504,7 +111181,6 @@ { "name": "hdsaglik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "health-toolbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heatherlydesign.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hedd.audio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heibobo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heibobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heibobo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111616,7 +111292,6 @@ { "name": "jinkou.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jinkou.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jinkou.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jjfxz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joaquimfialfotografia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jobsboard24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jonssheds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111823,7 +111498,6 @@ { "name": "naturschutz-holderbank.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "navajasdesupervivencia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "navegantesdelcosmos.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nbadao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nbit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neenan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neh.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111839,7 +111513,6 @@ { "name": "nicolaslogerot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nicwortel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ningwei.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nirvati.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nitolab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nixorigin.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nja.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112011,7 +111684,6 @@ { "name": "readybyjosh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reallight.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rebure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "recyclenow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redsift.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redsift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redsift.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112031,7 +111703,6 @@ { "name": "rhinosf1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rhyno.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rhysg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "riaiai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rickoriginal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "riderchris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rime.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112055,7 +111726,6 @@ { "name": "sadeem.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safety.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safetysource.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "saiserver.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "salge.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samuelphotos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sandbox.i.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112180,7 +111850,6 @@ { "name": "sxjjt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sxmnm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sxqxmx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sxtik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "synchrocity.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "synergyofserra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "szemuvegtrend.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112208,7 +111877,6 @@ { "name": "theafricanvibeking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecfef.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thediligentwoman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thefinx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegamecave.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegameroof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thegreenlawreport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112217,7 +111885,6 @@ { "name": "themusketeerslodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thephoenixdg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theprinterjam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "therapie-fricktal.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thesaltsanctuaryfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thescriptinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theskepticalreviewarchive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112314,7 +111981,6 @@ { "name": "vipuser.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visionsc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visiquate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "visitsugartown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vistapaket.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visu.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vivagy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112438,7 +112104,6 @@ { "name": "yinwa.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yjrk.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yliarb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ynrrsr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yofi-yofi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yomeuno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yooznet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112526,7 +112191,6 @@ { "name": "99dog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "99music.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9fruit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "a06.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a1cookingequipment.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a340.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a64.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112563,7 +112227,6 @@ { "name": "agencestaff.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agent4fl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agilextra.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agilusdiagnostics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrifoglio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agriportal.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aguaazul.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112645,7 +112308,6 @@ { "name": "atlantclinical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atlassen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atlastravelvic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "atomeus.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "atuallemoveis.ind.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aucoindubloc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "audiobone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -112893,7 +112555,6 @@ { "name": "creamless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creativeconsult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creativefocus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "creativityalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "creditshanghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crewresourcesinternational.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "crisp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -113336,7 +112997,6 @@ { "name": "goodbenefit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodcoat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodcollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "goodcotton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodeditor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodenvironment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodface.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114266,7 +113926,6 @@ { "name": "rusty44.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rusweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rygyatacado.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "s-hertogenbosch.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sa-stu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sabrinajoias.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sacerdos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114565,7 +114224,6 @@ { "name": "theprimegroup.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theruraltrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thervgeeks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thesupremacyg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theultimateshave.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theweald.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thinapps.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114581,7 +114239,6 @@ { "name": "tibinonest.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tieffeservice.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tieli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tiendacomprasegura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiktokdownloader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timefinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114658,7 +114315,6 @@ { "name": "uae-auto.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubigeo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uchiha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ucraft.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultrafree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultrapedic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ultraseven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114802,7 +114458,6 @@ { "name": "wiederum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wilsoninfanteadv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "windhamworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "winedoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl-bank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl-bank.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wl-bank.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115208,9 +114863,7 @@ { "name": "alitv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alkame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allerheiligenkirmes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alliancetrading.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allindustriessolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alljoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allnaijagists.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "allpatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alltak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115600,7 +115253,6 @@ { "name": "carefree-creative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caremind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carfashion.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carlasecrets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carohq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carportus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carsvans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115683,7 +115335,6 @@ { "name": "chrisandian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chrismurray.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christian-laubender.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "christianbsl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chupanhdao.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cima-alfa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cinematik.fans", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -115852,7 +115503,6 @@ { "name": "depicus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deportescr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dequency.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "derbysound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "derekgendron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dermatit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dermatologyandlasergroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116293,7 +115943,6 @@ { "name": "fzinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "galenzoski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "galgamer.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "game-developers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gamerkick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gamesaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gandmfamilydental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116401,7 +116050,6 @@ { "name": "gubia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gugumu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guillaumesworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gunduzyucel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gunting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guoyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gurufox.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116524,7 +116172,6 @@ { "name": "heronhallacademy.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "herwz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "herzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "het-klaverblad.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hexene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hh-ri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hhdy3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116671,7 +116318,6 @@ { "name": "ironmongeryexperts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "is-real.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "isentek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "isidore.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ispc-synergies.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "israel21c.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "it-altstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116941,7 +116587,6 @@ { "name": "langer-bauwerk.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "langthaler.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "languageispower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lankatongtravel.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanlaog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lanzastil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117558,7 +117203,6 @@ { "name": "pdavislawgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peacesky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peakchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pearsonbsl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pedrola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peduse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "peers-liste.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117628,7 +117272,6 @@ { "name": "power-bi-connector.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "power-bi-connector.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "power-bi-connector.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "powerplay.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pozycznamiot.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ppfcalculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ppktgti.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118206,7 +117849,6 @@ { "name": "supertape.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "superworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "surfplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sussexsecurityinstallations.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "susteel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "svampbob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "svrtech.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118235,7 +117877,6 @@ { "name": "tails.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taims.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tairuide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "taiwanbible.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taiwancan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taiwanexcellence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taiwanplaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118393,7 +118034,6 @@ { "name": "tiktokv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tillinger.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tilpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tilyexpress.ug", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timbertreasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timbertreasures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timelybookkeeper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118443,7 +118083,6 @@ { "name": "topsuper60.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topsuper60.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topsuper60.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "torrelorenzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toshiroz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "totstraksonline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tour-de-franz.bike", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118537,7 +118176,6 @@ { "name": "unganisha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unicodeagentur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uninatural.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unique-app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "universoagropets.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unlimittech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unmaskingtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118577,7 +118215,6 @@ { "name": "vastu.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vatnik.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vebeco.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "velocitytech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vendloop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "venusvprincess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verbundkredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118883,7 +118520,6 @@ { "name": "zgcbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zgsmc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhaijibian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zhaso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhcg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhekoujie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zhenjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118929,7 +118565,6 @@ { "name": "zttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuancheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "zuichongqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuidong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuipinyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuishanghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118963,7 +118598,6 @@ { "name": "8i3m2a67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a-b.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a8438pb3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "a9-9.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aaic.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abacusnt.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abdul.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119157,7 +118791,6 @@ { "name": "australaccountants.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autoarena.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autoblog-de.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "autochin.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autohubmarketing.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avengepet.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "avthelsinki.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119207,7 +118840,6 @@ { "name": "bitterley.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blackmark.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blevinstirepros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "blockchainreporter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "blockedservers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bloscheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bloscheck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119230,7 +118862,6 @@ { "name": "bruckenbauer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brunoriguzzi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bth.dance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "budidayatani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buicha.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "builddesygner.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "burkebarclaylawoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119851,7 +119482,6 @@ { "name": "ideapanda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "igmedia.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ihoofs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ilaunch.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilustradanuvem.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "immo-express.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "impec-cable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -119935,7 +119565,6 @@ { "name": "keyfriend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kfc.bike", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kgdev.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "khord-kon.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kidneyst.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kidsblock.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kindler-design.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120193,7 +119822,6 @@ { "name": "mysoft.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysteryplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysticexperience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mythoughtsideasandramblings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myvawic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nachrichtenblatt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nachteile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120601,7 +120229,6 @@ { "name": "ruyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rvc.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ryanhopk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sabinearendt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sacredheartmission.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sadrailsim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safefly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120969,7 +120596,6 @@ { "name": "tzimisce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubwash.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ucscard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "udenit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ufero.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ufochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ufuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121352,7 +120978,6 @@ { "name": "ambassify.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amelia-wedding.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amiatlanticare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ammex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "analyticsinsight.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andersonenergy.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "andree.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121510,7 +121135,6 @@ { "name": "bebrik.men", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bebrochka.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beebruh.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beebuy.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beebuy.restaurant", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beeebraa.download", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beiyongjin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121603,7 +121227,6 @@ { "name": "cardswith.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carefu.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlijnottens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carloscolina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlsonfonder.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlsonfund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carlsonfunds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121768,7 +121391,6 @@ { "name": "dg-hyp.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dg-hyp.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dghyp.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dhursanconstruction.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dianchoi.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dianzipan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "diet-hack.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121840,7 +121462,6 @@ { "name": "drbaxter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dressrose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dripflow.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dronedeploy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drugrehabjohannesburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dubboskills.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -121861,7 +121482,6 @@ { "name": "easyenjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ebs.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecco-verde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ecolequebec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecopowerenginewash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecoscanapp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ect-telecoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -122572,7 +122192,6 @@ { "name": "olgamilosevic.edu.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olmportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "onepieceplayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onepointzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlineinfo.freesite.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onuruzunonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -122749,7 +122368,6 @@ { "name": "pvrtours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qbotica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qiangshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qianlong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qianmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qianshuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qianzhanggui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -122803,7 +122421,6 @@ { "name": "rocketsales.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rocknrowdyranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rsa-services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rude.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rumemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rutgershealth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ruzovyslon.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123526,7 +123143,6 @@ { "name": "ao2law.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apex.aw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "app-sharepoint-v1-pro-crd-hd.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aprileporte.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aprimatic.msk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armour.ventures", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123570,8 +123186,6 @@ { "name": "azalhavayolu.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "azemardstephanie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "b2bpoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "babaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "badmintonracketreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "baebronx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bai-bao.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123703,7 +123317,6 @@ { "name": "borzamalta.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boucherie-restaurant-les-provinces.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boxhall.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boxpark.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bravurabusinessconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "brewmovers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bryandrakedrivingschool.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123794,7 +123407,6 @@ { "name": "coduzion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cognitioweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coincap.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "colapsys.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "colis-collecte.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "collaboration.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "collezione.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -123904,7 +123516,6 @@ { "name": "e-launch.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eachdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eaglerun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "earnosethroat.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "earthcouture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "earthwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "earthytales.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124169,7 +123780,6 @@ { "name": "homedesigncompany.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homeserver-kp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hompimpaa.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hondapowerproducts.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hongxiaodou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "honzakulig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hopi.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -124996,7 +124606,6 @@ { "name": "tablion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tachip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tadaaam.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tagbin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tahititourisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tahititourisme.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taidou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125134,7 +124743,6 @@ { "name": "vigrid.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "villafashion.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ville-vif.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vinciu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visioned.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visiontaiwan.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitallearning.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125415,7 +125023,6 @@ { "name": "agen62.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrartermine-deggendorf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agrartermine-straubing-bogen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agrinous.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahl.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahli.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahouansou.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125553,7 +125160,6 @@ { "name": "asnaz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aspec-md.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assentfitness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "assignmenthelper.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assinare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assinare.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "assinare.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125645,7 +125251,6 @@ { "name": "bdty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "be-bellence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bean-jam.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beardsorcery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bearly.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bearslakeinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautyrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125794,7 +125399,6 @@ { "name": "botanical-design.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boundlessmediausa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bountiful.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boutibag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boutiquecoureurdesbois.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "box.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boynet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126089,7 +125693,6 @@ { "name": "crrow777radio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cryptin-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cryptomarketrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "crystaleez.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "csdurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cse-sna78.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cswrld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126643,7 +126246,6 @@ { "name": "garnerseo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "garo.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "garstonvets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gasfitermaipu.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gates-of-olympus-app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gavaskee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gavintang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126684,7 +126286,6 @@ { "name": "glazenschuifwandenoutlet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalawakening.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalbroadcastsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "globalloungenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "globalroad.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glosarios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gmtelectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126719,8 +126320,6 @@ { "name": "gozenhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gpcmicro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gpr.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gptunnel.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gptunnel.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gpu.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grabowski.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grabrfi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -126749,7 +126348,6 @@ { "name": "gretalfoodproducts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gretel.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gridcodestudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "groovyrelocation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grossaci.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "groupeaccedia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "growcredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127168,7 +126766,6 @@ { "name": "kita-bicibici.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klaspas.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klaviskripta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kleenkraftservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kleineserver.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klinikum-oberberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "klinlab.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127357,7 +126954,6 @@ { "name": "lostgeek.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lottcarey.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "loveherass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lpsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lricountry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lrp-autorecycling.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lskgreengroup.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127680,7 +127276,6 @@ { "name": "navyfederal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nawasyo.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nci.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ncionline.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neilcaruana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neilyanto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nekb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -127978,7 +127573,6 @@ { "name": "plumage.so", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "plurr.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pm.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pmgroup-global.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pocketoption.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pocopizza.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pocztex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128168,7 +127762,6 @@ { "name": "rakor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rakweb.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ralphdeal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rammin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "random-numbers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "random-password.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rany.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128328,7 +127921,6 @@ { "name": "santswebdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sarah-huenten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sarahsommer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sarkaridomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sasthyaseba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "satya-insights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sau.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128387,7 +127979,6 @@ { "name": "securitydelta.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "securitytalent.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seekicon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "seerist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seerr.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seg-tox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128719,7 +128310,6 @@ { "name": "taviskaron.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxivip24h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tcgc-adms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tcn.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tddaij.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "te9.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teagardenspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -128753,7 +128343,6 @@ { "name": "testscorpiogroup.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tetam.dynv6.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teuto.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tezfab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "the-nose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thealphaconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebarrens.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129116,7 +128705,6 @@ { "name": "windows101tricks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wingpictures.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wings.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wipers-nz.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wiseclinictc.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wiserpost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wissen.center", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129291,7 +128879,6 @@ { "name": "adasiacorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adney.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adphotography.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "advaya.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "advertizer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aegisys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afbct.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129314,7 +128901,6 @@ { "name": "alesraa-academy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alexkoala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alhothary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alicejewelry.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alikorooki.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alinemello.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alkesznevelde.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129369,7 +128955,6 @@ { "name": "awena.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "awesomeperfumes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "axfr.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "axomatic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "axomatic.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ayrom.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "b2c-engineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129628,7 +129213,6 @@ { "name": "dallatur.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danibooks.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danielnaaman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dante.ms", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dash.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datacenterunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datadefendersforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129744,7 +129328,6 @@ { "name": "emtreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "en-pc.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "encirca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "englishvip.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "enjoyangels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "entretien-vmc-professionnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -129898,7 +129481,6 @@ { "name": "grow100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupoalv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grupoimb.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "grupposanmarco.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gruvan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grzelka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guangri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130021,7 +129603,6 @@ { "name": "induoloog.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "infoparamigrantes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ingolfsskali.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "inia.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inkedin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inmini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "innerhtml.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130084,7 +129665,6 @@ { "name": "kaimi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kalimba-hangszerbolt.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kallosmedicalaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kandycoated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karenofarcola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karudomizile.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kengcoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130480,14 +130060,12 @@ { "name": "progressivenewz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projectmetrics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "projetofinancas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "prontt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pscosigngroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psoppc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pspepper.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pspshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pstool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "psyelena.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ptco.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puppyirl.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pupsic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puravidaeamor.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130798,7 +130376,6 @@ { "name": "trafficjunky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travelsinfozone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travelsure.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "traviscountyappliancerepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trctaborda.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trehand.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trekkerterreur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130869,7 +130446,6 @@ { "name": "vetuni.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vfu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viaweb.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "victorcatalin.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vinylbro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vision.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visionagrupo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -130991,7 +130567,6 @@ { "name": "yurissimo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yurissimo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yurissimo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "yuzicare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ywambaguio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ywambutuan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "yx-express.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131190,10 +130765,8 @@ { "name": "bebe4d.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beebom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belezna.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bellasuperfisky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belzhd.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belzhd.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "berget.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bert-hein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "berthouvan.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bestrshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131248,7 +130821,6 @@ { "name": "bubra.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "budgetapp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "budra.date", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "buildamericaluxuryhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bulgarcom.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bullis.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "buuba.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131464,7 +131036,6 @@ { "name": "dirigeantbtp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dirtyplumberreno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dishakiran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "divinemagazine.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmarcsentry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dmoz.v.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dnaplaincity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131666,7 +131237,6 @@ { "name": "germanyquality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getcancer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "getsmartcue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getvantage.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ghui.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "giacomomaniaci.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -131763,7 +131333,6 @@ { "name": "holmr.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homebush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "homefromhomecornwall.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "homeproroofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hooliapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hoopernewton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "horizon.ne.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132021,11 +131590,9 @@ { "name": "margarethouse.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marijuanafarms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mariuszholowieniec.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "markoheijnen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marquee.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marvin.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maschen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "masjidalnoorwairarapa.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "massage360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masterly.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masterpro.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132298,7 +131865,6 @@ { "name": "puzzlage.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puzzlage.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pxboom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qifei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qinde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qingran.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qinshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132568,7 +132134,6 @@ { "name": "tabbo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tajabzar.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tamahurt.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tanorder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tasirrigation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tauntonme.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taurus-exports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -132593,7 +132158,6 @@ { "name": "thebookishhistorian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thebritishtapestrygroup.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thecascadetravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thecreditpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thedealerapp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theertcexperts.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "theframeryandgallery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133020,7 +132584,6 @@ { "name": "app-novusportal-uat-ae.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apparo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appside.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aqua-oxygene.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aracelissanchez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arasikackm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arcticnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133069,9 +132632,7 @@ { "name": "batamtoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bbence.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bdsmsextoy.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beacon.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautiqline.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beautyaesthetics.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautyiconnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beeming.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beerstap.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133425,7 +132986,6 @@ { "name": "gaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "garagedoorrepairs-sanantonio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gasketech.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gatot.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaylaktika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gdhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133885,7 +133445,6 @@ { "name": "night-life.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nimver.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nintendodsgames.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nishinija.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "njj0121.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nlx.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nonqmloans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -133913,7 +133472,6 @@ { "name": "onlinetravel.deals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ontimeemergencyroadsideandbatteryservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "opramachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "opsholders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "optone.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "orangeshark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oregoncouples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134055,7 +133613,6 @@ { "name": "reparacoesnolar.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "represa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reservaelcortijosuitehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "responsive.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reverseaging.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reviewtrendingproducts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rewolucja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134419,7 +133976,6 @@ { "name": "webzvit.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wedesigneg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wedos.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "weekly-app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weempoweryou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weibel.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weispfenning.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134650,7 +134206,6 @@ { "name": "bataindustrials.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "batteriesplusbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bccst.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bdbpayroll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bdsm-erotik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bealest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beats-universe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -134973,7 +134528,6 @@ { "name": "fortressinc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fortstocktonpecosroadhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forumpsicoanaliticbarcelona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fotostudio87.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "francescosorrentino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "franchisechain.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frankiearts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135004,14 +134558,12 @@ { "name": "geniusfix.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "genoptimed.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geodecoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "geoplatform.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "georgeh005.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "georgie.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gesolarinverter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getcalc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getnetworkvisibility.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getsprout.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ghosthunting.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gilloteaux.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ginestasolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "giovannipiscicelli.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135131,7 +134683,6 @@ { "name": "interbulit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "interiordesignhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intermediazionerifiuti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "internetzonei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inthetrees.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipa-us.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ironleaf.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135338,7 +134889,6 @@ { "name": "modern-metal-solutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mofospremium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mofosreel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mojogaragedoors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "momentlocacoes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mooijwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "morcillaencaldera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -135907,7 +135457,6 @@ { "name": "wdcnet.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webline.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "webmad.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "weimeicleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weizhi1111.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wellnesstravelhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wellsofbeauty.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136002,7 +135551,6 @@ { "name": "ai-kyousei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aicontent.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aikido.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aiwoz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ajka-solution.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akaiclinic-yokohama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "akdenizecza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136135,7 +135683,6 @@ { "name": "chrischambersphotography.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "christinadooleyphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chrizz.ddnss.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chuan.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chuou-labo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ciallo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cibran.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136145,7 +135692,6 @@ { "name": "classicpraga.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "classicprague.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "classicprague.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "claudiamatiello.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clgp.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clifford-hospital.org.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinicadeesteticaembh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136551,7 +136097,6 @@ { "name": "littlenamehub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "livibank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ln-s.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "loco-creations.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "logicstudio.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "logicstudio.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lolyoureallyscannedthisqrcodegeniusthatssketchy.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136675,8 +136220,6 @@ { "name": "nniai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nntb.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "no-bigtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nobigtech.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nofuss.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "noirpvp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nojiri-dental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nootropicsforbrainhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -136688,7 +136231,6 @@ { "name": "nuffieldtrust.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "numerated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nusantararom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nusapulsa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nysis.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nysis.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nysis.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -137081,7 +136623,6 @@ { "name": "velvpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "velyn.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "versantsdaime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "verschwundenerboehmerwald.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viaferratacauterets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "victoriacarter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "victory-design.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -137597,7 +137138,6 @@ { "name": "drillworx.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drpatyuen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dsigroup.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dubaimegadeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dusara.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dylantjames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "e-mutation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -137632,7 +137172,6 @@ { "name": "entreprise-ravalement-facade.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "envanature.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epiclock.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "epochconcepts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "erkkiai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "erlandsen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138084,7 +137623,6 @@ { "name": "menegaro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mentaflex.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "menukart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "menzzo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mercadoorganico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "merciahandyman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mestriga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138120,7 +137658,6 @@ { "name": "mistressofthehouseofbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mistrvyvoje.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mitsannapolis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mittvarsel.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlle-margot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlle-margot.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mllemargot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138165,7 +137702,6 @@ { "name": "nationaldebtcounsellors.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nationalracingnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nefi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nekomimi.cafe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nekonekowo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nemoarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "netgazeti.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138230,7 +137766,6 @@ { "name": "onboardweb.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oncall.health", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "one1xfarsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "onic.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlyso.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openseo.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oralchirurgie-phoenix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138316,7 +137851,6 @@ { "name": "proautoconsultant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "procom-automation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "programar.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "proheadshots.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "promaster.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "promptbazar.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "promptwars.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138587,7 +138121,6 @@ { "name": "swngrs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "swtp-p-appsrv-coordination-platform-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sympatent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "synthpop.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "systec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "system-noah.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "systronlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138595,11 +138128,7 @@ { "name": "t-shock.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "t0bi.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "t4gsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tagon8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tagon8.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tagon8.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tagon8inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tagon8inc.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "takada418.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "talkapp.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tamarpsychotherapy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138665,7 +138194,6 @@ { "name": "tor.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toricho-ganka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torontoheights.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "torrentelectricals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "torrentinvestments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tourpitch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toyopartespanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138919,7 +138447,6 @@ { "name": "bluemax49ers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluetenfraeulein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boehs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boothersandco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boutique-opinioes.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "breakingbreadwiththebryants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bregner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -138940,7 +138467,6 @@ { "name": "cirugiaplasticasanluis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "civicdigest.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clackyfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "classifylanka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clicknbook.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clozd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmsfs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139052,7 +138578,6 @@ { "name": "homewoodpathfinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hooli1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hsys.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hw.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icast.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "idute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iguacumaquinas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139112,7 +138637,6 @@ { "name": "liebscher-bracht-kassel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "linahuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "logicalis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lugvonsiga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "m.wtf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "m4rkos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "macalha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139147,7 +138671,6 @@ { "name": "myluckysock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysmilefinance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysoft.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mytechwarellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nachtvertraut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nanodgx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "napalha.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139187,7 +138710,6 @@ { "name": "ospoalliance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oswmlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pamba.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "paradymecompanies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "partyrehabb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "paulbolton.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pedersenandpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139294,7 +138816,6 @@ { "name": "sopenamobilhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sparumzuege.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spaworldhouston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "specialmomentvideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "spicestore.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sprovoost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srande.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139350,7 +138871,6 @@ { "name": "titaniumphysique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tonetempo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topbrokers.africa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "torch.security", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toxicflags.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tracbelagro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trapezegroup.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139374,7 +138894,6 @@ { "name": "vanyavpn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "venezaequipamentos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "verloskundigcentrumraak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "versatilestructures.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vhv2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "villacom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viralytydne.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139506,7 +139025,6 @@ { "name": "backdigit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bain-savon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "balfourbeattytraining.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "baltijaam.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bancoatlantida.com.ni", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bateriaprofesional.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "battletrades.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139565,7 +139083,6 @@ { "name": "bluehouse-odda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bluerainroofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bmgc.edu.bd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bodyconcept-kfz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boenderoutdoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bolezni.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bombshelled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139604,7 +139121,6 @@ { "name": "cardlysa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "career.how", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "careerstart.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "careskillsacademy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cartazodiacal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casadelsole.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "caspe.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139688,7 +139204,6 @@ { "name": "css-clamp-generator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ctmportal.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ctpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cuadrosblangar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cukrzyca.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "customtshirtrequest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cwg.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -139854,7 +139369,6 @@ { "name": "freestyle.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "freshsnap.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "friesland-stern.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "frokentech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "frontiermovinghtx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ftoffice.serveexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "furries.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140050,7 +139564,6 @@ { "name": "kotapay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "krankheiten.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kreativbox.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kubiaktr.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kvxr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kyrknatet.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lab-ratz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140116,7 +139629,6 @@ { "name": "marcoduenki.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "margus.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mariogasparini.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "massana.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matchory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matematikyoldasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "maternalwellness.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140158,7 +139670,6 @@ { "name": "monterreygroup.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "montevista.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "moolimusic.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mope-blog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "motivemm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "motorwatcher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "movahoteis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140266,7 +139777,6 @@ { "name": "pekarnasazava.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pekarskarodina.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pekarskis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pemo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petermarshall.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petermclarenartist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pfr.fyi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140325,7 +139835,6 @@ { "name": "razawitv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rbw-tech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "realizarse-japan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "realliance.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rebabusiprojects.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "recommendatron.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "redpandamap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140604,8 +140113,6 @@ { "name": "uniodontopocos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unionalcoyana.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unionalcoyana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unitedinternationalschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unitedpucollege.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urlr.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "us.edu.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "usacontainerllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140668,8 +140175,6 @@ { "name": "wp.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wpallstars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wytworniatresci.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wzdh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wzdh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "x52.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xdlab.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xfilesultimate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -140939,7 +140444,6 @@ { "name": "classygaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "claudios-pizzaservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clazzor.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "clean4me-us.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clevemedsleepview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinicabelve.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cliveptr.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141129,7 +140633,6 @@ { "name": "geektown.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "generali.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "geometryenjoychallenge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "giomi.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gltjp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "go5.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gold.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141145,7 +140648,6 @@ { "name": "griffnet.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grove-e-move.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grpmail.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gtarestoration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guidanceetbienetre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gutowski-maler.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gwerder.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141633,7 +141135,6 @@ { "name": "rentsync.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "republicchophouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rescueyourrestaurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "restorebodybalance.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "retroworldshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rewire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rextie.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141671,7 +141172,6 @@ { "name": "sarah-jones.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sasakidental.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sasongko.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "satelitnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "satuenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saugatuckcabin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saugatuckvacationhomerental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141767,7 +141267,6 @@ { "name": "takenouchi-perio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "takiguchi-shika1515.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "talk-local.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tapirs.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "taxborn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tdos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "teamtriangle.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -141886,7 +141385,6 @@ { "name": "vr-immo-invest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vr-immoinvest.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vr-re-bank.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vrbq.qld.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w88link.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wapatui.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "warsawtravelers.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142193,7 +141691,6 @@ { "name": "carl-sinclair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carorchestra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "carpetcleanerreviewshq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "carwrapsinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "casebydemani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "catalogobata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cavapoos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142231,7 +141728,6 @@ { "name": "clubpublic.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clubtravalet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cm-lagos.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cm-pu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmcper.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cmogus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codechum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142361,8 +141857,6 @@ { "name": "echonautique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eci-research.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eckersondesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ecmx.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ecomsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "economicnewsbrasil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "economizaplay.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eda-az.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142411,7 +141905,6 @@ { "name": "fabricacultural.org.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "faetasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fakepology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fathers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "figma-gov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fines.vic.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "finy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142488,7 +141981,6 @@ { "name": "gradyhunt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grana.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grandiegames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "grandkidsmatter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grandx86.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greatdayinamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "greatwaterfilters.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142806,10 +142298,8 @@ { "name": "minigoldendoodle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minilabradoodlepuppies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "minnesotatitlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mirandacarvalholeiloes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mississippititlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "missourititlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mk83.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlcounsel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlyny-nitra.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mocanu.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142897,7 +142387,6 @@ { "name": "okdisasterhelp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oke.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "okmzt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oldsoul.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olimp04.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olive.dental", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "olivehealth.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142917,7 +142406,6 @@ { "name": "opusraid.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oregontitlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "organizewithmarie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oricinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "otsbodywork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "otzyvy.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ourhousepm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -142995,7 +142483,6 @@ { "name": "pregosa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prelogica.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "premiumresidency.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pretimmobilier.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pretiumfarm.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "prewin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "primecredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143022,7 +142509,6 @@ { "name": "ptmodularleisure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ptr.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ptta.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pundeez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pup.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puppyporch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pupsportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143239,7 +142725,6 @@ { "name": "ticoartisan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tiertreff24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timetofly.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tinteymas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tipmast.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tipshub.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "titlesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143280,11 +142765,9 @@ { "name": "tysseminilager.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ucmultrasonics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ucmultrasuoni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ucsooregon.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uggonlinestoreofficialol.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ulog.ba", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "umbraco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uniformcomponents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uniglobalintijaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unionares.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unlimit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143521,7 +143004,6 @@ { "name": "abenberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abettercreditunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abhandshake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "abilitylinks.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abinandanainfra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abion-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abmleadershipalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143605,7 +143087,6 @@ { "name": "admeweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "admin-smolensk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "admiralcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "adp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adrcoforegon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adria.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "adrianjamesnutrition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143633,7 +143114,6 @@ { "name": "aern.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aerojet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aeroportlimoges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aeroportsdeparis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aerospaceglobalforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aesm.limited", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aessonline.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143658,10 +143138,8 @@ { "name": "afterinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "afuzion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agduc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agence-france-electricite.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agendaedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agendatrad.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "agews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agilexbiolabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agoa.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "agoodson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143684,7 +143162,6 @@ { "name": "aihello.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aihelp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aijobs.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aime.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimforclimate.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimixgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aimplas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143813,7 +143290,6 @@ { "name": "almorinda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "almosallamy.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "almworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "alnaharnews.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alobees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alohapacific.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alorimusic.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -143955,7 +143431,6 @@ { "name": "anybodylistening.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anzappl.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aok.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aomeikey.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aomz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aovup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apaleo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144004,7 +143479,6 @@ { "name": "arab-drama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arab-drama.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arab-dream.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "arab-dream.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arabfcn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aradex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arafatx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144040,7 +143514,6 @@ { "name": "arkin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armakuni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "armemberplugin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "armsteadproject.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "army-technology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "arn0.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144081,7 +143554,6 @@ { "name": "asharqbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ashesdiamonds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ashfordtownhall.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ashikagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ashton.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asiahilux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "asianlifestyledesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144439,7 +143911,6 @@ { "name": "bethkery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bethlehemnj.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betriebsrat-ivb.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "betterandbetter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betterify.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betterme.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "betterworldproducts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144511,7 +143982,6 @@ { "name": "bioethicsanddisability.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biofabio.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biofeedbackcalifornia.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "biofourmis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biofuels-news.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biogeosciences-discuss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "biogeosciences.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144544,7 +144014,6 @@ { "name": "bizvibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bjoernblessin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bk-installatietechniek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bkdgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bkdr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bkoradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bkpictures.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -144689,7 +144158,6 @@ { "name": "bouma.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boundary.london", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boundindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "boutique-box-internet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "boutiquecarerecovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bouwklikshop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bouwklikweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145015,7 +144483,6 @@ { "name": "cazenovecapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cba.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbc-network.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cbcexeter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbhf.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbmconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cccadvocate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145233,7 +144700,6 @@ { "name": "clim-past.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "climarte.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "climate-film.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "climatebrick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "climatechangedmit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "climatesafepensions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinea.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145285,7 +144751,6 @@ { "name": "codecentric.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codecnetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codecs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "codekitchen.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codeocean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codeseek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codesync.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145703,7 +145168,6 @@ { "name": "dcdrights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dcearlychildhood.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dcmedical.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dcseu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dctransparency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ddai.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145739,7 +145203,6 @@ { "name": "defactofit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defaults-write.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defenseorchestrator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "defenseromania.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defensivedriving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defispot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "defyner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145787,7 +145250,6 @@ { "name": "dermacare.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dert.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dertouristik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "desede.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "deseks.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "designacademy.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "designerrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -145980,7 +145442,6 @@ { "name": "doukhobor.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "downloadmorestorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "downtowndoverpartnership.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "downtownontario.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doxford-engine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doxradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doxradio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146050,7 +145511,6 @@ { "name": "dwavgs888.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dwqr.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dyln.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dynalogix.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dynarex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dysnomia.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dz-hip.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146267,10 +145727,8 @@ { "name": "electronicshelpcare.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "electrum-mona.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elefantcms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elegantseagulls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elejido.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elekta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "elektrotechnik-schwab.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elemmental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elemy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eleneshome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146421,7 +145879,6 @@ { "name": "episource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epnuffic.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epobocka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "epoqueevolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epressrelease.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eprisephoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "epsilon.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146489,7 +145946,6 @@ { "name": "euphoriareign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eupl.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurapp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "eurekka.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurobahn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "euromat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eurometal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146753,7 +146209,6 @@ { "name": "flickerleap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flightdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flipacoinonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "flockler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "floppy.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "florencehc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "floriane-even.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146811,7 +146266,6 @@ { "name": "formstack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "formularapida.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "formulatedby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fornex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forrest79.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forro.london", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forteprenestino.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -146972,7 +146426,6 @@ { "name": "galileonet.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gammagroup.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gandhiashramsabarmati.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gandour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ganoderma4in1coffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gansevoorthotelgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gantlaborde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147146,7 +146599,6 @@ { "name": "gks-bildung.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glaminati.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glasengel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "glassboxtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glasswall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glattbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147172,7 +146624,6 @@ { "name": "gloverscast.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gluek.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glyphobet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "glyptoteket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gmmb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gmv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gnacsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147186,7 +146637,6 @@ { "name": "goalswizard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goarsmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gobeyond.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gobo.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gobsn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gocar.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147353,7 +146803,6 @@ { "name": "gupy.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gurmat.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gushi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gutex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gutterjunkies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gutzfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gvn.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147367,7 +146816,6 @@ { "name": "gymedin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gymless.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h2oinnovation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "h4bchelsea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "habana.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "habibbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hacialahuelgafeminista.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147766,7 +147214,6 @@ { "name": "ica.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icade.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icanbecreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "icbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icbda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icccad.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icdgroup.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147953,7 +147400,6 @@ { "name": "inquestconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insbright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inscape.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "insegment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insideuniversal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insightsvt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "insighttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -147975,7 +147421,6 @@ { "name": "integ.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intellar.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intelligentgo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "intelligentlegalsolutions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intellisoft.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "intenseo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "interactivemedia-foundation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148225,7 +147670,6 @@ { "name": "johnlecarre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnnyinscatola.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnrdockendorf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "johnschroeder.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnsonsexpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johntopley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "joho.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148312,7 +147756,6 @@ { "name": "kafshetebi.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaia-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaiserburg-nuernberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kalankit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaldi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kalhotkomat.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kaliartistry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148398,7 +147841,6 @@ { "name": "kettcar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kettleworx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ketv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "kevhealy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kevinmcphotograph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kevinwoodphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "keytomylime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -148662,7 +148104,6 @@ { "name": "launchconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laurieshieldsdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lavozdeanza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lawpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lawtrend.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lawyersnew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lazarev.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149126,7 +148567,6 @@ { "name": "massivebio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masstech.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "masterscast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "matc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matele.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mathux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "matiasbrunacci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149397,7 +148837,6 @@ { "name": "mkm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlokcleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mlq.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mmdriving.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mmeaeasterndistrict.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mmimicro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mmquality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149438,7 +148877,6 @@ { "name": "mojizuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mojizuri.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mokenney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "molaclothing.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mollyjayne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "momentosfriko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "momentum-tech.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149529,13 +148967,11 @@ { "name": "msmc.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mtb.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mtex.net.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mtnbikeriders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mtogc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mujeresparalasalud.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mukio.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mukurtu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mula.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mulligangear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "multibanco.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "multicharts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "multihog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149630,7 +149066,6 @@ { "name": "myramadanmoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myriadhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "myriation.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "mysimsem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysterytag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mysumber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mytaxindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149723,7 +149158,6 @@ { "name": "ndpta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nealemorison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nearbees.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nearform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "necrat.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nedco.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "neelscastillon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149865,7 +149299,6 @@ { "name": "nitnemsahib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nitrd.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nitro-tv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nixny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nizuc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "njmap2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "njoyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -149957,7 +149390,6 @@ { "name": "ntarasioannis.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ntdse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nte.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ntma.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ntnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nujek.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nullcon.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150093,7 +149525,6 @@ { "name": "oneontahighalumni.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oneplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onepointtwocapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oneskin.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onesoccer.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onestepgps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onesub.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150267,7 +149698,6 @@ { "name": "palmaroyale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palmgrovefarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palmknihy.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "palmmedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palmspringsairmuseum.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palumboeditore.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "palyvoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150305,7 +149735,6 @@ { "name": "pardiso-project.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parfin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parhoonshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "parisaeroport.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parisalignedinvestment.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parkandroam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "parkaue.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150431,7 +149860,6 @@ { "name": "petlja.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petnetid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petrapsy.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "petrolicious.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petskb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "petsmartcorporate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pewhispanic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150780,7 +150208,6 @@ { "name": "puertocadiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "puertomalaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pugscore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "pulvajewelry.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pumascan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "pumasecurity.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "punchdrunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150872,7 +150299,6 @@ { "name": "radio1.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radio7.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radiogra.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "radioj.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radioklara.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radiomonoster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radioplanetario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -150961,7 +150387,6 @@ { "name": "recode-lang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reconciliatecondios.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reconyx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "recreus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "recycle-it.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "recycleit.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "red-team.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151093,7 +150518,6 @@ { "name": "riceforafrica.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richardepiggle.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richardrosario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "richardstengel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richerenches.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richtek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "richter.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151285,7 +150709,6 @@ { "name": "safeguardproperties.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safeproject.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safespaceresearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "safestbettingsites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safetypay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saffle.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sagegateshead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151503,7 +150926,6 @@ { "name": "semboyan35.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "semidotinfotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "semisupervised.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "semkins.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sempel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sen-uni-lu.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "senadaadzem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151518,7 +150940,6 @@ { "name": "sentinelone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sentral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sentrysoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "seo.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "seoulsummit.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sepadental.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sepio.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151533,7 +150954,6 @@ { "name": "servier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "servingdumplings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "servipizza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "serviz.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sesamesoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "session.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sestable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151758,7 +151178,6 @@ { "name": "smartcarleen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartcentsforlife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartedupadangpanjang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "smartenspaces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartlivingmama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartology.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smartpostapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -151955,7 +151374,6 @@ { "name": "squadcoders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sragnar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sreality.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sron.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srpcleanenergy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "srtr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ssbcheyenne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152051,7 +151469,6 @@ { "name": "stimaging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stirchleybaths.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stiridecluj.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stiridiaspora.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stjameswest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stjohnskids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stjv.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152086,7 +151503,6 @@ { "name": "strategieliberte.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strategysystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "straykidsjapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "streamlinecarwash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "streamnetlibrary.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "streamr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "streiche.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152299,7 +151715,6 @@ { "name": "techjeny.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "techjournal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technikforum-backnang.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "technmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technologies-ebusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "technologylawdispatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "techpartneralliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152645,7 +152060,6 @@ { "name": "thirdlinefp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thiri.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thirstys2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thistle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thistle.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thmarch.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152664,7 +152078,6 @@ { "name": "thunderclient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thunderlotusgames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "thuprai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "thz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tib.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tic.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ticket-9.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152695,7 +152108,6 @@ { "name": "timeless-hairstyles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timesdelphic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timetap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "timetravel-vienna.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timogrossenbacher.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "timroes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tinggly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152756,7 +152168,6 @@ { "name": "tooltester.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toom-baumarkt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toom.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "toonboom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "toowoonbayhp.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "top10usenet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "topangiangaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152802,12 +152213,10 @@ { "name": "tpbafk.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tpcases.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tpctrevisobay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tptlive.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tptq-arabic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trackle.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tracymarinophotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradeledger.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tradeorado.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradernet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "traderssec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tradersvillage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -152917,7 +152326,6 @@ { "name": "tulanehillel.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tulanehullabaloo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tulsahistory.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tuniclick.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tunneymunney.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tuportaldelempleado.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "turbinehq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153038,7 +152446,6 @@ { "name": "unicommerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unicz.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unilim.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "unioncountyweedcontrol.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unionems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unisg.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "unisonglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153278,7 +152685,6 @@ { "name": "visorando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "visorando.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vistatalmidim.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "visualfabriq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitacura.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vitechteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vithas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153574,7 +152980,6 @@ { "name": "winterwind-productions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirsindderwandel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wisconsinacademy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wisdomathena1000.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wise.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wisers.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wishtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -153950,7 +153355,6 @@ { "name": "agronorte.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahg67.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ahmed.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ai.co.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aibios.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aicano.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aidenisik.scot", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154063,7 +153467,6 @@ { "name": "appiancloud-dynamic.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appiancloud-static.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appiancloud.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "appkc9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "applecommunity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "appleminded.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apptokens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154143,7 +153546,6 @@ { "name": "aumc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aup.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aup.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "austickcarremoval.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "auto-ecole-du-tursan.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autoamericas.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "autoexplore.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154216,7 +153618,6 @@ { "name": "beachfrontllc.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beaks.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beamdisinfo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beautifulcanvaspaintings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beautystudio-linda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bebra.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bebra.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154230,7 +153631,6 @@ { "name": "bedienungsanleitung-deutsch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bedireg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bedtimereviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "beebipood.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bees-portal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "belcoda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "beleaf.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154367,7 +153767,6 @@ { "name": "bryansk-news.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bsdcityliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bsslesin.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bsure.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bsure.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btpritikin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154457,7 +153856,6 @@ { "name": "cbg-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cc.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cc3a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cca.edu.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cccglp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccdcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccgpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154493,7 +153891,6 @@ { "name": "chernovcy-news.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chevychasetrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chezfalco.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "chigwelltreeservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chinainluxury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chita-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chokesngags.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154531,7 +153928,6 @@ { "name": "clinicamiromarbella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clinicasoma.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clonidine.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "clothinghunter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clou.tt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "clouddownunder.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cloudfleet.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154602,7 +153998,6 @@ { "name": "corriestmedicalclinic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cosamcontracting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cosplaysr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "costabike.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "count.town", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "court-colman-manor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "covettrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154694,7 +154089,6 @@ { "name": "damuliene.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danbrookes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "daniel-cox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "daniel-ip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danparkercarpentry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darbgaldi.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "darienboyshockey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -154860,7 +154254,6 @@ { "name": "donnellymech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "donutchurroworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "donwana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "doon.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doorlifted.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "doorlopendereisverzekering-vergelijken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dopequickreads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155184,7 +154577,6 @@ { "name": "flvs.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fly.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "flyingtomorocco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "flyreno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fmanuelsg.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "focusetlumiere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "focusrtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155198,7 +154590,6 @@ { "name": "forexsignalroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forexwinway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forlita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "fornonardona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fortressgb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "fortunafunds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "forumcommunity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155254,7 +154645,6 @@ { "name": "gacheamotors.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gahzly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "galacticashirts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gam-motos-parts.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gamenetwork.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gameszone.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gamingaccessories.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155302,7 +154692,6 @@ { "name": "getcleanworx.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getkeyport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getment.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "getmojito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getrealgifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getroom.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "getthink.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155447,7 +154836,6 @@ { "name": "harperreed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hassana.com.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "havenquilters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hayhurstrealestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "haysfinancialgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hcai.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "healthefoundation.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155457,7 +154845,6 @@ { "name": "heartofthemidlands.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heda4etak.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hederatech.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "heenshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "heitepriem.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hellenichandmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "helmerinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155532,7 +154919,6 @@ { "name": "hungu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hunterhi.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hustlersuniversityapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hw.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hxcrr.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hxnnxs.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hydrauliikkakauppa.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155547,7 +154933,6 @@ { "name": "hyultis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hyzure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hzuuuz.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "i110.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i2forensicmasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i3c6d0s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iamexperts.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155568,7 +154953,6 @@ { "name": "if-news.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iftta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ifyou.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "igame.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "igc-market.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "igtsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iiepeer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155794,7 +155178,6 @@ { "name": "karkkainen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karlapepe.lel.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karlhaworth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "karosello.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "karpierz.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kashmirdmc.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kasteelhoensbroek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -155938,7 +155321,6 @@ { "name": "lawkwk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "laxammo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "layx.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lazuardy.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lc-cloud.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lc-home.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lckube.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156522,7 +155904,6 @@ { "name": "one-acleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "one-pass.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onejustice.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oneleaf.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onestopsafetysolutions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ong.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oni.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156533,7 +155914,6 @@ { "name": "onlinecodechalao.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlinefilerepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlyprootechs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "oompf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oooir.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oooo.plus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "opalstudio.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -156818,7 +156198,6 @@ { "name": "qms.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qnanotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qprcaquatics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "qsecure.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "qualidiag.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quanticlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "quape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157217,7 +156596,6 @@ { "name": "skynotify.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slavyansk-news.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "slimonomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "slowinver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smaltireraee.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "smart-cash.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157340,7 +156718,6 @@ { "name": "strom-mit-system.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "strongcitiesnetwork.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sttheresacatholicschool.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "stuartmcbride.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "stucki-sanitaer.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studiobrandano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "studionerisabatini.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157629,7 +157006,6 @@ { "name": "ttsvisas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tudonalinha.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tuffdall.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tugedr.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tuinhout-compleet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tula-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tula-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157645,7 +157021,6 @@ { "name": "twinlimousine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "twistedservers.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tycom.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "typewell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "tyumen-news.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ubeen.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "udeca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157726,7 +157101,6 @@ { "name": "veluno.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "velvetpayments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vendiot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "venecleanus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ventasdeseguridad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ventolininhaler.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ventrata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157782,7 +157156,6 @@ { "name": "vnbctv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vntyper.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vocalaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "vocalshirts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voda-nadom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voicimonavis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "voidnya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157863,7 +157236,6 @@ { "name": "vuzopedia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vybaveni-firem.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "w3docs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "w996.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wackaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wackyaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wagener-gmbh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -157951,7 +157323,6 @@ { "name": "windsorhoteis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "winefortune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "winning.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wipeit.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wiproccs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wirtgen-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wisdomacademy.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158014,7 +157385,6 @@ { "name": "xn--y3cri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xnine.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "xoso66max1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xpertva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xsarius-tv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "xsauto.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158126,7 +157496,6 @@ { "name": "7.ls", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7dots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7pool.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "7skyco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "9ranks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "a-kang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "abelordbalagtas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158175,7 +157544,6 @@ { "name": "almazroueigroup.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "along-the-coast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alpinisci.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "altror.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ambros.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amm-ceramics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "analytixen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158191,7 +157559,6 @@ { "name": "antsiferov.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anyservicemanuals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "anzio.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "aogas.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aoronyx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "apexkk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "api.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158292,7 +157659,6 @@ { "name": "bszpy.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "btbusinesshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "budsforbuddies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "bulkmagic.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bulutimza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bulutimza.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "bunyancbi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158405,7 +157771,6 @@ { "name": "cybernetworkglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "czech-budowa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dahlberg.cologne", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dailyproductsclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danielfukuda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dargrad.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "data-mirror-72f6ffc87917.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158581,7 +157946,6 @@ { "name": "goz.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "grantpeier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "graphicalsystemsusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "greater.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gttnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gustoclean.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "guzek.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158648,7 +158012,6 @@ { "name": "humiliate.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "i9assessoria.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ibells.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ibharatkhabri.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ibwil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icawds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "icejusa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -158769,14 +158132,12 @@ { "name": "learnwisego-stage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lebanese.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ledhive.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "legrandbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lekkerkofi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lespetitschiffons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letsclimact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "letwork.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "level-assist.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "license4j.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "lifecoachroel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lifemaintain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lifesciencedynamics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lifestylemanagment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159093,7 +158454,6 @@ { "name": "saijanmasthan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saintalthegreat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saiserve.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "salescircle.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samarc.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sambi.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samplehc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159285,7 +158645,6 @@ { "name": "ukdri.ac.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ukfinancialplanning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "umdasch-madosan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "umiksmart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "underconstruction.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uniclejess.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "updating.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159295,7 +158654,6 @@ { "name": "urbanpursuit.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "urlss.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "usadocnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uubilng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "uwrgarlingtontx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vaamflytt.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "van-rutten.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159613,12 +158971,10 @@ { "name": "cbg-engadin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cbmvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cci.org.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ccloyaltyclub.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ccnda.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cellsys.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "centennialpainters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "centerpilot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "centralimpressos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "centrumvrijwilligerswerkhethogeland.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cfc-stmoritz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cforesources.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159771,7 +159127,6 @@ { "name": "eatpolkadot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "echameuncable.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ecreatorshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ectinfra.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edalive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "edith-thellmann.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "educationfinancenetwork.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159808,7 +159163,6 @@ { "name": "esy.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "euler.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eventosclick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "everteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evo-exchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "evolutionmuaythai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "exvega.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -159896,7 +159250,6 @@ { "name": "granitebaydermatologyandlaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gripvol.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "groupe-optimum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "growthbutton.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gt-ps.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h2breeze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "h4k.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160015,7 +159368,6 @@ { "name": "ksenoris.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ksteamship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "kwsoos.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "l3n.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "labmanager-lis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lackiererei-repx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lakashirdetes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160234,7 +159586,6 @@ { "name": "onecore.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "oneviewhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onguard.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "onlinecashloanz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "onlineydscenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openbackdoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "openchipplatform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160352,7 +159703,6 @@ { "name": "reefpark.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "reesefortraviscounty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "regentchair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "regg.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "removalsandstoragex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "remsi-e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "renaultduster.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160383,7 +159733,6 @@ { "name": "safetycomply.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samamoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samaraleaders.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "samelectricltd.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samquick.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samuvit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sanodent-focsani.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160444,7 +159793,6 @@ { "name": "smoothsnap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snail.observer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "snakeoil.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "softcleanr.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sola.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sosysadmin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "soundfingers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160573,7 +159921,6 @@ { "name": "travelchinawith.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "travelingsavvyseniors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trekbible.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "tripyana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "truckslogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trueimpactsigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "trustedstack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160625,7 +159972,6 @@ { "name": "wbmonitor.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wbmonitor.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wbpersonalmonitor.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "wbpgroup.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weiterbildungsmonitor.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "wellnesscoaches.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "weltraum.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160690,7 +160036,6 @@ { "name": "1b.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1bar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "1plus1tv.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "22emesiecle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2rings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "2to.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "345404.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -160963,7 +160308,6 @@ { "name": "cursosbajoprecio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cve-wizard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberbs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "cyberd.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberfortress.security", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberlaracom.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cyberti.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161021,7 +160365,6 @@ { "name": "dreamconnect.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "drobny-app.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dstechnologies.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "dstechnologiesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "duaputra.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dubachinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "durust.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161044,7 +160387,6 @@ { "name": "elementarythegame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "elfreelancer.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eliteheatgroup.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "embark.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "eminencecapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "empresasavenda.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "emy.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161140,7 +160482,6 @@ { "name": "gaelle-esthetique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gamestic.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gaminglog.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gaoice.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "garten-kresse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gassafetymanchester.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gayporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161872,7 +161213,6 @@ { "name": "vertinext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vessurvey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vetexpressmobilevet.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "viajesotur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viaknit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "viciadasemesmaltes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vietnam-melbet.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -161949,6 +161289,1298 @@ { "name": "ztt.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zuydgroep.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zwalm.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10jahre-govet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10jahre-govet.international", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1rail.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1tamilyogi.vote", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "45shiki.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4surfers.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4your.business", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7nets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "8i8.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaanya.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaapurse.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "academicalacrities.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aceenergy.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ach-portal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acme-dns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acme-dns.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acme-ssl.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acme-ssl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acquario.genova.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acstallningsmontage.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adarsh-pandey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "addexpiresheaders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adeptasiaconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "admin24.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advancedwcanalytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adventurouswomen.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aegis-bot.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aegissec.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aerofestival.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "affittacamere.firenze.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afiliado.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aflalogasperini.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agenciaalafia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agroequipos.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahd-cyber.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahjindigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akamslinkphoneqr.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akamsnetworksetup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ako.gl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akuluarabadunyasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "al-etraaf-belmoahlat-fi-almania.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "al-etraaf-fi-almania.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alarmreceiver.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alberosano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alberttalkstech.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aleman-auto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alienpls.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alljobspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alltracon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almaghrebsport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almanyada-denklik.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almanyada-denklik.info.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphaagency360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphaeducation.edu.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alpinenursinghome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alrashid-law.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alrowadexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alsgourmetsausages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alvicom.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amadmission.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amarsolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amazoncreatica.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amber-backend-app-826d62a5abda.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "americanreels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amirmarketanzali.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amplify.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "analiespantry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anarchistmedia.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andesiel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andrew.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andydominiquerak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anerkennung-in-deutschland-antragservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anerkennung-in-deutschlandantragsservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anerkennungindeutschlandantragservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anerkennungindeutschlandantragsservice.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "angelnumbergenerator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aniartacademies.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anthony.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antizanzare.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antragsservice-anerkennung-indeutschland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antragsserviceanerkennungindeutschland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antunes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apcmc.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "api.spa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apostrophe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apprenticeship-toolbox.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apropoaalst.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arabc.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aranc.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arcos.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arctic-store.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arizeruk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artlifehome.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arzeshyabi-dar-alman.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asb-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aseelanimalhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "askatechnicalquestion.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "askbrake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asyncura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlanta-airport-parking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atomready.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atomrss.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atribo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atribo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "audiofanzine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auroregaucher.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbilden-wir-machen-mit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbilderplattform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbilderplattform.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbilderportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ausbildungplus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auslandberatung-ausbildung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auslandberatungausbildung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auslandsberatungausbildung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoaddz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autocarrot.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autocarrot.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aventurateaviajar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avilauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aylanelli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azubis-ins-ausland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azubis-ins-ausland.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azubisinsausland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azubisinsausland.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "back0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baic-versicherung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bardoferry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barongoldsteindesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bauplanmanager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bdmarketer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beacongaragedoors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "become.education", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "become.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beemdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "belegstelle-glashuette.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bellylaughliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berget.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bertolinoengineering.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berufszertifikate-und-diplome.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beskar.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bestofbackyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betfjord.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "better.ad", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettertogetherphysiciancoaching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betweenbuns.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beyondsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bfh24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bhrc.wa.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigelkconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigmoth.gotdns.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biofire.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biohkw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biored.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bjksportscentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blanchot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluehaven.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluehentai.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluvacanze.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bold-fabrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bonificaamianto.lazio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borisfx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "botschaft.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boysontech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bpx.exchange", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bpx.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brainwaveboost.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breezly.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bricmon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridge.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brief.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britishvillage.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brocanteur-debarras-paris.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bsfamily.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bskmt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "businesswise.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.haus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.memorial", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buswell.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buyganodermacoffeeonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buzzkill.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caelandrayer.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cakebreadsnowgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calderacyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calivillalonga.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calorioapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cameraforensics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cancelli.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canny.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capitalcitycatfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capsugel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "captcha.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caraudioworx.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carinacodes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cartenova.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casanovamilano.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caseright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caseright.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casesandclues.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casewareanalytics.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casino-poker-tour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinodebeaulieu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinodecavalaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinotop1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "catalogosdemujer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdsc.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centella.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centrovenetoservizi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centurion.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cg-srv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cg-srv.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chanska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chapters-eg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chariot.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chat-insel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chingjyu.cyou", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chipdesign-germany.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chitownblackcars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "choptheknife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christchurcharmley.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chullostravelperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ciecompraenlinea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cistic.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ckp.eg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clash.taipei", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "classificazionerifiuti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clearwaymind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "climatizzazione.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "climbingmounttoubkal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clinicadentalramoscatalina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudaware.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clu.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cmo.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cmtk.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coachemocionalmentesaludable.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coastwideweb.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cocktail-express.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "code-beacon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codeactive.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codeactive.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codexlog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codinggirl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codinggirl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codybrunner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cognitive-enhancers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coisapet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collateralloanshawaii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "college-sewing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collierlittler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comp-consultants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compostodesucesso.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comprarlomejor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compumasapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conapdis.go.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "concellodeortigueira.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connactz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "countdowntomagic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpsnap.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crackstreams.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craftycove.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cre-pf.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crea3dsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crewtaskglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crimeid.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crispregional.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crj.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "croissancelocal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "croydondrive.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crushedice.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cryptogaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cssrstransports.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ctrlalto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cubotic.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "curisdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "curriculumciudadano.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cursosdepestanas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cut.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cutegifmaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cworkflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cwtv.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cwtv.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyabra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybelesoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyber.irish", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberinfraarmor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberproud-deli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberproud.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cygenx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyp.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "d3drone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daikoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daikoz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielberanek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielle-picchetti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dark-manga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datadus.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datenkrake.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "davidzelenka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "davtyan.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dawi.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dbkc.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deletecat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "delv.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demg-investors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demolire.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denniksport.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dennstoree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deondernemer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "derball.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "designceramika.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deunopostenacional.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "devopsfreelance.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dfsk-versicherung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dialogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digifun.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digireg.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digistore.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalaplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digiwedoo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dila.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diobrasperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discoverx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discuss.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disobey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dissention.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dobremedia.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dobrenoviny.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dobreradio.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctorsatdoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctosofi.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dondonya.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doorlinkplus.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dovodlaw.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dpid.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dreherit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "driveo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drmaniplastics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drtrupiano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dukemaps.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dumpsternationfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "duschkabine-shop24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dutchdevelapp.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-biofire.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earlyyearsaward.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecemi-alu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "echoesin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecopond.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edboothandassociates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edgex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "educationcluster.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edvberger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eheberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eheringe-shop24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "einvworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elblogdeldinero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eldin.ba", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eldinturkic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elhombreinvierno.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emailassist.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "embassyindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "empowerhealpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "encentfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enduro-center.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "energiaelcorteingles.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enggrup.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "englandgenealogy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enjoys.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enorness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ententaxi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eprice.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "equalityhealthcareservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ergosg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "escortify.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "estheclinic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euroindia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eventoopartyrooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "everestplus.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ewarranty.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ewigkeit.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exoatlas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exosys.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "experts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expobusiness.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eyaqueen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ezmedix.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "facil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fakecrime.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "falcony.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "famenneartmuseum.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "familyace.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fashionette.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ffazeshift.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fido.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fieldgroupny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "figma.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "files4share.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "findmeapp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "firenneon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "firmamaja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "firsattilkisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitnutkatie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitssey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flagstri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flamellugano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flamingo-shop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flearfarmcottages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "floatsys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flrs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foodgenieai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formap.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formulados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fouadvollmergut.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fractallatcarf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "framenails.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "framotec.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frank-vincent.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freightscore.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fruitware.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fsaddons.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fujivibe.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "functionalmedicinetraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "furrerhugi.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fusioncx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuzoku-h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fvledilizia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g9kingnine.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ga4wp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gafisa.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galacticmedallion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "game.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gameapps.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamers4funchannel.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gandioli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ganodermacoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gdwtowbars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geasrl.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geeks.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geitex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "genyo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geohunt-tokyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "germanpest.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geruestbau-grupp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "get2career.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gilribeirofit.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ginesenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glascentro-gmbh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glascentro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glastuershop24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "global-inwest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globalservice-am.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goldenfashion.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gonlinesites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodydoggy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grampage.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grandhoteltynemouth.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gravat.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graydaze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greymouthkiwi.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grupodesbrave.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grupokls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gsrank.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gta.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gta.vi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gtrtc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guardiancappartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gurusewa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gymnertia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gz999.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h2.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "h2o-securities.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haaglandenglas.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "habitationsfontaine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hackersgurukul.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hadan-it.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hamzahlabs.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hanakat.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handler.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handler.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handlerparts.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handmadebyblueberry.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hanimazhar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "happennino.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "happy5thwheelers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardtodo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hasankayra04.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hayalhanephotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hblbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "headpats.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthvitalzone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthwaymedicalnetwork.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "healthyeatingbenefits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heartcodelabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heatwrap.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heike-koltermann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heliguy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hellonest.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "helpguru.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "henrimalhas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hensiek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heos.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hermaj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hiattlawaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hicopy.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highmans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highskillacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "historictoxaway.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "holanuevayork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homelykw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homepage.help", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homewoodworkplans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honess-water.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoppy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "horizon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostoro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "housecleanerslongmont.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoyabit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hpthealing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hrcp.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hugheshandymanservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hungphatlaptop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperfuse.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperfuze.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iadschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "idaz09.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "idh.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ignca.gov.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilpuntomagazine.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imboxing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imkerei-bad-oldesloe.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imtqy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incenfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incentafit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incentbit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incentefit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incentfit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incentifit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incntfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indihomeofficial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indushospital.org.pk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infinitewealth.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infobellit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "infyz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "initializeai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inmigracionjusta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inovarmetaisonline.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inovigo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inphima.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inspiresandinnovate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "io-markets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iotrasloco.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ipadresse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ippudo.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irissoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ironwoodlabs.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irstaxforumonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "is-fund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isolation-thermique-exterieur.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "it-support-schmid.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itbfrance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itechhacks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itpeox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itreply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itsmeit.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ivaniglesias.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jcbank.com.jo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jcx.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jenkins.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jevremovic.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jfkvirtual.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinspace.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jitkamahdalova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmbaxico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmbaximarineservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "joblyconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "joeysslimeventure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnnyrelease.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jokinglybad.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jomslot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jordanjherrera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jptv4.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "junkcarremovalbrampton.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jusdocs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "k8ja.co.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kalendar.com.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kamataworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kapakinig.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karpatinfo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kasc.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaushikparui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kbobath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kdm.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keepcoolnewmom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kemppi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kendo-ueda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keyandswirl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khobor.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kidsweek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinegun.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kingswinehaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kkpig.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klinikpsikologonuraydin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klinkens.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knovos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knugen.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koinpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kojast.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "komi.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koparrestaurant.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kovroedov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kraflix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krizovkarik.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krrt.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kupisafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuroedov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurrabagroup.exposed", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lab-test.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laget.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laisvesknygos.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lapeyre.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasvegas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasvegas.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasvegas.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasvegashotels.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lauruslabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lecolehk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leleviagens.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lens-soma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "letourneaudistributeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "levinholidaypark.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lhero.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lhfund.co.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "librerose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "licitor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifecelebrated.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lihatvirtual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lineinchina.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liobet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lipetral.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lisansall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liso.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "litebattre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liuyan.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loanservicing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "localenv.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "localhero.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loeilducontinent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loganj.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lonely-mountain.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "longlanepasture.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lothiandomestics.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "love-damono.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lrnewenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucafrancesca.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lulasaga.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lulu960.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luminabh.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lymecraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lynki.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m-partners.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "m-r-team.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mabex-cybercore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mabexcybercore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "macs4seniors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magiccardbuyer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mainlandapp.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maisciencianaescolams.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "majk.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manualdousuario.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "margaritamun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marienolandmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mariokartworld.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marujapiruja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marx.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marxists.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marxists.sbs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mauiadventuretourskayakco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mave.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mavericklive.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mawrid.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maxilife.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mayfairlimo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazudh.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazudh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazudh.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mazudh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mbmbuild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mcar5b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mcr.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdigital.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meandliora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meapp.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mecafresa.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medcheck.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medicalrules.servebeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medizinstudium24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meedia.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meengan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meezjewelry.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mehdiqurancenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mehllegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mei-xin.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meizitu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mejoresencuestas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mejorlaptop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "menelaostore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meplusliora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "merisratings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "merzougaonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metamarkettrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mhmchauffeurs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mhp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mielkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mihanroid.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mijnstembureau-lelystad.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mijnstembureau-meppel.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miltonbaby.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miltonbaby.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miltonbaby.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minasverde.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minigameuniverse.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "misinforpedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mitfreespeech.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mixxie.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mlotfycarrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mmanea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mnbwnetrza.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mo-sick.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moalboaladventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moneysmart.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moreclarity.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mostamaracademy.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motabilityoperationsrecruitment.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motorcityalignment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motoreflex.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrmeticulous.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mslinkpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mslinkphoneqr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "munisiacs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mustdonewzealand.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mxlink.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mxradar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mybetterlife.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mybzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mygoalguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myitero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mykad.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mymoranguito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myschoolelection.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2023.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2024.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2025.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2026.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2027.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2028.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2029.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2030.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2031.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2032.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mz2033.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzakariya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzcdn.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzdy.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzdy.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mzly.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "n-ag.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nabthat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nachhaltige-anleger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nachnamen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nagaya.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nagorik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "najada.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naohasa.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "navoice.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "navoice.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nbri.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nederlandseloterij.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neuropsiperches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newflyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newstoter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newtrendsbykate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyork.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkattractionpasses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkcity.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkcity.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkcity.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkcity.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newyorkcity.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextdyna.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextgen-mw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nfclegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nfo.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nirinarabeson.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nirvati.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nmhincorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nmshippingshield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nofraud-test.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noldor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nomadgrowth.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nona.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nordkampen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nordkampen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novinvisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novoshoes.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "novus365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nowysacz.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nuevayork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nuevayork.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "numericolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nuuls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nyb.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nylonova.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o-o.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "o00o.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oasishealth.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oberpfalzverein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oblat.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ocadefusion.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "odosermou.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oh64.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldskoolanthemz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oldskooltunes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olekotenizavivki.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olennolla.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olerth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oltayagelme.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omgdevil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omgidol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onecloud.nsupdate.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oneinternetamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ontreams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orap.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orbaden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oro97.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osiriz.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osnovazabor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oudersvannu.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ozat-tools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p.lease", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pablodominio.sbs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pablogracia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pactnetwork.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pagodil.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pagoonline.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paigetan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "palermo-plovdiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "palngdev.wpenginepowered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pangge.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panhandlefloridatlhkce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parametricaeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peaktribe.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pemangkin.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perlei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "personaltransporter.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "personnalisathion.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pested.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "petbr.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phol.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pierrot-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pile.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pixelbattle.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planepost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "platord.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pokemoncentral.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pondsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poohcottage.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "popstockapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "portall.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "portcullisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "postermaniacs.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "postkassetrimmen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powerembedded.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powertuning.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ppcpump.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prairietechsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "premier-mt.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "premiumsleepingbags.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prenataldnatesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prendsendelagraine.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prettynightjob.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prevascloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prevencia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "preview.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "priczone.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "princeruperthotel.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "problemlos-privat-versichert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prodcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "produttori.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "projectfriends.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proofby.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prudentialzenith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psychedelia.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "puppiza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "puroprazer.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qibgroup.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qozido.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qq-p.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qstpcj25427.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quai.ly", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quantumdynamics.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quanyin.edu.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qubit.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "queryguard.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quinnappliances.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "racketlonindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ragingbearinteractive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rampal.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rampal.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "raniperearstikeskus.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rapidwater.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rayensalud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reachlawtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "realcdn.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "realworksforms.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "redeyenetworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regaltruckrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reiswegenhulp.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "remzi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rendatododia.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renner-und-koenigk.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renovationmp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rent-bot.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "residenzaperanziani.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "restauratori.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "restock.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "restorationgroup.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retailzpos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retalicecream.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "retrogarb.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rifiutozero.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riseabovecredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robinloeffel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robpot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rockpov.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "romesite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ronchonrongeurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rowan.fyi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roy-space.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rufei.wang", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rutice.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safecode1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "safetytools.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saginawtx.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sahilten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saltedfishes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samisallinen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samsat.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sandbar.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanignaciomun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sannhakhoa.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "santihealth.co.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saradahentai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sarahharrisphotography.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sashroy.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saveyourbusiness.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schmeckaner.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schmetzneedles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schoolstreaks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sea-force.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "searx.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seavisiongroup.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sebastianwyder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sebeobjevovat.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seecdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sefareshpardeh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sejambemvindosaofuturo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selea.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sell.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sellorbuy.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sellorbuy.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sercanazizoglu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sericle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serradiesel.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "servispcznojmo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "setorneinvestidor.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "settleinestonia.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sewasafal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sexopolis.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sgm-eng.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shawfactor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shelly-forum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shifters.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shinshu.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sigedtour.gov.bf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simcoepestx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simexamericas.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sinopec.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sinuel.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sipse.gov.bf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sistemano.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sixstarwellbeing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skillnestpro.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skloposud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skyeto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skyler.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skyltd.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sleeptrain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slippagetolerance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sls.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartiflix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smereka-frnt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smilingcfo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snd-rhein.ruhr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softcreatr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softcreatr.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solu.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solvd.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sound.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sourceproject.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spaghettispeller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spec-antikor.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "speztech.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sportscpg.bi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sqlwrapper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "squaremeter24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ss.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staarwaarsserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stackroute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startinnov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startuphakk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startwithcompassion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stepxpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stesmarteyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stichelbaut.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sticonline.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "story.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stratusfear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suegofaults.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sufundamento.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunsmartnsw.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suntropez-shop.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supermama.edu.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supportsave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supremeconcreteco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "susanahill.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sweetnest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sxyql.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "symcare.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "symplicit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "synapse76.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "systemano.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "systemno.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "takaritasmiskolc.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "talenthope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "talenthope.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tandoanh.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taodo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taxcertificationform.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taxcertificationportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taximarcaminha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taysiz.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teachingwithjen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamceleris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techgarage.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "technolove.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techrad.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techsy.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tectuc.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teddywp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tehpod.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telebari.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tenerunacasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tequilamessenger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "termoline.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "test.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thajskychram.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thankspenny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theballardpier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thebondyapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thedan.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thegreenmanofyork.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thegreenmanofyork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thelogicstudio.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thelogicstudio.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thereunion.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thewoodnorton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theworkswide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theyellowsub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thismatters.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thlautogarage.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thomasstrne-jyotish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "threatemail.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "threean.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tibagolden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tibaview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tibek-cnc-technik.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiersigma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "time.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timebucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "timewall.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tipsbymoh.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tonecircuit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tools4free.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toovendre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toptica-eagleyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "torrentpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toto.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tout-vendre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tout-vendre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tout-vendre.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.cm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.pics", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toutvendre.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toylum.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tqno.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tra.go.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tracxtms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "traemostucoche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tramin.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "transfem.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "traslochi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trasportatore.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travel4wellbeing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "travelrebel.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treasureboxhomes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tripefactorysunderland.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tripu.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trucksimply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trusted-signatures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trustted.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tshirts.durban", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuercenter.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "txokachat.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ubrains.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uea-inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ueken-ob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ulada.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ultimatefightgear.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unbollowed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "understandingmoney.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unemployedunion.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unitedliners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unitpurchaseplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unlockyourbrain.bzh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unsiteweb.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uonly.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "upidautomation.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uprizenow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uprooting.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "useworkshopapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utilajedepadure.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v-zone.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "validooo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valledealcudiaeventos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vascareclinics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vcp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vctpl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendre-tout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendre-tout.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendre-tout.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendreacheter.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendreacheter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendreacheter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendreouacheter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vendretout.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veoconocimiento.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verandering-berlin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verifiermesactions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verifymyeligibility.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veteranarmy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veterinario.napoli.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "victoriaisabel.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viernesnegro.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vilasantina.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vinehost.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visio.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visitenovayork.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "volt.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voodoobtc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vpsbudget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vpsssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vron.house", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vtechhealthcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vtwonen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vtwonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waki-ci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "walsrode-net.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "walsrode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "walsrode.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wangrufei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wayneswoodcraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weelzbahamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welava.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wesleyandpeiwenbear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wesleybear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wesleybear.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "west.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "westwardblinds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whawtheme.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitedragonmartialarts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whitehartdartmoor.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wholesaleganoderma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wildhealth.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "willows.uk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "winn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wolvex.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "womenleadingwomen.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woof.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "workwides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wrightsecurity.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wurmstube.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "www.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wxforms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wzitrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--hy1bj8u2yeo4i8lh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--incentft-81a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--ncentfit-11a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--ncentft-yyag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xonados.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xserownia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xyh.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "y337.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yado-vinyl.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yamasakit.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yarno.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yeoldemagicmag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yerelvitrin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ylilauta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yokowatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yoppoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youngsurveyors.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yourecipess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ywor.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zakiy.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zanreal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zaxid-kava.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zefirka.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zelina.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zelotech.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zemlya.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zenprivacy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zeva-mundial.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ziphealthy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zofoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zongzi.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zrampage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 199e8ded..1b1976d8 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2025-05-22 12:57 UTC +# Last updated: 2025-05-23 12:54 UTC PinsListTimestamp -1747918626 +1748004855 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index be41b91..889b999 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2025-05-22 12:57 UTC +// Last updated: 2025-05-23 12:54 UTC // { "pinsets": [
diff --git a/services/network/public/cpp/hash_value_mojom_traits.cc b/services/network/public/cpp/hash_value_mojom_traits.cc index 220a76b9..0c0f47e 100644 --- a/services/network/public/cpp/hash_value_mojom_traits.cc +++ b/services/network/public/cpp/hash_value_mojom_traits.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "services/network/public/cpp/hash_value_mojom_traits.h" #include <string.h>
diff --git a/services/webnn/tflite/graph_builder_tflite.cc b/services/webnn/tflite/graph_builder_tflite.cc index 8693b74..988ff73 100644 --- a/services/webnn/tflite/graph_builder_tflite.cc +++ b/services/webnn/tflite/graph_builder_tflite.cc
@@ -3649,12 +3649,8 @@ case mojom::ElementWiseUnary::Kind::kCast: { CHECK(data_type_limits.cast_input.Supports(input_descriptor)); return SerializeCastOperation( - input_tensor_index, - OperandDataTypeToTFLite( - GetOperand(op.input_operand_id).descriptor.data_type()), - output_tensor_index, - OperandDataTypeToTFLite( - GetOperand(op.output_operand_id).descriptor.data_type())); + input_tensor_index, input_tensor_info.data_type, output_tensor_index, + output_tensor_info.data_type); } case mojom::ElementWiseUnary::Kind::kCeil: { CHECK(data_type_limits.ceil_input.Supports(input_descriptor));
diff --git a/testing/scripts/variations_seed_access_helper.py b/testing/scripts/variations_seed_access_helper.py index 7e2a627..a3a6138 100644 --- a/testing/scripts/variations_seed_access_helper.py +++ b/testing/scripts/variations_seed_access_helper.py
@@ -90,7 +90,7 @@ # TODO(crbug.com/417138763): Update this function to support reading the seed -# from the seed file with proto format. +# and signature from the seed file with proto format. def get_current_seed(user_data_dir): """Gets the current seed.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 8feae85..5bee75d 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -566,22 +566,6 @@ ] } ], - "AndroidBrowserControlsInViz": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled_20240718", - "enable_features": [ - "AndroidBcivBottomControls", - "AndroidBrowserControlsInViz" - ] - } - ] - } - ], "AndroidDumpOnScrollWithoutResource": [ { "platforms": [ @@ -8420,28 +8404,6 @@ ] } ], - "DropInputEventsWhilePaintHolding": [ - { - "platforms": [ - "android", - "android_weblayer", - "android_webview", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "DropInputEventsWhilePaintHolding" - ] - } - ] - } - ], "DwaFeature": [ { "platforms": [ @@ -15953,6 +15915,26 @@ ] } ], + "PWANavigationCapturingAndroidDesktopWindowing": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "EnabledDesktopWindowingNavigations", + "params": { + "auxiliary_navigation_stays_in_browser": "desktop_wm" + }, + "enable_features": [ + "AuxiliaryNavigationStaysInBrowser", + "ReparentAuxiliaryNavigationFromPWA", + "ReparentTopLevelNavigationFromPWA" + ] + } + ] + } + ], "PWANavigationCapturingV2ChromeOS": [ { "platforms": [
diff --git a/third_party/angle b/third_party/angle index c1e806d..275745f 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit c1e806dec7a183ef7d85d9345d81dd0c7b1b5e93 +Subproject commit 275745ff8b294d025f3dac0eb431998442f600b8
diff --git a/third_party/blink/renderer/core/animation/css_transform_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_transform_interpolation_type.cc index 83cd0cc..860bf75 100644 --- a/third_party/blink/renderer/core/animation/css_transform_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_transform_interpolation_type.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/animation/interpolable_transform_list.h" #include "third_party/blink/renderer/core/animation/length_units_checker.h" +#include "third_party/blink/renderer/core/animation/tree_counting_checker.h" #include "third_party/blink/renderer/core/animation/underlying_value_owner.h" #include "third_party/blink/renderer/core/css/css_function_value.h" #include "third_party/blink/renderer/core/css/css_primitive_value.h" @@ -89,8 +90,11 @@ const CSSValue& value, const StyleResolverState& state, ConversionCheckers& conversion_checkers) const { + const CSSToLengthConversionData& conversion_data = + state.CssToLengthConversionData(); if (auto* list_value = DynamicTo<CSSValueList>(value)) { CSSPrimitiveValue::LengthTypeFlags types; + bool needs_tree_counting_checker = false; for (const CSSValue* item : *list_value) { const auto& transform_function = To<CSSFunctionValue>(*item); if (transform_function.FunctionType() == CSSValueID::kMatrix || @@ -107,6 +111,12 @@ DCHECK(primitive_value || (transform_function.FunctionType() == CSSValueID::kPerspective && argument->IsIdentifierValue())); + if (!primitive_value) { + continue; + } + if (primitive_value->IsElementDependent()) { + needs_tree_counting_checker = true; + } if (!primitive_value || (!primitive_value->IsLength() && primitive_value->IsResolvableBeforeLayout())) { continue; @@ -119,12 +129,14 @@ LengthUnitsChecker::MaybeCreate(types, state)) { conversion_checkers.push_back(length_units_checker); } - // TODO(crbug.com/415626999): Create a TreeCountingChecker for - // sibling-index() and sibling-count() if necessary. + if (needs_tree_counting_checker) { + conversion_checkers.push_back( + TreeCountingChecker::Create(conversion_data)); + } } return InterpolationValue(InterpolableTransformList::ConvertCSSValue( - value, state.CssToLengthConversionData(), + value, conversion_data, TransformOperations::BoxSizeDependentMatrixBlending::kAllow)); }
diff --git a/third_party/blink/renderer/core/events/promise_rejection_event.cc b/third_party/blink/renderer/core/events/promise_rejection_event.cc index c239e54e..63677b7e 100644 --- a/third_party/blink/renderer/core/events/promise_rejection_event.cc +++ b/third_party/blink/renderer/core/events/promise_rejection_event.cc
@@ -17,7 +17,8 @@ const PromiseRejectionEventInit* initializer) : Event(type, initializer), world_(&script_state->World()), - promise_(initializer->promise()) { + promise_(script_state->GetIsolate(), + initializer->promise().Unwrap().V8Promise()) { if (initializer->hasReason()) { reason_.Reset(script_state->GetIsolate(), initializer->reason().V8Value()); } @@ -25,14 +26,13 @@ PromiseRejectionEvent::~PromiseRejectionEvent() = default; -ScriptPromise<IDLAny> PromiseRejectionEvent::promise( - ScriptState* script_state) const { +ScriptObject PromiseRejectionEvent::promise(ScriptState* script_state) const { // Return null when the promise is accessed by a different world than the // world that created the promise. if (!CanBeDispatchedInWorld(script_state->World())) { - return EmptyPromise(); + return ScriptObject::CreateNull(script_state->GetIsolate()); } - return promise_; + return ScriptObject(script_state->GetIsolate(), promise_.Get(script_state)); } ScriptValue PromiseRejectionEvent::reason(ScriptState* script_state) const {
diff --git a/third_party/blink/renderer/core/events/promise_rejection_event.h b/third_party/blink/renderer/core/events/promise_rejection_event.h index 052f4de..8258e55 100644 --- a/third_party/blink/renderer/core/events/promise_rejection_event.h +++ b/third_party/blink/renderer/core/events/promise_rejection_event.h
@@ -35,7 +35,7 @@ ~PromiseRejectionEvent() override; ScriptValue reason(ScriptState*) const; - ScriptPromise<IDLAny> promise(ScriptState*) const; + ScriptObject promise(ScriptState*) const; const AtomicString& InterfaceName() const override; @@ -47,7 +47,7 @@ private: const Member<DOMWrapperWorld> world_; - MemberScriptPromise<IDLAny> promise_; + WorldSafeV8Reference<v8::Promise> promise_; TraceWrapperV8Reference<v8::Value> reason_; };
diff --git a/third_party/blink/renderer/core/events/promise_rejection_event.idl b/third_party/blink/renderer/core/events/promise_rejection_event.idl index 2885d196..693b2e78 100644 --- a/third_party/blink/renderer/core/events/promise_rejection_event.idl +++ b/third_party/blink/renderer/core/events/promise_rejection_event.idl
@@ -8,6 +8,6 @@ Exposed=(Window,Worker,ShadowRealm) // TODO(crbug.com/41480387): This should be Exposed=* ] interface PromiseRejectionEvent : Event { [CallWith=ScriptState] constructor(DOMString type, PromiseRejectionEventInit eventInitDict); - [CallWith=ScriptState] readonly attribute Promise<any> promise; + [CallWith=ScriptState] readonly attribute object promise; [CallWith=ScriptState] readonly attribute any reason; };
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc index b39ef563..64e4c3f 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.cc
@@ -86,6 +86,12 @@ reasons |= CompositingReason::kWillChangeFilter; if (style.HasWillChangeBackdropFilterHint()) reasons |= CompositingReason::kWillChangeBackdropFilter; + if (style.HasWillChangeClipPathHint()) { + reasons |= CompositingReason::kWillChangeClipPath; + } + if (style.HasWillChangeMixBlendModeHint()) { + reasons |= CompositingReason::kWillChangeMixBlendMode; + } // kWillChangeOther is needed only when none of the explicit kWillChange* // reasons are set.
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 33af504..96bc1d5 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -1195,6 +1195,12 @@ bool HasWillChangeBackdropFilterHint() const { return WillChangeProperties().Contains(CSSPropertyID::kBackdropFilter); } + bool HasWillChangeClipPathHint() const { + return WillChangeProperties().Contains(CSSPropertyID::kClipPath); + } + bool HasWillChangeMixBlendModeHint() const { + return WillChangeProperties().Contains(CSSPropertyID::kMixBlendMode); + } // Hyphen utility functions. Hyphenation* GetHyphenation() const;
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_context.cc b/third_party/blink/renderer/core/timing/soft_navigation_context.cc index 57efee9..ecc10364 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_context.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_context.cc
@@ -5,17 +5,22 @@ #include "third_party/blink/renderer/core/timing/soft_navigation_context.h" #include "base/trace_event/trace_event.h" +#include "third_party/blink/renderer/core/dom/container_node.h" #include "third_party/blink/renderer/core/dom/node.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" namespace blink { uint64_t SoftNavigationContext::last_context_id_ = 0; -SoftNavigationContext::SoftNavigationContext() = default; +SoftNavigationContext::SoftNavigationContext( + bool advanced_paint_attribution_enabled) + : advanced_paint_attribution_enabled_(advanced_paint_attribution_enabled) {} void SoftNavigationContext::AddModifiedNode(Node* node) { - auto add_result = modified_nodes_.insert(node); + node->SetIsModifiedBySoftNavigation(); + auto add_result = modified_nodes_.insert(node); if (add_result.is_new_entry) { // If this is the first mod this animation frame, trace it. if (num_modified_dom_nodes_ == @@ -45,21 +50,48 @@ return false; } - if (modified_nodes_.Contains(node)) { - already_painted_modified_nodes_.insert(node); - // If this is the first paint this animation frame, trace it. - if (painted_area_ == painted_area_last_animation_frame_) { - // TODO(crbug.com/353218760): Add support for reporting every single - // paint. + // For now, we only check paint after we meet other criteria, in order to + // reduce the risk of needless tree walks during paint. + CHECK(SatisfiesSoftNavNonPaintCriteria()); + + // Iterate up the dom tree: + for (Node* current_node = node; current_node; + current_node = current_node->parentNode()) { + if (current_node == known_not_related_parent_) { TRACE_EVENT_INSTANT( TRACE_DISABLED_BY_DEFAULT("loading"), - "SoftNavigationContext::FirstAttributablePaintInAnimationFrame", + "SoftNavigationContext::AddPaintedAreaWithEarlyExitTreeWalk", "context", this); + break; } - painted_area_ += painted_area; - return true; + // If the current_node is known modified, it is a container root, and this + // paint counts. + if (modified_nodes_.Contains(current_node)) { + already_painted_modified_nodes_.insert(node); + // If this is the first paint this animation frame, trace it. + if (painted_area_ == painted_area_last_animation_frame_) { + // TODO(crbug.com/353218760): Add support for reporting every single + // paint. + TRACE_EVENT_INSTANT( + TRACE_DISABLED_BY_DEFAULT("loading"), + "SoftNavigationContext::FirstAttributablePaintInAnimationFrame", + "context", this); + } + painted_area_ += painted_area; + return true; + } + + // For now, do not "tree walk" unless this flag is enabled. + if (!advanced_paint_attribution_enabled_) { + break; + } } + // This node was not part of a container root for this context. + // Let's cache this node's parent node, so if any of this node's siblings + // paint next, we can finish this check quicker for them. + known_not_related_parent_ = node->parentNode(); + if (is_newest_context) { // We want to know how much paint the page is doing that isn't attributed. // We only want to do this for a single (most recent) context, in order to @@ -81,6 +113,9 @@ } bool SoftNavigationContext::OnPaintFinished() { + // Reset this with each paint, since the conditions might change. + known_not_related_parent_ = nullptr; + auto num_modded_new_nodes = num_modified_dom_nodes_ - num_modified_dom_nodes_last_animation_frame_; auto num_gced_old_nodes = num_live_nodes_last_animation_frame_ + @@ -126,6 +161,7 @@ void SoftNavigationContext::Trace(Visitor* visitor) const { visitor->Trace(modified_nodes_); visitor->Trace(already_painted_modified_nodes_); + visitor->Trace(known_not_related_parent_); } } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_context.h b/third_party/blink/renderer/core/timing/soft_navigation_context.h index 43f486d..0b72e9b 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_context.h +++ b/third_party/blink/renderer/core/timing/soft_navigation_context.h
@@ -9,6 +9,7 @@ #include "base/time/time.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -22,7 +23,7 @@ static uint64_t last_context_id_; public: - SoftNavigationContext(); + explicit SoftNavigationContext(bool advanced_paint_attribution_enabled); bool IsMostRecentlyCreatedContext() const { return context_id_ == last_context_id_; @@ -68,6 +69,8 @@ // largest value and can be used to identify the most recent context. const uint64_t context_id_ = ++last_context_id_; + bool advanced_paint_attribution_enabled_; + base::TimeTicks user_interaction_timestamp_; String url_; bool was_emitted_ = false; @@ -86,6 +89,8 @@ size_t num_live_nodes_last_animation_frame_ = 0; uint64_t painted_area_last_animation_frame_ = 0; uint64_t repainted_area_last_animation_frame_ = 0; + + WeakMember<Node> known_not_related_parent_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc index ffcdc6c..fec3dcff 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -252,7 +252,6 @@ if (!context) { return false; } - node->SetIsModifiedBySoftNavigation(); context->AddModifiedNode(node); EmitSoftNavigationEntryIfAllConditionsMet(context); @@ -324,30 +323,13 @@ void SoftNavigationHeuristics::RecordPaint(LocalFrame* frame, const gfx::RectF& rect, Node* node) { - // A node which was created in a different window and transferred to this - // window might have modified-bit set, but this SNH class might not actually - // be set to detecting softnavs. - if (!node->IsModifiedBySoftNavigation()) { - return; - } - - // First, start with the most likely context. + // For now, we only care to map paints for the most recent context to meet + // non-paint criteria. if (most_recent_context_to_meet_non_paint_criteria_ && most_recent_context_to_meet_non_paint_criteria_->AddPaintedArea( node, rect, true)) { return; } - - // Then, reverse-iterate the rest of the list. - for (auto& context : base::Reversed(potential_soft_navigations_)) { - if (context == most_recent_context_to_meet_non_paint_criteria_) { - continue; - } - if (context->AddPaintedArea(node, rect, - context->IsMostRecentlyCreatedContext())) { - break; - } - } } void SoftNavigationHeuristics::OnPaintFinished() { @@ -528,8 +510,9 @@ // "new interaction" (i.e. keydown), but will create a new one if that has // been cleared, which can happen in tests. if (IsInteractionStart(type) || !active_interaction_context_) { - active_interaction_context_ = - MakeGarbageCollected<SoftNavigationContext>(); + active_interaction_context_ = MakeGarbageCollected<SoftNavigationContext>( + RuntimeEnabledFeatures:: + SoftNavigationDetectionAdvancedPaintAttributionEnabled(window_)); potential_soft_navigations_.push_back(active_interaction_context_); TRACE_EVENT_INSTANT(TRACE_DISABLED_BY_DEFAULT("loading"), "SoftNavigationHeuristics::CreateNewContext",
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics_test.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics_test.cc index 1d2d73e..f834375 100644 --- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics_test.cc +++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics_test.cc
@@ -327,35 +327,54 @@ scheduler::TaskAttributionInfo* task_state = nullptr; SoftNavigationContext* context = nullptr; + Node* node1 = CreateNodeForTest(); + Node* node2 = CreateNodeForTest(); + + // Simulate an event listener that starts a soft-nav { auto* event = CreateEvent(SoftNavigationHeuristics::EventScope::Type::kClick); std::optional<SoftNavigationHeuristics::EventScope> event_scope( heuristics->MaybeCreateEventScopeForEvent(*event)); - { - std::optional<TaskScope> task_scope = - tracker->MaybeCreateTaskScopeForCallback(script_state, nullptr); - task_state = tracker->RunningTask(); - ASSERT_TRUE(task_state); - context = task_state->GetSoftNavigationContext(); - ASSERT_TRUE(context); + std::optional<TaskScope> task_scope = + tracker->MaybeCreateTaskScopeForCallback(script_state, nullptr); + task_state = tracker->RunningTask(); + ASSERT_TRUE(task_state); + context = task_state->GetSoftNavigationContext(); + ASSERT_TRUE(context); - heuristics->SameDocumentNavigationCommitted("foo.html", context); - Node* node = CreateNodeForTest(); - heuristics->ModifiedDOM(node); - ReportPaintRectForTest(heuristics, node); - } + EXPECT_FALSE(context->SatisfiesSoftNavNonPaintCriteria()); + heuristics->SameDocumentNavigationCommitted("foo.html", context); + heuristics->ModifiedDOM(node1); + EXPECT_FALSE(context->SatisfiesSoftNavNonPaintCriteria()); } - EXPECT_EQ(heuristics->SoftNavigationCount(), 1u); + EXPECT_TRUE(context->SatisfiesSoftNavNonPaintCriteria()); + EXPECT_FALSE(context->SatisfiesSoftNavPaintCriteria(1)); + // Simulate a paint in a separate task. + { + ReportPaintRectForTest(heuristics, node1); + EXPECT_TRUE(context->SatisfiesSoftNavPaintCriteria(1)); + EXPECT_EQ(heuristics->SoftNavigationCount(), 1u); + } + + // Simulate another task for the same context, which does a second soft-nav { std::optional<TaskScope> task_scope = tracker->MaybeCreateTaskScopeForCallback(script_state, task_state); + EXPECT_EQ(tracker->RunningTask()->GetSoftNavigationContext(), context); heuristics->SameDocumentNavigationCommitted("bar.html", context); - Node* node = CreateNodeForTest(); - heuristics->ModifiedDOM(node); - ReportPaintRectForTest(heuristics, node); + heuristics->ModifiedDOM(node2); } + + // And another paint + { + ReportPaintRectForTest(heuristics, node2); + } + + // Should still just have one single soft-nav because a single context + // with a single Interaction should only emit once, even if it e.g. navigates + // twice (i.e. client-side redirects). EXPECT_EQ(heuristics->SoftNavigationCount(), 1u); }
diff --git a/third_party/blink/renderer/modules/ai/language_model_prompt_builder.cc b/third_party/blink/renderer/modules/ai/language_model_prompt_builder.cc index bf795f8..8547860 100644 --- a/third_party/blink/renderer/modules/ai/language_model_prompt_builder.cc +++ b/third_party/blink/renderer/modules/ai/language_model_prompt_builder.cc
@@ -145,6 +145,11 @@ void AudioToMojo(base::span<uint8_t> bytes, PendingEntry* entry); void BitmapToMojo(base::span<uint8_t> bytes, PendingEntry* entry); + // Called when an ImageBitmap is finished decoding. + void OnBitmapLoaded(PendingEntry* entry, + ScriptState* script_state, + ImageBitmap* bitmap); + SelfKeepAlive<LanguageModelPromptBuilder> keep_alive_{this}; WTF::Vector<mojom::blink::AILanguageModelPromptPtr> processed_prompts_; @@ -460,68 +465,40 @@ AudioToMojo(audio_contents.ByteSpan(), entry); } +// ThenCallable wrapper that calls a callback with the resolved/rejected value. +template <typename Type, typename ReactType = Type*> +class ThenCallback : public ThenCallable<Type, ThenCallback<Type, ReactType>> { + public: + explicit ThenCallback( + base::OnceCallback<void(ScriptState*, ReactType)> callback) + : callback(std::move(callback)) {} + void React(ScriptState* script_state, ReactType value) { + std::move(callback).Run(script_state, value); + } + base::OnceCallback<void(ScriptState*, ReactType)> callback; +}; + void LanguageModelPromptBuilder::ToMojo(V8ImageBitmapSource* bitmap, PendingEntry* entry) { - // TODO(crbug.com/419321438): Change CreateImageBitmap to not use JS promises. - class Resolve : public ThenCallable<ImageBitmap, Resolve> { - public: - explicit Resolve(LanguageModelPromptBuilder* builder, PendingEntry* entry) - : builder_(builder), entry_(entry) {} - void Trace(Visitor* visitor) const override { - visitor->Trace(builder_); - visitor->Trace(entry_); - ThenCallable<ImageBitmap, Resolve>::Trace(visitor); - } - void React(ScriptState* script_state, ImageBitmap* value) { - v8::Isolate* isolate = script_state->GetIsolate(); - v8::TryCatch try_catch(isolate); - ExceptionState exception_state(isolate); - if (!value) { - builder_->Reject(DOMException::Create( - "Invalid image bitmap.", - DOMException::GetErrorName(DOMExceptionCode::kDataError))); - return; - } - std::optional<SkBitmap> skia_bitmap = - GetBitmapFromCanvasImageSource(*value, exception_state); - if (!skia_bitmap) { - CHECK(exception_state.HadException() && try_catch.HasCaught()); - builder_->Reject(ScriptValue(isolate, try_catch.Exception())); - return; - } - builder_->OnPromptContentProcessed( - mojom::blink::AILanguageModelPromptContent::NewBitmap( - skia_bitmap.value()), - entry_); - } - - private: - Member<LanguageModelPromptBuilder> builder_; - Member<PendingEntry> entry_; - }; - class Reject : public ThenCallable<IDLAny, Reject> { - public: - explicit Reject(LanguageModelPromptBuilder* builder) : builder_(builder) {} - void Trace(Visitor* visitor) const override { - visitor->Trace(builder_); - ThenCallable<IDLAny, Reject>::Trace(visitor); - } - void React(ScriptState* script_state, ScriptValue value) { - builder_->Reject(value); - } - Member<LanguageModelPromptBuilder> builder_; - }; v8::Isolate* isolate = script_state_->GetIsolate(); v8::TryCatch try_catch(isolate); ExceptionState exception_state(isolate); // Note: GetBitmapFromV8ImageBitmapSource doesn't support async which is // required for blobs so async ImageBitmapFactories::CreateImageBitmap is // preferred. + // TODO(crbug.com/419321438): Change CreateImageBitmap to not use JS promises. ImageBitmapFactories::CreateImageBitmap( script_state_, bitmap, MakeGarbageCollected<ImageBitmapOptions>(), exception_state) - .Then(script_state_, MakeGarbageCollected<Resolve>(this, entry), - MakeGarbageCollected<Reject>(this)); + .Then( + script_state_, + MakeGarbageCollected<ThenCallback<ImageBitmap>>( + WTF::BindOnce(&LanguageModelPromptBuilder::OnBitmapLoaded, + WrapPersistent(this), WrapPersistent(entry))), + MakeGarbageCollected<ThenCallback<IDLAny, ScriptValue>>(WTF::BindOnce( + [](LanguageModelPromptBuilder* builder, ScriptState* script_state, + ScriptValue value) { builder->Reject(std::move(value)); }, + WrapPersistent(this)))); if (exception_state.HadException()) { CHECK(try_catch.HasCaught()); @@ -529,6 +506,31 @@ } } +void LanguageModelPromptBuilder::OnBitmapLoaded(PendingEntry* entry, + ScriptState* script_state, + ImageBitmap* bitmap) { + v8::Isolate* isolate = script_state->GetIsolate(); + v8::TryCatch try_catch(isolate); + ExceptionState exception_state(isolate); + if (!bitmap) { + Reject(DOMException::Create( + "Invalid image bitmap.", + DOMException::GetErrorName(DOMExceptionCode::kDataError))); + return; + } + std::optional<SkBitmap> skia_bitmap = + GetBitmapFromCanvasImageSource(*bitmap, exception_state); + if (!skia_bitmap) { + CHECK(exception_state.HadException() && try_catch.HasCaught()); + Reject(ScriptValue(isolate, try_catch.Exception())); + return; + } + OnPromptContentProcessed( + mojom::blink::AILanguageModelPromptContent::NewBitmap( + skia_bitmap.value()), + entry); +} + } // namespace void ConvertPromptInputsToMojo(
diff --git a/third_party/blink/renderer/platform/graphics/compositing_reasons.cc b/third_party/blink/renderer/platform/graphics/compositing_reasons.cc index 397a77ee..ddbf77b 100644 --- a/third_party/blink/renderer/platform/graphics/compositing_reasons.cc +++ b/third_party/blink/renderer/platform/graphics/compositing_reasons.cc
@@ -73,6 +73,10 @@ "Has a will-change: filter compositing hint."}, {CompositingReason::kWillChangeBackdropFilter, "Has a will-change: backdrop-filter compositing hint."}, + {CompositingReason::kWillChangeClipPath, + "Has a will-change: clip-path compositing hint."}, + {CompositingReason::kWillChangeMixBlendMode, + "Has a will-change: mix-blend-mode compositing hint."}, {CompositingReason::kWillChangeOther, "Has a will-change compositing hint other than transform, opacity, filter" " and backdrop-filter."},
diff --git a/third_party/blink/renderer/platform/graphics/compositing_reasons.h b/third_party/blink/renderer/platform/graphics/compositing_reasons.h index 792ec8cc..393bd733 100644 --- a/third_party/blink/renderer/platform/graphics/compositing_reasons.h +++ b/third_party/blink/renderer/platform/graphics/compositing_reasons.h
@@ -47,6 +47,8 @@ V(WillChangeOpacity) \ V(WillChangeFilter) \ V(WillChangeBackdropFilter) \ + V(WillChangeClipPath) \ + V(WillChangeMixBlendMode) \ /* This flag is needed only when none of the explicit kWillChange* reasons \ are set. */ \ V(WillChangeOther) \ @@ -89,7 +91,7 @@ V(Scrollbar) \ V(LinkHighlight) \ V(DevToolsOverlay) \ - V(ViewTransitionContent) \ + V(ViewTransitionContent) class PLATFORM_EXPORT CompositingReason { DISALLOW_NEW(); @@ -148,7 +150,8 @@ kRootScroller | kOverflowScrolling, kDirectReasonsForEffectProperty = kActiveOpacityAnimation | kWillChangeOpacity | kBackdropFilter | - kWillChangeBackdropFilter | kActiveBackdropFilterAnimation | + kWillChangeBackdropFilter | kWillChangeClipPath | + kWillChangeMixBlendMode | kActiveBackdropFilterAnimation | kViewTransitionPseudoElement | kTransform3DSceneLeaf | kElementCapture, kDirectReasonsForFilterProperty = kActiveFilterAnimation | kWillChangeFilter,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc index 41e8992a..80e7901 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/image_layer_bridge.cc
@@ -178,15 +178,17 @@ const gfx::Size size(image_for_compositor->width(), image_for_compositor->height()); - bool is_overlay_candidate = - shared_image->usage().Has(gpu::SHARED_IMAGE_USAGE_SCANOUT); + viz::TransferableResource::MetadataOverride overrides = { + .format = image_for_compositor->GetSharedImageFormat(), + .size = size, + .color_space = gfx::ColorSpace(), + .alpha_type = kPremul_SkAlphaType, + }; - *out_resource = viz::TransferableResource::MakeGpu( - shared_image, shared_image->GetTextureTarget(), - image_for_compositor->GetSyncToken(), size, - image_for_compositor->GetSharedImageFormat(), is_overlay_candidate, - viz::TransferableResource::ResourceSource::kImageLayerBridge); - out_resource->origin = shared_image->surface_origin(); + *out_resource = viz::TransferableResource::Make( + shared_image, + viz::TransferableResource::ResourceSource::kImageLayerBridge, + image_for_compositor->GetSyncToken(), overrides); auto func = WTF::BindOnce(&ImageLayerBridge::ResourceReleasedGpu, WrapWeakPersistent(this), @@ -233,13 +235,17 @@ return false; } - *out_resource = viz::TransferableResource::MakeSoftwareSharedImage( - resource.shared_image, resource.sync_token, size, format, - viz::TransferableResource::ResourceSource::kImageLayerBridge); - out_resource->origin = kTopLeft_GrSurfaceOrigin; - out_resource->color_space = sk_image->colorSpace() + auto resource_color_space = sk_image->colorSpace() ? gfx::ColorSpace(*sk_image->colorSpace()) : gfx::ColorSpace::CreateSRGB(); + + viz::TransferableResource::MetadataOverride overrides = { + .color_space = resource_color_space, + }; + *out_resource = viz::TransferableResource::Make( + resource.shared_image, + viz::TransferableResource::ResourceSource::kImageLayerBridge, + resource.sync_token, overrides); auto func = WTF::BindOnce(&ImageLayerBridge::ResourceReleasedSoftware, WrapWeakPersistent(this), std::move(resource)); *out_release_callback = std::move(func);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index a06d35c..6bdddfda 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -4575,9 +4575,14 @@ status: "stable", }, { + name: "SoftNavigationDetectionAdvancedPaintAttribution", + status: "experimental", + depends_on: ["SoftNavigationDetection"], + }, + { name: "SoftNavigationHeuristics", status: "experimental", - depends_on: ["NavigationId","SoftNavigationDetection"], + depends_on: ["NavigationId","SoftNavigationDetectionAdvancedPaintAttribution"], origin_trial_allows_third_party: true, origin_trial_feature_name: "SoftNavigationHeuristics", },
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 6b23a27..f968686 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -311,6 +311,12 @@ # --- END canvasRenderingContext.placeElement() implementation +# --- canvasRenderingContext.drawElement() implementation: issues.chromium.org/issues/417556295 + +crbug.com/419363705 wpt_internal/html/canvas/drawElement/svg-foreign-object.html [ Failure ] + +# --- END canvasRenderingContext.drawElement() implementation + # --- Skia roll test suppressions # --- END Skia roll test suppresions @@ -3347,6 +3353,7 @@ crbug.com/378891966 [ Win10.20h2 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_iframe_pdf_viewer.html [ Failure ] crbug.com/378891966 [ Linux ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_iframe_pdf_viewer.html [ Failure ] crbug.com/378891966 [ Mac ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_iframe_pdf_viewer.html [ Failure ] +crbug.com/415773057 [ Mac15 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html [ Crash ] crbug.com/378014595 [ Mac15 ] external/wpt/webrtc/RTCPeerConnection-addIceCandidate.html [ Timeout ] crbug.com/378014595 [ Mac15 ] external/wpt/webrtc/RTCPeerConnection-description-attributes-timing.https.html [ Timeout ] crbug.com/378750930 [ Mac14 ] external/wpt/webcodecs/per-frame-qp-encoding.https.any.html?av1 [ Timeout ] @@ -3586,6 +3593,7 @@ crbug.com/347779309 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-link-click-fragment.html [ Timeout ] crbug.com/347779309 [ Win10.20h2 ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html [ Crash Failure ] crbug.com/347779309 [ Mac14 ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html [ Crash ] +crbug.com/347779309 [ Mac15 ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html [ Crash ] crbug.com/347779309 [ Linux ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-navigation-reload.html [ Crash ] crbug.com/347779309 [ Linux ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-form-submit.html [ Failure Pass ] crbug.com/347779309 [ Linux ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-nav-meta-refresh.optional.html [ Failure Pass ] @@ -5328,10 +5336,6 @@ # Failing origin trial for css properties test crbug.com/1041993 http/tests/origin_trials/sample-api-script-added-after-css-declaration.html [ Failure ] -# Will change clip-path and mix-blend-mode don't trigger a Backdrop Root -crbug.com/338250112 external/wpt/css/filter-effects/backdrop-filter-backdrop-root-clip-path.html [ Failure ] -crbug.com/338250112 external/wpt/css/filter-effects/backdrop-filter-backdrop-root-mix-blend-mode.html [ Failure ] - # Ref_Tests which fail when SkiaRenderer is enable, and which cannot be # rebaselined. TODO(jonross): triage these into any existing bugs or file more # specific bugs. @@ -7328,10 +7332,6 @@ crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-cross-site-iframe.sub.https.window.html [ Failure ] crbug.com/1382865 external/wpt/storage-access-api/requestStorageAccess-nested-cross-site-iframe.sub.https.window.html [ Failure ] -# Test is flaky with "Illegal invocation" error reading -# PromiseRejectionEvent.promise -crbug.com/407400666 external/wpt/html/dom/idlharness.https.html?exclude=(Document|Window|HTML.+) [ Failure Pass ] - # Sheriff 2022-11-15 crbug.com/1383990 [ Mac ] external/wpt/html/dom/idlharness.worker.html [ Failure Skip ] crbug.com/1383989 [ Mac ] external/wpt/html/webappapis/scripting/events/event-handler-attributes-body-window.html [ Failure Skip ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 7e72af7..76cbe49 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -631,6 +631,20 @@ {} ] ], + "anchor-in-multicol-crash.html": [ + "8a4206630a17a3ddd5c7607367c685454a598852", + [ + null, + {} + ] + ], + "anchor-in-multicol-inherit-crash.html": [ + "233f8382e8a479e95c235dac2854a355d3341ad3", + [ + null, + {} + ] + ], "anchor-scroll-composited-scrolling-001-crash.html": [ "e8ecde3a3e36702d8833c6caa0c94782243edba4", [ @@ -5905,6 +5919,13 @@ {} ] ], + "root-reconstruct-frame-tree-crash.html": [ + "bff9a1629a1cdcdc2aac2bd5c961a47823e3f5a7", + [ + null, + {} + ] + ], "root-replace-crash.html": [ "165eec41b6bc56db131cc7fc19f23701bc291b8c", [ @@ -86339,7 +86360,7 @@ ] ], "corner-shape-render-fuzzy.html": [ - "590e960830f595c7bc6f730d12d69e19c2ba0453", + "12cd2546bf484282a8cab7163c610b5b88d0b9f8", [ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?border-radius=30%&corner-shape=superellipse(-1.5)&box-shadow=10px%2010px%200%2010px%20black", [ @@ -86471,32 +86492,6 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue", - [ - [ - "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-shape=scoop&border-radius=20%&border-width=20px&border-top-color=rebeccapurple&border-bottom-color=blue", - "==" - ] - ], - { - "fuzzy": [ - [ - null, - [ - [ - 0, - 200 - ], - [ - 0, - 550 - ] - ] - ] - ] - } - ], - [ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=25%&border-width=20px", [ [ @@ -86757,32 +86752,6 @@ } ], [ - "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow", - [ - [ - "/css/css-borders/tentative/corner-shape/corner-shape-any-ref.html?corner-top-left-shape=notch&border-radius=40px&border-width=10px&border-color=blue&border-left-color=yellow", - "==" - ] - ], - { - "fuzzy": [ - [ - null, - [ - [ - 0, - 200 - ], - [ - 0, - 550 - ] - ] - ] - ] - } - ], - [ "css/css-borders/tentative/corner-shape/corner-shape-render-fuzzy.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%", [ [ @@ -119570,6 +119539,19 @@ {} ] ], + "flex-aspect-ratio-img-vert-lr.html": [ + "c8075af6798c1a89d120da9a865443ae7c894466", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square-only.html", + "==" + ] + ], + {} + ] + ], "flex-basis-001.html": [ "85e3bc69c435da542f520bc0e5b9b0afe911f0ad", [ @@ -133872,6 +133854,19 @@ {} ] ], + "test-synthetic-bold-2.html": [ + "b7930c172c2ad57e370aa576c10befb0ff59b404", + [ + null, + [ + [ + "/css/css-fonts/test-synthetic-bold-2-notref.html", + "!=" + ] + ], + {} + ] + ], "test-synthetic-bold.html": [ "c2337c0a3ce538a573eddec7e75ea191bc394ae0", [ @@ -133911,6 +133906,19 @@ {} ] ], + "test-synthetic-italic-4.html": [ + "fa1f815b4219dbfa355e0f9f67a54382af6a46bc", + [ + null, + [ + [ + "/css/css-fonts/test-synthetic-italic-4-notref.html", + "!=" + ] + ], + {} + ] + ], "test-synthetic-italic.html": [ "3f6764ecfa3696310b1395037afbd6aa9c38b853", [ @@ -135183,6 +135191,19 @@ {} ] ], + "multicol-gap-decorations-019.html": [ + "c4f81bb95ea74e49f30f86fb5cf452094c801a4f", + [ + null, + [ + [ + "/css/css-gaps/agnostic/gap-decorations-003-ref.html", + "==" + ] + ], + {} + ] + ], "multicol-gap-intersections-018.html": [ "b8f8e1619a0dc25c6824cb2cd441635d93885e06", [ @@ -216943,6 +216964,19 @@ {} ] ], + "text-wrap-balance-word-spacing-001.html": [ + "db27bba1285bfbbb7fd5382b3f08c813c1e9fe79", + [ + null, + [ + [ + "/css/css-text/white-space/reference/text-wrap-balance-word-spacing-001-ref.html", + "==" + ] + ], + {} + ] + ], "text-wrap-nowrap-001.html": [ "94437df6deeb3ddcf73d7732c046901cb4b3842d", [ @@ -257620,7 +257654,7 @@ ] ], "new-content-with-overflow-zoomed.html": [ - "4ab9fa5a5751c1083afb69ca84f36cd9a1481fa5", + "6f0c8aac25db5eb5db3e734063d3edc313b32e80", [ null, [ @@ -258204,7 +258238,7 @@ ] ], "old-content-with-overflow-zoomed.html": [ - "fa701deb3394514fa2a25a062bd5d6949034a3b7", + "41d08c253c62ee88eadcfc9eff5eb4b8ad9ec142", [ null, [ @@ -258655,6 +258689,19 @@ ] ], "scoped": { + "nested-scope.html": [ + "9fff44e5e732edd1946adf414a8f23668022edda", + [ + null, + [ + [ + "/css/css-view-transitions/scoped/nested-scope-ref.html", + "==" + ] + ], + {} + ] + ], "new-content.html": [ "7302f7c4f8ee4c22bee0fe286a7b2343af98603e", [ @@ -279484,19 +279531,6 @@ ], {} ] - ], - "zero-width-filter.html": [ - "5fd54652c658bf9592a60bdb140d14af0756d479", - [ - null, - [ - [ - "/css/filter-effects/reference/green-100x100.html", - "==" - ] - ], - {} - ] ] }, "mediaqueries": { @@ -286331,7 +286365,20 @@ {} ] ] - } + }, + "visited-nested.html": [ + "57220446c8688a3a12fcb36aeb00b904c901fd3d", + [ + null, + [ + [ + "/css/visited-nested-ref.html", + "==" + ] + ], + {} + ] + ] }, "custom-elements": { "form-associated": { @@ -293883,6 +293930,32 @@ ] }, "text": { + "canvas.2d.fillText-FontFace.html": [ + "1175a313b873b95923934adaf15558b1a7a02a43", + [ + null, + [ + [ + "/html/canvas/offscreen/manual/text/empty-ref.html", + "!=" + ] + ], + {} + ] + ], + "canvas.2d.fillText.html": [ + "d6eed023072cd2b1827acdea5d592f29c5adf023", + [ + null, + [ + [ + "/html/canvas/offscreen/manual/text/empty-ref.html", + "!=" + ] + ], + {} + ] + ], "canvas.2d.offscreen.direction.html": [ "e41a7666f75bee42ce4feff9f4a8949d45accf42", [ @@ -350447,6 +350520,10 @@ "ca072086c415b058264e495c46cb4a692d8a0684", [] ], + "test-synthetic-bold-2-notref.html": [ + "ec5051519d703895e590e14c55b27b84ed164c35", + [] + ], "test-synthetic-bold-notref.html": [ "4a952acb46fb5b0f5681176ee3db32758413c48c", [] @@ -350459,6 +350536,10 @@ "a0721426016c949369ae0114211136f45ce51b27", [] ], + "test-synthetic-italic-4-notref.html": [ + "d6f9050be302c30b7609dd19be3870453219539c", + [] + ], "test-synthetic-italic-notref.html": [ "3684f3ae804aa109f2da5188556cd3b36ffa2fc9", [] @@ -368127,6 +368208,10 @@ "401e35e2f1f8c534487782df003078b1a53b6e36", [] ], + "text-wrap-balance-word-spacing-001-ref.html": [ + "d29d139614a7284b414eff1ae833591ec479fef9", + [] + ], "text-wrap-nowrap-001-mis-ref.html": [ "ca73318ecf3bae78643e5a754da54e8c8dc313d2", [] @@ -374320,7 +374405,7 @@ [] ], "content-with-overflow-zoomed-ref.html": [ - "ae076d55787363d6690d5ec9947e7e8823feb56c", + "5bfb9d2fa9853bed336be9d930b0073e99b559c3", [] ], "content-with-transform-ref.html": [ @@ -375003,6 +375088,10 @@ "content-ref.html": [ "1216fdfa85051ce2d19e97853b63f8ba70348209", [] + ], + "nested-scope-ref.html": [ + "804741cd6db993392ba8785e8c87f9c16894af41", + [] ] }, "scroller-child-abspos-ref.html": [ @@ -380943,7 +381032,11 @@ } } } - } + }, + "visited-nested-ref.html": [ + "22f4ecf0d7bbcef307fd679ae0905f9b5318f690", + [] + ] }, "custom-elements": { "DIR_METADATA": [ @@ -381381,7 +381474,7 @@ [] ], "OWNERS": [ - "144a162356513962eda1beaade31ac877a93dff2", + "59f1c0fee67e7cd65404d83927fb4bfb6f32535f", [] ] }, @@ -396648,6 +396741,10 @@ "1c2228a7acc341e1025673df937d0e5ab96ee353", [] ], + "empty-ref.html": [ + "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", + [] + ], "text-direction-worker-inherit.js": [ "a300048d10f59a8e42631edfd968d115f2e3b211", [] @@ -426467,7 +426564,7 @@ [] ], "basic-service-worker.js": [ - "749cd5f2194ff54918032e50145078b2bed727e2", + "7175d655a49627614a7433de63a22fe93223711e", [] ], "conditional-status.py": [ @@ -426479,7 +426576,7 @@ [] ], "counting-executor.py": [ - "3511fe4905e2d8962175f0e4bc318a13c41c35f5", + "bc610b1fe10e85a663e1e4cddc4b77331fe6b4f6", [] ], "executor.sub.html": [ @@ -427733,7 +427830,7 @@ ], "tentative": { "helper.js": [ - "c5b7de607470780a4b38a3c557452f6639bb2c38", + "744799d33fd7c268efac1c4e398142abdab3ee69", [] ] } @@ -428997,7 +429094,7 @@ }, "reftests": { "first-letter-ref.svg": [ - "66f5c6d68280e1dd016c64351446dc1965d84627", + "72f866be1d9b175a675a5e13fb79c83c5c8699e4", [] ], "font-size-scaling-ref.html": [ @@ -429033,7 +429130,7 @@ [] ], "opacity-ref.svg": [ - "18c00ab332c73f5c033e37d4429872d07210ade4", + "7b4dbba15e7ddf525e5a132aee265cb01682c1db", [] ], "text-bidi-controls-anchors-1-ref.svg": [ @@ -435207,7 +435304,7 @@ [] ], "fixtures_bidi.py": [ - "0996821cfefee7573d3f352adc7a43166d6628f6", + "9942f729f652b32dc789355dae80a5e7f057828b", [] ], "fixtures_http.py": [ @@ -468233,7 +468330,7 @@ ] ], "summarizer-availability-available.tentative.https.window.js": [ - "f569cb43b0fccc7a370d67447ac8545a492b4108", + "df4e161d6374346a339d473b82732a3e40a82988", [ "ai/summarizer/summarizer-availability-available.tentative.https.window.html", { @@ -468260,7 +468357,7 @@ ] ], "summarizer-availability.tentative.https.window.js": [ - "85282959f9ea22eb1bad45ef833f0698805bb8bd", + "91cb31295578bccc360c317236ba7917f63785fb", [ "ai/summarizer/summarizer-availability.tentative.https.window.html", { @@ -478025,7 +478122,7 @@ ] ], "async-navigator-clipboard-change-event.tentative.https.html": [ - "37e2e6a7bde3ef85de09691e5fa4fba4a644b310", + "bf32f4851b341ce08b2772b06c803dc02fdb24a6", [ null, { @@ -495662,6 +495759,13 @@ {} ] ], + "position-try-ident-function.html": [ + "4457c4f14f8413697b244fb16425e4baa7c5aab2", + [ + null, + {} + ] + ], "position-try-initial-transition.html": [ "163e2dc3b6d509ed757da87bb4728be7e7f645e0", [ @@ -500134,6 +500238,13 @@ {} ] ], + "container-ident-function.html": [ + "692efa757b31d85733329c721a2e17cf77aee54e", + [ + null, + {} + ] + ], "container-inheritance.html": [ "b4efa1d5231e2dcba3a0fe382dcd574ae3f4ddcc", [ @@ -500457,7 +500568,7 @@ ] ], "font-relative-units.html": [ - "3d676402e1e6b266ede4e0249bfae29f159d14f7", + "97f43ac466f3bcafb3c764af8524ca0a1601ce5b", [ null, {} @@ -505085,14 +505196,14 @@ ] }, "font-face-range-order.html": [ - "b198a9fb572d38a87e25cc71e932821d8e96b16c", + "feae4803e7d3d007037b476c38a666d952ce7718", [ null, {} ] ], "font-face-style-normal.html": [ - "440661b82bbbd1f92c0a76ff650800ab24993cc7", + "baf34c0bc2028965cdf6ea795a8a222b45c8372c", [ null, {} @@ -505225,7 +505336,7 @@ ] ], "generic-family-keywords-001.html": [ - "bd39bac3ff8b3cda7e7eb60c75b0b5e6589f6110", + "17a635bd8e8e7dd3b8111a4127588e6e946d9b93", [ null, {} @@ -505239,7 +505350,7 @@ ] ], "generic-family-keywords-003.html": [ - "c787b59fb285dab2551c98026641b7f9dfdb84cd", + "4b79b58a5634609371ad4ccf502e474328eefc46", [ null, {} @@ -508853,7 +508964,7 @@ ] }, "grid-extrinsically-sized-mutations.html": [ - "75600046e821099a19a0fa7b78670608fb626793", + "ea9eb7ca242549d6980f219119e229067123d41b", [ null, {} @@ -512424,14 +512535,14 @@ ] ], "getclientrects-000.html": [ - "be11ba99493c12d75e8dd42ed55ca998bbe66001", + "0464b69fed5da99f3de331057585cf14e9f85118", [ null, {} ] ], "getclientrects-001.html": [ - "48a31d901fa79c9ca9aa12b7b9e8f7c0f51af0f8", + "62a79d630d9ebe9345c18910ca0d364eed00c9e0", [ null, {} @@ -512718,7 +512829,7 @@ ] ], "offsetProps-001.html": [ - "a592c5a88d7ec31169c120f14dfbac14a8080510", + "d9747bfd10ca10aad6e5ec26565e23a20f71f194", [ null, {} @@ -515778,6 +515889,13 @@ {} ] ], + "registered-property-ident-function.html": [ + "343e472a8146cb1bfa6297bc221635354bcd207a", + [ + null, + {} + ] + ], "registered-property-initial.html": [ "2fa062f310e86220ce331a49fdcb4d5abb4094f0", [ @@ -516300,7 +516418,7 @@ ] ], "line-spacing.html": [ - "4854e984c442c06028f929e63e1a5b25839efcf6", + "51f00c7dcbb2cbec79f054ff0850290d317c2dba", [ null, {} @@ -519270,7 +519388,7 @@ ] ], "shape-margin-001.html": [ - "205241bbfd6c92a209487fb21185a713158e32e2", + "71eb743b81a28bb834a7f51661dcec2667387d31", [ null, {} @@ -519340,14 +519458,14 @@ ] ], "shape-outside-circle-004.html": [ - "c28172c333458876d2dc6db3694ae79b800d0d48", + "d5d429b20bd3570ff7cadfe7d9bb3beff55bafba", [ null, {} ] ], "shape-outside-circle-005.html": [ - "55a7f07acfc2611f2522474080606e70273cbc37", + "032a0a628ae1a192df9b5023e1f16ddd4c184f03", [ null, {} @@ -519438,14 +519556,14 @@ ] ], "shape-outside-ellipse-004.html": [ - "9456bec3d80aa35ad85a9f2017afcc4361f5faff", + "2cfefad4f81abd9ef8752c6770ef76310cc7962d", [ null, {} ] ], "shape-outside-ellipse-005.html": [ - "5c90827d2dda84f97e5ff4db1ab97d2f4f81c819", + "dd0942d28a5560304f360572d3a341b9598b7146", [ null, {} @@ -519515,7 +519633,7 @@ ] ], "shape-outside-inset-003.html": [ - "abb9972d0568a1e53676d587598355db477385ac", + "008fc772346e3d6d20ff06336ef5f9606f9b25df", [ null, {} @@ -519592,7 +519710,7 @@ ] ], "shape-outside-polygon-004.html": [ - "5edde7dfad3a22d0c7ffe2c54cab333b6f2567bb", + "7540e1a1bd8d4b43b1be8b1f311a4d3af48f63b7", [ null, {} @@ -519613,7 +519731,7 @@ ] ], "shape-outside-shape-arguments-000.html": [ - "2c2c959c8c4d68136b2d1042dd3d98bb08850c3e", + "542b8bcf7df06bc348015b50985059011cf640f4", [ null, {} @@ -520393,7 +520511,7 @@ ] ], "keyword-sizes-for-intrinsic-contributions.html": [ - "dc287b195907e2b114a4d035470dde94f4039b84", + "b42bd71b8e7ccc802ba11e3bf3384b3854a0c3fa", [ null, {} @@ -521684,14 +521802,14 @@ ], "tentative": { "baseline-table.html": [ - "1507bf656f48b5b944cdea12f68bd586d9c20f11", + "4ceeb4d3241f2677d121eb86a73291fb6c4567ec", [ null, {} ] ], "baseline-td.html": [ - "4090c5db64e37159164f4965f224859dfd44cc5c", + "d2eec93a44f16a8dc35ba0f99228fb217de96c82", [ null, {} @@ -521712,7 +521830,7 @@ ] ], "colgroup-col.html": [ - "40fbefee200cb280416733a04a335ebcc7764c8a", + "ba009de9996085f785e47d73aec6aa15081c3ea3", [ null, {} @@ -521775,7 +521893,7 @@ ] ], "table-quirks.html": [ - "af2a516c0e8a39d21496bd4698e14e86891ccae3", + "35c091095500e29112029d23a55a020a763631ef", [ null, {} @@ -524555,7 +524673,7 @@ ] ], "trailing-space-position-001.html": [ - "648ae23dccbeb5d79a30fd14506a6f4164b2f26f", + "9a23e80375d2b34692717ab95060c6edd78b763b", [ null, {} @@ -524583,7 +524701,7 @@ ] ], "white-space-intrinsic-size-021.html": [ - "9c63117d087932fb7c4788ff58c251d60dc1bf17", + "e1a8d03894c0893d7d5b552ae58f597d806cac90", [ null, {} @@ -530180,7 +530298,7 @@ ] ], "cap-invalidation.html": [ - "0becd0d093d680c1c18323da51fc39812c3709cd", + "c3d7f798e11350ad294f142fea7e242c659d649c", [ null, {} @@ -530741,6 +530859,13 @@ {} ] ], + "sign-in-keyframes-with-relative-units.html": [ + "5431c7c6241020f1c9af2808b8747d25f68f977e", + [ + null, + {} + ] + ], "signed-zero.html": [ "6ede4bbb0ecb67ea40ec26e1f41c516d2e9d3a88", [ @@ -531443,7 +531568,7 @@ ] ], "group-animation-for-root-transition.html": [ - "9c702663e62fb5d1adb156630da1cdeb3b6c9868", + "b7ad7598e8b1cc8c550e239c379a739add01dc39", [ null, {} @@ -531726,7 +531851,7 @@ ] }, "no-crash-set-exception.html": [ - "bc0d764a590aaed95d2e6afe487f2477385a9c94", + "cc401b8bd6f91e7f98e628950827011908208585", [ null, {} @@ -531749,7 +531874,7 @@ ] ], "no-raf-while-render-blocked.html": [ - "a86fd14536229767b510d53741e86fd89e901828", + "36a923d84ede044a222f24b723301e411d27e343", [ null, { @@ -531893,7 +532018,7 @@ ] }, "paused-animation-at-end.html": [ - "ae9176ea26c242a0d268310405f1202181dd5ad1", + "4b8148140bdde7922e63204040d698d881d56603", [ null, {} @@ -531920,6 +532045,13 @@ {} ] ], + "pseudo-get-computed-style-clean-style.html": [ + "be194a1d646692f548ba34823badc52b27d78f2d", + [ + null, + {} + ] + ], "pseudo-get-computed-style.html": [ "274e946b825951f0a941c9befe5059452568d9c4", [ @@ -532031,7 +532163,7 @@ ] ], "transition-skipped-after-animation-started.html": [ - "56c477a55f6e6e4dfc73ca40077dc0938ee6a1d7", + "a6bd29b6f85966224e60bcc6a8b73d933c3d71f8", [ null, {} @@ -532061,7 +532193,7 @@ ] ], "view-transition-name-on-removed-element.html": [ - "36beb308283a9a61a2289193b136fa7bed7f09d7", + "375553652abd72300334ca1ba13ce3ce5581e83c", [ null, {} @@ -532335,7 +532467,7 @@ ] ], "text-input-block-size.optional.html": [ - "680e0b6532b1a28bc94238b079fd2ab8417966d7", + "77d67aad9c913097a292b88c36da9b7b01e17178", [ null, {} @@ -533532,7 +533664,7 @@ ] ], "getComputedStyle-insets-relpos-inline.html": [ - "d5f197ee9bc6cd53ec636889773438391d698120", + "7d53f316396bb4d68bc6e600ff81b12a1fc38e56", [ null, {} @@ -534418,7 +534550,7 @@ ] ], "getBoundingClientRect-shy.html": [ - "b27a7884605f16cbac77e705d05f8ab519a39d9e", + "55349e93969af0d527da4bcb589804239164bafc", [ null, {} @@ -651836,7 +651968,7 @@ ] ], "dialog-form-submission.html": [ - "5934485087a267f917d9b47d5414a36c1065da6f", + "04255cc3c8040d09b913ae0b602f042ed756ab81", [ null, { @@ -657687,7 +657819,7 @@ ] ], "on-dialog-behavior-request-close.tentative.html": [ - "e505c917d7cf6e56107caa4ca40c2a9b49341f33", + "64b448655dd8955f411b0bc3bdb69e7c29dc24ac", [ null, { @@ -657696,7 +657828,7 @@ ] ], "on-dialog-behavior.html": [ - "041bc8536acca1d8c1949dd5cfca9b97c9b5a6ba", + "4cfb0b5a9254b249558380aa9084c30ba3f82356", [ null, { @@ -669937,14 +670069,14 @@ ] ], "merror-001.html": [ - "a9a021c2e991c82ea8a58a302d099a88b78f7a62", + "0551e32794862102d539e1ddb9394a768b8647e2", [ null, {} ] ], "mphantom-001.html": [ - "771688cf19416d78342e019450221102728942ae", + "5af588215537597166ff03cb48127a1e3fb5b572", [ null, {} @@ -701058,7 +701190,7 @@ ] ], "svg.html": [ - "6511afc8b000a2b415819cc88d2aa1b5fccb0cdc", + "60f24e32e04057e9dcac8401228ad91e07ed6607", [ null, {} @@ -704895,6 +705027,13 @@ {} ] ], + "timeline-names-ident-function.html": [ + "a1305bdc17c56b37790599443c317d5532b5bf01", + [ + null, + {} + ] + ], "timeline-offset-in-keyframe-change-timeline.tentative.html": [ "5a70820b881edf687961606f79153dab96d6ac2d", [ @@ -713626,7 +713765,7 @@ "detection": { "tentative": { "racing-soft-navigations.html": [ - "ba510b717e5232d0349fa7bd83d8e68e41edc7a9", + "3daa2d171825704c270448b7cccde834dbed87a8", [ null, { @@ -714923,7 +715062,7 @@ "tentative": { "service-worker": { "basic.sub.https.html": [ - "44937ea376f221105550f39f5d97c60b36fc4aed", + "7e4fd24423d96a1936b92eb1472d1ba42f0adb10", [ "speculation-rules/prefetch/tentative/service-worker/basic.sub.https.html?origin=cross-site&sw=fetch-handler", { @@ -730484,14 +730623,14 @@ "signatures": { "tentative": { "accept-signature.parser-inserted.html": [ - "ccedc5ce4f9213e748611cb305892a87950978f6", + "0d688d39066ce720b61dead92714dca0ad85b138", [ null, {} ] ], "accept-signature.window.js": [ - "97e817e328c279149ac9668ed5014a30f811006d", + "291162c44594b95b50c8286d4d223c57136dde57", [ "subresource-integrity/signatures/tentative/accept-signature.window.html", { @@ -733053,7 +733192,7 @@ ] ], "svg-pointer-events-bbox.html": [ - "8db9149c231d1f4812b76610e3488ecd74787625", + "06d34fec54ba47a36690cd1be31d3c3f9b890b33", [ null, {} @@ -734179,7 +734318,7 @@ ] ], "getcharnumatposition.html": [ - "f17369b3742eddddbee792e0a0d983c24052f0ef", + "15f5dc68737a5b5ad7e75bf29ab5bcf3dbaaf482", [ null, {} @@ -767656,7 +767795,7 @@ ] ], "arg_min_max.https.any.js": [ - "e08a8cabd1a64e260c8d9b88526e3c98b286e302", + "f8e4d801056c31a1ec56d4e9686f16e2dd1eff25", [ "webnn/conformance_tests/arg_min_max.https.any.html?cpu", { @@ -770026,7 +770165,7 @@ ] ], "expand.https.any.js": [ - "2304cf9e9c917a9338b8dc1e6e3cbd75dfbd6c51", + "821c9b83ec269da21586682b005445f0a586bae6", [ "webnn/conformance_tests/expand.https.any.html?cpu", { @@ -770248,7 +770387,7 @@ ] ], "gather.https.any.js": [ - "c3bb635bdce62a534907952e88b6402b8f3d4a91", + "f0b75e1cf41a7510070343975f7411e2a7e64de6", [ "webnn/conformance_tests/gather.https.any.html?cpu", { @@ -770359,7 +770498,7 @@ ] ], "gatherElements.https.any.js": [ - "4482c36865fe474b37816cfe60560119b3584774", + "32299529f478f5b261b767b7f2ac9a71f04f01e0", [ "webnn/conformance_tests/gatherElements.https.any.html?cpu", { @@ -770470,7 +770609,7 @@ ] ], "gatherND.https.any.js": [ - "0377b777e4dda8fd28552fdb4541f389b37dc30e", + "ddf8626f17aef9dbfe6ab9df49c8568300a56c7a", [ "webnn/conformance_tests/gatherND.https.any.html?cpu", { @@ -774559,7 +774698,7 @@ ] ], "pad.https.any.js": [ - "02c9ec24508e07a66df5d7eae8e5e02d52f5575b", + "c2ba0e45b8f56fd4e4f75f780780c94cc4838df7", [ "webnn/conformance_tests/pad.https.any.html?cpu", { @@ -777427,7 +777566,7 @@ ] ], "reshape.https.any.js": [ - "05b8ea21e674796818f4c6143044a1beaaa3fb59", + "8345f09ae92587b9bfa3afab43214ac5567c2ab3", [ "webnn/conformance_tests/reshape.https.any.html?cpu", { @@ -777538,7 +777677,7 @@ ] ], "reverse.https.any.js": [ - "3cc2b9bc0cde11ec69d508086a11475687b2fd3a", + "8c76d04b1ee53d5b65de19b17e7d144eaf881a49", [ "webnn/conformance_tests/reverse.https.any.html?cpu", { @@ -778084,7 +778223,7 @@ ] ], "scatterElements.https.any.js": [ - "d2625630e07ce1b6a2f24fc9156bcf729f0c437f", + "d988719d84041839fdd6e890999c5e3e62d4e7e2", [ "webnn/conformance_tests/scatterElements.https.any.html?cpu", { @@ -778195,7 +778334,7 @@ ] ], "scatterND.https.any.js": [ - "e512e41ea3f922cafaef5f9747baa2e9e6c4d8d1", + "8505d143c76e03424af83079fc8339936a2361a7", [ "webnn/conformance_tests/scatterND.https.any.html?cpu", { @@ -779002,7 +779141,7 @@ ] ], "slice.https.any.js": [ - "7083bc09394a4f39c2c2570f1b7609bfff981ef5", + "6be61a9c253c853dd5aecc14b3dd78ff9f044a8d", [ "webnn/conformance_tests/slice.https.any.html?cpu", { @@ -779446,7 +779585,7 @@ ] ], "split.https.any.js": [ - "b9345f5d17996edf582b387d8247a2a5ca1e6835", + "c805be252573f1c241b17ba70eed09e7da6f422a", [ "webnn/conformance_tests/split.https.any.html?cpu", { @@ -780436,7 +780575,7 @@ ] ], "tensor.https.any.js": [ - "1a46c35b320e979a7d77a018990bbdf5abacaf28", + "03057a62ee864e9eb40506ef309dc6362bc44128", [ "webnn/conformance_tests/tensor.https.any.html?cpu", { @@ -780919,7 +781058,7 @@ ] ], "tile.https.any.js": [ - "822944b3e994df0de6a1db9cf5b98ee102e7cfbc", + "29a24871816e5266eaacae83092ec59013a443d0", [ "webnn/conformance_tests/tile.https.any.html?cpu", { @@ -781030,7 +781169,7 @@ ] ], "transpose.https.any.js": [ - "8a5afc1be2fb608d82276af89582933bca93336d", + "413b159f74379f132a7b584a73b923baa7cc82c6", [ "webnn/conformance_tests/transpose.https.any.html?cpu", { @@ -781141,7 +781280,7 @@ ] ], "triangular.https.any.js": [ - "bf1f51471de8e447d9ed98d04dc962cdadac2a5c", + "8006672f17d47da162864f0591028cabb1ed1c64", [ "webnn/conformance_tests/triangular.https.any.html?cpu", { @@ -781252,7 +781391,7 @@ ] ], "where.https.any.js": [ - "13291216a59674762750f940f73dc89afc9a37ae", + "21975b4610389067d4b1e09062601f66af59a78a", [ "webnn/conformance_tests/where.https.any.html?cpu", { @@ -836420,12 +836559,33 @@ "bidi": { "browser": { "create_user_context": { + "accept_insecure_certs.py": [ + "10e98febfbbfe0c9d7d489b1062d41565a619495", + [ + null, + {} + ] + ], "create_user_context.py": [ "f495498d0722131b728e1fb2c3fcb96afeb26b67", [ null, {} ] + ], + "invalid.py": [ + "9af6cdd5232244b46a3a3bc76ee4694c0704ba53", + [ + null, + {} + ] + ], + "proxy.py": [ + "fb59228e09034ba6738be2fdec06fddc2e1532bb", + [ + null, + {} + ] ] }, "get_client_windows": { @@ -837534,7 +837694,7 @@ ] ], "before_request_sent_cached.py": [ - "e8119d29d9e259208a11bed7c330a9ecbca49886", + "6577b9fe08fe8b5c5d4874cec05e98eebc74cc30", [ null, {} @@ -837777,7 +837937,7 @@ ] ], "response_completed_cached.py": [ - "2c7ea02d6011e30ff4ef19050b0cf88681eea653", + "4c024f3c4bbd48b55f63cb5037dc33bd9a739e79", [ null, {} @@ -837793,7 +837953,7 @@ ] ], "response_started_cached.py": [ - "db34035fca15d5b7c2749c316ed6eb8905cabbe7", + "2b7e25bcd9f3473cf1a7662c8c543f0af7850d5c", [ null, {} @@ -839614,7 +839774,7 @@ ] ], "merge.py": [ - "4d36926fd3f063aed95fe5a7f477fd215686f698", + "32991b322a076f8020ad9e00cbdd27dc42fcb825", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/font-relative-units.html b/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/font-relative-units.html index 3d67640..97f43ac 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/font-relative-units.html +++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/container-queries/font-relative-units.html
@@ -7,6 +7,7 @@ <style> @import url("/fonts/ahem.css"); :root { font-family: 'Ahem'; font-size: 10px; line-height: 10px; } + #log { font-family: sans-serif; } #em_container { container-type: inline-size; width: 100px; @@ -100,19 +101,23 @@ <div id="rlh_test"></div> </div> <script> - setup(() => assert_implements_size_container_queries()); + setup(() => assert_implements_size_container_queries(), { explicit_done: true }); const green = "rgb(0, 128, 0)"; - test(() => assert_equals(getComputedStyle(em_test).color, green), "em relative inline-size"); - test(() => assert_equals(getComputedStyle(rem_test).color, green), "rem relative inline-size"); - test(() => assert_equals(getComputedStyle(ex_test).color, green), "ex relative inline-size"); - test(() => assert_equals(getComputedStyle(rex_test).color, green), "rex relative inline-size"); - test(() => assert_equals(getComputedStyle(ch_test).color, green), "ch relative inline-size"); - test(() => assert_equals(getComputedStyle(rch_test).color, green), "rch relative inline-size"); - test(() => assert_equals(getComputedStyle(ic_test).color, green), "ic relative inline-size"); - test(() => assert_equals(getComputedStyle(ric_test).color, green), "ric relative inline-size"); - test(() => assert_equals(getComputedStyle(lh_test).color, green), "lh relative inline-size"); - test(() => assert_equals(getComputedStyle(rlh_test).color, green), "rlh relative inline-size"); - test(() => assert_equals(getComputedStyle(cap_test).color, green), "cap relative inline-size"); - test(() => assert_equals(getComputedStyle(rcap_test).color, green), "rcap relative inline-size"); + + document.fonts.ready.then(() => { + test(() => assert_equals(getComputedStyle(em_test).color, green), "em relative inline-size"); + test(() => assert_equals(getComputedStyle(rem_test).color, green), "rem relative inline-size"); + test(() => assert_equals(getComputedStyle(ex_test).color, green), "ex relative inline-size"); + test(() => assert_equals(getComputedStyle(rex_test).color, green), "rex relative inline-size"); + test(() => assert_equals(getComputedStyle(ch_test).color, green), "ch relative inline-size"); + test(() => assert_equals(getComputedStyle(rch_test).color, green), "rch relative inline-size"); + test(() => assert_equals(getComputedStyle(ic_test).color, green), "ic relative inline-size"); + test(() => assert_equals(getComputedStyle(ric_test).color, green), "ric relative inline-size"); + test(() => assert_equals(getComputedStyle(lh_test).color, green), "lh relative inline-size"); + test(() => assert_equals(getComputedStyle(rlh_test).color, green), "rlh relative inline-size"); + test(() => assert_equals(getComputedStyle(cap_test).color, green), "cap relative inline-size"); + test(() => assert_equals(getComputedStyle(rcap_test).color, green), "rcap relative inline-size"); + done(); + }) </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-vert-lr.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-vert-lr.html new file mode 100644 index 0000000..c8075af --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-aspect-ratio-img-vert-lr.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#algo-main-item"> +<meta name="assert" content="Flex item should compute its main size from its definite cros size and aspect ratio."> +<link rel="match" href="../reference/ref-filled-green-100px-square-only.html"> +<style> +.flexbox { + position: relative; + display: flex; + writing-mode: vertical-lr; + width: 100px; + align-items: start; +} +.flex-item{ + width: 40px +} +.abspos { + width: 60px; + height: 100px; background-color: green; + position: absolute; + left: 40px; +} +</style> +</head> +</head> +<body> + <p>Test passes if there is a filled green square.</p> + <div class="flexbox"> + <img class="flex-item" src="support/20x50-green.png"> + <div class="abspos"></div> + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-range-order.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-range-order.html index b198a9f..feae4803 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-range-order.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-range-order.html
@@ -16,7 +16,7 @@ font-stretch: 200% 50%; font-style: oblique 90deg -90deg; font-weight: 900 100; -src: local(Ahem); +src: url(/fonts/Ahem.ttf); } </style> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal-expected.txt index 888da51..ce8c6b5 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal-expected.txt
@@ -1,11 +1,5 @@ This is a testharness.js-based test. -[FAIL] CSS Fonts: parsing 'normal' in the font-style descriptor - promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred." [FAIL] CSS Fonts: parsing 'normal' in the font-style descriptor 1 - promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred." -[FAIL] CSS Fonts: parsing 'normal' in the font-style descriptor 2 - promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred." -[FAIL] CSS Fonts: parsing 'normal' in the font-style descriptor 3 - promise_test: Unhandled rejection with value: object "NetworkError: A network error occurred." + assert_equals: 'oblique 0deg' serializes as 'normal' expected "normal" but got "oblique 0deg" Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal.html index 440661b..baf34c0 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/font-face-style-normal.html
@@ -14,22 +14,22 @@ @font-face { font-family: test1; font-style: normal; - src: local(Ahem); + src: url(/fonts/Ahem.ttf); } @font-face { font-family: test2; font-style: oblique 0deg; - src: local(Ahem); + src: url(/fonts/Ahem.ttf); } @font-face { font-family: test3; font-style: oblique 0deg 10deg; - src: local(Ahem); + src: url(/fonts/Ahem.ttf); } @font-face { font-family: test4; font-style: normal 10deg; - src: local(Ahem); + src: url(/fonts/Ahem.ttf); } </style> <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-001.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-001.html index bd39bac..17a635b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-001.html
@@ -24,12 +24,14 @@ let ahem = document.getElementById('ahem'); let ahem_expected_width = ahem.offsetWidth; kGenericFontFamilyKeywords.forEach(keyword => { - test(() => { + promise_test(async function() { let element = document.getElementById('test'); element.setAttribute("style", `font-family: ${keyword};`); let expected_width = element.offsetWidth; // Insert the @font-face rules for quoted and unquoted keywords. + // NOTE that we have to wait for font loads again at each step, + // as new asynchronous loads may be initiated when the style changes. document.documentElement.insertAdjacentHTML('beforeend', ` <style> @font-face { @@ -43,10 +45,11 @@ src: local(Ahem), url('/fonts/Ahem.ttf'); } </style>`); - + await document.fonts.ready; assert_equals(element.offsetWidth, expected_width, `unquoted ${keyword} does not match @font-face rule`); element.setAttribute("style", `font-family: "${keyword}";`); + await document.fonts.ready; assert_equals(element.offsetWidth, ahem_expected_width, `quoted ${keyword} matches @font-face rule`); }, `@font-face matching for quoted and unquoted ${keyword}`); });
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-003.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-003.html index c787b59f..4b79b58a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/generic-family-keywords-003.html
@@ -10,7 +10,7 @@ <canvas id="canvas" width="400" height="150"></canvas> <script> setup({ explicit_done: true }); - window.addEventListener("load", () => { document.fonts.ready.then(runTests); }); + window.addEventListener("load", () => { document.fonts.load("25px Ahem").then(runTests); }); function runTests() { const measured_text = "|||||"; const canvas = document.getElementById("canvas"); @@ -19,7 +19,7 @@ let ahem_expected_width = ctx.measureText(measured_text).width; kGenericFontFamilyKeywords.forEach(keyword => { - test(() => { + promise_test(async function() { ctx.font = `25px ${keyword}`; let expected_width = ctx.measureText(measured_text).width; @@ -38,10 +38,12 @@ } </style>`); + await document.fonts.load(`25px ${keyword}`); ctx.font = `25px ${keyword}`; let unquoted_width = ctx.measureText(measured_text).width; assert_equals(unquoted_width, expected_width, `unquoted ${keyword} does not match @font-face rule`); + await document.fonts.load(`25px "${keyword}"`); ctx.font = `25px "${keyword}"`; let quoted_width = ctx.measureText(measured_text).width; assert_equals(quoted_width, ahem_expected_width, `quoted ${keyword} matches @font-face rule`);
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-extrinsically-sized-mutations.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-extrinsically-sized-mutations.html index 7560004..ea9eb7c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-extrinsically-sized-mutations.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-extrinsically-sized-mutations.html
@@ -105,17 +105,21 @@ </div> </body> <script> -document.body.offsetHeight; -mutateContent(); -document.body.offsetHeight; +setup({ explicit_done: true }); +document.fonts.ready.then(() => { + document.body.offsetHeight; + mutateContent(); + document.body.offsetHeight; -let tests = document.querySelectorAll(".test"); -tests.forEach((element) => { - test(function() { - let expectedHeight = element.getAttribute("data-expected-height"); - assert_equals(element.offsetHeight, Number(expectedHeight), "height"); + let tests = document.querySelectorAll(".test"); + tests.forEach((element) => { + test(function() { + let expectedHeight = element.getAttribute("data-expected-height"); + assert_equals(element.offsetHeight, Number(expectedHeight), "height"); + }); }); -}); + done(); +}) </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html index be11ba99..0464b69 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-000.html
@@ -65,7 +65,10 @@ <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> - test(()=> { + setup({ explicit_done: true }); + + document.fonts.ready.then(() => { + test(()=> { var span = document.querySelector("#horizontalTbLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -77,9 +80,9 @@ assert_equals(rects[2].top, 70); assert_equals(rects[3].left, 300); assert_equals(rects[3].top, 50); - }, "horizontal-tb ltr"); + }, "horizontal-tb ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#verticalLrLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -91,9 +94,9 @@ assert_equals(rects[2].top, 150); assert_equals(rects[3].left, 100); assert_equals(rects[3].top, 250); - }, "vertical-lr ltr"); + }, "vertical-lr ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#verticalRlLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -105,8 +108,9 @@ assert_equals(rects[2].top, 150); assert_equals(rects[3].left, 120); assert_equals(rects[3].top, 250); - }, "vertical-rl ltr"); - test(()=> { + }, "vertical-rl ltr"); + + test(()=> { var span = document.querySelector("#horizontalTbRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -118,8 +122,9 @@ assert_equals(rects[2].top, 70); assert_equals(rects[3].left, 110); assert_equals(rects[3].top, 50); - }, "horizontal-tb rtl"); - test(()=> { + }, "horizontal-tb rtl"); + + test(()=> { var span = document.querySelector("#verticalLrRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -131,8 +136,9 @@ assert_equals(rects[2].top, 160); assert_equals(rects[3].left, 100); assert_equals(rects[3].top, 60); - }, "vertical-lr rtl"); - test(()=> { + }, "vertical-lr rtl"); + + test(()=> { var span = document.querySelector("#verticalRlRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -144,5 +150,8 @@ assert_equals(rects[2].top, 160); assert_equals(rects[3].left, 120); assert_equals(rects[3].top, 60); - }, "vertical-rl rtl"); + }, "vertical-rl rtl"); + + done(); + }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-001.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-001.html index 48a31d90..62a79d6 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/getclientrects-001.html
@@ -102,7 +102,10 @@ const GAP = 10; const TEXT_SIZE = 80; - test(()=> { + setup({ explicit_done: true }); + + document.fonts.ready.then(() => { + test(()=> { var span = document.querySelector("#horizontalTbLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -114,9 +117,9 @@ assert_equals(rects[2].top, 70); assert_equals(rects[3].left, 300); assert_equals(rects[3].top, 50); - }, "horizontal-tb ltr"); + }, "horizontal-tb ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#verticalLrLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -128,9 +131,9 @@ assert_equals(rects[2].top, 150); assert_equals(rects[3].left, 100); assert_equals(rects[3].top, 250); - }, "vertical-lr ltr"); + }, "vertical-lr ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#verticalRlLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -142,9 +145,9 @@ assert_equals(rects[2].top, 150); assert_equals(rects[3].left, 120); assert_equals(rects[3].top, 250); - }, "vertical-rl ltr"); + }, "vertical-rl ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#sidewaysLrLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -156,9 +159,9 @@ assert_equals(rects[2].top, TOP + COLUMN * 2 + GAP - TEXT_SIZE); assert_equals(rects[3].left, LEFT); assert_equals(rects[3].top, TOP + COLUMN - TEXT_SIZE); - }, "sideways-lr ltr"); + }, "sideways-lr ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#sidewaysRlLtr span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -170,9 +173,9 @@ assert_equals(rects[2].top, TOP + COLUMN + GAP); assert_equals(rects[3].left, LEFT + LINE); assert_equals(rects[3].top, TOP + COLUMN * 2 + GAP * 2); - }, "sideways-rl ltr"); + }, "sideways-rl ltr"); - test(()=> { + test(()=> { var span = document.querySelector("#horizontalTbRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -184,8 +187,9 @@ assert_equals(rects[2].top, 70); assert_equals(rects[3].left, 110); assert_equals(rects[3].top, 50); - }, "horizontal-tb rtl"); - test(()=> { + }, "horizontal-tb rtl"); + + test(()=> { var span = document.querySelector("#verticalLrRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -197,8 +201,9 @@ assert_equals(rects[2].top, 160); assert_equals(rects[3].left, 100); assert_equals(rects[3].top, 60); - }, "vertical-lr rtl"); - test(()=> { + }, "vertical-lr rtl"); + + test(()=> { var span = document.querySelector("#verticalRlRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -210,9 +215,9 @@ assert_equals(rects[2].top, 160); assert_equals(rects[3].left, 120); assert_equals(rects[3].top, 60); - }, "vertical-rl rtl"); + }, "vertical-rl rtl"); - test(()=> { + test(()=> { var span = document.querySelector("#sidewaysLrRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -224,9 +229,9 @@ assert_equals(rects[2].top, TOP + COLUMN + GAP); assert_equals(rects[3].left, LEFT); assert_equals(rects[3].top, TOP + COLUMN + GAP + COLUMN + GAP); - }, "sideways-lr rtl"); + }, "sideways-lr rtl"); - test(()=> { + test(()=> { var span = document.querySelector("#sidewaysRlRtl span"); var rects = span.getClientRects(); assert_equals(rects.length, 4); @@ -238,5 +243,8 @@ assert_equals(rects[2].top, TOP + COLUMN * 2 + GAP - TEXT_SIZE); assert_equals(rects[3].left, LEFT + LINE); assert_equals(rects[3].top, TOP + COLUMN - TEXT_SIZE); - }, "sideways-rl rtl"); + }, "sideways-rl rtl"); + + done(); + }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/offsetProps-001.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/offsetProps-001.html index a592c5a8..d9747bf 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-multicol/offsetProps-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/offsetProps-001.html
@@ -22,20 +22,28 @@ </span> </div> <script> - test(()=> { +setup({ explicit_done: true }); +document.fonts.ready.then(() => { + test(() => { assert_equals(outer.offsetWidth, 292); assert_equals(outer.offsetHeight, 40); }, "outer"); - test(()=> { + + test(() => { assert_equals(middle.offsetWidth, 150); assert_equals(middle.offsetHeight, 40); }, "middle"); - test(()=> { + + test(() => { assert_equals(inner1.offsetWidth, 64); assert_equals(inner1.offsetHeight, 24); }, "inner1"); - test(()=> { + + test(() => { assert_equals(inner2.offsetWidth, 110); assert_equals(inner2.offsetHeight, 40); }, "inner2"); + + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/line-spacing.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/line-spacing.html index 4854e984c..51f00c7d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-ruby/line-spacing.html +++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/line-spacing.html
@@ -23,11 +23,17 @@ text-emphasis: 'x'; text-emphasis-position: under left; } + +#log { + font-family: sans-serif; +} </style> <body> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script> +setup({ explicit_done: true }); + function renderRuby(source) { document.body.insertAdjacentHTML('afterbegin', source); const firstChild = document.body.firstChild; @@ -45,120 +51,124 @@ }; } -test(() => { - const {container, ruby, rt} = renderRubyAndGetBoxes( - '<div><ruby>base<rt>annotation</rt></ruby></div>'); - assert_true(container.top <= rt.top); - assert_true(rt.top < ruby.top); -}, 'Over ruby doesn\'t overflow the block'); +document.fonts.load("16px Ahem").then(() => { + test(() => { + const {container, ruby, rt} = renderRubyAndGetBoxes( + '<div><ruby>base<rt>annotation</rt></ruby></div>'); + assert_true(container.top <= rt.top); + assert_true(rt.top < ruby.top); + }, 'Over ruby doesn\'t overflow the block'); -test(() => { - const {container, ruby, rt} = renderRubyAndGetBoxes( - '<div>before <span style="vertical-align:32px;">' + - '<ruby>base<rt>annotation</rt></ruby>' + - '</span> after</div>'); - assert_true(container.top <= rt.top); - assert_true(rt.top < ruby.top); -}, 'Over ruby + vertical-align doesn\'t overflow the block'); + test(() => { + const {container, ruby, rt} = renderRubyAndGetBoxes( + '<div>before <span style="vertical-align:32px;">' + + '<ruby>base<rt>annotation</rt></ruby>' + + '</span> after</div>'); + assert_true(container.top <= rt.top); + assert_true(rt.top < ruby.top); + }, 'Over ruby + vertical-align doesn\'t overflow the block'); -test(() => { - const {container, ruby, rt} = renderRubyAndGetBoxes( - '<div><ruby style="ruby-position:under">base<rt>annotation</rt></ruby></div>'); - assert_true(container.bottom >= rt.bottom); - assert_true(rt.bottom > ruby.bottom); -}, 'Under ruby doesn\'t overflow the block'); + test(() => { + const {container, ruby, rt} = renderRubyAndGetBoxes( + '<div><ruby style="ruby-position:under">base<rt>annotation</rt></ruby></div>'); + assert_true(container.bottom >= rt.bottom); + assert_true(rt.bottom > ruby.bottom); + }, 'Under ruby doesn\'t overflow the block'); -test(() => { - const {container, ruby, rt} = renderRubyAndGetBoxes( - '<div>before <ruby style="vertical-align:-32px; ruby-position:under">' + - 'base<rt>annotation</rt></ruby> after</div>'); - assert_true(container.bottom >= rt.bottom); - assert_true(rt.bottom > ruby.bottom); -}, 'Under ruby + vertical-align doesn\'t overflow the block'); + test(() => { + const {container, ruby, rt} = renderRubyAndGetBoxes( + '<div>before <ruby style="vertical-align:-32px; ruby-position:under">' + + 'base<rt>annotation</rt></ruby> after</div>'); + assert_true(container.bottom >= rt.bottom); + assert_true(rt.bottom > ruby.bottom); + }, 'Under ruby + vertical-align doesn\'t overflow the block'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div><ruby style="ruby-position:under">base<rt>annotation</rt></ruby>' + - '<div>n</div></div>'); - const nextBlockBox = container.querySelector('div').getBoundingClientRect(); - const rtBox = rt.getBoundingClientRect(); - assert_greater_than_equal(nextBlockBox.top, rtBox.bottom); -}, 'Under ruby doesn\'t overwrap with the next block'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div><ruby style="ruby-position:under">base<rt>annotation</rt></ruby>' + + '<div>n</div></div>'); + const nextBlockBox = container.querySelector('div').getBoundingClientRect(); + const rtBox = rt.getBoundingClientRect(); + assert_greater_than_equal(nextBlockBox.top, rtBox.bottom); + }, 'Under ruby doesn\'t overwrap with the next block'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div><span>before</span><br><ruby>base<rt style="font-size:16px"' + - '>annotation</rt></ruby></div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - assert_true(ruby.getBoundingClientRect().top - firstLine.bottom > 1); -}, 'Expand inter-lines spacing'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div><span>before</span><br><ruby>base<rt style="font-size:16px"' + + '>annotation</rt></ruby></div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + assert_true(ruby.getBoundingClientRect().top - firstLine.bottom > 1); + }, 'Expand inter-lines spacing'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div style="line-height:1.5;">' + - '<span>First line</span><br>' + - '<span>Second line</span><br>' + - '<ruby>base<rt style="font-size:50%">' + - 'annotation</rt></ruby></div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect(); - const rubyLine = ruby.getBoundingClientRect(); - assert_approx_equals(secondLine.top - firstLine.top, rubyLine.top - secondLine.top, 1); -}, 'Consume half-leading of the previous line'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div style="line-height:1.5;">' + + '<span>First line</span><br>' + + '<span>Second line</span><br>' + + '<ruby>base<rt style="font-size:50%">' + + 'annotation</rt></ruby></div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect(); + const rubyLine = ruby.getBoundingClientRect(); + assert_approx_equals(secondLine.top - firstLine.top, rubyLine.top - secondLine.top, 1); + }, 'Consume half-leading of the previous line'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div style="line-height:1.5;">' + - '<span>First line</span><br>' + - '<span class="under_emp">Second line</span><br>' + - '<ruby>base<rt style="font-size:50%">' + - 'annotation</rt></ruby></div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect(); - const rubyLine = ruby.getBoundingClientRect(); - const RUBY_EMPHASIS_SIZE = 8; - assert_greater_than_equal(rubyLine.top - secondLine.top, - secondLine.top - firstLine.top + RUBY_EMPHASIS_SIZE); -}, 'Don\'t Consume half-leading of the previous line with text-emphasis'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div style="line-height:1.5;">' + + '<span>First line</span><br>' + + '<span class="under_emp">Second line</span><br>' + + '<ruby>base<rt style="font-size:50%">' + + 'annotation</rt></ruby></div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + const secondLine = container.querySelectorAll('span')[1].getBoundingClientRect(); + const rubyLine = ruby.getBoundingClientRect(); + const RUBY_EMPHASIS_SIZE = 8; + assert_greater_than_equal(rubyLine.top - secondLine.top, + secondLine.top - firstLine.top + RUBY_EMPHASIS_SIZE); + }, 'Don\'t Consume half-leading of the previous line with text-emphasis'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div style="line-height:1.5;">' + - '<span>First line</span><br>' + - '<ruby style="ruby-position:under">base<rt style="font-size:50%">' + - 'annotation</rt></ruby><br>' + - '<span>Third line</span></div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - const rubyLine = ruby.getBoundingClientRect(); - const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect(); - assert_approx_equals(rubyLine.top - firstLine.top, thirdLine.top - rubyLine.top, 1); -}, 'Consume half-leading of the next line'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div style="line-height:1.5;">' + + '<span>First line</span><br>' + + '<ruby style="ruby-position:under">base<rt style="font-size:50%">' + + 'annotation</rt></ruby><br>' + + '<span>Third line</span></div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + const rubyLine = ruby.getBoundingClientRect(); + const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect(); + assert_approx_equals(rubyLine.top - firstLine.top, thirdLine.top - rubyLine.top, 1); + }, 'Consume half-leading of the next line'); -test(() => { - const {container, ruby, rt} = renderRuby( - '<div style="line-height:1.5;">' + - '<span>First line</span><br>' + - '<ruby style="ruby-position:under">base<rt style="font-size:50%">' + - 'annotation</rt></ruby><br>' + - '<span class="over_emp">Third line</span>' + - '</div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - const rubyLine = ruby.getBoundingClientRect(); - const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect(); - const RUBY_EMPHASIS_SIZE = 8; - assert_greater_than_equal(thirdLine.top - rubyLine.top, - rubyLine.top - firstLine.top + RUBY_EMPHASIS_SIZE); -}, 'Don\'t Consume half-leading of the next line with text-emphasis'); + test(() => { + const {container, ruby, rt} = renderRuby( + '<div style="line-height:1.5;">' + + '<span>First line</span><br>' + + '<ruby style="ruby-position:under">base<rt style="font-size:50%">' + + 'annotation</rt></ruby><br>' + + '<span class="over_emp">Third line</span>' + + '</div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + const rubyLine = ruby.getBoundingClientRect(); + const thirdLine = container.querySelectorAll('span')[1].getBoundingClientRect(); + const RUBY_EMPHASIS_SIZE = 8; + assert_greater_than_equal(thirdLine.top - rubyLine.top, + rubyLine.top - firstLine.top + RUBY_EMPHASIS_SIZE); + }, 'Don\'t Consume half-leading of the next line with text-emphasis'); -// crbug.com/336592423 -test(() => { - const {container, ruby, rt} = renderRuby( - '<div style="line-height:1;">' + - '<span style="display:inline-block; width:1em; height:4em; vertical-align:top"></span><br>' + - '<ruby>base<rt>annotation</rt></ruby></div>'); - const firstLine = container.querySelector('span').getBoundingClientRect(); - const rtBox = rt.getBoundingClientRect(); - assert_greater_than_equal(rtBox.top, firstLine.bottom); -}, 'An atomic-inline should not overlap with an annotation in the next line'); + // crbug.com/336592423 + test(() => { + const {container, ruby, rt} = renderRuby( + '<div style="line-height:1;">' + + '<span style="display:inline-block; width:1em; height:4em; vertical-align:top"></span><br>' + + '<ruby>base<rt>annotation</rt></ruby></div>'); + const firstLine = container.querySelector('span').getBoundingClientRect(); + const rtBox = rt.getBoundingClientRect(); + assert_greater_than_equal(rtBox.top, firstLine.bottom); + }, 'An atomic-inline should not overlap with an annotation in the next line'); + + done(); +}); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-margin-001.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-margin-001.html index 205241b..71eb743 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-margin-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-margin-001.html
@@ -32,7 +32,7 @@ generate_tests( ParsingUtils.testShapeMarginInlineStyle, ParsingUtils.buildTestCases(shape_margin_valid_unit_tests, "inline")); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests( ParsingUtils.testShapeMarginComputedStyle, ParsingUtils.buildTestCases(shape_margin_valid_unit_tests, "computed")); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-004.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-004.html index c28172c..d5d429b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-004.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-004.html
@@ -23,7 +23,7 @@ generate_tests( ParsingUtils.testInlineStyle, ParsingUtils.buildPositionTests("circle", true, 'lengthUnit + inline', ParsingUtils.validUnits) ); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests( ParsingUtils.testComputedStyle, ParsingUtils.buildPositionTests("circle", true, 'lengthUnit + computed', ParsingUtils.validUnits) ); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-005.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-005.html index 55a7f07..032a0a6 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-005.html
@@ -21,7 +21,7 @@ setup({explicit_done: true}); generate_tests(ParsingUtils.testInlineStyle, ParsingUtils.buildRadiiTests('circle', 'lengthUnit + inline', ParsingUtils.validUnits)); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests(ParsingUtils.testComputedStyle, ParsingUtils.buildRadiiTests('circle', 'lengthUnit + computed', ParsingUtils.validUnits)); ParsingUtils.restoreFonts(); done();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html index 9456bec3..2cfefad4 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html
@@ -23,7 +23,7 @@ generate_tests( ParsingUtils.testInlineStyle, ParsingUtils.buildPositionTests("ellipse", true, 'lengthUnit + inline', ParsingUtils.validUnits) ); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests( ParsingUtils.testComputedStyle, ParsingUtils.buildPositionTests("ellipse", true, 'lengthUnit + computed', ParsingUtils.validUnits) ); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html index 5c90827..dd0942d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html
@@ -21,7 +21,7 @@ setup({explicit_done: true}); generate_tests(ParsingUtils.testInlineStyle, ParsingUtils.buildRadiiTests('ellipse', 'lengthUnit + inline', ParsingUtils.validUnits)); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests(ParsingUtils.testComputedStyle, ParsingUtils.buildRadiiTests('ellipse', 'lengthUnit + computed', ParsingUtils.validUnits)); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-inset-003.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-inset-003.html index abb9972..008fc772 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-inset-003.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-inset-003.html
@@ -24,7 +24,7 @@ generate_tests(ParsingUtils.testInlineStyle, ParsingUtils.generateInsetRoundCases(unit, 'inline')); }); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { ParsingUtils.validUnits.forEach(function(unit) { generate_tests(ParsingUtils.testComputedStyle, ParsingUtils.generateInsetRoundCases(unit, 'computed')); });
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html index 5edde7dfa..7540e1a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html
@@ -35,7 +35,7 @@ generate_tests( ParsingUtils.testInlineStyle, ParsingUtils.buildPolygonTests(arg_length_units_tests, 'inline') ); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests( ParsingUtils.testComputedStyle, ParsingUtils.buildPolygonTests(arg_length_units_tests, 'computed') ); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html index 2c2c959..542b8bc 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html +++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html
@@ -60,7 +60,7 @@ generate_tests( ParsingUtils.testInlineStyle, ParsingUtils.buildTestCases(basic_shape_args_tests, "inline") ); ParsingUtils.setupFonts(); - document.fonts.ready.then(()=> { + document.fonts.load("10px Ahem").then(()=> { generate_tests( ParsingUtils.testComputedStyle, ParsingUtils.buildTestCases(basic_shape_args_tests, "computed") ); ParsingUtils.restoreFonts();
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/keyword-sizes-for-intrinsic-contributions.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/keyword-sizes-for-intrinsic-contributions.html index dc287b19..b42bd71 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-sizing/keyword-sizes-for-intrinsic-contributions.html +++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/keyword-sizes-for-intrinsic-contributions.html
@@ -111,5 +111,5 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/check-layout-th.js"></script> <script> -checkLayout(".test"); +document.fonts.ready.then(() => checkLayout(".test")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-table.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-table.html index 1507bf6..4ceeb4d3 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-table.html +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-table.html
@@ -175,5 +175,5 @@ </div> </main> <script> - checkLayout(".container"); + document.fonts.ready.then(() => checkLayout(".container")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-td.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-td.html index 4090c5db..d2eec93 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-td.html +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/baseline-td.html
@@ -119,6 +119,6 @@ </main> <script> - checkLayout("table, .display-table"); + document.fonts.ready.then(() => checkLayout("table, .display-table")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/colgroup-col.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/colgroup-col.html index 40fbefe..ba009de 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/colgroup-col.html +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/colgroup-col.html
@@ -118,5 +118,5 @@ </main> <script> - checkLayout("table"); + document.fonts.ready.then(() => checkLayout("table")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/table-quirks.html b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/table-quirks.html index af2a516..35c0910 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/table-quirks.html +++ b/third_party/blink/web_tests/external/wpt/css/css-tables/tentative/table-quirks.html
@@ -72,5 +72,5 @@ test(_ => { assert_equals(window.getComputedStyle(document.querySelector("#notitalic")).fontStyle, "normal"); }, "decoration does not propagate into table"); - checkLayout("table"); + document.fonts.ready.then(() => checkLayout("table")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/text-wrap-balance-word-spacing-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/text-wrap-balance-word-spacing-001-ref.html new file mode 100644 index 0000000..d29d1396 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/text-wrap-balance-word-spacing-001-ref.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <title>CSS Text level 4 Test: text-wrap-style should account for word-spacing</title> + <link rel="author" title="Yulun Wu"> + <link rel="help" href="https://www.w3.org/TR/css-text-4/#word-spacing-property"> + <link rel="help" href="https://www.w3.org/TR/css-text-4/#text-wrap-style"> + <link rel="stylesheet" type="text/css" href="/fonts/ahem.css"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <style> + body { + font-family: "Ahem"; + font-size: 12px; + width: 500px; + } + .spacing-10 { + word-spacing: 10px; + } + .spacing-30 { + word-spacing: 30px; + } + .balance-first-line-spacing-30::first-line { + word-spacing: 30px; + } + .img1 { + background-color: green; + width: 20px; + height: 10px; + } + .img2 { + background-color: green; + width: 20px; + height: 10px; + margin-left: 30px; + margin-right: 30px; + } + </style> + </head> + <body> + <div class="spacing-10">This passes if this div is one line </div> + <div class="spacing-30">This passes if this<br> div has the exact<br> correct breaking points</div> + <div class="spacing-30">This passes if this div has<br> the exact correct breaking<br> points</div> + <div class="balance-first-line-spacing-30">This passes if this div<br> has the exact correct breaking points</div> + <div>test<img class="img1">test <img class="img2"> test</div> + </body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/text-wrap-balance-word-spacing-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/text-wrap-balance-word-spacing-001.html new file mode 100644 index 0000000..db27bba --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/text-wrap-balance-word-spacing-001.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <title>CSS Text level 4 Test: text-wrap-style should account for word-spacing</title> + <link rel="author" title="Yulun Wu"> + <link rel="help" href="https://www.w3.org/TR/css-text-4/#word-spacing-property"> + <link rel="help" href="https://www.w3.org/TR/css-text-4/#text-wrap-style"> + <link rel="match" href="reference/text-wrap-balance-word-spacing-001-ref.html"> + <link rel="stylesheet" type="text/css" href="/fonts/ahem.css"/> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <style> + body { + font-family: "Ahem"; + font-size: 12px; + width: 500px; + } + .spacing-10-balance { + word-spacing: 10px; + text-wrap-style: balance; + } + .spacing-30-balance { + word-spacing: 30px; + text-wrap-style: balance; + } + .spacing-30 { + word-spacing: 30px; + } + .balance-first-line-spacing-30 { + text-wrap-style: balance; + } + .balance-first-line-spacing-30::first-line { + word-spacing: 30px; + } + .img1 { + background-color: green; + width: 20px; + height: 10px; + } + </style> + </head> + <body> + <div class="spacing-10-balance">This passes if this div is one line </div> + <div class="spacing-30-balance">This passes if this div has the exact correct breaking points</div> + <div class="spacing-30">This passes if this div has the exact correct breaking points</div> + <div class="balance-first-line-spacing-30">This passes if this div has the exact correct breaking points</div> + <div class="spacing-30-balance">test<img class="img1">test <img class="img1"> test</div> + </body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-space-position-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-space-position-001.html index 648ae23..9a23e803 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-space-position-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-space-position-001.html
@@ -31,11 +31,15 @@ <div class="pre-wrap">1234<span data-line="0" class="bg"> </span>567</div> </section> <script> -for (let e of document.querySelectorAll('[data-line]')) { - test(() => { - let y = e.offsetTop; - assert_equals(Math.round(y / 10), parseInt(e.dataset.line)); - }); -} +setup({ explicit_done: true }); +document.fonts.ready.then(() => { + for (let e of document.querySelectorAll('[data-line]')) { + test(() => { + let y = e.offsetTop; + assert_equals(Math.round(y / 10), parseInt(e.dataset.line)); + }); + } + done(); +}); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-021.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-021.html index 9c63117..e1a8d03 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-021.html +++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/white-space-intrinsic-size-021.html
@@ -306,5 +306,5 @@ <script src="/resources/testharnessreport.js"></script> <script src="/resources/check-layout-th.js"></script> <script> -checkLayout(".container > div"); +document.fonts.ready.then(() => checkLayout(".container > div")); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/cap-invalidation.html b/third_party/blink/web_tests/external/wpt/css/css-values/cap-invalidation.html index 0becd0d0..c3d7f798 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-values/cap-invalidation.html +++ b/third_party/blink/web_tests/external/wpt/css/css-values/cap-invalidation.html
@@ -21,9 +21,11 @@ <script> setup({ single_test: true }); - let old_width = div.getBoundingClientRect().width; - document.documentElement.style.fontFamily = "sans-serif"; - let new_width = div.getBoundingClientRect().width; - assert_not_equals(old_width, new_width, "expect the capital height of Ahem and sans-serif to be different"); - done(); + document.fonts.ready.then(() => { + let old_width = div.getBoundingClientRect().width; + document.documentElement.style.fontFamily = "sans-serif"; + let new_width = div.getBoundingClientRect().width; + assert_not_equals(old_width, new_width, "expect the capital height of Ahem and sans-serif to be different"); + done(); + }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-transform-dynamic.html b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-transform-dynamic.html new file mode 100644 index 0000000..4dce7f6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-values/tree-counting/sibling-index-keyframe-transform-dynamic.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<title>CSS Values and Units Test: sibling-index() changing transform during @keyframes animation</title> +<link rel="help" href="https://drafts.csswg.org/css-values-5/#tree-counting"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + @keyframes --anim { + from { + transform: translateX(calc(10px * sibling-index())); + } + to { + transform: none; + } + } + #target { + animation: --anim 1000s step-end; + } +</style> +<div> + <div id="rm"></div> + <div></div> + <div id="target"></div> +</div> +<script> + test(() => { + assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 30, 0)"); + }, "Initially, the sibling-index() is 3 for #target"); + + test(() => { + rm.remove(); + assert_equals(getComputedStyle(target).transform, "matrix(1, 0, 0, 1, 20, 0)"); + }, "Removing a preceding sibling of #target reduces the sibling-index()"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-reconstruct-frame-tree-crash.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-reconstruct-frame-tree-crash.html new file mode 100644 index 0000000..bff9a16 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/root-reconstruct-frame-tree-crash.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1966682"> +<script> + window.addEventListener("load", async () => { + const viewTransition = document.startViewTransition(async () => {}) + await viewTransition.ready + const header = document.createElement("th") + document.documentElement.appendChild(header) + document.documentElement.getBoundingClientRect(); + document.documentElement.className = ""; + }) +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html index 680e0b6..77d67aad 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html +++ b/third_party/blink/web_tests/external/wpt/css/css-writing-modes/forms/text-input-block-size.optional.html
@@ -20,31 +20,35 @@ <input id="verticalInput"> <script> -for (const inputType of ["text", "email", "password", "search", "tel", "url", "number"]) { - horizontalInput.type = inputType; - verticalInput.type = inputType; - for (const writingMode of ["vertical-lr", "vertical-rl", "sideways-lr", "sideways-rl"]) { - if (!CSS.supports(`writing-mode: ${writingMode}`)) - continue; - test(t => { - verticalInput.style.writingMode = writingMode; - t.add_cleanup(() => { - verticalInput.removeAttribute("style"); - }); +setup({ explicit_done: true }); +document.fonts.ready.then(() => { + for (const inputType of ["text", "email", "password", "search", "tel", "url", "number"]) { + horizontalInput.type = inputType; + verticalInput.type = inputType; + for (const writingMode of ["vertical-lr", "vertical-rl", "sideways-lr", "sideways-rl"]) { + if (!CSS.supports(`writing-mode: ${writingMode}`)) + continue; + test(t => { + verticalInput.style.writingMode = writingMode; + t.add_cleanup(() => { + verticalInput.removeAttribute("style"); + }); - const verticalRect = verticalInput.getBoundingClientRect(); - assert_true( - verticalRect.width < verticalRect.height, - "input has correct aspect ratio for default input size" - ); + const verticalRect = verticalInput.getBoundingClientRect(); + assert_true( + verticalRect.width < verticalRect.height, + "input has correct aspect ratio for default input size" + ); - const horizontalRect = horizontalInput.getBoundingClientRect(); - assert_equals( - Math.round(verticalRect.width), - Math.round(horizontalRect.height), - "width of vertical input matches height of horizontal input" - ); - }, `Test input[type=${inputType}] block-size in writing-mode: ${writingMode}`); + const horizontalRect = horizontalInput.getBoundingClientRect(); + assert_equals( + Math.round(verticalRect.width), + Math.round(horizontalRect.height), + "width of vertical input matches height of horizontal input" + ); + }, `Test input[type=${inputType}] block-size in writing-mode: ${writingMode}`); + } } -} + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/getBoundingClientRect-shy.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/getBoundingClientRect-shy.html index b27a7884..55349e9 100644 --- a/third_party/blink/web_tests/external/wpt/css/cssom-view/getBoundingClientRect-shy.html +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/getBoundingClientRect-shy.html
@@ -28,66 +28,72 @@ return rect; } -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 0, 5); - assert_equals(rect.width, 50); -}, "Range 0-5 should not include the hyphen."); +setup({ explicit_done: true }); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 1, 5); - assert_equals(rect.width, 40); -}, "Range 1-5 should not include the hyphen."); +document.fonts.ready.then(() => { + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 0, 5); + assert_equals(rect.width, 50); + }, "Range 0-5 should not include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 0, 6); - assert_equals(rect.width, 60); -}, "Range 0-6 should not include the hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 1, 5); + assert_equals(rect.width, 40); + }, "Range 1-5 should not include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 1, 6); - assert_equals(rect.width, 50); -}, "Range 1-6 should not include the hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 0, 6); + assert_equals(rect.width, 60); + }, "Range 0-6 should not include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 0, 7); - assert_equals(rect.width, 70); -}, "Range 0-7 should include the hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 1, 6); + assert_equals(rect.width, 50); + }, "Range 1-6 should not include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 1, 7); - assert_equals(rect.width, 60); -}, "Range 1-7 should include the hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 0, 7); + assert_equals(rect.width, 70); + }, "Range 0-7 should include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test1.firstChild, 0, 8); - assert_equals(rect.width, 70); - assert_equals(rect.height, 20); -}, "Range 0-8 should include the hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 1, 7); + assert_equals(rect.width, 60); + }, "Range 1-7 should include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test2.firstChild, 0, 8); - assert_equals(rect.width, 70); - assert_equals(rect.height, 20); -}, "Range 0-8 should include only the first hyphen."); + test(() => { + const rect = getBoundingClientRect(test1.firstChild, 0, 8); + assert_equals(rect.width, 70); + assert_equals(rect.height, 20); + }, "Range 0-8 should include the hyphen."); -test(() => { - const rect = getBoundingClientRect(test3.firstChild, 2, 3); - assert_equals(rect.width, 0); -}, "Collapsed soft-hyphen should be 0 width."); + test(() => { + const rect = getBoundingClientRect(test2.firstChild, 0, 8); + assert_equals(rect.width, 70); + assert_equals(rect.height, 20); + }, "Range 0-8 should include only the first hyphen."); -test(() => { - const rect = getBoundingClientRect(test3.firstChild, 6, 7); - assert_equals(rect.width, 10); -}, "Rendered soft-hyphen should have a width."); + test(() => { + const rect = getBoundingClientRect(test3.firstChild, 2, 3); + assert_equals(rect.width, 0); + }, "Collapsed soft-hyphen should be 0 width."); -test(() => { - const rect = getBoundingClientRect(test4.firstChild, 0, 1); - assert_equals(rect.width, 0); -}, "Collapsed soft-hyphen in a span should be 0 width."); + test(() => { + const rect = getBoundingClientRect(test3.firstChild, 6, 7); + assert_equals(rect.width, 10); + }, "Rendered soft-hyphen should have a width."); -test(() => { - const rect = getBoundingClientRect(test5.firstChild, 0, 1); - assert_equals(rect.width, 10); -}, "Rendered soft-hyphen in a span should have a width."); + test(() => { + const rect = getBoundingClientRect(test4.firstChild, 0, 1); + assert_equals(rect.width, 0); + }, "Collapsed soft-hyphen in a span should be 0 width."); + + test(() => { + const rect = getBoundingClientRect(test5.firstChild, 0, 1); + assert_equals(rect.width, 10); + }, "Rendered soft-hyphen in a span should have a width."); + + done(); +}); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/getComputedStyle-insets-relpos-inline.html b/third_party/blink/web_tests/external/wpt/css/cssom/getComputedStyle-insets-relpos-inline.html index d5f197ee..7d53f31 100644 --- a/third_party/blink/web_tests/external/wpt/css/cssom/getComputedStyle-insets-relpos-inline.html +++ b/third_party/blink/web_tests/external/wpt/css/cssom/getComputedStyle-insets-relpos-inline.html
@@ -46,19 +46,6 @@ </span> sit amet </div> -<script> -test(() => { - let style = getComputedStyle(target1); - assert_equals(style.left, '0px'); - assert_equals(style.right, '140px'); -}, 'OOF with left fixed right auto in relpos inline container'); - -test(() => { - let style = getComputedStyle(target2); - assert_equals(style.left, '140px'); - assert_equals(style.right, '0px'); -}, 'OOF with left auto right fixed in relpos inline container'); -</script> <div class="ifc"> Lorem @@ -70,15 +57,33 @@ sit amet </div> <script> -test(() => { - let style = getComputedStyle(target3); - assert_equals(style.left, '0px'); - assert_equals(style.right, '140px'); -}, 'OOF with left fixed right auto in relpos inline container with mixed directions'); +setup({ explicit_done: true }); -test(() => { - let style = getComputedStyle(target4); - assert_equals(style.left, '140px'); - assert_equals(style.right, '0px'); -}, 'OOF with left auto right fixed in relpos inline container with mixed directions'); +document.fonts.ready.then(() => { + test(() => { + let style = getComputedStyle(target1); + assert_equals(style.left, '0px'); + assert_equals(style.right, '140px'); + }, 'OOF with left fixed right auto in relpos inline container'); + + test(() => { + let style = getComputedStyle(target2); + assert_equals(style.left, '140px'); + assert_equals(style.right, '0px'); + }, 'OOF with left auto right fixed in relpos inline container'); + + test(() => { + let style = getComputedStyle(target3); + assert_equals(style.left, '0px'); + assert_equals(style.right, '140px'); + }, 'OOF with left fixed right auto in relpos inline container with mixed directions'); + + test(() => { + let style = getComputedStyle(target4); + assert_equals(style.left, '140px'); + assert_equals(style.right, '0px'); + }, 'OOF with left auto right fixed in relpos inline container with mixed directions'); + + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/zero-width-filter.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/zero-width-filter.html deleted file mode 100644 index 5fd54652..0000000 --- a/third_party/blink/web_tests/external/wpt/css/filter-effects/zero-width-filter.html +++ /dev/null
@@ -1,14 +0,0 @@ -<!DOCTYPE html> -<title>zero width filters are ignored</title> -<link rel="help" href="https://www.w3.org/TR/filter-effects-1/#filter-region"> -<link rel="match" href="reference/green-100x100.html"> -<svg width="200" height="200"> - <defs> - <rect id="r" width="100" height="100" fill="green"/> - <filter x="0" y="0" id="f_off" width="0" height="0"> - <feOffset/> - </filter> - </defs> - <rect width="100" height="100" fill="red"/> - <use style="filter:url(#f_off)" href="#r"/> -</svg>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText-FontFace.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText-FontFace.html new file mode 100644 index 0000000..1175a31 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText-FontFace.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> + <title>HTML 5 Canvas Test: fillText() after loading a FontFace and transferControlToOffscreen draws text</title> + <link rel="mismatch" href="empty-ref.html"> + <meta charset="utf-8"> + <meta name="assert" content="fillText() after loading a FontFace and transferControlToOffscreen() draws text"> + <script src="/common/reftest-wait.js"></script> +</head> +<body onload="runTest()"> +<canvas id="c"></canvas> +<script> + function runTest() { + let test_font = new FontFace( + "Lato-Medium", + "url(/fonts/Lato-Medium.ttf)" + ); + + test_font.load().then(font => { + const c = document.getElementById("c"); + const ctx = c.transferControlToOffscreen().getContext("2d"); + // This should also draw text without setting the font. + ctx.fillText("T", 5, 50); + takeScreenshot(); + }); + } +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText.html new file mode 100644 index 0000000..d6eed02 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/canvas.2d.fillText.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<head> + <title>HTML 5 Canvas Test: fillText() after transferControlToOffscreen draws text</title> + <link rel="mismatch" href="empty-ref.html"> + <meta charset="utf-8"> + <meta name="assert" content="fillText() after transferControlToOffscreen() draws text"> + <script src="/common/reftest-wait.js"></script> +</head> +<body onload="runTest()"> +<canvas id="c"></canvas> +<script> + function runTest() { + const c = document.getElementById("c"); + const ctx = c.transferControlToOffscreen().getContext("2d"); + ctx.fillText("T", 5, 50); + takeScreenshot(); + } +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/empty-ref.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/empty-ref.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/text/empty-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.any.worker-expected.txt index fc2d49d..1cb7107 100644 --- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.any.worker-expected.txt +++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.any.worker-expected.txt
@@ -1,9 +1,7 @@ This is a testharness.js-based test. -Found 7 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 6 FAIL, 0 TIMEOUT, 0 NOTRUN. [FAIL] UserActivation interface: existence and properties of interface object assert_false: UserActivation interface should not exist expected false got true -[FAIL] PromiseRejectionEvent interface: attribute promise - assert_throws_js: getting property on prototype object must throw TypeError function "function () { [native code] }" did not throw [FAIL] WorkerGlobalScope interface: attribute onoffline assert_true: The prototype object must have a property "onoffline" expected true got false [FAIL] WorkerGlobalScope interface: attribute ononline @@ -15,3 +13,4 @@ [FAIL] Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false Harness: the test ran to completion. +
diff --git "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML.+\051-expected.txt" "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML.+\051-expected.txt" index 291ec48..7b22798 100644 --- "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML.+\051-expected.txt" +++ "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML.+\051-expected.txt"
@@ -1,13 +1,11 @@ This is a testharness.js-based test. -Found 34 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 32 FAIL, 0 TIMEOUT, 0 NOTRUN. [FAIL] TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false [FAIL] TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain [FAIL] ImageData interface: new ImageData(10, 10) must inherit property "data" with the proper type assert_inherits: property "data" found on object expected in prototype chain -[FAIL] CustomElementRegistry interface: existence and properties of interface object - assert_throws_js: interface object didn't throw TypeError when called as a constructor function "function() {\n new interface_object();\n }" did not throw [FAIL] ElementInternals interface: operation setValidity(optional ValidityStateFlags, optional DOMString, optional HTMLElement) assert_equals: property has wrong .length expected 0 but got 1 [FAIL] VisibilityStateEntry interface: attribute name @@ -20,8 +18,6 @@ assert_own_property: expected property "duration" missing [FAIL] Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing -[FAIL] PromiseRejectionEvent interface: attribute promise - assert_throws_js: getting property on prototype object must throw TypeError function "function () { [native code] }" did not throw [FAIL] Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing [FAIL] Navigator interface: attribute oscpu
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-form-submission.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-form-submission.html index 5934485..04255cc 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-form-submission.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/dialog-form-submission.html
@@ -21,22 +21,33 @@ </form> </dialog> <script> -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + const button = document.querySelector('button'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); dialog.showModal(); - const button = document.querySelector('button'); button.click(); assert_false(dialog.open, "dialog should be closed now"); assert_equals(dialog.returnValue, "default", "Return the default value"); }, 'click the form submission button should close the dialog'); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + const button = document.querySelector('button'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); + dialog.returnValue = "initial"; dialog.showModal(); - const button = document.querySelector('button'); button.value = "sushi"; button.click(); @@ -44,22 +55,50 @@ assert_equals(dialog.returnValue, "sushi", "Return the updated value"); }, 'form submission should return correct value'); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + const button = document.querySelector('button'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); + dialog.returnValue = "initial"; dialog.showModal(); - const button = document.querySelector('button'); button.removeAttribute("value"); button.click(); assert_false(dialog.open, "dialog should be closed now"); - assert_not_equals(dialog.returnValue, undefined, "returnValue should not be set"); -}, "no returnValue when there's no result."); + assert_equals(dialog.returnValue, "initial", "returnValue should not be updated"); +}, "returnValue doesn't update when there's no value attribute."); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + const button = document.querySelector('button'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); + dialog.returnValue = "initial"; dialog.showModal(); + button.setAttribute("value", ""); + button.click(); + assert_false(dialog.open, "dialog should be closed now"); + assert_equals(dialog.returnValue, "", "returnValue should be updated"); +}, "returnValue does update when there's an empty value attribute."); + +promise_test(async (t) => { + const dialog = document.querySelector('dialog'); const button = document.querySelector('input'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); + dialog.showModal(); + let expectedReturnValue = ""; button.addEventListener('click', function(event) { expectedReturnValue = event.offsetX + "," + event.offsetY; @@ -71,16 +110,26 @@ assert_equals(dialog.returnValue, expectedReturnValue, "returnValue should be the offsets of the click"); }, "input image button should return the coordinates"); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); dialog.showModal(); const button = document.getElementById('confirmImgBtn2'); await test_driver.click(button); assert_false(dialog.open, "dialog should be closed now"); }, "formmethod attribute should use dialog form submission"); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); dialog.returnValue = ""; dialog.showModal(); @@ -99,8 +148,13 @@ assert_equals(dialog.returnValue, "", "dialog's returnValue remains the same"); }, "closing the dialog while submitting should stop the submission"); -promise_test(async () => { +promise_test(async (t) => { const dialog = document.querySelector('dialog'); + t.add_cleanup(() => { + dialog.close(); + dialog.returnValue = ""; + button.removeAttribute("value"); + }); dialog.returnValue = undefined; dialog.showModal();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior-request-close.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior-request-close.tentative.html index e505c91..64b4486 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior-request-close.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior-request-close.tentative.html
@@ -74,6 +74,69 @@ invokee.show(); assert_true(invokee.open, "invokee.open"); assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.setAttribute("value", "foo"); + containedinvoker.click(); + assert_equals(invokee.returnValue, "foo"); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to request-close with value (with command ${setType} as ${command}) open dialog closes and overrides returnValue`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.setAttribute("value", ""); + containedinvoker.click(); + assert_equals(invokee.returnValue, ""); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to request-close with value (with command ${setType} as ${command}) open dialog closes and overrides returnValue when empty string`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.removeAttribute("value"); + containedinvoker.click(); + assert_equals(invokee.returnValue, "test"); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to request-close with value (with command ${setType} as ${command}) open dialog closes and doesn't override returnValue when missing value attribute`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); if (typeof command === "string") { if (setType === "property") { containedinvoker.command = command;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior.html index 041bc85..4cfb0b5 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/on-dialog-behavior.html
@@ -141,6 +141,69 @@ invokee.show(); assert_true(invokee.open, "invokee.open"); assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.setAttribute("value", "foo"); + containedinvoker.click(); + assert_equals(invokee.returnValue, "foo"); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to close (with command ${setType} as ${command}) open dialog closes and overrides returnValue`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.setAttribute("value", ""); + containedinvoker.click(); + assert_equals(invokee.returnValue, ""); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to close (with command ${setType} as ${command}) open dialog closes and overrides returnValue when empty string`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + if (setType === "property") { + containedinvoker.command = command; + } else { + containedinvoker.setAttribute("command", command); + } + invokee.returnValue = "test"; + containedinvoker.removeAttribute("value"); + containedinvoker.click(); + assert_equals(invokee.returnValue, "test"); + assert_false(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); + }, + `invoking to close (with command ${setType} as ${command}) open dialog closes and doesn't override returnValue when missing value attribute`, + ); + + test( + function (t) { + t.add_cleanup(resetState); + invokee.show(); + assert_true(invokee.open, "invokee.open"); + assert_false(invokee.matches(":modal"), "invokee :modal"); if (typeof command === "string") { if (setType === "property") { containedinvoker.command = command;
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/merror-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/merror-001.html index a9a021c2..0551e32 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/merror-001.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/merror-001.html
@@ -24,20 +24,25 @@ </math> </div> <script> - test(function () { + setup({ explicit_done: true }); + document.fonts.ready.then(() => { + test(function () { var style = window.getComputedStyle(document.getElementById("merror")); assert_equals(style.borderWidth, "1px"); assert_equals(style.borderColor, "rgb(255, 0, 0)"); assert_equals(style.borderStyle, "solid"); assert_equals(style.backgroundColor, "rgb(255, 255, 224)"); - }, "Default CSS properties on merror"); + }, "Default CSS properties on merror"); - test(function () { + test(function () { var merrorBox = document.getElementById("merror").getBoundingClientRect(); var referenceBox = document.getElementById("reference").getBoundingClientRect(); assert_equals(merrorBox.width, referenceBox.width + 2); assert_equals(merrorBox.height, referenceBox.height + 2); - }, "Bounding box is the same as mrow + 1px border"); + }, "Bounding box is the same as mrow + 1px border"); + + done(); + }); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/mphantom-001.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/mphantom-001.html index 771688c..5af5882 100644 --- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/mphantom-001.html +++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/mrow/mphantom-001.html
@@ -24,17 +24,22 @@ </math> </div> <script> - test(function () { + setup({ explicit_done: true }); + document.fonts.ready.then(() => { + test(function () { var style = window.getComputedStyle(document.getElementById("mphantom")); assert_equals(style.visibility, "hidden"); - }, "Default CSS properties on mphantom"); + }, "Default CSS properties on mphantom"); - test(function () { + test(function () { var mphantomBox = document.getElementById("mphantom").getBoundingClientRect(); var referenceBox = document.getElementById("reference").getBoundingClientRect(); assert_equals(mphantomBox.width, referenceBox.width); assert_equals(mphantomBox.height, referenceBox.height); - }, "Bounding box is the same as mrow"); + }, "Bounding box is the same as mrow"); + + done(); + }); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/resize-observer/svg.html b/third_party/blink/web_tests/external/wpt/resize-observer/svg.html index 6511afc8..60f24e3 100644 --- a/third_party/blink/web_tests/external/wpt/resize-observer/svg.html +++ b/third_party/blink/web_tests/external/wpt/resize-observer/svg.html
@@ -1,4 +1,5 @@ <!doctype html> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="./resources/resizeTestHelper.js"></script> @@ -596,7 +597,8 @@ guard = async_test('guard'); }, "ResizeObserver implemented") -test0() +document.fonts.ready + .then(() => { return test0(); }) .then(() => { return test1(); }) .then(() => { return test2(); }) .then(() => { return test3(); })
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection-second-softnav.tentative.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection-second-softnav.tentative.html deleted file mode 100644 index 4d26bb9..0000000 --- a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection-second-softnav.tentative.html +++ /dev/null
@@ -1,60 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<meta charset="utf-8"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/soft-navigation-helper.js"></script> -</head> -<body> - <main id=main> - <div> - <a id=link><img src="/images/lcp-256x256.png" id="img"></a> - </div> - </main> - <script> - const link = document.getElementById("link"); - let first_lcp_painted; - let second_lcp_painted; - (async () => { - await new Promise(r => { first_lcp_painted = r; }); - addImageToMain("lcp-133x106.png", "no_lcp"); - (new PerformanceObserver(second_lcp_painted)).observe({type: "element"}); - })(); - testSoftNavigation({ - pushState: null, - clicks: 2, - addContent: async () => { - // Add an LCP element. - await new Promise(resolve => { - addImageToMain("lcp-100x50.png", "first_lcp" + counter); - (new PerformanceObserver(resolve)).observe({type: "element"}); - }); - if(counter) { - first_lcp_painted(); - // Wait for the unrelated LCP to be painted. - await new Promise(r => { second_lcp_painted = r; }); - } - const url = URL + "?" + counter; - history.pushState({}, '', url); - }, - link: link, - validate: async () => { - const lcps = await getLcpEntries(); - const ref_counter = counter-1; - assert_equals(lcps.length, 2 + ref_counter, "Got 2 LCP entries"); - assert_equals(lcps[lcps.length - 1].id, "first_lcp" + ref_counter, - "Got the first LCP"); - }, - test: "Second soft navigation image LCP discovered between user " + - "interaction and soft navigation detection are properly " + - "reported, while unrelated LCPs are ignored during that time. " + - "As a side effect, we also test element timing."}); - </script> -</body> -</html> - - -
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection.tentative.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection.tentative.html deleted file mode 100644 index 0de675d3..0000000 --- a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/image-lcp-before-detection.tentative.html +++ /dev/null
@@ -1,54 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<meta charset="utf-8"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/soft-navigation-helper.js"></script> -</head> -<body> - <main id=main> - <div> - <a id=link><img src="/images/lcp-256x256.png" id="img"></a> - </div> - </main> - <script> - const link = document.getElementById("link"); - let first_lcp_painted; - let second_lcp_painted; - (async () => { - await new Promise(r => { first_lcp_painted = r; }); - addImageToMain("lcp-133x106.png", "no_lcp"); - (new PerformanceObserver(second_lcp_painted)).observe({type: "element"}); - })(); - testSoftNavigation({ - pushState: null, - addContent: async () => { - // Add an LCP element. - await new Promise(resolve => { - addImageToMain("lcp-100x50.png", "first_lcp"); - (new PerformanceObserver(resolve)).observe({type: "element"}); - }); - first_lcp_painted(); - // Wait for the unrelated LCP to be painted. - await new Promise(r => { second_lcp_painted = r; }); - const url = URL + "?" + counter; - history.pushState({}, '', url); - }, - link: link, - validate: async () => { - const lcps = await getLcpEntries(); - assert_equals(lcps.length, 2, "Got 2 LCP entries"); - assert_equals(lcps[lcps.length - 1].id, "first_lcp", "Got the first LCP"); - }, - test: "Image LCP discovered between user interaction and soft " + - "navigation detection are properly reported, while unrelated " + - "LCPs are ignored during that time. As a side effect, we also " + - "test element timing."}); - </script> -</body> -</html> - -
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection-second-softnav.tentative.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection-second-softnav.tentative.html deleted file mode 100644 index bed27c3..0000000 --- a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection-second-softnav.tentative.html +++ /dev/null
@@ -1,62 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<meta charset="utf-8"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/soft-navigation-helper.js"></script> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -</head> -<body> - <main id=main> - <div> - <a id=link><img src="/images/lcp-256x256.png" id="img"></a> - </div> - </main> - <script> - const link = document.getElementById("link"); - let first_lcp_painted; - let second_lcp_painted; - (async () => { - await new Promise(r => { first_lcp_painted = r; }); - addTextParagraphToMain("LOREM IPSUMR", "no lcp"); - (new PerformanceObserver(second_lcp_painted)).observe({type: "element"}); - })(); - testSoftNavigation({ - pushState: null, - clicks: 2, - addContent: async () => { - // Add an LCP element. - await new Promise(resolve => { - const p = addTextParagraphToMain("Lorem Ipsum", /*element_timing=*/"first_lcp" + counter); - p.id = "first_lcp" + counter; - (new PerformanceObserver(resolve)).observe({type: "element"}); - }); - if(counter) { - first_lcp_painted(); - // Wait for the unrelated LCP to be painted. - await new Promise(r => { second_lcp_painted = r; }); - } - const url = URL + "?" + counter; - history.pushState({}, '', url); - }, - link: link, - validate: async () => { - const lcps = await getLcpEntries(); - const ref_counter = counter-1; - assert_equals(lcps.length, 2 + ref_counter, "Got 2 LCP entries"); - assert_equals(lcps[lcps.length - 1].id, "first_lcp" + ref_counter, "Got the first LCP"); - }, - test: "Second soft navigation text LCP discovered between user " + - "interaction and soft navigation detection are properly " + - "reported, while unrelated LCPs are ignored during that time. " + - "As a side effect, we also test element timing."}); - </script> -</body> -</html> - - - -
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection.tentative.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection.tentative.html deleted file mode 100644 index 11e82e5..0000000 --- a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/text-lcp-before-detection.tentative.html +++ /dev/null
@@ -1,55 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> -<meta charset="utf-8"> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/soft-navigation-helper.js"></script> -<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> -</head> -<body> - <main id=main> - <div> - <a id=link><img src="/images/lcp-256x256.png" id="img"></a> - </div> - </main> - <script> - const link = document.getElementById("link"); - let first_lcp_painted; - let second_lcp_painted; - (async () => { - await new Promise(r => { first_lcp_painted = r; }); - addTextParagraphToMain("LOREM IPSUMR", "no lcp"); - (new PerformanceObserver(second_lcp_painted)).observe({type: "element"}); - })(); - testSoftNavigation({ - pushState: null, - addContent: async () => { - // Add an LCP element. - await new Promise(resolve => { - const p = addTextParagraphToMain("Lorem Ipsum", /*element_timing=*/"first_lcp"); - p.id = "first_lcp"; - (new PerformanceObserver(resolve)).observe({type: "element"}); - }); - first_lcp_painted(); - // Wait for the unrelated LCP to be painted. - await new Promise(r => { second_lcp_painted = r; }); - const url = URL + "?" + counter; - history.pushState({}, '', url); - }, - link: link, - validate: async () => { - const lcps = await getLcpEntries(); - assert_equals(lcps.length, 2, "Got 2 LCP entries"); - assert_equals(lcps[lcps.length - 1].id, "first_lcp", "Got the first LCP"); - }, - test: "Text LCP discovered between user interaction and soft " + - "navigation detection are properly reported, while unrelated " + - "LCPs are ignored during that time. As a side effect, we also " + - "test element timing."}); - </script> -</body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/svg/interact/scripted/svg-pointer-events-bbox.html b/third_party/blink/web_tests/external/wpt/svg/interact/scripted/svg-pointer-events-bbox.html index 8db9149c..06d34fec54 100644 --- a/third_party/blink/web_tests/external/wpt/svg/interact/scripted/svg-pointer-events-bbox.html +++ b/third_party/blink/web_tests/external/wpt/svg/interact/scripted/svg-pointer-events-bbox.html
@@ -131,25 +131,31 @@ }, `${label} ${shouldContain ? 'contains' : 'does not contain'} point at (${point.x}, ${point.y})`); } -pointsOnCircle1.forEach(point => hitTest(point, circle1, true)); -pointsNotOnCircle1.forEach(point => hitTest(point, circle1, false)); -pointsInsideBBoxOfCircle1.forEach(point => hitTest(point, group1, true, 'group1')); +setup({ explicit_done: true }); -pointsOnCircle2.forEach(point => hitTest(point, circle2, true)); -pointsInsideBBoxOfCircle2.forEach(point => hitTest(point, circle2, true, 'bbox of circle2')); +document.fonts.ready.then(() => { + pointsOnCircle1.forEach(point => hitTest(point, circle1, true)); + pointsNotOnCircle1.forEach(point => hitTest(point, circle1, false)); + pointsInsideBBoxOfCircle1.forEach(point => hitTest(point, group1, true, 'group1')); -pointsOnText1.forEach(point => hitTest(point, text1, true)); -pointsOnTspan1.forEach(point => hitTest(point, tspan1, true)); -pointsNotOnText1.forEach(point => hitTest(point, text1, false)); -pointsInsideBBoxOfText1.forEach(point => hitTest(point, text1, true, 'bbox of text1')); + pointsOnCircle2.forEach(point => hitTest(point, circle2, true)); + pointsInsideBBoxOfCircle2.forEach(point => hitTest(point, circle2, true, 'bbox of circle2')); -pointsOnText2.forEach(point => hitTest(point, text2, true)); -pointsOnTspan2.forEach(point => hitTest(point, tspan2, true)); -pointsNotOnText2.forEach(point => hitTest(point, text2, false)); -pointsInsideBBoxOfText2.forEach(point => hitTest(point, text2, true, 'bbox of text2')); + pointsOnText1.forEach(point => hitTest(point, text1, true)); + pointsOnTspan1.forEach(point => hitTest(point, tspan1, true)); + pointsNotOnText1.forEach(point => hitTest(point, text1, false)); + pointsInsideBBoxOfText1.forEach(point => hitTest(point, text1, true, 'bbox of text1')); -pointsOnText3.forEach(point => hitTest(point, text3, true)); -pointsNotOnText3.forEach(point => hitTest(point, text3, false)); + pointsOnText2.forEach(point => hitTest(point, text2, true)); + pointsOnTspan2.forEach(point => hitTest(point, tspan2, true)); + pointsNotOnText2.forEach(point => hitTest(point, text2, false)); + pointsInsideBBoxOfText2.forEach(point => hitTest(point, text2, true, 'bbox of text2')); -pointsOnImage1.forEach(point => hitTest(point, image1, true)); + pointsOnText3.forEach(point => hitTest(point, text3, true)); + pointsNotOnText3.forEach(point => hitTest(point, text3, false)); + + pointsOnImage1.forEach(point => hitTest(point, image1, true)); + + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/text/reftests/first-letter-ref.svg b/third_party/blink/web_tests/external/wpt/svg/text/reftests/first-letter-ref.svg index 66f5c6d..72f866be 100644 --- a/third_party/blink/web_tests/external/wpt/svg/text/reftests/first-letter-ref.svg +++ b/third_party/blink/web_tests/external/wpt/svg/text/reftests/first-letter-ref.svg
@@ -1,4 +1,7 @@ <svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml"> + <metadata> + <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + </metadata> <style> text { font-family: Ahem;
diff --git a/third_party/blink/web_tests/external/wpt/svg/text/reftests/opacity-ref.svg b/third_party/blink/web_tests/external/wpt/svg/text/reftests/opacity-ref.svg index 18c00ab..7b4dbba 100644 --- a/third_party/blink/web_tests/external/wpt/svg/text/reftests/opacity-ref.svg +++ b/third_party/blink/web_tests/external/wpt/svg/text/reftests/opacity-ref.svg
@@ -1,5 +1,7 @@ -<svg xmlns="http://www.w3.org/2000/svg"> - <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml"> + <metadata> + <h:link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> + </metadata> <style> text { font-size: 50px;
diff --git a/third_party/blink/web_tests/external/wpt/svg/text/scripted/getcharnumatposition.html b/third_party/blink/web_tests/external/wpt/svg/text/scripted/getcharnumatposition.html index f17369b..15f5dc68 100644 --- a/third_party/blink/web_tests/external/wpt/svg/text/scripted/getcharnumatposition.html +++ b/third_party/blink/web_tests/external/wpt/svg/text/scripted/getcharnumatposition.html
@@ -26,47 +26,53 @@ return p; } -test(() => { - const element = document.querySelector('#htb'); - assert_equals(element.getNumberOfChars(), 3); - const start = 40; - assert_equals(element.getCharNumAtPosition(newPoint(start - 10, 100)), -1); - assert_equals(element.getCharNumAtPosition(newPoint(start + 10, 100)), 0); - assert_equals(element.getCharNumAtPosition(newPoint(start + 30, 100)), 1); - assert_equals(element.getCharNumAtPosition(newPoint(start + 50, 100)), 2); - assert_equals(element.getCharNumAtPosition(newPoint(start + 70, 100)), -1); -}, 'horizontal-tb'); +setup({ explicit_done: true }); -test(() => { - const element = document.querySelector('#vlr'); - assert_equals(element.getNumberOfChars(), 3); - const start = 120; - assert_equals(element.getCharNumAtPosition(newPoint(40, start - 10)), -1); - assert_equals(element.getCharNumAtPosition(newPoint(40, start + 10)), 0); - assert_equals(element.getCharNumAtPosition(newPoint(40, start + 30)), 1); - assert_equals(element.getCharNumAtPosition(newPoint(40, start + 50)), 2); - assert_equals(element.getCharNumAtPosition(newPoint(40, start + 70)), -1); -}, 'virtical-lr'); +document.fonts.ready.then(() => { + test(() => { + const element = document.querySelector('#htb'); + assert_equals(element.getNumberOfChars(), 3); + const start = 40; + assert_equals(element.getCharNumAtPosition(newPoint(start - 10, 100)), -1); + assert_equals(element.getCharNumAtPosition(newPoint(start + 10, 100)), 0); + assert_equals(element.getCharNumAtPosition(newPoint(start + 30, 100)), 1); + assert_equals(element.getCharNumAtPosition(newPoint(start + 50, 100)), 2); + assert_equals(element.getCharNumAtPosition(newPoint(start + 70, 100)), -1); + }, 'horizontal-tb'); -test(() => { - const element = document.querySelector('#vrl'); - assert_equals(element.getNumberOfChars(), 3); - const start = 120; - assert_equals(element.getCharNumAtPosition(newPoint(80, start - 10)), -1); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 10)), 0); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 30)), 1); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 50)), 2); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 70)), -1); -}, 'virtical-rl'); + test(() => { + const element = document.querySelector('#vlr'); + assert_equals(element.getNumberOfChars(), 3); + const start = 120; + assert_equals(element.getCharNumAtPosition(newPoint(40, start - 10)), -1); + assert_equals(element.getCharNumAtPosition(newPoint(40, start + 10)), 0); + assert_equals(element.getCharNumAtPosition(newPoint(40, start + 30)), 1); + assert_equals(element.getCharNumAtPosition(newPoint(40, start + 50)), 2); + assert_equals(element.getCharNumAtPosition(newPoint(40, start + 70)), -1); + }, 'vertical-lr'); -test(() => { - const element = document.querySelector('#srl'); - assert_equals(element.getNumberOfChars(), 3); - const start = 200; - assert_equals(element.getCharNumAtPosition(newPoint(80, start - 10)), -1); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 10)), 0); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 30)), 1); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 50)), 2); - assert_equals(element.getCharNumAtPosition(newPoint(80, start + 70)), -1); -}, 'sideways-rl'); + test(() => { + const element = document.querySelector('#vrl'); + assert_equals(element.getNumberOfChars(), 3); + const start = 120; + assert_equals(element.getCharNumAtPosition(newPoint(80, start - 10)), -1); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 10)), 0); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 30)), 1); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 50)), 2); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 70)), -1); + }, 'vertical-rl'); + + test(() => { + const element = document.querySelector('#srl'); + assert_equals(element.getNumberOfChars(), 3); + const start = 200; + assert_equals(element.getCharNumAtPosition(newPoint(80, start - 10)), -1); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 10)), 0); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 30)), 1); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 50)), 2); + assert_equals(element.getCharNumAtPosition(newPoint(80, start + 70)), -1); + }, 'sideways-rl'); + + done(); +}); </script>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/accept_insecure_certs.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/accept_insecure_certs.py new file mode 100644 index 0000000..10e98fe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/accept_insecure_certs.py
@@ -0,0 +1,14 @@ +import pytest + +from .. import get_user_context_ids + +pytestmark = pytest.mark.asyncio + + +@pytest.mark.parametrize("accept_insecure_certs", [True, False]) +async def test_create_context(bidi_session, create_user_context, + accept_insecure_certs): + user_context = await create_user_context( + accept_insecure_certs=accept_insecure_certs) + # TODO: check the parameter is respected. + assert user_context in await get_user_context_ids(bidi_session)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/invalid.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/invalid.py new file mode 100644 index 0000000..9af6cdd5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/invalid.py
@@ -0,0 +1,68 @@ +import pytest + +import webdriver.bidi.error as error + +pytestmark = pytest.mark.asyncio + + +# Even though the user context is not expected to be created, if the user agent +# under the test does not support the parameter, the validation will not fail +# and unexpected user context will be created and will not be closed. Using +# `create_user_context` fixture guarantees the mistakenly created user context +# is destroyed. + +@pytest.mark.parametrize("value", [42, "foo", {}, []]) +async def test_accept_insecure_certs_invalid_type(create_user_context, value): + with pytest.raises(error.InvalidArgumentException): + await create_user_context(accept_insecure_certs=value) + + +@pytest.mark.parametrize("value", [False, 42, "foo", []]) +async def test_proxy_invalid_type(create_user_context, value): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy=value) + + +@pytest.mark.parametrize("value", [{}]) +async def test_proxy_invalid_value(create_user_context, value): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy=value) + + +@pytest.mark.parametrize("value", [False, 42, {}, []]) +async def test_proxy_proxy_type_invalid_type(create_user_context, value): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy={ + "proxyType": value + }) + + +async def test_proxy_proxy_type_invalid_value(create_user_context): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy={ + "proxyType": "SOME_UNKNOWN_TYPE" + }) + + +async def test_proxy_proxy_type_manual_socks_version_without_socks_proxy( + create_user_context): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy={ + "proxyType": "manual", + "socksVersion": 0 + }) + + +async def test_proxy_proxy_type_manual_socks_proxy_without_socks_version( + create_user_context): + with pytest.raises(error.InvalidArgumentException): + await create_user_context( + proxy={ + "proxyType": "manual", + "socksProxy": "127.0.0.1:1080" + })
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy.py new file mode 100644 index 0000000..fb59228e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy.py
@@ -0,0 +1,74 @@ +import pytest + +from .. import get_user_context_ids + +pytestmark = pytest.mark.asyncio + + +@pytest.fixture +def create_user_context_with_proxy(bidi_session, create_user_context): + async def create_user_context_with_proxy(proxy): + user_context = await create_user_context(proxy=proxy) + + assert user_context in await get_user_context_ids(bidi_session) + + return user_context + + return create_user_context_with_proxy + + +async def test_system(create_user_context_with_proxy): + await create_user_context_with_proxy({ + "proxyType": "system" + }) + # TODO: check the proxy is actually set. + + +async def test_autodetect( + create_user_context_with_proxy): + await create_user_context_with_proxy({ + "proxyType": "autodetect" + }) + # TODO: check the proxy is actually set. + + +async def test_direct(create_user_context_with_proxy): + await create_user_context_with_proxy({ + "proxyType": "direct" + }) + # TODO: check the proxy is actually set. + + +@pytest.mark.parametrize("ftpProxy", [None, "127.0.0.1:21"]) +@pytest.mark.parametrize("httpProxy", [None, "127.0.0.1:80"]) +@pytest.mark.parametrize("sslProxy", [None, "127.0.0.1:443"]) +@pytest.mark.parametrize("noProxy", [None, ["127.0.0.1"]]) +@pytest.mark.parametrize("socks", [None, { + "socksProxy": "127.0.0.1:1080", + "socksVersion": 5}]) +async def test_manual(create_user_context_with_proxy, + ftpProxy, httpProxy, sslProxy, + noProxy, socks): + proxy = { + "proxyType": "manual" + } + + if ftpProxy is not None: + proxy["ftpProxy"] = ftpProxy + + if httpProxy is not None: + proxy["httpProxy"] = httpProxy + + if sslProxy is not None: + proxy["sslProxy"] = sslProxy + + if noProxy is not None: + proxy["noProxy"] = noProxy + + if socks is not None: + proxy.update(socks) + + await create_user_context_with_proxy(proxy) + # TODO: check the proxy is actually set. + +# TODO: test "proxyType": "pac"
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py index e8119d2..6577b9f 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/before_request_sent/before_request_sent_cached.py
@@ -105,7 +105,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events after reload, for the document and the stylesheet. wait = AsyncPoll(bidi_session, timeout=2) @@ -172,7 +174,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events after reload, for the document and the stylesheet. wait = AsyncPoll(bidi_session, timeout=2) @@ -264,7 +268,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect three events after reload, for the document and the 2 stylesheets. wait = AsyncPoll(bidi_session, timeout=2) @@ -338,7 +344,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript file. wait = AsyncPoll(bidi_session, timeout=2) @@ -446,7 +454,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript module. wait = AsyncPoll(bidi_session, timeout=2) @@ -548,7 +558,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the image. wait = AsyncPoll(bidi_session, timeout=2)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_completed/response_completed_cached.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_completed/response_completed_cached.py index 2c7ea02d..4c024f3 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_completed/response_completed_cached.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_completed/response_completed_cached.py
@@ -249,7 +249,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events after reload, for the document and the stylesheet. wait = AsyncPoll(bidi_session, timeout=2) @@ -324,7 +326,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect three events after reload, for the document and the 2 stylesheets. wait = AsyncPoll(bidi_session, timeout=2) @@ -418,7 +422,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect three events after reload, for the document and the 2 stylesheets. wait = AsyncPoll(bidi_session, timeout=2) @@ -491,7 +497,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript file. wait = AsyncPoll(bidi_session, timeout=2) @@ -622,7 +630,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript module. wait = AsyncPoll(bidi_session, timeout=2) @@ -727,7 +737,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the image. wait = AsyncPoll(bidi_session, timeout=2)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_started/response_started_cached.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_started/response_started_cached.py index db34035..2b7e25bcd 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_started/response_started_cached.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/network/response_started/response_started_cached.py
@@ -258,7 +258,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events after reload, for the document and the stylesheet. wait = AsyncPoll(bidi_session, timeout=2) @@ -330,7 +332,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect three events after reload, for the document and the 2 stylesheets. wait = AsyncPoll(bidi_session, timeout=2) @@ -427,7 +431,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect three events after reload, for the document and the 2 stylesheets. wait = AsyncPoll(bidi_session, timeout=2) @@ -506,7 +512,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript file. wait = AsyncPoll(bidi_session, timeout=2) @@ -629,7 +637,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the javascript module. wait = AsyncPoll(bidi_session, timeout=2) @@ -731,7 +741,9 @@ ) # Reload the page. - await bidi_session.browsing_context.reload(context=top_context["context"]) + await bidi_session.browsing_context.reload( + context=top_context["context"], wait="complete" + ) # Expect two events, one for the document and one for the image. wait = AsyncPoll(bidi_session, timeout=2)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/classic/new_session/merge.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/classic/new_session/merge.py index 4d36926..32991b322 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/classic/new_session/merge.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/classic/new_session/merge.py
@@ -41,42 +41,61 @@ def test_merge_platform_name(new_session, add_browser_capabilities, target_platform): + always_match = add_browser_capabilities({}) + + if "platformName" in always_match: + platform_name = always_match.pop("platformName") + else: + platform_name = target_platform + + # Remove pageLoadStrategy so we can use it to validate the merging of the firstMatch + # capabilities, and guarantee platformName isn't simply ignored. + if "pageLoadStrategy" in always_match: + del always_match["pageLoadStrategy"] + response, _ = new_session({"capabilities": { - "alwaysMatch": add_browser_capabilities({"timeouts": {"script": 10}}), + "alwaysMatch": always_match, "firstMatch": [{ - "platformName": target_platform.upper(), + "platformName": platform_name.upper(), "pageLoadStrategy": "none", }, { - "platformName": target_platform, + "platformName": platform_name, "pageLoadStrategy": "eager", }]}}) value = assert_success(response) - assert value["capabilities"]["platformName"] == target_platform + assert value["capabilities"]["platformName"] == platform_name assert value["capabilities"]["pageLoadStrategy"] == "eager" def test_merge_browserName(new_session, add_browser_capabilities): - response, _ = new_session( - {"capabilities": {"alwaysMatch": add_browser_capabilities({})}}) - value = assert_success(response) + always_match = add_browser_capabilities({}) - browser_settings = { - "browserName": value["capabilities"]["browserName"], - "browserVersion": value["capabilities"]["browserVersion"], - } + if "browserName" in always_match: + browser_name = always_match.pop("browserName") + else: + response, _ = new_session( + {"capabilities": {"alwaysMatch": always_match}}) + value = assert_success(response) + browser_name = value["capabilities"]["browserName"] + + # Remove pageLoadStrategy so we can use it to validate the merging of the firstMatch + # capabilities, and guarantee browserName isn't simply ignored. + if "pageLoadStrategy" in always_match: + del always_match["pageLoadStrategy"] response, _ = new_session({"capabilities": { - "alwaysMatch": add_browser_capabilities({"timeouts": {"script": 10}}), + "alwaysMatch": always_match, "firstMatch": [{ - "browserName": browser_settings["browserName"] + "invalid", + "browserName": browser_name + "invalid", "pageLoadStrategy": "none", }, { - "browserName": browser_settings["browserName"], + "browserName": browser_name, "pageLoadStrategy": "eager", }]}}, delete_existing_session=True) + value = assert_success(response) - assert value["capabilities"]["browserName"] == browser_settings['browserName'] + assert value["capabilities"]["browserName"] == browser_name assert value["capabilities"]["pageLoadStrategy"] == "eager"
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py index 0996821..9942f72 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/fixtures_bidi.py
@@ -499,9 +499,11 @@ user_contexts = [] - async def create_user_context(): + async def create_user_context(accept_insecure_certs=None, proxy=None): nonlocal user_contexts - user_context = await bidi_session.browser.create_user_context() + user_context = await bidi_session.browser.create_user_context( + accept_insecure_certs=accept_insecure_certs, proxy=proxy + ) user_contexts.append(user_context) return user_context
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/font-face-style-normal-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/font-face-style-normal-expected.txt deleted file mode 100644 index ce8c6b5..0000000 --- a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-fonts/font-face-style-normal-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] CSS Fonts: parsing 'normal' in the font-style descriptor 1 - assert_equals: 'oblique 0deg' serializes as 'normal' expected "normal" but got "oblique 0deg" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy-expected.txt new file mode 100644 index 0000000..5e5d347f --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/webdriver/tests/bidi/browser/create_user_context/proxy-expected.txt
@@ -0,0 +1,5 @@ +This is a wdspec test. +[FAIL] test_autodetect + webdriver.bidi.error.UnsupportedOperationException: unsupported operation (Autodetect proxy is not supported per user context) +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-multimodal.https.window.js b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-multimodal.https.window.js index eae27c26..7a45793 100644 --- a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-multimodal.https.window.js +++ b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-multimodal.https.window.js
@@ -7,6 +7,8 @@ const kPrompt = 'describe this'; const kValidImagePath = 'resources/media/apple.jpg'; const kValidAudioPath = 'resources/media/speech.mp3'; +const kValidSVGImagePath = 'resources/media/wikipedia-logo.svg'; +const kValidVideoPath = 'resources/media/video.mp4'; function messageWithContent(prompt, type, value) { return [{ @@ -158,6 +160,64 @@ assert_regexp_match(result, /<image>/); }, 'Prompt with ArrayBufferView image content'); +promise_test(async () => { + await ensureLanguageModel(); + const newImage = new Image(); + newImage.src = kValidSVGImagePath; + const session = + await LanguageModel.create({expectedInputs: [{type: 'image'}]}); + + const result = + await session.prompt(messageWithContent( + kPrompt, 'image', newImage)); + assert_regexp_match(result, /<image>/); +}, 'Prompt with HTMLImageElement image content (with SVG)'); + + +promise_test(async () => { + await ensureLanguageModel(); + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.setAttribute('width', '100'); + svg.setAttribute('height', '100'); + const svgImage = + document.createElementNS('http://www.w3.org/2000/svg', 'image'); + svgImage.setAttribute('href', kValidImagePath); + svgImage.setAttribute('decoding', 'sync'); + svg.appendChild(svgImage); + document.body.appendChild(svg); + + // Must wait for the SVG and image to load first. + // TODO(crbug.com/417260923): Make prompt Api await the image to be loaded. + const {promise, resolve} = Promise.withResolvers(); + svgImage.addEventListener('load', resolve); + await promise; + const session = + await LanguageModel.create({expectedInputs: [{type: 'image'}]}); + + const result = + await session.prompt(messageWithContent( + kPrompt, 'image', svgImage)); + assert_regexp_match(result, /<image>/); +}, 'Prompt with SVGImageElement image content'); + +promise_test(async () => { + await ensureLanguageModel(); + var video = document.createElement('video'); + video.src = kValidVideoPath; + video.width = 1224; + video.height = 768; + // Video must have frames fetched. See crbug.com/417249941#comment3 + await video.play(); + + const session = + await LanguageModel.create({expectedInputs: [{type: 'image'}]}); + + const result = + await session.prompt(messageWithContent( + kPrompt, 'image', video)); + assert_regexp_match(result, /<image>/); +}, 'Prompt with HTMLVideoElement image content'); + /***************************************** * Audio tests *****************************************/
diff --git a/third_party/blink/web_tests/wpt_internal/ai/resources/media/video.mp4 b/third_party/blink/web_tests/wpt_internal/ai/resources/media/video.mp4 new file mode 100644 index 0000000..ed139d6d --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/ai/resources/media/video.mp4 Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/ai/resources/media/wikipedia-logo.svg b/third_party/blink/web_tests/wpt_internal/ai/resources/media/wikipedia-logo.svg new file mode 100644 index 0000000..dc32f98 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/ai/resources/media/wikipedia-logo.svg
@@ -0,0 +1 @@ +<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [<!ENTITY st0 "opacity:.22;fill:#231F20;"><!ENTITY st1 "opacity:.34;fill:url(#SVGID_25_);"><!ENTITY st2 "opacity:.19;fill:#231F20;"><!ENTITY st3 "opacity:.18;fill:url(#SVGID_42_);"><!ENTITY st4 "opacity:.73;fill:#FFF;"><!ENTITY st5 "opacity:.35;fill:url(#SVGID_6_);"><!ENTITY st6 "opacity:.53;fill:#FFF;"><!ENTITY st7 "opacity:.43;fill:url(#SVGID_23_);"><!ENTITY st8 "opacity:.25;fill:#231F20;"><!ENTITY st9 "opacity:.53;fill:url(#SVGID_9_);"><!ENTITY st10 "opacity:.88;fill:#231F20;"><!ENTITY st11 "opacity:.31;fill:url(#SVGID_24_);"><!ENTITY st12 "fill:#232323;"><!ENTITY st13 "opacity:.68;fill:url(#SVGID_22_);"><!ENTITY st14 "opacity:.28;fill:#231F20;"><!ENTITY st15 "opacity:.38;fill:url(#SVGID_43_);"><!ENTITY st16 "fill:url(#SVGID_1_);"><!ENTITY st17 "fill:url(#SVGID_2_);"><!ENTITY st18 "fill:url(#SVGID_4_);"><!ENTITY st19 "opacity:.45;fill:url(#SVGID_5_);"><!ENTITY st20 "opacity:.17;fill:#FFF;"><!ENTITY st21 "opacity:.3;fill:#505050;"><!ENTITY st22 "fill:#616161;"><!ENTITY st23 "fill:#FFF;"><!ENTITY st24 "opacity:.2;fill:url(#SVGID_41_);"><!ENTITY st25 "opacity:.69;fill:url(#SVGID_3_);"><!ENTITY st26 "opacity:.45;fill:url(#SVGID_39_);"><!ENTITY st27 "opacity:.96;fill:url(#SVGID_10_);"><!ENTITY st28 "opacity:.3;fill:#FFF;"><!ENTITY st29 "fill:#9FA2A3;"><!ENTITY st30 "opacity:.73;fill:url(#SVGID_8_);"><!ENTITY st31 "fill:#6B6B6B;"><!ENTITY st32 "opacity:.36;fill:#231F20;"><!ENTITY st33 "opacity:.5;fill:url(#SVGID_7_);"><!ENTITY st34 "opacity:.1;fill:#232323;"><!ENTITY st35 "fill:url(#SVGID_11_);"><!ENTITY st36 "fill:url(#SVGID_12_);"><!ENTITY st37 "fill:url(#SVGID_13_);"><!ENTITY st38 "fill:url(#SVGID_14_);"><!ENTITY st39 "fill:url(#SVGID_15_);"><!ENTITY st40 "fill:url(#SVGID_16_);"><!ENTITY st41 "fill:url(#SVGID_17_);"><!ENTITY st42 "fill:url(#SVGID_18_);"><!ENTITY st43 "fill:url(#SVGID_19_);"><!ENTITY st44 "fill:url(#SVGID_20_);"><!ENTITY st45 "fill:url(#SVGID_21_);"><!ENTITY st46 "fill:url(#SVGID_26_);"><!ENTITY st47 "fill:url(#SVGID_27_);"><!ENTITY st48 "fill:url(#SVGID_28_);"><!ENTITY st49 "fill:url(#SVGID_29_);"><!ENTITY st50 "fill:url(#SVGID_30_);"><!ENTITY st51 "fill:url(#SVGID_31_);"><!ENTITY st52 "fill:url(#SVGID_33_);"><!ENTITY st53 "fill:url(#SVGID_34_);"><!ENTITY st54 "fill:url(#SVGID_35_);"><!ENTITY st55 "fill:url(#SVGID_36_);"><!ENTITY st56 "fill:url(#SVGID_37_);"><!ENTITY st57 "fill:url(#SVGID_38_);"><!ENTITY st58 "fill:url(#SVGID_40_);"><!ENTITY st59 "opacity:.1;fill:#231F20;"><!ENTITY st60 "opacity:.5;fill:#141414;"><!ENTITY st61 "opacity:.38;fill:#231F20;"><!ENTITY st62 "opacity:.83;fill:url(#SVGID_32_);">]><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="103px" height="94px" viewBox="0 0 103 94"><title>Wikipedia logo version 2</title><radialGradient id="SVGID_1_" cx="244.5713" cy="-427.1392" r="68.6868" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".4835" stop-color="#EAEAEB"/><stop offset=".9451" stop-color="#A9ABAE"/><stop offset="1" stop-color="#999B9E"/></radialGradient><path style="&st16;" d="M49.85,17.003c0.014-0.606-0.392-1.27-0.392-1.27l-0.025-0.058c0,0-0.487-0.949-1.301-1.228c-0.815-0.278-1.478,0.342-1.478,0.342s-0.114,0.131-0.428,0.494c-0.313,0.364-0.507,0.666-1.198,0.938c-0.692,0.271-1.379,0.204-1.743,0.033c-0.365-0.172-0.457-0.537-0.457-0.537s-0.229-0.722-0.313-1.049c-0.086-0.331-0.308-1.694-0.308-1.694s-0.492-2.747-0.535-3.304c0,0,1.475-0.126,3.686-0.775c2.3-0.673,3.043-1.206,3.043-1.206s-0.432-0.156-0.484-0.662c-0.051-0.507-0.089-1.19-0.089-1.19s-0.089-0.5,0.483-1.139c0.572-0.64,1.354-0.863,1.763-0.953c0.41-0.089,1.281-0.17,2.092-0.134c0.813,0.038,1.266,0.112,1.594,0.291c0.327,0.178,0.356,0.61,0.356,0.61l-0.009,1.146c0,0-0.035,0.402,0.262,0.529c0,0,0.505,0.305,2.197,0.133c0,0,0.719-0.126,1.845-0.46c1.125-0.335,4.129-1.229,4.554-1.341c0.426-0.111,0.953-0.291,1.645-0.469c0.693-0.179,2.041-0.626,2.309-0.73c0.27-0.104,1.811-0.618,2.928-0.81c1.114-0.195,2.226-0.186,2.813,0.149c0,0,0.357,0.304,0.521,0.662c0.162,0.358,0.476,0.863,0.92,1.088c0.457,0.227,0.754,0.371,1.877,0.273c0,0,0.021-0.096-0.396-0.37c-0.417-0.277-0.991-0.701-0.991-0.701s-0.334-0.245-0.408-0.447c-0.072-0.202-0.043-0.306-0.043-0.306l0.877-1.406c0,0,0-0.172,0.506-0.238c0.506-0.067,1.074-0.134,1.742-0.313c0.67-0.178,0.789-0.312,0.789-0.312l0.578,0.178c0,0,3.547,2.853,4.655,3.583l0.198-0.239c0,0,0.437,0.018,0.828,0.172c0.393,0.154,0.979,0.562,0.979,0.562s1.613,1.31,2.072,2.2l0.222,0.679l-0.102,0.161c0,0,0.919,1.307,2.096,2.602c0,0,1.229,1.664,1.689,2.09c0,0-0.108-0.399-0.203-0.849l0.339-0.226l0.2-0.144l0.617,0.259c3.575,4.811,6.435,10.424,8.144,16.328l-0.121,0.484l0.396,0.501c1.129,4.212,1.729,8.643,1.729,13.211c0,1.122-0.038,2.236-0.109,3.339l-0.304,0.511l0.226,0.555C99.95,72.645,78.057,93.131,51.38,93.131c-18.502,0-34.702-9.854-43.637-24.601l-0.102-0.365l-0.205-0.151c-3.387-5.742-5.682-12.205-6.595-19.104l0.212-0.524l-0.336-0.482c-0.213-1.892-0.322-3.812-0.322-5.758c0-2.985,0.255-5.909,0.748-8.755l0.25-0.562l-0.087-0.328C2.463,26.451,4.689,20.783,7.78,15.7l0.684-0.384l0.081,0.032c0,0,0.233-0.169,0.354-0.217l0.076-0.023c0,0,1.179-1.971,1.625-2.601c0,0,0.542-0.348,0.745-0.407c0,0,0.124-0.016,0.189,0.076c0,0,0.496-0.432,1.699-2.054c0.004-0.005,0.007-0.011,0.012-0.017c0,0-0.114-0.076-0.131-0.174c-0.018-0.097,0.108-0.591,0.173-0.717s0.108-0.156,0.108-0.156s1.722-2.032,3.151-3.238c0,0,0.26-0.202,0.678-0.25c0,0,1.472-0.613,3.264-2.184c0,0,0.051-0.289,0.478-0.858c0.428-0.57,1.456-1.163,2.222-1.337c0.764-0.174,0.896-0.038,0.896-0.038l0.064,0.065l0.515,0.766c0,0,0.565-0.316,1.413-0.604c0.847-0.289,0.979-0.262,0.979-0.262l0.823,1.336l-0.987,2c0,0-0.644,1.421-1.655,2.185c0,0-0.472,0.284-1.12,0.127c-0.648-0.157-1.072,0.333-1.072,0.333l-0.17,0.14c0,0,0.14-0.024,0.346-0.103c0,0,0.158,0.065,0.274,0.223c0.114,0.158,0.913,1.175,0.913,1.175s0.005,0.837-0.415,1.938c-0.419,1.1-1.467,2.891-1.467,2.891s-0.733,1.424-1.075,2.253c-0.342,0.829-0.515,1.765-0.488,2.262c0,0,0.187,0.062,0.707-0.202c0.655-0.332,1.083,0.027,1.083,0.027s0.719,0.53,1.041,0.881c0.262,0.289,0.802,1.765,0.209,3.224c0,0-0.402,1.008-1.377,1.724c0,0-0.216,0.332-1.529,0.174c-0.368-0.043-0.585-0.276-1.372-0.2c-0.785,0.077-1.231,0.815-1.231,0.815l0.013-0.024c-0.692,0.999-1.154,2.458-1.154,2.458l-0.057,0.165c0,0-0.241,0.509-0.292,1.752c-0.053,1.284,0.284,3.109,0.284,3.109s7.876-1.387,9.88-0.055l0.58,0.532c0,0,0.046,0.174-0.031,0.376c-0.08,0.204-0.375,0.673-0.987,1.113c-0.611,0.438-1.222,1.583-0.313,2.304c1.034,0.818,1.691,0.766,3.43,0.468c1.74-0.297,2.898-1.269,2.898-1.269s0.972-0.72,0.783-1.628c-0.188-0.908-1.017-1.189-1.017-1.189s-0.658-0.423-0.141-1.238c0,0,0.141-0.689,2.553-1.316c2.414-0.626,6.812-1.52,10.557-1.989c0,0-2.539-8.223-0.738-9.289c0,0,0.438-0.296,1.224-0.408l0.72-0.037c0.131-0.027,0.343,0.005,0.796,0.045c0.453,0.038,1.001,0.076,1.678-0.441c0.676-0.519,0.697-0.819,0.697-0.819"/><radialGradient id="SVGID_2_" cx="197.6416" cy="-371.8613" r="0" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#FFF"/><stop offset=".4835" stop-color="#EAEAEB"/><stop offset=".9451" stop-color="#A9ABAE"/><stop offset="1" stop-color="#999B9E"/></radialGradient><path style="&st17;" d="M-16.122-14.641"/><linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="456.2744" y1="510.1602" x2="502.7757" y2="582.9122" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#8A8A8A"/><stop offset=".5687" stop-color="#606060"/><stop offset=".5914" stop-color="#FFF"/><stop offset=".6116" stop-color="#585858"/><stop offset="1" stop-color="#303030"/></linearGradient><path style="&st25;" d="M82.447,79.307l0.451,0.168c-0.032,0.061-0.067,0.119-0.101,0.179c-0.864,1.573-0.936,1.927-1.36,2.253c-0.424,0.326-0.58,0.539-1.443,0.695c-0.865,0.156-1.771,1.175-1.771,1.175s-0.875,0.835-0.48,0.866c0.396,0.025,1.177-0.609,1.177-0.609s0.497-0.354,0.625-0.255c0.125,0.099-0.539,0.751-0.539,0.751s-1.161,1.176-2.479,1.982l-0.396,0.213c0,0,1.869-1.392,2.764-2.395c0,0,0.185-0.271-0.185,0.057c-0.369,0.325-1.332,0.821-1.741,0.821c-0.41,0,0.016-0.563,0.016-0.563s0.596-0.768,1.812-1.758c1.22-0.994,2.239-0.922,2.239-0.922s0.227,0.043,0.253-0.271c0.028-0.313,0.312-0.863,0.312-0.863s0.453-1.032,1.674-2.749c1.218-1.714,1.77-2.195,1.77-2.195s1.588-1.629,2.423-3.259c0,0,0.581-1.006-0.364-0.255c-0.951,0.753-2.211,1.7-3.44,2.014c-1.233,0.312-1.349-0.836-1.349-0.836s-0.271-1.884,1.049-3.344c1.188-1.316,2.492-1.273,3.684-1.415c1.188-0.144,2.21-1.571,2.21-1.571s0.82-0.922,1.289-3.797c0.218-1.337,0.067-2.244-0.144-2.818l0.021-0.647l-0.368-0.021c-0.078-0.106-0.135-0.153-0.135-0.153s-0.297-0.299-0.607-0.524c-0.313-0.227-0.692-0.649-1.063-1.457c0,0-1.019-2.11-0.792-5.156c0.227-3.047,2.762-2.762,2.762-2.762s1.475,0.143,1.76-0.298c0.283-0.438,0.553-0.993,0.649-2.223c0.101-1.233-0.396-2.408-0.396-2.408s-0.186-0.609-1.049-0.708c-0.863-0.1-1.051,0.169-1.051,0.169s-0.255,0.072-0.723,1.09c-0.471,1.021-0.75,1.488-1.602,1.702c-0.849,0.211-2.023,0.099-2.549-0.992c-0.515-1.072-1.757-3.693-2.351-5.772l0.084-0.735l-0.325-0.471c-0.063-0.396-0.117-0.846-0.13-1.236c-0.026-0.992-0.312-2.097-0.638-3.2c-0.326-1.106-1.459-2.972-1.672-3.399c-0.324-0.667-0.621-0.949-1.021-0.893c-0.396,0.056-0.339,0.056-0.513,0.056c-0.168,0-0.266,0.212-0.311,0.425c-0.042,0.212-0.375,1.315-1.104,1.812c-0.752,0.51-1.147,0.737-2.438,0.85c0,0-1.487,0.099-2.661-2.097C71,29.36,71.301,27.96,71.398,27.45c0.099-0.51,0.539-1.247,1.229-1.388c0.693-0.141,1.119-0.184,1.119-0.184s1.122-0.01,1.603-0.071c0.551-0.071,0.283-1.006,0.283-1.006s-0.361-2.371-2.348-4.318l-0.096-0.487l-0.756-0.381c-1.881-2.04-4.354-5.354-4.354-5.354s-1.105-1.048-0.17-2.493c0,0,0.438-0.963,1.742-0.792c0.419,0.081,0.457,0.123,0.818,0.199c0.481,0.099,1.008,0.225,1.478-0.398c0,0,0.438-0.792-0.271-1.812s-0.923-1.742-1.785-1.687c0,0-0.397-0.055-0.793,0.384C68.702,8.1,67.682,8.378,67.086,8.44c-0.679,0.071-2.252-0.528-3.156-2.082c-0.513-0.874-0.752-1.35-0.865-1.595l0.231-0.34l0.72,0.08c0.186,0.358,0.549,1.056,0.978,1.812c0.552,0.978,1.048,1.118,1.373,1.261c0.325,0.141,1.049-0.071,1.431-0.283c0.385-0.213,0.766-0.695,1.43-0.738c0.668-0.043,1.629,0.071,2.311,0.793c0.682,0.723,1.531,2.224,1.459,2.932c-0.068,0.708-0.111,1.403-1.035,1.699c-0.921,0.298-1.303,0.043-1.884-0.084c-0.581-0.128-0.864-0.072-1.104,0.211c-0.242,0.284-0.512,0.892-0.412,1.162c0.102,0.27,0.186,0.454,0.75,1.262c0.566,0.806,3.474,4.25,4.031,4.766l-0.152,0.698l0.968,0.176c0.625,0.724,1.358,1.668,1.687,2.263c0.493,0.907,0.752,2.337,0.779,3.002c0.025,0.666-0.299,0.963-0.299,0.963s-0.313,0.524-2.012,0.524c-1.517,0-1.614,0.297-1.614,0.297s-0.47,0.467-0.369,1.615c0.103,1.146,0.616,2.344,1.56,3.37c0.778,0.851,2.252-0.006,2.748-0.295c0.51-0.299,0.822-1.264,0.822-1.264s0.102-1.217,1.432-1.217c1.377,0,1.969,1.318,1.969,1.318s0.963,1.295,1.941,4.121c0.481,1.389,0.566,2.281,0.566,2.281l0.126,1.668l-0.513,0.892l0.732,0.312c0.135,0.541,0.348,1.24,0.686,2.044c0,0,1.008,2.381,1.443,3.286c0.44,0.906,0.896,0.766,1.264,0.808c0,0,0.85,0.113,1.16-0.282c0.313-0.398,0.61-1.092,0.61-1.092s0.663-1.812,2.138-1.657c1.475,0.156,1.84,1.092,2.096,2.168c0.256,1.074,0.313,3.229-0.479,4.545c-0.798,1.318-1.688,1.135-1.688,1.135s-1.813-0.17-2.225,0.213c-0.41,0.382-0.623,0.724-0.681,1.613c-0.058,0.894,0.026,2.336,0.751,4.08c0.631,1.523,1.146,1.361,1.432,1.728c0.284,0.368,1.188,1.204,1.104,3.272c-0.082,2.067-0.791,4.149-1.586,5.439c-0.793,1.288-1.997,2.053-1.997,2.053s-0.338,0.211-1.076,0.311c-0.735,0.102-1.784,0.086-2.534,0.513c-0.75,0.426-0.992,1.501-1.063,1.971c-0.069,0.468-0.112,1.529,0.921,1.413c1.034-0.109,2.577-1.4,2.577-1.4s1.486-1.104,1.685-0.752c0.199,0.354-0.636,1.784-0.636,1.784s-1.035,1.562-1.898,2.523c-0.709,0.791-1.641,1.868-2.431,3.102L82.447,79.307L82.447,79.307z"/><linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="425.2861" y1="502.9512" x2="445.7861" y2="598.6606" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#A8A9AB"/><stop offset="1" stop-color="#636668"/></linearGradient><path style="&st18;" d="M23.441,22.732c-0.007,0.008-0.013,0.018-0.021,0.025C23.428,22.75,23.434,22.74,23.441,22.732z"/><linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="421.0684" y1="504.3701" x2="441.068" y2="597.7433" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#A8A9AB"/><stop offset="1" stop-color="#636668"/></linearGradient><path style="&st19;" d="M38.188,89.707l0.163,0.01c-0.163-0.147-0.37-0.281-0.62-0.414c-0.699-0.371-3.731-2.375-4.669-3.009c-0.936-0.633-2.575-1.7-3.297-1.478c-0.554,0.172-0.475,0.394-0.804,0.556c-0.331,0.157-0.687,0.052-1.504-0.384c-0.818-0.434-1.424-0.725-3.02-2.239c-1.245-1.185,1.595-0.118,1.595-0.118s0.619,0.262,0.343-0.385c-0.277-0.646-1.676-2.333-2.994-3.691c-1.068-1.098-1.674-1.86-2.435-2.97l-0.566-0.661l0.007-0.166c-0.018-0.024-0.035-0.054-0.052-0.078c0,0-1.874-3.377-1.676-4.617c0,0,0.068-0.828,1.241-1.188c0.817-0.251,0.71,0.542,3.112,0.975c0,0,2.07,0.559,2.611-0.945c0.539-1.505-0.567-3.393-0.567-3.393s-1.449-2.656-3.244-2.758c-0.95-0.053-0.692,0.586-2.125,0.926c0,0-1.913,0.184-2.519-0.963c-0.734-1.389-1.04-2.969-1.015-4.022c0.022-1,0.054-1.079,0.119-1.371c0.045-0.206,0.192-0.582,0.254-1.128l-0.134-0.667l0.204-0.501c0.002-0.26-0.004-0.535-0.021-0.83c-0.091-1.66-0.213-4.221-0.437-5.71c-0.223-1.491-0.633-3.798-1.991-3.866c0,0-0.671-0.051-1.634,0.885c-0.884,0.856-1.684-0.708-1.728-1.663c-0.053-1.121,0.131-2.254,0.409-2.795c0.277-0.541,1.042-0.567,1.186-0.555c0.146,0.013,0.555,0.171,1.043,0.474c0.488,0.305,1.16,0.305,1.557-0.092c0.395-0.394,0.947-0.856,1.173-2.598c0.224-1.741,0.224-3.547,0.013-5.71l-0.225-0.484l1.339-0.289c-0.001-0.017-0.021-0.126-0.032-0.193c0-0.002,0-0.003,0-0.005c-0.002-0.017-0.005-0.032-0.007-0.049c-0.001-0.003-0.001-0.005-0.001-0.007c-0.003-0.019-0.007-0.038-0.009-0.057c0-0.001-0.001-0.001-0.001-0.003c-0.003-0.02-0.006-0.042-0.009-0.062c0-0.001,0-0.001,0-0.001c-0.004-0.023-0.007-0.045-0.011-0.068c0-0.004-0.001-0.006-0.001-0.008c-0.002-0.022-0.006-0.045-0.008-0.066c-0.001-0.006-0.001-0.01-0.003-0.017c-0.002-0.023-0.005-0.046-0.009-0.069c-0.001-0.004-0.001-0.007-0.002-0.014c-0.003-0.026-0.007-0.05-0.011-0.076c0-0.002,0-0.004,0-0.005c-0.004-0.024-0.008-0.05-0.011-0.076c-0.001-0.007-0.001-0.01-0.003-0.017c-0.002-0.025-0.006-0.052-0.009-0.08c-0.001-0.005-0.001-0.011-0.002-0.021c-0.005-0.027-0.007-0.053-0.011-0.081c-0.001-0.006-0.002-0.013-0.002-0.019c-0.002-0.029-0.006-0.058-0.01-0.087c0-0.004-0.001-0.008-0.003-0.014c-0.002-0.028-0.005-0.056-0.009-0.082c-0.001-0.006-0.001-0.011-0.002-0.016c-0.002-0.031-0.006-0.06-0.01-0.09c0-0.006-0.001-0.015-0.002-0.021c-0.004-0.03-0.006-0.061-0.011-0.09c0-0.007-0.001-0.015-0.002-0.022c-0.003-0.03-0.006-0.062-0.01-0.093c0-0.006-0.002-0.012-0.002-0.019c-0.003-0.032-0.005-0.063-0.009-0.094c0-0.002,0-0.005,0-0.009c-0.004-0.032-0.005-0.066-0.01-0.1c0-0.005,0-0.012-0.001-0.02c-0.002-0.033-0.005-0.065-0.007-0.098c-0.001-0.007-0.001-0.014-0.001-0.021c-0.004-0.033-0.006-0.067-0.008-0.099c0-0.005,0-0.012-0.001-0.02c-0.002-0.033-0.006-0.069-0.007-0.102c0-0.003,0-0.007-0.001-0.01c-0.002-0.033-0.004-0.066-0.006-0.1c-0.001-0.006-0.001-0.011-0.001-0.017c-0.001-0.032-0.003-0.068-0.005-0.1c0-0.008,0-0.014-0.001-0.021c-0.001-0.031-0.002-0.065-0.003-0.099c-0.001-0.006-0.001-0.013-0.001-0.021c-0.002-0.033-0.003-0.066-0.004-0.1c0-0.005,0-0.009,0-0.014c-0.001-0.032-0.001-0.066-0.002-0.099c0-0.003,0-0.005,0-0.009c0-0.034,0-0.067-0.001-0.101c0-0.005,0-0.013,0-0.017c0-0.033,0-0.067,0-0.098c0-0.005,0.001-0.012,0.001-0.019c0-0.032,0-0.065,0.001-0.095c0-0.005,0-0.009,0-0.015c0.001-0.033,0.001-0.065,0.003-0.099c0.052-1.244,0.292-1.752,0.292-1.752l0.057-0.164c0,0,0.46-1.459,1.154-2.459l-0.013,0.024c0,0,0.446-0.738,1.231-0.814c0.785-0.079,1.004,0.156,1.371,0.2c0.04,0.004,0.078,0.008,0.115,0.013c0.013,0.002,0.025,0.002,0.037,0.004c0.025,0.002,0.051,0.004,0.075,0.006c0.014,0.001,0.027,0.003,0.041,0.003c0.021,0.001,0.043,0.003,0.064,0.004c0.014,0.001,0.028,0.002,0.041,0.003c0.02,0.001,0.04,0.001,0.058,0.003c0.014,0,0.026,0,0.042,0c0.019,0.001,0.036,0.002,0.055,0.002c0.013,0.001,0.026,0.001,0.038,0.002c0.017,0,0.034,0,0.051,0c0.011,0,0.023,0,0.034,0c0.017,0,0.033,0,0.05,0c0.011,0,0.02-0.001,0.032-0.001c0.016-0.001,0.031-0.001,0.046-0.001c0.011-0.001,0.02-0.001,0.03-0.002c0.016,0,0.03-0.002,0.045-0.002c0.009,0,0.019,0,0.026-0.001c0.016-0.001,0.03-0.002,0.044-0.004c0.006,0,0.016-0.001,0.023-0.002c0.015-0.001,0.029-0.001,0.044-0.003c0.006-0.001,0.013-0.002,0.02-0.002c0.016-0.002,0.03-0.004,0.045-0.008c0.004,0,0.008,0,0.013-0.001c0.019-0.002,0.036-0.005,0.052-0.008l0,0c0.035-0.006,0.068-0.014,0.098-0.021c0,0,0,0,0.002-0.002c0.012-0.002,0.026-0.005,0.039-0.01c0.002,0,0.004,0,0.008-0.001c0.009-0.003,0.019-0.006,0.028-0.009c0.004,0,0.007-0.002,0.01-0.003c0.009-0.003,0.019-0.007,0.026-0.009c0.002-0.001,0.005-0.002,0.008-0.003c0.008-0.003,0.015-0.006,0.021-0.009c0.004-0.001,0.006-0.003,0.009-0.003c0.007-0.004,0.014-0.005,0.02-0.009c0.003-0.001,0.006-0.003,0.008-0.004c0.005-0.002,0.012-0.005,0.019-0.007c0.001-0.001,0.003-0.002,0.005-0.004c0.005-0.003,0.01-0.005,0.016-0.007c0.002-0.002,0.003-0.002,0.006-0.004c0.004-0.001,0.008-0.005,0.012-0.007c0.002-0.001,0.004-0.001,0.005-0.003c0.004-0.002,0.008-0.006,0.012-0.008c0.001,0,0.003-0.002,0.004-0.003c0.003-0.003,0.007-0.004,0.011-0.007c0.001-0.001,0.001-0.001,0.002-0.003c0.004-0.001,0.006-0.005,0.008-0.008h0.002c0.003-0.002,0.005-0.005,0.008-0.007l0.001-0.001c0.002-0.002,0.004-0.004,0.006-0.006s0.002-0.002,0.003-0.003c0.001,0,0.002-0.002,0.002-0.002c0.001-0.003,0.001-0.003,0.003-0.005c0.003-0.001,0.003-0.004,0.003-0.004c0.328-0.241,0.593-0.516,0.797-0.775c0.014-0.017,0.026-0.033,0.04-0.05c0.002-0.004,0.005-0.009,0.008-0.012c0.013-0.015,0.026-0.031,0.038-0.048c0.002-0.004,0.006-0.008,0.007-0.011c0.012-0.018,0.025-0.033,0.038-0.05c0.001,0,0.001,0,0.001-0.001c0.039-0.054,0.075-0.109,0.109-0.159c0-0.002,0.002-0.004,0.003-0.007c0.01-0.016,0.02-0.029,0.03-0.044c0.001-0.004,0.005-0.007,0.007-0.011c0.008-0.014,0.017-0.029,0.024-0.042c0.003-0.004,0.005-0.009,0.009-0.013c0.008-0.014,0.017-0.028,0.024-0.042l0.001-0.002c0.017-0.027,0.032-0.055,0.046-0.079c0.002-0.003,0.004-0.008,0.007-0.012c0.005-0.009,0.01-0.021,0.016-0.03c0.003-0.007,0.007-0.014,0.012-0.02c0.004-0.008,0.01-0.017,0.014-0.024c0.002-0.008,0.006-0.017,0.011-0.023c0.004-0.007,0.009-0.016,0.012-0.022c0.004-0.007,0.007-0.014,0.011-0.021c0.002-0.006,0.007-0.011,0.01-0.018c0.066-0.13,0.097-0.207,0.097-0.207c0.594-1.459,0.052-2.935-0.21-3.224c-0.32-0.354-1.041-0.883-1.041-0.883s-0.426-0.357-1.08-0.025c-0.521,0.264-0.711,0.201-0.711,0.201c-0.024-0.498,0.149-1.432,0.491-2.263c0.341-0.829,1.075-2.253,1.075-2.253s1.047-1.792,1.467-2.89c0.418-1.102,0.415-1.94,0.415-1.94s-0.795-1.019-0.91-1.177c-0.115-0.158-0.272-0.223-0.272-0.223c-0.205,0.078-0.345,0.103-0.345,0.103l0.169-0.14c0,0,0.424-0.492,1.073-0.334c0.648,0.158,1.119-0.126,1.119-0.126c1.011-0.764,1.654-2.187,1.654-2.187l0.988-1.997L27.059,1.12c0,0-0.131-0.028-0.979,0.259c0,0-0.773,1.905-1.725,3.087c0,0-0.374,0.552-0.664,0.416c-0.289-0.134-0.629-0.144-0.91-0.085c-0.281,0.06-1.156,0.349-1.948,1.413c-0.79,1.064-0.883,1.863-0.458,2.101c0.425,0.238,1.045-0.076,1.42-0.407c0.375-0.333,0.638-0.485,0.757-0.47c0.118,0.02,0.093,0.315,0.068,0.41c-0.026,0.094-0.154,1.364-1.625,3.913c-0.369,0.64-0.845,1.589-1.069,2.046l0.608,0.447l-0.999,0.503c-0.266,0.758-0.605,1.945-0.471,2.61c0.204,1.011,1.158,1.011,1.158,1.011s0.621,0.027,1.344-0.348c0.722-0.375,0.892,1.242,0.892,1.505c0,0.264-0.007,1.726-1.02,2.442c0,0-0.409,0.313-0.985,0.313c-0.579,0-0.954-0.169-0.954-0.169s-0.984-0.272-1.59,0.083c-0.604,0.358-1.326,1.098-1.897,2.17c-0.569,1.072-1.045,2.986-1.019,4.397c0.02,1.111,0.18,2.162,0.291,2.879l0.667,0.435l-0.543,0.623c0.079,1.136,0.168,3.363,0.155,4.109c-0.018,0.911-0.154,2.84-1.115,3.292c0,0-0.324,0.171-0.868-0.238s-1.132-0.426-1.37-0.435c-0.238-0.007-1.285,0.162-1.692,1.311c-0.408,1.145-0.375,2.688-0.29,3.597c0.086,0.91,0.876,2.458,1.872,2.458c0,0,0.484,0.035,1.055-0.553c0.568-0.586,0.902-0.637,1.156-0.629c0.255,0.009,0.749,0.272,1.072,2.851c0.307,2.442,0.437,4.442,0.414,6.668l0.605,0.392l-0.758,0.768c-0.042,0.199-0.089,0.417-0.142,0.626c-0.169,0.682-0.187,1.364-0.024,2.569c0.161,1.21,0.811,3.72,1.754,4.375c1.252,0.871,2.071,0.856,2.916,0.791c0.842-0.067,1.424-0.712,1.424-0.712s0.331-0.342,0.685-0.237c0.356,0.104,1.346,0.66,2.058,2.084c0.713,1.425,0.871,2.992-0.316,3.272c-1.187,0.272-3.231-0.846-3.231-0.846s-1.161-0.647-2.109,0.064c-0.951,0.713-0.977,1.807-0.502,3.15c0.261,0.738,0.782,1.938,1.513,3.188l0.721,0.302l-0.193,0.551c0.492,0.748,1.055,1.479,1.678,2.105c0,0,2.466,2.729,3.838,4.457c0,0,0.08,0.157-0.158,0.016c-0.238-0.146-1.266-0.621-1.82-0.566c-0.555,0.054-0.45,0.395-0.45,0.395s0.238,1.254,4.01,3.365c0,0,1.359,0.766,2.216,0.766c0,0,0.277,0.039,0.619-0.346c0.346-0.381,0.45-0.341,0.688-0.262c0.237,0.076,0.553,0.249,1.741,1.105c1.188,0.857,3.496,2.176,4.325,2.731c0.83,0.555,0.793,0.657,0.621,1.054c-0.171,0.396,0.593,0.619,0.593,0.619s1.899,0.855,2.928,0.846c1.029-0.016,1.464-0.119,2.097,0.012c0.632,0.133,1.28,0.291,1.345,0.346c0.066,0.053-0.315,0.038-0.315,0.038s-2.362-0.276-2.494-0.21c-0.13,0.066,0.014,0.184,0.99,0.436v0.006c1.245,0.217,2.507,0.387,3.782,0.51c-0.489-0.061-2.52-0.322-3.823-0.713c0,0-0.131-0.078,0.173-0.014c0.303,0.065,2.018,0.225,2.466,0.157c0.448-0.065-0.092-0.274-0.092-0.274s-0.897-0.425-2.889-0.582c0,0-0.803-0.055-1.503,0.014c-0.699,0.066-1.41-0.264-1.41-0.264s-1.028-0.317-0.78-0.646c0.126-0.165,0.137-0.336,0.065-0.502L38.188,89.707L38.188,89.707z"/><linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="444.7598" y1="550.8145" x2="473.8418" y2="550.8145" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#231F20"/><stop offset="1" stop-color="#474747"/></linearGradient><path style="&st5;" d="M62.342,86.16l-0.438,0.646c0.096,0.655-0.104,0.875-0.254,1.119c-0.156,0.26-0.59,0.592-0.375,1.185c0.218,0.59,1.687,0.401,2.535,0.144c0.852-0.26,1.569-0.49,2.134-0.693c0.562-0.198,0.719,0.086,0.719,0.086s0.246,0.175-0.574,0.606c-0.821,0.433-2.336,0.634-3.055,0.72c-0.724,0.086-0.506-0.043-1.586,0.33c-1.082,0.377-0.07,0.707-0.07,0.707c2.435,0.635,4.188,0.115,4.188,0.115l0.332-0.097c0.27-0.077,0.535-0.161,0.803-0.244c-2.021,0.456-3.326,0.149-3.739,0.095c-0.431-0.058-0.778-0.145-0.88-0.361c-0.102-0.215,0.479-0.2,0.479-0.2s1.683-0.188,3.24-0.69c1.557-0.506,1.932-0.98,1.871-1.341c-0.057-0.358-0.848-0.332-1.785-0.028c-0.937,0.305-2.334,0.75-2.662,0.821c-0.334,0.07-0.691,0.06-0.812-0.146c-0.114-0.203-0.216-0.53,0.146-0.905c0.36-0.376,0.402-0.694,0.402-0.694c0.055-0.254,0.057-0.523,0.021-0.8L62.342,86.16l0.545-0.118c-0.298-1.124-1.052-2.218-1.279-2.577c-0.314-0.507-0.836-0.793-2.393-0.535c-1.556,0.26-3.386,1.035-3.386,1.035s-1.888,0.997-3.298,0.812c-1.413-0.188-1.703-1.614-1.688-2.063c0.015-0.447,0.304-0.835,1.039-1.123c0.735-0.289,2.465-0.678,4.985-0.808s3.458-1.771,3.458-1.771c0.33-0.478,0.922-1.543-0.489-2.336c-1.41-0.791-1.441-0.593-2.119-1.107c-0.678-0.52-1.412-1.153-1.701-2.033c-0.025-0.084-0.066-0.197-0.104-0.292l-0.849-0.558l0.41-0.371c-0.34-0.67-0.693-1.271-0.693-1.271s-1.281-1.902-0.246-3.703c1.038-1.803,2.736-2.348,2.736-2.348s1.5-0.332,2.996,0.016c1.418,0.324,2.133-0.219,2.133-0.219s0.865-0.374,1.123-2.102c0.264-1.729-0.014-4.943-2.316-5.578c-2.307-0.633-3.527,0.563-3.527,0.563s-1.24,1.369-1.644,1.57c-0.404,0.201-1.022,0.563-1.022,0.563s-0.867,0.519-1.453,0.648c-0.393,0.086-1.791-1.771-1.933-3.201c-0.133-1.316-0.401-2.388-0.306-5.096l-0.485-0.63l0.537-0.533c0.101-2.999-0.417-5.116-1.188-6.461c-0.807-1.412-2.119-2.161-2.766-2.478c-0.648-0.318-2.147-0.462-3.17-0.086c-1.023,0.374-1.239,0.678-1.613,1.326c-0.376,0.648-0.836,0.605-0.836,0.605s-1.427,0.043-1.888-2.133c-0.646-3.049,0.359-4.035,0.359-4.035s0.318-0.476,1.369-0.619c1.053-0.144,1.73,0.115,2.537,0.315c0.806,0.202,1.41,0.116,2.419-0.374c1.008-0.491,1.442-1.297,1.238-2.739c-0.195-1.393-0.255-1.742-1.483-5.964l-0.875-0.46l0.583-0.579C44.87,23.032,44.8,20.35,44.8,20.35c-0.106-0.977,0.049-1.292,0.598-1.54c0.576-0.259,1.116-0.175,1.934-0.123c0.818,0.053,1.425-0.079,1.847-0.316c0.422-0.237,1.581-0.87,1.504-2.162c-0.08-1.292-1.109-2.824-1.953-3.351c-0.843-0.528-1.953-0.316-2.558,0.131c-0.606,0.45-0.845,1.029-1.214,1.214c-0.369,0.183-0.895,0.605-1.45,0.474c-0.554-0.132-0.581-1.371-0.818-2.77c-0.153-0.907-0.271-1.611-0.338-1.989l-0.678-0.254c0.044,0.557,0.535,3.304,0.535,3.304s0.223,1.364,0.308,1.692c0.086,0.329,0.314,1.05,0.314,1.05s0.092,0.364,0.456,0.535c0.365,0.172,1.052,0.24,1.743-0.032c0.692-0.271,0.886-0.572,1.199-0.938c0.315-0.364,0.429-0.493,0.429-0.493s0.663-0.622,1.478-0.343c0.813,0.278,1.299,1.228,1.299,1.228l0.028,0.06c0,0,0.403,0.661,0.392,1.269v-0.057c0,0-0.022,0.301-0.697,0.818c-0.676,0.519-1.226,0.479-1.678,0.442c-0.454-0.04-0.666-0.072-0.797-0.045l-0.719,0.038C45.178,18.303,44.74,18.6,44.74,18.6c-1.8,1.064,0.736,9.288,0.736,9.288l0,0L45.2,28.501c0,0,0.514,2.052,0.904,3.378c0.388,1.326,0.562,2.637,0.62,2.91c0.058,0.274,0.044,0.762-0.317,1.051c-0.359,0.289-1.239,0.534-1.425,0.562c-0.187,0.029-0.535-0.042-0.996-0.201c-0.462-0.158-0.922-0.187-0.922-0.187s-1.11-0.188-2.291,0.173c-1.182,0.359-2.076,1.569-2.148,3.083c-0.071,1.513-0.057,2.278,0.535,3.617c0.59,1.34,1.657,2.104,2.463,2.118c0.808,0.014,1.469-0.403,1.931-1.051c0.459-0.65,0.59-0.751,0.59-0.751c0.548-0.302,1.944-0.433,2.651-0.172c0.708,0.258,2.007,1.073,2.723,2.679c0.579,1.298,0.76,2.75,0.729,5.363l0.584,0.448l-0.61,0.703c-0.007,0.246-0.016,0.498-0.026,0.761c-0.143,3.876,0.72,5.864,0.72,5.864c0.491,1.065,1.023,1.83,1.745,2.318c0.719,0.489,1.699,0.156,2.018,0c0.315-0.158,1.194-0.563,1.943-1.037c0.749-0.477,0.725-0.679,1.629-1.515c0.907-0.833,2.076-0.604,2.076-0.604s1.107,0.028,1.74,1.313c0.637,1.283,0.509,3.109,0.347,3.773c-0.158,0.662-0.444,1.097-1.063,0.979c-0.621-0.114-1.645-0.217-2.019-0.231c-0.375-0.014-1.433-0.049-2.394,0.203c-0.938,0.244-2.205,0.92-3.414,2.883c-0.938,1.52-0.478,3.013-0.262,3.603c0.17,0.462,0.635,1.104,1.043,1.896l0.756,0.252l-0.35,0.656c0.398,0.963,0.701,1.493,1.305,2.151c0.648,0.705,1.672,1.251,2.881,1.714c1.213,0.462,0.662,1.282,0.662,1.282c-0.69,1.497-2.75,1.557-3.354,1.628c-0.604,0.07-1.872,0.188-3.058,0.447c-1.182,0.261-2.291,0.418-2.954,1.182c-0.661,0.764-0.402,1.557-0.013,2.393c0.388,0.834,1.427,1.28,2.853,1.226c1.426-0.058,2.35-0.476,3.214-0.851s2.362-0.809,2.81-0.937c0.445-0.129,1.051-0.39,1.498,0.26c0.482,0.701,0.994,1.697,1.229,2.45L62.342,86.16L62.342,86.16z"/><path style="&st34;" d="M101.566,51.162c0,0,0.347-3.236,0.457-4.392c0.018-0.173,0.031-0.343,0.045-0.513l-0.098-0.241c-0.459,5.815-0.938,7.727-0.938,7.727s0.013-0.037,0.031-0.101c0.189-0.817,0.357-1.646,0.51-2.48C101.568,51.162,101.566,51.162,101.566,51.162L101.566,51.162z"/><path style="&st34;" d="M91.268,12.579l0.328,0.413l0.279,0.5c1.021,1.648,2.846,4.295,2.846,4.295s0.739,0.958,0.905,0.968c0.164,0.01-0.084-0.741-0.084-0.741s-0.271-0.979,0.517,0.298c0.73,1.19,1.207,2.359,1.317,2.72c0.114,0.361,0.042,0.411,0.042,0.411s-0.146,0.072-0.146,0.33c0,0.505,0.496,1.659,0.496,1.659s1.545,3.926,2.07,5.563c0.526,1.641,1.133,4.368,1.133,4.368s0.187,0.804,0.207,1.174c0.021,0.371-0.063,0.381-0.229,0.186c-0.164-0.196-0.329-0.072-0.329-0.072s-0.175,0.072-0.175,0.773c0,0.7,0.085,2.346,0.217,3.615c0.152,1.505,0.616,2.133,0.616,2.133s0.413,0.618,0.526-0.577c0.096-1.028,0.185-0.228,0.185-0.228c0.196,1.557,0.062,4.544,0.03,4.955c-0.019,0.218-0.032,0.433-0.049,0.64l0.133-0.221c0.201-2.971,0.06-5.359,0.06-5.359s-0.144-1.323-0.3-1.311c-0.155,0.01-0.211,0.701-0.211,0.701s-0.065,0.467-0.156,0.456c-0.088-0.011-0.369,0.022-0.566-1.412c-0.199-1.436-0.156-2.949-0.156-2.949s-0.043-0.155,0.048-0.189c0.09-0.034,0.188,0.1,0.188,0.1s0.133,0.189,0.287,0.033c0.156-0.154,0.19-0.622-0.301-3.08c-0.288-1.454-0.711-2.896-1.006-3.832l-0.294-0.333l-0.058-0.718c0,0-0.311-0.913-1.033-2.737c-0.723-1.824-0.846-2.458-0.846-2.458s-0.045-0.2,0.066-0.234c0.111-0.032,0.091-0.178,0.091-0.178s-0.013-0.245-0.278-0.99c-0.268-0.746-0.426-1.281-1.356-2.86c-0.869-1.468-1.124-1.558-1.124-1.558s-0.426-0.234-0.112,0.591c0.313,0.823-0.075,0.232-0.075,0.232c-0.925-1.177-2.838-4.292-2.838-4.292l-0.537-0.373l-0.508-1.261l-0.015,0.01"/><path style="&st34;" d="M1.547,32.696l-0.183,0.37c-0.472,2.495-0.625,5.135-0.62,5.31c0.01,0.208-0.036,0.211-0.075,0.178c-0.042-0.035,0.03-0.16-0.048-0.16c-0.079,0-0.108,0.211-0.108,0.211L0.512,38.6c-0.021,0.288-0.038,0.574-0.053,0.861l0.016-0.003c0.068-0.098,0.097-0.028,0.097-0.028s-0.029,0.126,0.097,0.056c0.126-0.07,0.21-1.379,0.21-1.379s0.014-2.813,0.836-6.14c0.819-3.327,1.281-4.259,1.281-4.259s0.154-0.418,0.138-0.083C3.12,27.958,3.33,27.986,3.33,27.986c0.375-0.054,0.821-1.125,1.267-2.493c0.445-1.363,0.668-2.589,0.668-2.7c0-0.11-0.055-0.194-0.152-0.138c-0.098,0.056-0.125,0.014-0.125,0.014c-0.014-0.208,0.361-1.127,0.361-1.127c1.253-3.202,3.104-5.694,3.104-5.694l0.09-0.504c-0.164,0.254-0.27,0.419-0.421,0.661c-0.056,0.089-0.042,0.297-0.001,0.32c-0.201,0.191-0.365,0.35-0.476,0.456c-2.707,4.473-3.059,6.556-3.059,6.556c-0.017,0.214,0.004,0.311,0.111,0.306c0.065-0.003,0.251-0.349,0.116,0.354c-0.09,0.468-0.524,1.708-0.693,2.212c-0.171,0.505-0.358,0.85-0.495,0.826C3.49,27.01,3.49,26.801,3.49,26.801s-0.042-0.546-0.398,0.245c-0.356,0.791-0.713,1.859-1.425,4.65c-0.031,0.125-0.063,0.251-0.092,0.38L1.547,32.696L1.547,32.696z"/><path style="&st34;" d="M4.841,62.626c-0.15-0.401-0.264-0.722-0.179-0.581c0.085,0.143,0.198,0.432,0.462,0.725c0.263,0.291,0.442-0.226-0.622-3.104s-1.354-3.04-1.402-3.095c-0.046-0.058-0.215-0.237-0.167,0.167c0.045,0.404,0.018,0.656-0.51-1.146c-0.528-1.806-0.996-4.844-1.025-5.089c-0.027-0.243-0.169-1.778-0.396-3.594c-0.226-1.814-0.246-3.743-0.207-4.28c0.039-0.537-0.066-0.828-0.123-0.837c-0.056-0.008-0.094,0.047-0.131,0.284c-0.038,0.234-0.01,0.395-0.067,0.385c-0.057-0.009-0.076-0.471-0.076-0.471H0.391c0,0.05,0,0.1,0,0.151c0,0.174,0.001,0.345,0.002,0.519l0.039,0.402c0.033,0.597,0.129,0.354,0.135,0.246c0.006-0.109,0.03-0.329,0.03-0.329s0.103-0.884,0.084,0.02c-0.019,0.904,0.236,4.563,0.236,4.563c0.019,0.236,0.041,0.479,0.068,0.729l0.063,0.092l-0.042,0.104c0.265,2.425,0.795,5.086,0.795,5.086c0.507,2.417,1.11,3.846,1.308,4.25c0.198,0.405,0.236,0.085,0.17-0.271c-0.066-0.357,0.546,0.688,0.873,1.674c0.332,0.99,0.556,1.815,0.556,1.815s0.254,0.781,0.142,0.828c-0.113,0.046-0.292-0.293-0.292-0.293s-0.473-0.835-0.274-0.228c0.398,1.231,1.6,3.822,1.6,3.822l1.396,2.471C6.282,65.836,4.982,63.004,4.841,62.626L4.841,62.626z"/><path style="&st34;" d="M7.281,67.639c0.069,0.125,0.136,0.246,0.202,0.359L7.281,67.639z"/><path style="&st34;" d="M20.722,2.874C20.51,3.216,20.48,3.388,20.48,3.388s0.112-0.118,0.183-0.237C20.733,3.033,20.722,2.874,20.722,2.874z"/><path style="&st34;" d="M17.216,5.572c-0.417,0.048-0.677,0.25-0.677,0.25S16.889,5.761,17.216,5.572z"/><path style="&st34;" d="M84.005,4.909c0,0,0.247-0.03,0.347,0.02c0.101,0.049,0.066-0.158,0.066-0.158s-0.287-0.406-0.322-0.556c-0.32-0.089-0.611-0.1-0.611-0.1l-0.028,0.034c-0.01,0.075-0.036,0.188-0.012,0.297C83.441,4.448,83.917,4.811,84.005,4.909L84.005,4.909z"/><path style="&st34;" d="M87.487,7.88l0.095-0.152l-0.223-0.679c-0.004-0.012-0.012-0.022-0.021-0.036c-0.007,0.066-0.049,0.125-0.172,0.115c0,0-0.099-0.03-0.011,0.198C87.219,7.469,87.355,7.699,87.487,7.88L87.487,7.88z"/><path style="&st34;" d="M101.566,51.162c0,0,0.347-3.236,0.457-4.392c0.018-0.173,0.031-0.343,0.045-0.513l-0.098-0.241c-0.459,5.815-0.938,7.727-0.938,7.727s0.013-0.037,0.031-0.101c0.189-0.817,0.357-1.646,0.51-2.48C101.568,51.162,101.566,51.162,101.566,51.162L101.566,51.162z"/><linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="266.4922" y1="-395.2783" x2="295.9644" y2="-485.0349" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset=".0094" stop-color="#FCFCFC"/><stop offset=".0655" stop-color="#EEEEEE"/><stop offset=".1342" stop-color="#E5E5E5"/><stop offset=".2515" stop-color="#E3E3E3"/><stop offset=".3357" stop-color="#8A8A8A"/><stop offset=".4422" stop-color="#B8B8B8"/><stop offset="1" stop-color="#3B3B3B"/></linearGradient><path style="&st33;" d="M79.003,84.528c0,0,0.667-0.653,0.539-0.752c-0.128-0.101-0.623,0.256-0.623,0.256s-0.073,0.062-0.185,0.142l0.393-0.252c0,0-0.038,0.238-0.355,0.555c0,0-0.094,0.094-0.258,0.248c-0.957,0.938-2.386,1.998-2.386,1.998l0.396-0.211C77.844,85.703,79.003,84.528,79.003,84.528z"/><linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="460.4629" y1="512.5557" x2="509.5884" y2="573.3062" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EFF0F0"/><stop offset=".5914" stop-color="#F0F1F2"/><stop offset=".599" stop-color="#787878"/><stop offset=".6456" stop-color="#EEEFF0"/><stop offset="1" stop-color="#D8D9DB"/></linearGradient><path style="&st30;" d="M82.984,39.705l0.51-0.891l-0.127-1.667c0,0-0.085-0.893-0.566-2.28c-0.979-2.828-1.941-4.122-1.941-4.122s-0.592-1.318-1.969-1.318c-1.33,0-1.431,1.219-1.431,1.219s-0.312,0.963-0.821,1.261c-0.5,0.29-1.972,1.146-2.748,0.296c-0.941-1.026-1.461-2.225-1.56-3.372c-0.101-1.146,0.367-1.615,0.367-1.615s0.1-0.296,1.614-0.296c1.703,0,2.014-0.525,2.014-0.525s0.324-0.296,0.297-0.963s-0.284-2.097-0.779-3.001c-0.324-0.596-1.058-1.537-1.684-2.261l-0.967-0.178l0.15-0.699c-0.56-0.514-3.465-3.959-4.031-4.766c-0.564-0.808-0.65-0.993-0.75-1.262c-0.099-0.269,0.17-0.877,0.412-1.161c0.238-0.283,0.521-0.341,1.104-0.212c0.58,0.127,0.961,0.381,1.886,0.084c0.919-0.297,0.962-0.992,1.033-1.699c0.071-0.708-0.78-2.209-1.458-2.932c-0.684-0.721-1.645-0.836-2.311-0.792c-0.664,0.042-1.047,0.523-1.433,0.737c-0.382,0.213-1.103,0.425-1.429,0.284c-0.326-0.142-0.823-0.284-1.375-1.261c-0.43-0.76-0.794-1.459-0.979-1.817L63.299,4.42v0.012c0,0,0.633,1.654,1.633,2.811c0.998,1.157,2.266,0.919,2.266,0.919s0.82-0.089,1.533-0.772c0.711-0.683,1.761-0.148,2.024,0.04c0.269,0.189,0.853,0.911,1.478,2.127c0.621,1.216-0.355,2.058-0.355,2.058s-0.555,0.535-1.691,0.088c-1.14-0.443-1.813,0.259-1.986,0.614c-0.182,0.357-0.508,0.99,0.076,1.73c0.584,0.742,3.178,4.273,4.916,5.945c1.74,1.672,2.314,3.047,2.682,4.342c0.365,1.297,0.079,1.899-0.521,2.018c-0.604,0.118-1.148,0.021-2.086,0.187c-0.94,0.17-1.349,0.367-1.543,1.653c-0.199,1.286,0.562,3.373,1.67,4.361c1.106,0.989,2.334,0.386,2.76,0.228c0.427-0.159,1.352-0.653,1.681-2.027c0.188-0.783,0.851-0.721,0.851-0.721s0.563-0.071,0.854,0.117c0.287,0.19,0.633,0.525,1.402,1.87c0.772,1.346,1.453,3.146,1.724,4.738C82.924,38.35,82.729,38.576,82.984,39.705c0.256,1.128,1.078,3.245,1.466,4.074c0.383,0.832,0.78,1.662,0.989,2.107c0.205,0.445,0.531,0.782,1.443,0.802c0.908,0.02,1.273-0.228,1.541-0.662c0.27-0.435,0.612-1.088,0.713-1.316c0.1-0.228,0.467-0.911,1.146-1.02c0.685-0.108,1.762,0.01,2.106,1.198c0.313,1.071,0.76,2.622-0.158,4.5c-0.65,1.334-1.129,0.859-2.451,0.948c0,0-1.165-0.01-1.781,0.921c-0.611,0.93-0.416,2.61-0.286,3.877s0.988,3.113,1.621,3.563c0.636,0.443,0.86,0.849,1.08,1.256c0.216,0.404,0.534,1.205,0.216,3.313c-0.313,2.106-0.979,3.74-1.867,4.521c-0.024,0.021-0.05,0.043-0.07,0.063c-0.067,0.065-0.141,0.135-0.219,0.201c-0.537,0.521-0.371,0.543-0.889,0.793c-0.594,0.289-0.988,0.207-1.958,0.365c-0.97,0.16-1.583,0.327-2.088,0.821c-0.503,0.495-1.243,1.409-0.979,3.187c0.148,0.986,1.318,0.584,2.229,0.111c-0.274,0.125-0.553,0.221-0.798,0.246c-1.033,0.113-0.991-0.949-0.921-1.415c0.069-0.47,0.313-1.544,1.063-1.97s1.799-0.41,2.533-0.512c0.738-0.101,1.076-0.313,1.076-0.313s1.205-0.766,1.997-2.055c0.793-1.289,1.502-3.371,1.587-5.438c0.084-2.068-0.821-2.902-1.104-3.271c-0.283-0.366-0.799-0.203-1.431-1.729c-0.724-1.74-0.81-3.188-0.751-4.079c0.057-0.892,0.27-1.231,0.682-1.612c0.41-0.383,2.223-0.213,2.223-0.213s0.893,0.185,1.686-1.134c0.793-1.317,0.738-3.471,0.481-4.546c-0.253-1.076-0.623-2.013-2.097-2.168c-1.471-0.152-2.138,1.66-2.138,1.66s-0.297,0.693-0.608,1.092c-0.312,0.395-1.16,0.285-1.16,0.285c-0.37-0.044-0.821,0.099-1.264-0.81c-0.438-0.906-1.442-3.286-1.442-3.286c-0.339-0.809-0.556-1.512-0.688-2.055L82.984,39.705L82.984,39.705z"/><linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="272.8721" y1="-392.8257" x2="302.4699" y2="-482.9646" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st9;" d="M82.487,79.313l0.801-0.479c0.788-1.231,1.72-2.31,2.431-3.103c0.863-0.961,1.896-2.522,1.896-2.522s0.835-1.431,0.638-1.784c-0.13-0.23-0.704,0.02-1.687,0.752c-3.674,2.746-3.971,1.246-3.971,1.246c0.422,2.438,4.729-1.633,5.108-1.375c-0.063,0.563-0.457,1.172-1.25,2.25c0,0-0.388,0.555-0.78,0.953c-0.369,0.432-0.578,0.641-0.578,0.641s-0.088,0.09-0.125,0.125c-0.471,0.541-1.024,1.242-1.595,2.018c-0.019,0.021-0.104,0.113-0.125,0.143c-0.295,0.416-0.491,0.73-0.702,1.062c-0.014,0.022-0.064,0.011-0.076,0.034c0-0.002-0.013,0.014-0.025,0.037c-0.245,0.39-0.373,0.713-0.508,0.959c-0.012,0.029-0.021,0.065-0.03,0.095c0,0-0.319,0.665-0.457,1.067c-0.14,0.405-0.12,0.547-0.623,0.625c-0.504,0.078-0.276-0.053-1.021,0.196c0,0-0.403,0.199-0.938,0.571c-0.027,0.021-0.057,0.042-0.082,0.063c-0.736,0.604-1.247,1.119-1.534,1.436c-0.051,0.063-0.099,0.13-0.146,0.195c0,0-0.157,0.168,0.051,0.188c0.206,0.021,0.633-0.01,1.008-0.169l0.088-0.057c-0.186,0.103-0.373,0.174-0.513,0.162c-0.396-0.026,0.479-0.864,0.479-0.864s0.906-1.019,1.771-1.175c0.862-0.156,1.021-0.371,1.444-0.693c0.426-0.327,0.494-0.682,1.359-2.254c0.03-0.059,0.064-0.115,0.098-0.176L82.487,79.313L82.487,79.313z"/><linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="444.6943" y1="510.9561" x2="469.7246" y2="592.0699" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#FFF"/><stop offset=".7473" stop-color="#F9F9F9"/><stop offset="1" stop-color="#D5D7D8"/></linearGradient><path style="&st27;" d="M55.064,72.686l0.408-0.377c-0.34-0.668-0.693-1.269-0.693-1.269s-1.282-1.901-0.245-3.703c1.036-1.803,2.737-2.348,2.737-2.348s1.5-0.332,2.996,0.017c1.418,0.323,2.133-0.22,2.133-0.22s0.865-0.376,1.123-2.104c0.261-1.729-0.014-4.94-2.317-5.576c-2.306-0.633-3.528,0.563-3.528,0.563s-1.242,1.369-1.644,1.57c-0.404,0.2-1.024,0.562-1.024,0.562s-0.865,0.52-1.453,0.648c-0.39,0.087-1.788-1.771-1.931-3.2c-0.133-1.313-0.4-2.385-0.305-5.084c0-0.005,0-0.01,0-0.017l-0.486-0.629l0.537-0.526c0.102-3-0.418-5.119-1.188-6.463c-0.805-1.414-2.118-2.163-2.766-2.479c-0.647-0.317-2.146-0.461-3.169-0.086c-1.022,0.375-1.237,0.677-1.613,1.325c-0.376,0.65-0.835,0.606-0.835,0.606s-1.427,0.044-1.89-2.132c-0.644-3.049,0.36-4.036,0.36-4.036s0.318-0.475,1.369-0.619c1.053-0.144,1.73,0.115,2.536,0.317c0.807,0.2,1.41,0.114,2.42-0.374c1.009-0.49,1.442-1.298,1.24-2.738c-0.196-1.397-0.249-1.727-1.484-5.966l-0.874-0.458l0.582-0.579c-1.182-4.271-1.257-6.961-1.257-6.961c-0.105-0.975,0.049-1.29,0.598-1.537c0.576-0.261,1.117-0.177,1.934-0.125c0.819,0.052,1.425-0.079,1.847-0.316c0.423-0.236,1.583-0.87,1.503-2.163c-0.078-1.292-1.108-2.823-1.951-3.35c-0.844-0.528-1.952-0.317-2.56,0.132c-0.606,0.447-0.843,1.028-1.213,1.212c-0.368,0.185-0.896,0.607-1.45,0.474c-0.554-0.132-0.581-1.372-0.818-2.77c-0.155-0.915-0.276-1.614-0.342-1.989l-0.674-0.254c0.043,0.557,0.535,3.304,0.535,3.304l0.294,1.624c0,0,0,0.007,0,0.02c0.006,0.018,0.009,0.036,0.013,0.05c0.019,0.079,0.049,0.18,0.082,0.289c0.114,0.215,0.37,0.456,0.942,0.502c1.076,0.089,1.772-0.468,2.025-0.709c0.254-0.239,0.86-0.911,0.86-0.911s0.329-0.632,1.253-0.494c0.922,0.14,1.238,0.773,1.403,1.013c0.167,0.242,1.57,1.961,0.672,2.861c-0.039,0.039-0.093,0.089-0.152,0.146c-0.104,0.111-0.245,0.246-0.446,0.399c-0.675,0.517-1.226,0.48-1.678,0.442c-0.453-0.039-0.665-0.07-0.795-0.043l-0.72,0.038c-0.787,0.11-1.224,0.408-1.224,0.408c-1.8,1.065,0.735,9.287,0.735,9.287s0.671,2.029,0.973,2.979c0.301,0.949,0.496,1.625,0.791,3.264c0.295,1.639-0.231,2.092-0.525,2.251c-0.294,0.158-0.984,0.568-1.77,0.604c-0.783,0.034-1.027-0.368-2.371-0.432c-1.345-0.065-2.246,0.345-2.661,0.906c-0.417,0.561-0.913,1.862-0.675,3.4c0.237,1.541,0.504,2.064,1.092,2.748c0.59,0.681,1.165,0.97,1.978,0.696c0.792-0.266,0.764-0.756,1.173-1.164c0.517-0.519,0.855-0.792,2.063-0.821c1.208-0.029,1.979,0.288,2.594,0.784c0.619,0.496,1.934,1.646,2.294,3.356c0.359,1.713,0.424,2.268,0.424,3.676s-0.101,2.978-0.064,4.381c0.036,1.4,0.187,2.841,0.577,3.795c0.386,0.955,0.926,1.755,1.4,2.18c0.475,0.426,0.896,0.438,1.373,0.252c0.475-0.188,1.511-0.771,2.373-1.324c0.861-0.555,0.797-0.99,1.576-1.502c0.875-0.576,1.799-0.605,2.457-0.486c0.661,0.112,1.676,0.631,2.092,1.889C63.059,60.58,63,61.998,63,61.998s0.035,1.186-0.445,1.876c-0.48,0.688-1.272,0.616-1.625,0.545c-0.354-0.071-1.094-0.136-1.094-0.136s-1.451-0.165-2.563,0.094c-1.105,0.258-2.077,1.085-2.73,1.896c-0.652,0.813-0.941,1.57-0.984,2.158c-0.043,0.59,0.027,1.595,0.642,2.572c0.612,0.979,0.712,1.432,1.409,2.827c0.695,1.396,2.15,2.17,2.201,2.206c0.05,0.037,1.388,0.523,1.89,0.949c0.505,0.425,0.555,0.826,0.411,1.208c-0.145,0.381-0.438,1.094-1.604,1.604c-1.166,0.512-2.591,0.523-3.496,0.617c-0.906,0.094-2.651,0.332-3.697,0.834c-1.043,0.503-0.97,1.454-0.97,1.454s-0.028,1.556,1.337,1.983c1.365,0.434,2.64,0,3.201-0.237c0.562-0.238,1.487-0.583,1.487-0.583s1.791-0.631,2.752-0.848c0.965-0.217,1.533-0.323,2.188,0.832c0.652,1.158,1.014,1.886,1.078,2.625c0.064,0.74-0.209,1.148-0.461,1.432c-0.25,0.279-0.217,0.46-0.217,0.46c-0.105,0.873,1.182,0.763,1.182,0.763s0.041-0.004,0.11-0.018c-0.26,0.021-0.499-0.021-0.59-0.178c-0.116-0.202-0.217-0.531,0.146-0.906c0.359-0.374,0.402-0.693,0.402-0.693c0.305-1.439-1.038-3.371-1.354-3.875c-0.315-0.503-0.836-0.791-2.394-0.531c-1.556,0.26-3.386,1.037-3.386,1.037s-1.891,0.995-3.299,0.809c-1.413-0.188-1.701-1.614-1.687-2.063c0.016-0.444,0.304-0.836,1.038-1.122c0.733-0.289,2.464-0.679,4.984-0.809c2.522-0.128,3.458-1.771,3.458-1.771c0.331-0.478,0.923-1.543-0.489-2.338c-1.412-0.789-1.44-0.589-2.116-1.104c-0.68-0.521-1.412-1.153-1.701-2.034c-0.026-0.084-0.07-0.198-0.108-0.291L55.064,72.686L55.064,72.686z"/><linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="390.042" y1="485.6797" x2="390.042" y2="485.6797" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#FFF"/><stop offset=".7473" stop-color="#F9F9F9"/><stop offset="1" stop-color="#D5D7D8"/></linearGradient><path style="&st35;" d="M-16.122-14.641"/><linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="390.042" y1="485.6797" x2="390.042" y2="485.6797" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#FFF"/><stop offset=".7473" stop-color="#F9F9F9"/><stop offset="1" stop-color="#D5D7D8"/></linearGradient><path style="&st36;" d="M-16.122-14.641"/><path style="&st34;" d="M92.002,13.363c1.021,1.649,2.844,4.295,2.844,4.295s0.256,0.332,0.5,0.605l0.01-0.011c0.011-0.375-0.051-0.571-0.06-0.621l-0.091-0.274c-0.021-0.367,0.438,0.095,0.611,0.288c-0.498-0.754-0.659-0.811-0.659-0.811s-0.423-0.234-0.111,0.59c0.312,0.824-0.075,0.233-0.075,0.233c-0.924-1.177-2.838-4.293-2.838-4.293l-0.553-0.383L92.002,13.363L92.002,13.363z"/><path style="&st34;" d="M101.539,51.352c0.014-0.063,0.023-0.125,0.034-0.188c-0.004,0-0.009,0-0.009,0s0.005-0.03,0.013-0.089C101.563,51.17,101.551,51.262,101.539,51.352L101.539,51.352z"/><path style="&st34;" d="M100.822,35.679c0.088-0.033,0.188,0.1,0.188,0.1s0.135,0.189,0.289,0.033c0.107-0.104,0.155-0.353,0.025-1.257c-0.004,0.229-0.053,0.409-0.137,0.59c-0.139,0.296-0.314,0.02-0.441-0.081c-0.129-0.098-0.168,0.07-0.168,0.07l-0.004,0.162c0,0.7,0.087,2.346,0.217,3.617c0.063,0.605,0.173,1.071,0.287,1.408l0.041,0.076c0.089,0.148,0.188,0.343,0.307,0.255c0.116-0.089,0.274-0.582,0.274-0.582l0.128-0.591c0.191,0.113,0.291,0.529,0.341,0.962c-0.002-0.037-0.004-0.056-0.004-0.056s-0.144-1.324-0.3-1.313c-0.155,0.01-0.21,0.701-0.21,0.701s-0.066,0.468-0.157,0.456c-0.088-0.011-0.365,0.022-0.564-1.412c-0.201-1.436-0.158-2.949-0.158-2.949S100.732,35.713,100.822,35.679L100.822,35.679z"/><path style="&st34;" d="M99.696,28.566l0.298,0.341c0.479,1.494,0.996,3.843,1.092,4.264c-0.027-0.139-0.056-0.286-0.088-0.441c-0.288-1.454-0.711-2.896-1.006-3.832L99.696,28.566l-0.05-0.702c-0.004-0.01-0.006-0.016-0.006-0.016s-0.312-0.913-1.033-2.737c-0.725-1.824-0.848-2.458-0.848-2.458s-0.043-0.2,0.066-0.234c0.109-0.032,0.09-0.178,0.09-0.178s-0.013-0.245-0.277-0.99c-0.182-0.503-0.312-0.911-0.662-1.607c0.281,0.585,0.463,1.052,0.524,1.259l0.028,0.068c0,0,0.099,0.148,0.066,0.552c-0.027,0.403-0.146,0.452-0.146,0.452l0.022,0.14c0.141,0.538,0.418,1.187,0.418,1.187s1.065,2.709,1.748,4.54L99.696,28.566L99.696,28.566z"/><linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="274.5342" y1="-396.1577" x2="255.2091" y2="-490.1944" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st37;" d="M42.958,91.536c0.938,0.177,1.723,0.358,1.889,0.396C44.514,91.822,43.895,91.653,42.958,91.536z"/><linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="422.5586" y1="518.7568" x2="427.2878" y2="578.1768" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset=".2198" stop-color="#989A9C"/><stop offset=".2527" stop-color="#FFF"/></linearGradient><path style="&st38;" d="M20.381,74.92l0.007-0.164l-0.052-0.08c0,0-1.874-3.375-1.676-4.615c0,0,0.069-0.827,1.241-1.187c0.817-0.25,0.71,0.538,3.112,0.976c0,0,2.07,0.557,2.611-0.946c0.539-1.507-0.566-3.394-0.566-3.394s-1.45-2.656-3.244-2.756c-0.95-0.055-0.692,0.583-2.125,0.924c0,0-1.913,0.185-2.519-0.963c-0.733-1.389-1.015-2.968-1.015-4.021c0-1.058,0.045-1.001,0.126-1.405c0.045-0.219,0.186-0.548,0.248-1.09l-0.134-0.675l0.204-0.499c0.002-0.26-0.004-0.535-0.021-0.83c-0.092-1.661-0.211-4.221-0.436-5.711c-0.223-1.491-0.633-3.799-1.991-3.865c0,0-0.671-0.052-1.636,0.885c-0.882,0.856-1.682-0.708-1.726-1.663c-0.052-1.121,0.131-2.255,0.409-2.795c0.277-0.541,1.042-0.566,1.186-0.554c0.146,0.012,0.555,0.17,1.042,0.474c0.489,0.304,1.161,0.304,1.558-0.092c0.395-0.395,0.948-0.856,1.173-2.598c0.225-1.741,0.225-3.547,0.013-5.71l-0.224-0.485l1.339-0.288c-0.001-0.016-0.021-0.125-0.032-0.195c0,0,0-0.001-0.001-0.002c-0.001-0.017-0.004-0.033-0.007-0.052c0-0.002,0-0.004,0-0.005c-0.003-0.019-0.007-0.038-0.009-0.057c-0.001-0.001-0.001-0.001-0.001-0.003c-0.003-0.022-0.006-0.042-0.009-0.062c0-0.001,0-0.001,0-0.001c-0.004-0.022-0.006-0.045-0.011-0.067c0-0.003-0.001-0.006-0.001-0.007c-0.002-0.022-0.006-0.045-0.008-0.068c-0.001-0.005-0.001-0.01-0.003-0.015c-0.002-0.023-0.005-0.047-0.009-0.069c-0.001-0.004-0.002-0.01-0.002-0.014c-0.003-0.026-0.007-0.05-0.012-0.076c0-0.002,0-0.005,0-0.005c-0.004-0.025-0.008-0.05-0.012-0.076c0-0.007-0.001-0.012-0.002-0.018c-0.002-0.024-0.006-0.052-0.009-0.079c-0.001-0.005-0.001-0.011-0.003-0.021c-0.004-0.027-0.006-0.053-0.01-0.081c-0.001-0.007-0.002-0.013-0.003-0.02c-0.003-0.028-0.005-0.057-0.009-0.087c-0.001-0.003-0.001-0.008-0.003-0.013c-0.003-0.028-0.005-0.056-0.009-0.082c-0.001-0.006-0.001-0.011-0.002-0.017c-0.003-0.031-0.006-0.06-0.01-0.091c-0.001-0.007-0.001-0.014-0.002-0.02c-0.004-0.03-0.006-0.062-0.011-0.09c0-0.007-0.001-0.015-0.002-0.022c-0.003-0.031-0.006-0.063-0.01-0.094c-0.001-0.006-0.002-0.011-0.002-0.018c-0.003-0.032-0.005-0.063-0.009-0.094c0-0.003,0-0.005-0.001-0.009c-0.003-0.033-0.004-0.068-0.009-0.1c0-0.005,0-0.013-0.001-0.02c-0.002-0.035-0.005-0.065-0.007-0.099c-0.001-0.008-0.001-0.015-0.002-0.021c-0.003-0.032-0.005-0.066-0.007-0.099c0-0.005-0.001-0.011-0.001-0.02c-0.002-0.033-0.006-0.068-0.007-0.101c0-0.003-0.001-0.008-0.001-0.009c-0.002-0.033-0.004-0.066-0.007-0.1c0-0.006,0-0.012,0-0.017c-0.001-0.032-0.003-0.068-0.005-0.1c0-0.008,0-0.014-0.001-0.022c-0.001-0.033-0.004-0.067-0.005-0.098c0-0.006,0-0.013,0-0.021c-0.002-0.033-0.003-0.066-0.004-0.101c0-0.005,0-0.008,0-0.013c-0.001-0.032-0.002-0.066-0.002-0.099c0-0.003,0-0.005,0-0.009c0-0.034-0.001-0.067-0.001-0.102c0-0.005,0-0.012,0-0.016c0-0.033,0-0.067,0-0.098c0-0.005,0-0.012,0-0.019c0.001-0.032,0.001-0.065,0.001-0.096c0-0.004,0.001-0.009,0.001-0.014c0-0.033,0.001-0.066,0.003-0.1c0.052-1.243,0.291-1.751,0.291-1.751l0.058-0.166c0,0,0.46-1.458,1.152-2.458l-0.011,0.024c0,0,0.446-0.738,1.231-0.816c0.785-0.077,1.003,0.158,1.371,0.202c0.04,0.004,0.078,0.008,0.115,0.013c0.013,0.001,0.025,0.002,0.037,0.004c0.025,0.002,0.051,0.003,0.074,0.006c0.014,0.001,0.028,0.002,0.042,0.003c0.021,0.001,0.043,0.002,0.064,0.004c0.014,0.001,0.028,0.001,0.041,0.002c0.02,0.001,0.04,0.002,0.058,0.002c0.013,0.002,0.026,0.002,0.04,0.002c0.021,0.001,0.037,0.002,0.055,0.002c0.014,0,0.026,0.001,0.039,0.001c0.016,0,0.034,0.001,0.051,0.001c0.011,0,0.023,0,0.034,0c0.017,0,0.032,0,0.05-0.001c0.01,0,0.02,0,0.032-0.001c0.016,0,0.031,0,0.046-0.001c0.011,0,0.02-0.001,0.03-0.001c0.015,0,0.03-0.002,0.045-0.002c0.009,0,0.017-0.001,0.026-0.001c0.015-0.001,0.03-0.003,0.044-0.004c0.006-0.001,0.016-0.002,0.022-0.002c0.016-0.001,0.03-0.002,0.044-0.004c0.007-0.001,0.014-0.001,0.019-0.002c0.016-0.002,0.03-0.004,0.045-0.007c0.006,0,0.009,0,0.014-0.001c0.019-0.002,0.036-0.006,0.052-0.008l0,0c0.035-0.008,0.068-0.014,0.098-0.021c0,0,0-0.002,0.002-0.002c0.012-0.002,0.025-0.005,0.039-0.01c0.002,0,0.004-0.001,0.007-0.001c0.01-0.003,0.02-0.006,0.029-0.009c0.003-0.001,0.007-0.002,0.01-0.004c0.009-0.002,0.018-0.006,0.026-0.008c0.002-0.002,0.005-0.003,0.008-0.003c0.008-0.003,0.015-0.006,0.021-0.009c0.003-0.001,0.006-0.003,0.009-0.004c0.006-0.003,0.014-0.004,0.02-0.009c0.003-0.001,0.006-0.002,0.008-0.003c0.005-0.002,0.012-0.005,0.019-0.007c0.001-0.002,0.003-0.003,0.005-0.004c0.005-0.004,0.01-0.005,0.015-0.008c0.003-0.001,0.004-0.003,0.008-0.003c0.004-0.002,0.008-0.005,0.012-0.008c0,0,0.004,0,0.005-0.002c0.004-0.003,0.008-0.006,0.012-0.008c0.001-0.002,0.002-0.002,0.004-0.003c0.003-0.003,0.007-0.004,0.01-0.008c0.002,0,0.002,0,0.002-0.002c0.003-0.001,0.007-0.005,0.011-0.008c0,0,0.001,0,0.001-0.001c0.004-0.002,0.005-0.004,0.009-0.007h0.001c0.002-0.002,0.004-0.004,0.006-0.007c0.001-0.001,0.002-0.001,0.003-0.002s0.002-0.002,0.002-0.002c0.001-0.003,0.001-0.003,0.003-0.005c0.002-0.002,0.004-0.004,0.004-0.004c0.328-0.241,0.591-0.516,0.797-0.775c0.014-0.017,0.026-0.034,0.04-0.05c0.002-0.004,0.005-0.009,0.008-0.012c0.013-0.016,0.026-0.032,0.038-0.05c0.002-0.003,0.006-0.006,0.007-0.01c0.012-0.018,0.025-0.032,0.038-0.05c0,0,0,0,0.001,0c0.039-0.055,0.075-0.109,0.109-0.159c0-0.003,0.002-0.006,0.003-0.008c0.01-0.015,0.021-0.028,0.03-0.044c0.001-0.003,0.004-0.007,0.007-0.01c0.008-0.016,0.017-0.029,0.024-0.042c0.002-0.004,0.005-0.009,0.009-0.013c0.008-0.014,0.017-0.028,0.023-0.042c0.001-0.001,0.001-0.002,0.002-0.002c0.017-0.028,0.032-0.055,0.046-0.079c0.002-0.003,0.004-0.008,0.006-0.013c0.006-0.01,0.01-0.021,0.017-0.029c0.003-0.007,0.007-0.014,0.012-0.02c0.004-0.008,0.009-0.017,0.014-0.024c0.002-0.008,0.006-0.017,0.01-0.023c0.004-0.007,0.009-0.016,0.012-0.023c0.004-0.006,0.006-0.014,0.011-0.021c0.002-0.006,0.007-0.013,0.01-0.021c0.066-0.128,0.097-0.205,0.097-0.205c0.593-1.459,0.052-2.936-0.21-3.225c-0.32-0.353-1.041-0.882-1.041-0.882s-0.288-0.241-0.751-0.144c0.349-0.049,0.791,0.091,0.966,0.558c0.277,0.734,0.376,1.335,0.212,2.33c0,0-0.26,1.387-1.384,2.233c-1.125,0.848-1.923,0.096-2.885,0.13c-0.962,0.032-1.516,0.701-1.809,1.157c-0.293,0.457-1.417,2.2-1.319,5.067c0.097,2.868,0.291,4.301,0.325,5.558c0.033,1.205,0.178,3.976-0.635,5.278c-0.815,1.303-1.628,0.65-2.2,0.309c-0.571-0.341-1.223-0.245-1.744,0.131c-0.521,0.375-0.833,1.124-0.848,3.324c-0.016,2.364,1.532,2.606,1.532,2.606s0.293,0.146,0.945-0.537c0,0,0.651-0.685,1.253-0.603c0.604,0.082,0.995,0.716,1.255,1.808c0.261,1.092,0.796,5.621,0.717,8.668c-0.034,1.271-0.62,1.286-0.36,3.617c0,0,0.409,3.13,1.401,4.089c0.995,0.962,2.378,0.781,2.706,0.75c0.324-0.032,0.7-0.26,0.7-0.26s0.309-0.197,0.537-0.374c0.23-0.182,0.522-0.428,1.011-0.277c0.489,0.146,1.645,0.896,2.557,2.571c0.915,1.678,0.496,3.317-0.26,3.521c-0.668,0.182-0.848,0.229-1.971-0.05c-1.124-0.274-1.451-0.567-1.957-0.766c-0.504-0.196-1.043-0.263-1.547,0.114c-0.505,0.373-1.345,1.057-0.343,3.32c0.961,2.174,1.692,3.797,3.518,5.623c-0.522-0.607-0.956-1.188-1.427-1.871L20.381,74.92L20.381,74.92z"/><linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="237.3721" y1="-388.3604" x2="218.8474" y2="-478.5023" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st39;" d="M22.494,7.387l-0.05,0.025C22.45,7.41,22.469,7.401,22.494,7.387z"/><linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="259.9063" y1="-479.3379" x2="259.8987" y2="-479.3752" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st40;" d="M46.028,92.85c0.13,0.014,0.26,0.026,0.391,0.041c-0.114-0.016-0.31-0.039-0.561-0.074C45.916,92.828,45.972,92.838,46.028,92.85L46.028,92.85z"/><path style="&st29;" d="M24.089,5.489c-0.649,0.36-0.7-0.016-1.141,0.017c-0.439,0.033-1.026,0.212-1.596,1.043c-0.571,0.831-0.586,1.89,0.326,1.417c0,0,0.436-0.428,0.815-0.579c0.081-0.043,0.24-0.126,0.406-0.174l0.144-0.117c0,0,0.424-0.491,1.073-0.333c0.648,0.156,1.119-0.129,1.119-0.129c1.01-0.761,1.655-2.184,1.655-2.184l0.987-1.998l-0.826-1.336c0,0-0.698,1.489-1.383,2.53C24.986,4.692,25.033,4.972,24.089,5.489L24.089,5.489z"/><path style="&st29;" d="M19.871,16.292c0,0-0.424,1.89,1.156,1.597c0,0,0.006-0.002,0.022-0.007c-0.062,0.003-0.089-0.006-0.089-0.006c-0.025-0.497,0.149-1.432,0.49-2.261c0.341-0.83,1.075-2.254,1.075-2.254s1.047-1.791,1.467-2.89c0.42-1.102,0.416-1.939,0.416-1.939s-0.8-1.019-0.915-1.176c-0.115-0.157-0.272-0.223-0.272-0.223c-0.054,0.019-0.103,0.036-0.146,0.051c0.115-0.007,0.221,0.021,0.283,0.114c0.213,0.31-0.39,2.036-0.39,2.036s-0.522,1.238-1.548,3.03C20.393,14.157,19.871,16.292,19.871,16.292L19.871,16.292z"/><linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="268.9033" y1="-394.6382" x2="249.4966" y2="-489.0725" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st41;" d="M38.185,89.697l0.166,0.02c-0.134-0.119-0.305-0.236-0.497-0.347c0.184,0.113,0.489,0.358,0.312,0.665c-0.245,0.424-0.048,0.457,0.489,0.863c0,0,0.022,0.013,0.061,0.033c-0.156-0.107-0.253-0.234-0.156-0.362c0.125-0.166,0.136-0.334,0.065-0.499L38.185,89.697L38.185,89.697z"/><linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="254.4561" y1="-391.5991" x2="235.0337" y2="-486.1104" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st42;" d="M24.437,82.749c-1.245-1.185,1.595-0.118,1.595-0.118s0.619,0.262,0.343-0.385c-0.246-0.57-1.373-1.963-2.543-3.219l0.144,0.156c0,0,2.346,2.721,2.183,2.966c-0.164,0.245-1.108-0.325-1.108-0.325s-1.401-0.539-1.206,0.13c0.143,0.491,1.059,1.271,1.536,1.649C25.109,83.372,24.798,83.09,24.437,82.749z"/><linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="262.6514" y1="-392.9692" x2="243.1559" y2="-487.8355" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st43;" d="M26.977,84.73c0.424,0.256,0.903,0.513,1.365,0.676c0,0,0.831,0.293,1.337-0.114c0.503-0.403,0.503-0.601,1.238-0.243c0,0,1.388,0.696,2.382,1.444c0.98,0.735,3.557,2.336,4.396,2.791c-0.764-0.417-3.712-2.365-4.633-2.99c-0.936-0.633-2.574-1.698-3.297-1.476c-0.554,0.172-0.474,0.396-0.804,0.555c-0.331,0.158-0.688,0.055-1.504-0.383C27.291,84.9,27.134,84.818,26.977,84.73L26.977,84.73z"/><linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="271.5479" y1="-390.9575" x2="251.1904" y2="-490.0176" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st44;" d="M39.903,91.448c0.37,0.104,0.672,0.06,0.787,0.035c-0.678,0.04-1.35-0.269-1.35-0.269s-0.067-0.021-0.165-0.061C39.413,91.268,39.689,91.385,39.903,91.448z"/><linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="274.6582" y1="-395.8442" x2="255.2559" y2="-490.2569" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset="1" stop-color="#E4E5E6"/></linearGradient><path style="&st45;" d="M44.293,92.169c0,0-1.344-0.163-1.939-0.163c0,0-0.037,0.064,0.226,0.158c-0.021-0.021-0.031-0.049,0.189,0c0.304,0.064,2.018,0.225,2.465,0.158c0.448-0.068-0.091-0.278-0.091-0.278s-0.088-0.041-0.267-0.102C44.553,92.201,44.293,92.169,44.293,92.169L44.293,92.169z"/><path style="&st34;" d="M4.662,62.045c0.085,0.143,0.198,0.432,0.462,0.725c0.146,0.16,0.266,0.072,0.162-0.525c-0.253-0.182-0.407-0.318-0.464-0.371c-0.113-0.013-0.263-0.297-0.263-0.297s-0.471-0.835-0.274-0.227c0.398,1.23,1.6,3.821,1.6,3.821l1.396,2.47c-0.999-1.803-2.299-4.633-2.44-5.013C4.691,62.223,4.577,61.904,4.662,62.045L4.662,62.045z"/><path style="&st34;" d="M1.547,32.696l0.032-0.643c0.027-0.122,0.057-0.241,0.087-0.36c0.712-2.789,1.069-3.858,1.425-4.649c0.356-0.792,0.398-0.245,0.398-0.245s0,0.209,0.136,0.234c0.135,0.023,0.324-0.32,0.494-0.826c0.17-0.504,0.604-1.745,0.693-2.212c0.135-0.704-0.051-0.358-0.115-0.354c-0.108,0.005-0.126-0.091-0.113-0.306c0,0,0.382-2.122,3.064-6.563c0.18-0.17,0.321-0.307,0.47-0.449c-0.055-0.052-0.033-0.265,0.001-0.32c0.136-0.214,0.275-0.435,0.422-0.661l-0.09,0.504c0,0-1.85,2.492-3.104,5.694c0,0-0.342,0.835-0.359,1.094c-0.025,0.154-0.104,0.739,0.152,0.582l0.065-0.048c-0.093,0.484-0.295,1.37-0.607,2.325c-0.288,0.878-0.573,1.633-0.841,2.078l-0.002-0.004c-0.08,0.067-0.098-0.016-0.146-0.21c-0.048-0.198-0.113-0.198-0.113-0.198c-0.179,0-0.324,0.202-0.41,0.359c-0.04,0.056-0.089,0.19-0.089,0.19s-0.461,0.934-1.281,4.26c-0.822,3.328-0.836,6.14-0.836,6.14s-0.084,1.309-0.21,1.379c-0.126,0.07-0.097-0.056-0.097-0.056s-0.045-0.052-0.114,0.045c0,0,0.02-0.76,0.044-0.875c0,0,0.041-0.206,0.119-0.206s0.006,0.125,0.048,0.16c0.039,0.032,0.084,0.03,0.075-0.178c-0.005-0.176,0.147-2.816,0.621-5.312L1.547,32.696L1.547,32.696z"/><path style="&st34;" d="M0.392,41.994c0-0.002,0-0.004,0-0.005c0,0,0.018,0.217,0.042,0.356l-0.003,0.01c0.078,0.357,0.187,0.357,0.187,0.357c0.008-0.096,0.087-0.273,0.183-0.458c0.007,0.106,0.007,0.231-0.004,0.375c-0.037,0.537-0.019,2.466,0.209,4.28c0.225,1.815,0.367,3.349,0.394,3.594c0.029,0.245,0.498,3.283,1.025,5.089c0.285,0.967,0.422,1.344,0.483,1.424l0.008,0.049c0,0,0.097,0.184,0.348,0.32c0,0,0.111-0.097,0.112-0.412c0.018,0.031,0.037,0.065,0.057,0.105c-0.083,0.262-0.105,0.426-0.105,0.426l0,0c-0.042-0.043-0.06-0.031-0.046,0.045c0.067,0.357,0.027,0.68-0.169,0.272c-0.198-0.403-0.8-1.832-1.307-4.251c0,0-0.531-2.659-0.795-5.084l0.042-0.105L0.989,48.29c-0.027-0.248-0.048-0.491-0.067-0.729c0,0-0.255-3.657-0.237-4.562c0.019-0.904-0.085-0.02-0.085-0.02s-0.021,0.219-0.028,0.329c-0.008,0.109-0.103,0.352-0.136-0.246C0.459,43.322,0.392,42.261,0.392,41.994L0.392,41.994z"/><path style="&st34;" d="M24.672,1.974l-0.53-0.753l-0.066-0.065c0,0-0.131-0.136-0.896,0.038l-0.11,0.022c0,0,0.38-0.094,0.168,0.191c-0.212,0.285-0.56,0.496-1.172,1.15c-0.612,0.655-0.411,0.803-0.01,0.668c0.401-0.138,1.188-0.499,2.606-1.243L24.672,1.974z"/><path style="&st34;" d="M23.106,1.21c-0.022,0.003-0.036,0.006-0.036,0.006L23.106,1.21z"/><path style="&st34;" d="M23.637,1.811c0.31-0.272,0.429-0.484,0.454-0.641l-0.015-0.014c0,0-0.131-0.136-0.896,0.038l-0.075,0.015c0.09-0.015,0.303-0.032,0.133,0.198c-0.212,0.285-0.56,0.496-1.172,1.151c-0.612,0.656-0.411,0.803-0.01,0.667c0.106-0.038,0.239-0.088,0.4-0.157C22.599,2.755,23.046,2.325,23.637,1.811z"/><path style="&st34;" d="M83.482,4.115l-0.2,0.235c0,0,0.136,0.081,0.208,0.141c0.008,0.005,0.014,0.01,0.021,0.012c-0.043-0.034-0.07-0.056-0.07-0.056c-0.023-0.109,0.004-0.223,0.014-0.297L83.482,4.115c0,0,0.055,0.002,0.143,0.011L83.482,4.115L83.482,4.115z"/><path style="&st6;" d="M62.559,90.319c0,0,1.686-0.187,3.239-0.691c1.558-0.504,1.935-0.981,1.874-1.341c-0.037-0.238-0.396-0.305-0.906-0.238c0.271-0.021,0.514,0.032,0.354,0.332c-0.313,0.582-0.861,0.782-0.861,0.782s-0.267,0.19-0.89,0.371c-0.806,0.245-1.794,0.375-2.335,0.438c-0.691,0.082-0.521-0.033-1.465,0.291c-0.023,0.016-0.047,0.025-0.065,0.043c-0.289,0.237,1.071,0.514,1.071,0.514s1.302,0.361,3.257,0.23l0.067-0.021c0.267-0.078,0.533-0.161,0.8-0.245c-2.021,0.457-3.324,0.149-3.737,0.095c-0.434-0.058-0.777-0.144-0.88-0.359C61.98,90.305,62.559,90.319,62.559,90.319L62.559,90.319z"/><path style="&st34;" d="M63.301,4.417l0.717,0.076c1.429-0.405,2.651-0.776,2.651-0.776s1.265-0.41,1.901-0.636c0.635-0.227,1.09-0.313,1.656-0.41c0.563-0.096,1.309-0.14,1.709-0.131c0.398,0.007,0.528,0.122,0.528,0.122s0.166,0.131,0.245,0.27c0.077,0.138,0.74,1.891,2.975,2.005c2.231,0.112,2.261-1.096,2.063-1.464c-0.226-0.427-0.896-0.863-0.896-0.863s-0.898-0.575-1.09-0.846c-0.192-0.271,0.033-0.358,0.104-0.376c0.066-0.018,2.433-0.497,2.729-0.608l0.021-0.02l-0.563-0.174c0,0-0.119,0.134-0.789,0.312c-0.67,0.179-1.233,0.246-1.742,0.313c-0.504,0.067-0.504,0.239-0.504,0.239l-0.879,1.406c0,0-0.029,0.104,0.043,0.305c0.073,0.202,0.41,0.448,0.41,0.448s0.573,0.424,0.99,0.699c0.418,0.275,0.395,0.373,0.395,0.373c-1.123,0.095-1.418-0.048-1.875-0.276c-0.445-0.223-0.76-0.729-0.922-1.086c-0.162-0.357-0.521-0.663-0.521-0.663c-0.589-0.336-1.696-0.343-2.813-0.15c-1.115,0.194-2.656,0.707-2.923,0.812c-0.271,0.104-1.616,0.551-2.309,0.729c-0.694,0.179-1.224,0.357-1.646,0.47c-0.426,0.11-3.431,1.005-4.557,1.339c-1.124,0.333-1.848,0.461-1.848,0.461c-1.688,0.171-2.193-0.134-2.193-0.134c-0.297-0.125-0.262-0.527-0.262-0.527l0.009-1.147c0,0-0.029-0.433-0.356-0.611c-0.328-0.179-0.779-0.252-1.593-0.29c-0.811-0.038-1.683,0.044-2.093,0.134c-0.408,0.09-1.19,0.313-1.764,0.952c-0.573,0.641-0.481,1.141-0.481,1.141s0.035,0.683,0.088,1.19c0.052,0.504,0.484,0.662,0.484,0.662s-0.744,0.532-3.045,1.206c-2.209,0.648-3.682,0.774-3.682,0.774l0.678,0.254c0,0,5.468-1.015,7.148-2.616c0,0,0.624-0.293,0.02-0.88c-0.606-0.585-0.897-0.761-0.897-0.761s-0.41-0.224,0.019-0.771c0.43-0.547,0.923-0.795,1.352-0.933c0.429-0.138,1.753-0.25,2.925-0.093c0,0,0.491,0.041,0.459,0.408c-0.034,0.366-0.088,0.872-0.077,1.028c0.008,0.158,0.023,0.515,0.398,0.845c0.378,0.332,1.099,0.453,1.099,0.453s1.257,0.228,2.843-0.217c1.584-0.445,3.642-1.14,5.431-1.629L63.301,4.417L63.301,4.417z"/><path style="&st12;" d="M-16.122-14.641"/><path style="&st22;" d="M48.462,6.628c0.31,0.207,0.476,0.221,0.5,0.421c0.055,0.339-0.56,0.64-0.56,0.64l-0.006-0.011c0,0-0.431-0.157-0.484-0.664c-0.052-0.505-0.088-1.19-0.088-1.19s0.001,0.2,0.046,0.26C48.004,6.256,48.087,6.378,48.462,6.628z"/><path style="&st20;" d="M82.447,79.307l0.451,0.17c1.104-0.617,1.496-0.809,1.759-0.963c1.183-0.703,2.592-1.563,2.963-1.855c0,0,0.761-0.518,0.116,0.195s-0.969,1.007-0.969,1.007s-0.625,0.626-0.471,0.782c0,0,0.166,0.246,1.193-0.687c1.023-0.929,2.15-2.258,2.275-2.44c0.127-0.188,0.146-0.293,0.146-0.293s0.107-0.215,0.273-0.393c0.145-0.15,1.377-1.496,1.994-2.121c0,0,0.002,0.001,0.006,0.003c0.273-0.362,0.541-0.729,0.806-1.102c-0.358,0.379-1.724,1.829-2.483,2.684c0,0-0.713,0.763-0.938,1.056s-0.225,0.47-0.225,0.47s-0.117,0.196-0.392,0.519s-1.24,1.186-1.24,1.186s-0.577,0.47-0.754,0.478c-0.179,0.011,0.431-0.538,0.431-0.538s0.588-0.625,0.967-1.123c0.382-0.498,0.137-0.47,0.137-0.47s-0.186-0.049-0.986,0.459c-0.8,0.508-1.367,0.858-1.367,0.858s-1.722,0.986-2.814,1.623c-1.096,0.636-3.6,1.908-5.021,2.492c-1.43,0.588-2.162,0.715-2.035,0.527c0.127-0.186,0.461-0.459,0.461-0.459s0.399-0.4,0.399-0.803c0,0,0.128-0.586-1.604-0.223c-1.729,0.36-3.293,1.213-3.293,1.213s-2.571,1.182-1.965,1.887c0,0,0.117,0.186,0.635,0.352c0.52,0.166-0.92,0.606-0.92,0.606c-1.365,0.448-2.413,0.651-3.74,0.926c-1.963,0.403-3.564,0.761-4.165,0.894c-0.165,0.035-0.253,0.059-0.253,0.059s-1.212,0.292-3.229,1.072c-2.015,0.783-5.972,1.43-5.972,1.43s-2.542,0.293-2.777,0.627c-0.234,0.331,0.177,0.499,0.177,0.499s0.362,0.224,1.671,0.283c0,0,0.451,0,0.471,0.036c0.018,0.039,0.046,0.068-0.235,0.156c-0.286,0.088-0.854,0.314-2.778,0.558c-1.936,0.245-1.896-0.067-1.896-0.067s-0.01-0.076,0.078-0.216c0.087-0.134,0.009-0.369-0.293-0.535c0,0-0.419-0.272-1.829-0.262c-1.408,0.009-4.212,0.017-6.833-0.14c-2.374-0.143-5.59-0.551-6.099-0.664c0,0-0.117-0.029-0.206-0.117c-0.088-0.09-0.646-0.422-1.164-0.733c-0.517-0.313-2.073-0.907-2.073-0.907s-2.011-0.783-1.945-0.521c0.015,0.063,0.13,0.153,0.268,0.246c0.351,0.188,0.704,0.375,1.06,0.56l0.002-0.002c0,0-0.743-0.402-0.538-0.402s0.438,0.109,0.438,0.109s1.213,0.332,1.966,0.686c0.753,0.353,1.407,0.83,1.407,0.83s0.929,0.549,2.319,0.732c1.346,0.182,3.174,0.389,3.777,0.448l0.594-0.272l0.433,0.354c1.106,0.068,2.575,0.146,2.575,0.146s2.976,0.111,4.605-0.019c0.733-0.063,0.507,0.317,0.507,0.317s-0.214,0.354,0.206,0.529c0,0,0.771,0.439,3.343,0.157c2.573-0.286,3.138-0.862,3.138-0.862s0.299-0.275-0.351-0.398c-0.513-0.1-0.513-0.051-1.175-0.117c-0.665-0.067-0.998-0.205-0.557-0.323c0.441-0.114,1.174-0.175,1.174-0.175s2.249-0.313,4.066-0.783c0,0,1.938-0.458,3.861-1.134c0.756-0.265,1.395-0.459,1.887-0.599l0.438-0.644l0.644,0.372c0.065-0.014,0.103-0.021,0.103-0.021s2.306-0.539,3.274-0.703c0.966-0.168,3.154-0.637,4.087-1.086c0.928-0.448,1.396-0.805,1.505-1.075c0.107-0.272-0.393-0.431-0.393-0.431s-0.588-0.138-0.508-0.34c0.075-0.205,0.293-0.382,1.213-0.793c0.918-0.41,2.07-0.859,3.227-1.144c1.154-0.282,0.732,0.194,0.732,0.194s-0.692,0.705-0.783,0.979c-0.086,0.273,0.029,0.285,0.119,0.333c0.088,0.05,0.646,0.028,1.022-0.067c0.383-0.099,3.464-1.271,5.341-2.347c0.049-0.026,0.094-0.054,0.139-0.08L82.447,79.307z"/><linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="221.1826" y1="-454.5649" x2="221.373" y2="-454.5649" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#808080"/><stop offset=".0868" stop-color="#7A7A7A"/><stop offset=".36" stop-color="#6B6B6B"/><stop offset=".5192" stop-color="#686868"/><stop offset=".6377" stop-color="#5F5F5F"/><stop offset=".7431" stop-color="#4E4E4E"/><stop offset=".8408" stop-color="#383838"/><stop offset=".9324" stop-color="#1B1B1B"/><stop offset="1" stop-color="#000"/></linearGradient><path style="&st13;" d="M7.432,68.01l0.178,0.131c-0.105-0.099-0.167-0.155-0.167-0.155s-0.008,0.003-0.024,0.003C7.423,67.993,7.429,68.002,7.432,68.01L7.432,68.01z"/><linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="221.4043" y1="-449.8027" x2="316.0254" y2="-449.8027" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#808080"/><stop offset=".0868" stop-color="#7A7A7A"/><stop offset=".3817" stop-color="#828282"/><stop offset=".5185" stop-color="#808080"/><stop offset=".5677" stop-color="#797979"/><stop offset=".6027" stop-color="#6E6E6E"/><stop offset=".608" stop-color="#6B6B6B"/><stop offset="1" stop-color="#4E4E4E"/></linearGradient><path style="&st7;" d="M90.412,59.954l-0.371-0.021c-1.807,1.463-2.342,1.938-3.781,2.955c0,0-1.644,1.228-3.44,2.196c-1.804,0.97-3.919,0.853-3.919,0.853s-0.573-0.062-0.295-0.477c0.275-0.415,0.634-1.425,0.771-1.938c0.141-0.516,0.415-1.82-0.633-2.235s-3.018,0.196-3.018,0.196s-4.525,1.205-6.371,3.23c-1.793,1.969-0.286,2.846-0.286,2.846s0.702,0.49,1.386,0.73c0.645,0.229,0.516,0.436,0.354,0.555c0,0-2.021,1.287-4.408,1.974c0,0-3.268,1.001-6.441,1.206c-3.154,0.203-4.495,0.283-4.495,0.283l-0.399,0.379l-0.758-0.252c-1.283,0.154-3.455,0.463-5.596,0.979c-2.622,0.64-5.123,1.147-6.903,2.296c0,0-1.333,0.887-0.566,1.746c0.765,0.862,1.565,1.23,1.565,1.23s0.472,0.207,0.464,0.336c-0.009,0.164-0.015,0.309-0.367,0.512c0,0-1.394,0.814-4.108,0.859c-2.714,0.045-3.911,0.021-4.707-0.695c-0.658-0.591,0.165-1.844,0.165-1.844s0.33-0.612,0-1.453c-0.33-0.84-2.218-0.854-2.218-0.854l-2.615-0.134c-3.095-0.081-7.182-0.427-9.001-0.653c0,0-0.012-0.002-0.033-0.006l-0.006,0.166l-0.721-0.303c-1.139-0.221-3.243-0.668-4.075-1.084c-0.759-0.38-1.167-0.313-1.066-1.102c0.101-0.769-0.753-1.836-0.753-1.836s-1.188-1.287-2.257-2.086c-1.069-0.804-1.523-0.564-1.523-0.564s-0.484,0.258-0.049,1.296c0.436,1.04,0.86,1.403,0.86,1.403s0.208,0.22,0.089,0.279c-0.118,0.06-0.484-0.219-0.789-0.478c-0.253-0.21-1.885-1.742-2.456-2.276l0.105,0.356c0.019,0.028,0.035,0.062,0.052,0.086c0.184,0.291,0.855,1.269,2.155,2.28c1.549,1.213,1.559,0.729,1.559,0.729s0.061-0.399-0.297-0.84c-0.359-0.44-0.934-1.373-0.791-1.715c0.144-0.339,0.309-0.31,0.309-0.31s0.133-0.051,0.596,0.299c0.462,0.351,1.498,1.076,2.011,1.703c0.513,0.623,0.48,1.181,0.48,1.181s-0.102,0.563,0.453,1.17c0.553,0.604,1.733,1.714,5.859,2.351c0.025,0.004,0.034,0.006,0.059,0.01l0.193-0.551l0.573,0.663c3.598,0.521,5.555,0.563,5.555,0.563s4.709,0.162,5.982,0.162c1.272,0,1.035,0.666,1.035,0.666s-0.072,0.359-0.225,0.646c-0.155,0.287-0.524,1.365-0.144,1.939c0,0,0.585,1.427,4.381,1.527c0,0,3.324,0.268,5.643-0.688c2.319-0.954,0.226-2.275,0.226-2.275s-0.794-0.481-1.13-0.739c-0.308-0.234-0.184-0.481-0.121-0.646c0.06-0.162,0.297-0.359,0.563-0.492c0.266-0.134,1.239-0.654,5.365-1.722c4.124-1.069,6.587-1.183,6.587-1.183s0.02-0.002,0.055-0.004l0.338-0.656l0.854,0.556c0.732-0.06,1.681-0.129,2.526-0.171c1.691-0.082,4.341-0.471,5.879-0.807c1.54-0.343,3.869-1.062,5.592-1.951c1.725-0.895,1.809-1.519,1.809-1.519s0.328-0.475-0.392-0.995c-0.719-0.523-1.036-0.382-1.673-1.027c-0.637-0.646,0.557-1.62,0.557-1.62s0.612-0.861,4.021-2.175c3.403-1.313,3.979-0.873,4.153-0.729s0.195,0.615,0.123,0.935c-0.069,0.317-0.494,1.455-0.721,2.053c-0.227,0.594-0.316,1.406,0.605,1.601c0.923,0.194,2.215-0.008,3.428-0.442c2.893-1.033,3.756-2.295,8.534-5.764c0.012-0.008,0.021-0.017,0.03-0.021L90.412,59.954l0.689,0.108c1.978-1.573,3.869-3.571,3.869-3.571s1.258-1.261,1.889-2.356c0.595-1.026,0.027,0.89,0.027,0.89s-0.32,1.516,0.19,2.077c0.405,0.445,1.563-0.795,1.563-0.795s0.688-0.789,0.965-2.061c0.408-1.875,0.185-2.248,0.185-2.248s-0.246-0.389-0.093-0.852c0.154-0.459,1.158-3.047,1.98-4.01l0.502-0.563c0-0.008,0.002-0.02,0.002-0.027l-0.224-0.557l0.304-0.512c0,0-0.279,0.322-1.404,2.177c-1.266,2.087-1.467,3.771-1.467,3.771s-0.119,0.653-0.054,1.034c0.063,0.355,0.188,0.519,0.192,0.622c0.009,0.104-0.073,0.959-0.508,1.773c-0.438,0.814-0.815,1.031-0.815,1.031s-0.756,0.545-0.86,0.157c-0.104-0.39-0.074-0.72-0.035-0.966c0.035-0.248,0.289-1.579,0.252-2.072c-0.035-0.494-0.479-0.098-0.479-0.098s-0.104,0.119-0.298,0.366s-1.288,1.637-1.705,2.125c-0.988,1.157-1.886,1.989-4.292,3.93c-0.007,0.003-0.015,0.011-0.019,0.015L90.412,59.954L90.412,59.954z"/><linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="214.5928" y1="-431.356" x2="314.4043" y2="-431.356" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#555555"/><stop offset="1" stop-color="#231F20"/></linearGradient><path style="&st11;" d="M1.193,48.543l0.104,0.975c0.235,0.285,0.577,0.677,1.071,1.187c1.084,1.121,1.427,0.416,1.427,0.416s0.253-0.705-0.054-1.985C3.434,47.85,3.488,47.09,4.066,47.11c0.578,0.019,2.258,0.361,2.782,1.752c0,0,0.217,0.649,0.018,1.479c-0.2,0.834-0.162,1.57-0.018,2.295c0.145,0.725,0.759,1.407,1.464,1.971c0.706,0.562,2.746,1.535,4.734,1.66c1.987,0.127,2.601,0.021,2.601,0.021l0.746-0.767l0.134,0.668c0.812-0.09,2.116-0.229,3.62-0.393c2.528-0.271,4.227-0.544,5.798-0.308c1.573,0.235,2.079,1.462,2.079,1.462s0.108,0.314-0.253,0.544c-0.349,0.224-0.749,0.547-0.948,0.89c-0.199,0.346-0.411,1.068,0.16,2.035c0.572,0.963,2.142,1.592,3.478,1.432c1.335-0.155,3.335-0.67,4.52-0.979c1.287-0.337,2.424-0.971,2.572-1.98c0.147-1.008-1.534-2.295-1.534-2.295s-0.812-0.609-0.91-0.75c-0.1-0.139,0.099-0.197,0.099-0.197s0.949-0.229,1.357-0.414c0.404-0.189,1.522-0.646,3.353-1.219s5.608-1.248,5.608-1.248s2.084-0.332,4.685-0.543l0.622-0.702l0.485,0.625c0.409-0.024,0.825-0.046,1.243-0.063c3.572-0.129,5.344-0.554,7.242-0.979c1.897-0.427,4.568-1.978,4.965-2.276c0.396-0.295,1.229-0.66,1.396-1.957c0.168-1.295-1.364-2.157-1.364-2.157s-1.218-0.644-1.475-0.93c-0.258-0.287-0.02-0.562-0.02-0.562s0.689-1.485,2.896-2.354c2.205-0.872,3.689-1.107,4.618-1.208c0.932-0.099,1.245,0.237,1.374,0.396c0.128,0.157,0.128,0.485,0.021,0.821c-0.102,0.308-0.444,1.038-0.645,1.395c-0.197,0.356-0.523,1.216-0.316,1.622c0.208,0.405,0.843,0.593,1.662,0.445c0.821-0.149,2.988-0.761,4.888-1.553c1.9-0.792,5.073-2.345,5.073-2.345s0.009-0.004,0.022-0.012l0.086-0.729l0.729,0.295c1.02-0.562,2.764-1.58,4.01-2.631c1.871-1.573,3.699-3.225,4.166-3.639c0.465-0.417,0.892-0.752,1.307-0.732c0.414,0.021,0.732,0.317,0.988,1.434c0.258,1.118,0.308,2.038,0.426,2.582c0.117,0.543,0.285,1.175,0.931,1.304c0.646,0.129,1.513-0.434,1.838-0.713c0.33-0.276,0.92-1.176,0.882-2.382c0,0,0.068-1.604-0.761-3.127c0,0-0.351-0.614-0.479-0.782c-0.088-0.118-0.155-0.238-0.01-0.525c0.148-0.286,0.467-0.821,1.062-1.156c0.448-0.256,0.88-0.316,1.128-0.396c0,0,0.275-0.067,0.626-0.261l-0.126-0.412l0.289,0.316c0.404-0.239,0.652,0.045,0.652,0.045l-0.392-0.501l0.119-0.484c0,0-0.304-0.163-0.685-0.088c-0.383,0.078-0.42,0.362-1.014,0.458c-0.593,0.096-1.275,0.306-1.945,1.319c-0.67,1.011,0,2.271,0,2.271s0.359,0.592,0.533,0.896c0.172,0.306,1.066,2.215,0.037,3.608c0,0-0.552,0.643-1.525,0.86c-0.86,0.19-0.642-0.816-0.729-1.355c0,0-0.129-2.281-1.237-3.588c-0.976-1.146-2.746,0.888-3.629,1.566c-0.822,0.629-3.228,3.112-6.684,4.925l-0.51,0.892l-0.324-0.472c-1.658,0.827-5.418,2.656-7.87,3.514c0,0-1.875,0.762-2.64,0.782c0,0-0.17,0.006-0.034-0.179c0.133-0.185,0.276-0.322,0.507-0.737c0.23-0.418,0.646-1.357,0.646-2.327c0-0.969-1.119-1.917-2.68-1.748c-1.561,0.167-3.052,0.6-4.849,1.292c-1.796,0.692-3.343,2.159-3.55,3.375c-0.209,1.216,1.105,1.92,1.105,1.92s1.484,0.751,1.674,1.157c0.188,0.406,0.049,0.783,0.049,0.783s-0.129,0.406-0.783,0.782c-0.649,0.377-2.42,1.287-2.42,1.287s-2.207,1.217-5.562,1.512c0,0-3.058,0.26-4.817,0.348c-0.022,0.002-0.046,0.002-0.069,0.003l-0.541,0.53l-0.587-0.449c-1.64,0.136-3.54,0.359-3.54,0.359s-4.29,0.609-8.219,1.822c-3.336,1.027-3.971,1.594-3.971,1.594s-0.711,0.596-0.118,1.453c0,0,0.341,0.539,1.03,1.08c0.685,0.541,1.237,1.057,1.159,1.317c-0.08,0.265-0.29,0.382-0.29,0.382s-0.961,0.856-4.894,1.518c0,0-2.531,0.488-3.31-0.275c-0.778-0.766-0.435-1.279-0.435-1.279s0.052-0.173,0.62-0.527c0,0,0.951-0.596,0.647-1.727c-0.303-1.135-2.129-2.545-4.101-2.533c0,0-2.303,0.006-8.196,0.762c0,0-0.008,0-0.027,0.005l-0.204,0.501l-0.605-0.393c-0.324,0.039-0.713,0.076-1.114,0.107c-1.012,0.07-2.477-0.057-4.3-0.596c-1.824-0.543-2.963-1.535-3.126-2.133c-0.114-0.412,0.035-0.996,0.035-0.996S7.62,50.2,7.405,49.115c-0.22-1.083-0.582-1.934-1.631-2.567c-1.048-0.632-1.643-0.522-1.643-0.522s-0.939-0.144-0.904,1.446c0.037,1.59,0.235,2.256,0.235,2.256s0.181,0.562-0.108,0.635c-0.288,0.072-0.74-0.361-0.74-0.361s-1.021-0.924-1.619-1.688l0.048,0.066l-0.214,0.525c0,0,0.067,0.115,0.266,0.375L1.193,48.543L1.193,48.543z"/><linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="214.8965" y1="-410.8818" x2="306.501" y2="-410.8818" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#A0A0A0"/><stop offset=".0769" stop-color="#656767"/><stop offset="1" stop-color="#717375"/></linearGradient><path style="&st1;" d="M91.075,11.742l0.183,0.846c0,0-0.563,0.313-1.678,0.613c-1.113,0.3-2.188,0.801-2.188,0.801s-0.89,0.289-0.551,1.013c0.338,0.726,0.838,1.076,0.838,1.076s0.711,0.69,0.736,1.213c0.021,0.526-0.199,0.765-0.764,1.076c-0.563,0.313-1.075,0.375-1.075,0.375s-1.338,0.24-2.001-0.387c-0.663-0.626-0.787-1.663-0.787-1.663s-0.05-0.876-1.148-1.251c-1.102-0.375-2.453,0.425-2.453,0.425s-1.063,0.563-2.2,1.3c-1.14,0.738-3.291,1.64-4.642,2.114l-0.152,0.699l-0.758-0.382c-1.422,0.489-3.271,1.109-3.271,1.109S66.652,21.645,65,21.871c-1.648,0.224-2.016-0.014-2.238-0.238c-0.228-0.224,0.039-1.012,0.039-1.012s0.674-1.376,0.348-2.09c-0.324-0.714-2.451-0.9-2.486-0.9c-0.04,0-2.318-0.265-4.451,0.932c-1.895,1.062-2.143,1.642-2.143,1.642s-0.604,0.938,0.113,1.867c0.807,1.051,1.879,1.146,1.879,1.146s1.021,0.079,1.258,0.38c0.24,0.299,0.076,0.626,0.076,0.626s-0.336,0.925-2.228,1.312c0,0-3.181,0.933-9.113,1.776l-0.582,0.579c-3.743,0.47-8.143,1.363-10.555,1.989c-2.412,0.627-2.553,1.317-2.553,1.317c-0.519,0.813,0.141,1.236,0.141,1.236s0.829,0.283,1.017,1.19c0.19,0.91-0.783,1.629-0.783,1.629s-1.159,0.972-2.898,1.269c-1.739,0.297-2.396,0.35-3.429-0.47c-0.91-0.721-0.298-1.863,0.312-2.301c0.612-0.438,0.909-0.91,0.988-1.112c0.079-0.204,0.032-0.377,0.032-0.377l-0.58-0.534c-2.005-1.33-9.883,0.063-9.883,0.063s0,0.002,0,0l-1.341,0.289l-0.673-0.435c0,0-2.291,0.604-4.876,0.589c-2.712-0.014-1.27-2.128-1.27-2.128s0.638-1.118,0.75-1.764c0,0,0.224-1.745-1.42-1.631c-1.645,0.112-1.968,1.546-1.968,1.546s-0.112,0.801-0.089,1.392c0.021,0.594-0.002,1.847-0.742,2.56c-0.737,0.713-1.529,0.495-1.529,0.495s-1.331-0.582-1.595-0.718c-0.274-0.142-0.517-0.151-0.751-0.066c-0.02,0.007-0.039,0.018-0.057,0.029l-0.175,0.75l0.025-0.623c-0.156,0.176-0.271,0.42-0.271,0.42l0.088,0.327l-0.248,0.565c-0.002,0.012-0.005,0.023-0.006,0.035l0.008,0.003c0,0,0.087-0.196,0.222-0.357l0.182-0.369L1.493,32.94c0.055-0.044,0.112-0.07,0.172-0.074c0.281-0.017,0.629,0.158,0.629,0.158s1.135,0.611,1.642,0.716s0.875-0.065,1.205-0.292c0.527-0.365,1.143-1.121,1.4-1.839c0.229-0.646,0.279-2.394,0.279-2.394l0.004,0.014c0,0,0-0.421-0.011-0.518c-0.012-0.098-0.075-0.553,0.204-0.783c0.278-0.234,0.459-0.347,1.144-0.364c0.68-0.017,0.886,0.38,0.886,0.38S9.28,28.269,9.28,28.48c0,0.21-0.068,0.34-0.068,0.34s-0.371,0.626-0.5,0.934c-0.13,0.307-0.636,1.323-0.489,2.177c0.148,0.852,1.479,1.251,1.479,1.251s1.062,0.25,2.575,0.027l3.12-0.503l0.543-0.624l0.218,0.474c0.805-0.147,2.14-0.369,3.583-0.511c2.326-0.228,4.787-0.262,5.821-0.132c0,0,0.484,0.061,0.405,0.234c-0.062,0.136-0.421,0.415-0.421,0.415s-0.135,0.081-0.654,0.667s-0.671,1.155-0.693,1.661c-0.024,0.505,0.516,1.995,2.415,2.394c1.901,0.397,4.077-0.341,4.077-0.341s1.427-0.314,2.786-1.674c1.41-1.411,0.012-3.108,0.012-3.108s-0.22-0.304-0.647-0.442c0,0-0.187-0.05-0.079-0.17c0.108-0.12,0.37-0.647,1.37-0.905c1-0.257,3.977-1.198,11.065-2.135l0.274-0.617l0.874,0.459c2.708-0.373,4.551-0.694,7.827-1.454c0,0,3.04-0.539,3.675-1.651c0.368-0.65,1.032-1.539-0.045-2.434c0,0-0.125-0.161-0.791-0.312c-0.666-0.151-1.179-0.252-1.738-0.653c-0.563-0.403-0.551-0.869-0.551-0.869s-0.047-0.445,0.862-0.958c0,0,0.851-0.623,2.54-1.158c1.691-0.533,3.648-0.296,3.648-0.296s0.82,0.089,0.685,0.643c-0.14,0.555-0.604,1.482-0.622,1.959c-0.021,0.474,0.012,1.027,0.938,1.414c0.931,0.386,2.267,0.266,2.267,0.266s1.386-0.069,3.647-0.801c2.265-0.731,4.594-1.573,4.594-1.573l-0.094-0.483l0.971,0.173c0.591-0.22,1.406-0.539,2.285-0.936c1.801-0.81,2.656-1.488,3.48-1.958c0,0,1.815-1.118,2.887-1.088c0,0,0.25-0.009,0.272,0.32c0.022,0.329,0.104,0.814,0.218,1.096c0.111,0.281,0.734,1.822,2.729,2.048c1.993,0.228,2.846-1.118,2.846-1.118s0.683-1.049-0.493-2.296c0,0-0.961-1.028-0.99-1.107c0,0-0.104-0.155,0.168-0.233c0.269-0.078,3.152-0.884,4.268-1.398c0,0,0.012-0.005,0.036-0.015l-0.271-0.485l0.535,0.365c0.202-0.101,0.449-0.246,0.544-0.395c0.171-0.271-0.054-0.797-0.054-0.797l0.006-0.007c-0.133-0.184-0.266-0.366-0.4-0.546l-0.606-0.256l-0.06,0.033L91.075,11.742"/><path style="&st34;" d="M8.12,16.324l-0.291,0.435c0.134-0.023,0.244-0.056,0.244-0.056s0.404-0.066,1.112,0.12c0.917,0.244,2.067-0.496,2.067-0.496s0.872-0.523,1.274-1.381l0.361-1.005c0,0,0.291-0.972,1.105-1.281c0,0,0.317-0.171,0.831-0.177c0.513-0.005,0.392,0.354,0.392,0.354s-0.056,0.233-0.586,0.912c-0.529,0.677-0.671,1.196-0.671,1.196s-0.318,0.722,0.193,0.957c0,0,0.24,0.141,0.939-0.091c0.7-0.233,3.02-0.843,4.438-1.06l0.993-0.506c-0.313-0.23-0.602-0.444-0.602-0.444c-2.388,0.442-4.168,0.995-4.775,1.226c-0.609,0.23-0.62,0.082-0.62,0.082c-0.211-0.248,0.435-1.022,0.435-1.022s0.655-0.894,0.913-1.715c0.259-0.82-0.892-0.707-0.892-0.707c-0.758,0.121-1.303,0.48-1.93,1.236c-0.486,0.586-0.782,1.389-0.893,1.814c-0.071,0.267-0.193,0.515-0.193,0.515s-0.091,0.165-0.45,0.322c-0.416,0.182-1.228,0.396-1.228,0.396s-0.54,0.045-0.931-0.15c-0.24-0.118-0.901,0.05-0.901,0.05l0.091-0.504l-0.082-0.032l-0.683,0.383c-0.115,0.189-0.228,0.379-0.341,0.569c-0.063,0.146-0.179,0.475,0.044,0.51c0.05,0.008,0.113,0.008,0.164,0.008L8.12,16.324L8.12,16.324z"/><path style="&st34;" d="M13.295,9.19c0,0,0.342-0.271,0.342-0.026c0,0.248-0.333,0.69-0.333,0.69s-0.107,0.134-0.172,0.134C13.068,9.987,13.15,9.516,13.295,9.19L13.295,9.19z"/><path style="&st12;" d="M-16.122-14.641"/><path style="&st34;" d="M10.595,12.501c0,0-0.388,0.46,0,0.52l0.838-0.828c-0.037-0.037-0.054-0.055-0.157-0.112C11.277,12.081,10.752,12.343,10.595,12.501L10.595,12.501z"/><path style="&st28;" d="M77.807,85.745c0,0-1.75,0.806-3.396,1.603c-1.647,0.803-2.25,1.14-2.25,1.14s-0.088,0.049-0.031,0.082c0.056,0.028-0.008,0.063-0.008,0.063c-0.847,0.409-2.703,1.07-2.703,1.07s-0.167,0.057-0.157,0.02c0.006-0.041,0.199-0.105,0.199-0.105s0.381-0.146,0.283-0.217c-0.098-0.072-1.21,0.305-1.21,0.305s-1.949,0.621-2.894,0.887c-0.941,0.269-2.75,0.735-2.75,0.735c-1.201,0.298-3.75,0.798-4.315,0.901c-0.562,0.104-0.417,0.064-0.417,0.064s0.492-0.189-0.411-0.226c-1.146-0.05-2.362,0.112-3.612,0.288c-1.25,0.18-1.178,0.324-1.178,0.324s-0.04,0.154,0.708,0.14c0.752-0.019,0.534,0.046,0.534,0.046c-1.396,0.202-4.2,0.238-4.2,0.238l0.005,0.01c0.456,0.014,0.916,0.018,1.376,0.018c0.608,0,1.218-0.01,1.822-0.031c0.241-0.021,1.483-0.15,1.925-0.244c0.486-0.105-0.093-0.105-0.093-0.105l-0.74-0.023c0,0-0.776-0.026-0.052-0.158c0.729-0.133,1.834-0.192,2.388-0.252c0.83-0.094,0.541,0.105,0.541,0.105l-0.04,0.023c0,0,0.014,0.094,0.528,0.066c0.515-0.024,4.721-0.804,7.069-1.487c2.347-0.688,4.102-1.255,4.102-1.255s0.157-0.055,0.066,0.025c-0.094,0.078-0.463,0.2-0.463,0.2s-0.595,0.3,0.844-0.108c0.066-0.02,0.134-0.039,0.197-0.06c1.234-0.469,2.446-0.983,3.635-1.543c0.029-0.028,0.131-0.146-0.021-0.101c-0.172,0.056,0-0.065,0.187-0.131c0.184-0.066,2.267-1.162,3.363-1.608l0.002,0.003c0.394-0.227,0.781-0.455,1.17-0.691L77.807,85.745L77.807,85.745z"/><linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="217.6563" y1="-436.751" x2="217.6563" y2="-436.751" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".3807" stop-color="#CECECE"/><stop offset=".5396" stop-color="#BFBFBF"/><stop offset=".8357" stop-color="#7C7C7C"/><stop offset=".8996" stop-color="#A8A8A8"/><stop offset=".9093" stop-color="#9A9A9A"/><stop offset=".9327" stop-color="#7D7D7D"/><stop offset=".9558" stop-color="#686868"/><stop offset=".9785" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path style="&st46;" d="M3.893,50.249L3.893,50.249L3.893,50.249z"/><linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="214.3262" y1="-436.5107" x2="322.8717" y2="-424.4851" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".3807" stop-color="#CECECE"/><stop offset=".5396" stop-color="#BFBFBF"/><stop offset=".8357" stop-color="#7C7C7C"/><stop offset=".8996" stop-color="#A8A8A8"/><stop offset=".9093" stop-color="#9A9A9A"/><stop offset=".9327" stop-color="#7D7D7D"/><stop offset=".9558" stop-color="#686868"/><stop offset=".9785" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path style="&st47;" d="M1.193,48.543l0.107,0.98c0.236,0.285,0.579,0.675,1.067,1.181c1.084,1.121,1.428,0.416,1.428,0.416s0.072-0.201,0.092-0.586c-0.042,0.216-0.209,0.403-0.788-0.056c-0.298-0.237-0.688-0.627-1.076-1.049c-0.326-0.326-0.723-0.742-1.021-1.117l0.048,0.065l-0.213,0.526c0,0,0.069,0.115,0.268,0.376L1.193,48.543L1.193,48.543z"/><linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="213.8887" y1="-436.4771" x2="336.8819" y2="-422.851" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#FFF"/><stop offset=".078" stop-color="#F4F4F4"/><stop offset=".3807" stop-color="#CECECE"/><stop offset=".5396" stop-color="#BFBFBF"/><stop offset=".8357" stop-color="#7C7C7C"/><stop offset=".8996" stop-color="#A8A8A8"/><stop offset=".9093" stop-color="#9A9A9A"/><stop offset=".9327" stop-color="#7D7D7D"/><stop offset=".9558" stop-color="#686868"/><stop offset=".9785" stop-color="#5B5B5B"/><stop offset="1" stop-color="#575757"/></linearGradient><path style="&st48;" d="M3.741,49.133c-0.006-0.027-0.013-0.054-0.02-0.078c0.012,0.088,0.028,0.179,0.043,0.272c0,0,0.094,0.394,0.12,0.753C3.87,49.813,3.83,49.498,3.741,49.133z"/><linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="411.2539" y1="557.002" x2="507.2363" y2="537.6277" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset="1" stop-color="#BFC0C2"/></linearGradient><path style="&st49;" d="M99.696,28.566l0.29,0.316c0.406-0.238,0.654,0.045,0.654,0.045l-0.386-0.494c-0.383,0.082-1.093,0.256-2.233,0.61c0,0-1.353,0.594-1.59,1.532c-0.016,0.332,0.049,0.641,0.116,0.876c0.753,1.429,0.913,1.666,0.913,1.666c0.499,1.091,0.422,1.993,0.25,2.824c-0.188,0.921-1.188,1.668-1.794,1.842c-0.608,0.171-0.953,0-1.14-0.483c-0.188-0.485-0.157-0.845-0.438-2.34c-0.28-1.499-0.653-2.2-1.216-2.372c-0.563-0.173-1.313,0.468-1.749,0.811c-0.438,0.344-2.417,2.152-2.417,2.152s-2.324,2.091-5.743,4.026c-3.417,1.935-7.69,3.418-7.69,3.418s-2.842,1.092-3.525,0.998c-0.688-0.093-0.516-0.718-0.297-1.076c0.219-0.36,0.516-0.937,0.766-1.545c0.313-0.756,0.201-1.654-0.359-1.967c-0.562-0.311-1.248-0.468-3.523,0.094s-3.197,1.076-3.838,1.451c-0.643,0.376-1.576,1.233-1.842,1.716c-0.266,0.484-0.563,0.983,0.126,1.576c0.688,0.594,0.763,0.485,1.56,1.046c0.797,0.562,0.922,0.64,0.969,1.466c0.045,0.827-0.766,1.341-0.766,1.341s-3.123,2.082-6.602,2.777c-2.34,0.469-6.833,0.639-6.833,0.639s-1.327-0.045-5.384,0.547c-4.056,0.594-6.787,1.514-7.738,1.856c-0.952,0.343-2.34,0.81-3.136,1.17c-0.795,0.358-0.375,0.89-0.203,1.015c0.172,0.123,1.185,1.074,1.498,1.354c0.312,0.282,1.466,1.279,0.108,2.108c-1.356,0.826-3.603,1.264-3.603,1.264s-3.121,0.654-4.119,0.234c-1.001-0.422-1.2-0.778-1.452-1.358c-0.313-0.718-0.016-1.263,0.794-1.78c0.77-0.486,0.469-1.199,0.469-1.199c-0.983-1.9-3.058-2.058-4.774-1.936c-2.72,0.198-5.358,0.471-7.425,0.734c-3.059,0.39-4.541-0.063-5.992-0.516c-1.452-0.453-2.997-1.529-3.154-2.498c-0.027-0.097-0.039-0.199-0.042-0.307c-0.078-0.758,0.074-1.146,0.184-1.784c0.108-0.625-0.043-1.532-0.084-1.758c-0.008-0.026-0.016-0.058-0.023-0.085c-0.507-1.304-1.725-1.903-2.668-2.058c-0.953-0.157-0.983,0.857-0.983,0.857s-0.002,0.012-0.006,0.04c0.078-0.208,0.222-0.315,0.444-0.31c0.577,0.02,2.259,0.361,2.781,1.754c0,0,0.218,0.648,0.019,1.479c-0.199,0.832-0.162,1.571-0.019,2.295c0.145,0.725,0.759,1.408,1.465,1.969c0.704,0.562,2.745,1.535,4.734,1.66c1.814,0.117,2.483,0.037,2.587,0.023l0.759-0.768l0.135,0.666c0.81-0.088,2.115-0.229,3.619-0.394c2.529-0.271,4.227-0.541,5.8-0.306c1.572,0.232,2.078,1.463,2.078,1.463s0.107,0.313-0.253,0.542c-0.349,0.226-0.75,0.548-0.947,0.891c-0.2,0.345-0.411,1.066,0.159,2.033c0.572,0.965,2.142,1.595,3.478,1.435c1.336-0.158,3.336-0.672,4.521-0.98c1.286-0.336,2.424-0.969,2.572-1.979c0.148-1.009-1.534-2.297-1.534-2.297s-0.81-0.611-0.909-0.75c-0.1-0.14,0.099-0.197,0.099-0.197s0.95-0.229,1.356-0.416c0.403-0.19,1.523-0.644,3.353-1.217c1.831-0.572,5.609-1.248,5.609-1.248s2.09-0.332,4.694-0.543l0.612-0.705l0.493,0.627c0.406-0.023,0.819-0.045,1.235-0.061c3.572-0.129,5.343-0.555,7.24-0.979c1.897-0.426,4.569-1.979,4.965-2.276c0.396-0.296,1.229-0.662,1.395-1.958c0.17-1.294-1.363-2.157-1.363-2.157s-1.218-0.643-1.476-0.929c-0.256-0.288-0.019-0.562-0.019-0.562s0.689-1.485,2.896-2.355c2.207-0.872,3.69-1.106,4.619-1.207c0.931-0.099,1.247,0.237,1.375,0.395c0.128,0.158,0.128,0.485,0.021,0.821c-0.101,0.308-0.443,1.039-0.644,1.396c-0.199,0.356-0.522,1.216-0.317,1.622c0.211,0.405,0.842,0.592,1.662,0.444c0.822-0.147,2.987-0.761,4.889-1.553c1.897-0.793,5.074-2.344,5.074-2.344s0.01-0.005,0.021-0.013l0.086-0.729l0.729,0.296c1.021-0.562,2.764-1.582,4.01-2.63c1.871-1.574,3.699-3.225,4.166-3.641c0.465-0.415,0.89-0.751,1.305-0.732c0.416,0.021,0.734,0.318,0.99,1.434c0.258,1.119,0.306,2.038,0.426,2.583c0.117,0.542,0.285,1.176,0.929,1.305c0.644,0.128,1.513-0.436,1.841-0.713c0.326-0.277,0.918-1.176,0.879-2.383c0,0,0.068-1.605-0.762-3.127c0,0-0.348-0.614-0.477-0.782c-0.088-0.119-0.155-0.238-0.008-0.523c0.146-0.288,0.465-0.821,1.059-1.157c0.449-0.256,0.881-0.316,1.128-0.396c0,0,0.28-0.069,0.636-0.266L99.696,28.566L99.696,28.566z"/><path style="&st23;" d="M1.547,32.696l-0.05,0.239c0.053-0.041,0.111-0.068,0.17-0.072c0.281-0.018,0.629,0.158,0.629,0.158s1.135,0.61,1.642,0.716c0.507,0.105,0.875-0.065,1.205-0.292c0.25-0.174,0.521-0.434,0.763-0.737c-0.29,0.29-0.725,0.548-1.365,0.595c0,0-0.571-0.049-1.419-0.587c-0.846-0.537-1.327-0.231-1.729,0.105l0,0l-0.249,0.564c-0.001,0.013-0.003,0.023-0.006,0.036l0.009,0.001c0,0,0.087-0.192,0.217-0.352L1.547,32.696L1.547,32.696z"/><path style="&st4;" d="M6.387,31.961c0.059-0.12,0.112-0.238,0.155-0.354c0.05-0.14,0.09-0.334,0.125-0.55c-0.096,0.44-0.223,0.73-0.223,0.73S6.428,31.853,6.387,31.961L6.387,31.961z"/><path style="&st4;" d="M6.807,28.654c-0.038,0.439-0.038,0.987-0.038,1.493l0,0c0.04-0.509,0.052-0.935,0.052-0.935l0.004,0.014c0,0,0-0.421-0.011-0.518C6.811,28.695,6.809,28.677,6.807,28.654z"/><linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="413.5137" y1="516.4121" x2="417.999" y2="516.4121" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#E2E3E4"/><stop offset=".5055" stop-color="#FFF"/></linearGradient><path style="&st50;" d="M8.12,16.324l-0.291,0.435c0.087-0.014,0.089-0.007,0.244-0.056c0,0,0.404-0.066,1.112,0.12c0.917,0.244,2.067-0.496,2.067-0.496s0.272-0.164,0.583-0.458c-0.4,0.24-1.385,0.762-2.132,0.585c-0.961-0.229-0.994-0.017-1.336-0.049c-0.292-0.028-0.292-0.11-0.275-0.314c0.002-0.032,0.023-0.054,0.03-0.092c0.05-0.261,0.339-0.689,0.339-0.689l-0.684,0.383c-0.115,0.189-0.227,0.378-0.34,0.569c-0.063,0.146-0.179,0.475,0.044,0.509c0.055,0.009,0.11,0.011,0.163,0.009L8.12,16.324L8.12,16.324z"/><path style="&st23;" d="M17.019,15.036c-1.027,0.278-1.972,0.734-2.494,0.604c-0.438-0.109-0.084-0.76,0.042-0.965c0.069-0.146,0.167-0.292,0.249-0.406c0.31-0.506,0.833-1.351,0.833-1.351s0,0,0-0.002c0.017-0.032,0.033-0.067,0.049-0.102c0.067-0.18,0.12-0.537-0.472-0.597c-0.799-0.082-1.613,0.619-1.613,0.619s-0.547,0.301-0.838,1.417l0.112-0.313c0,0,0.291-0.973,1.105-1.281c0,0,0.317-0.171,0.831-0.177c0.513-0.005,0.392,0.354,0.392,0.354s-0.056,0.233-0.586,0.912c-0.529,0.677-0.671,1.195-0.671,1.195s-0.319,0.723,0.193,0.957c0,0,0.238,0.141,0.939-0.091c0.7-0.233,3.02-0.843,4.438-1.06l0.993-0.506C19.849,14.299,18.012,14.769,17.019,15.036L17.019,15.036z"/><path style="&st23;" d="M-16.122-14.641"/><path style="&st23;" d="M-16.122-14.641"/><path style="&st59;" d="M90.578,74.217c0.006-0.004,0.009-0.008,0.014-0.013C90.587,74.21,90.582,74.213,90.578,74.217z"/><path style="&st59;" d="M90.821,73.951c0.001-0.002,0.002-0.004,0.003-0.004C90.823,73.947,90.822,73.949,90.821,73.951z"/><path style="&st59;" d="M90.738,74.042c0.003-0.004,0.008-0.009,0.011-0.013C90.746,74.033,90.741,74.038,90.738,74.042z"/><path style="&st8;" d="M87.9,76.68l-0.164,0.174c-0.646,0.716-0.969,1.007-0.969,1.007l-0.242,0.269l0,0c-0.002,0.006-0.006,0.012-0.012,0.014c0.008,0.002,0.018,0.004,0.041,0.004c0,0,0.229-0.002,0.588-0.219c-0.072,0.041-0.139,0.068-0.181,0.07c-0.177,0.012,0.431-0.538,0.431-0.538s0.588-0.626,0.967-1.125c0.382-0.497,0.138-0.468,0.138-0.468s-0.087-0.021-0.397,0.125C88.125,76.018,88.268,76.223,87.9,76.68L87.9,76.68z"/><path style="&st59;" d="M90.657,74.133c0.003-0.006,0.007-0.013,0.013-0.017C90.664,74.121,90.662,74.128,90.657,74.133z"/><path style="&st0;" d="M72.945,81.21c0,0,2.215-0.931,3.402-0.79c0,0,0.611,0.059-0.062,0.711c-0.672,0.652-0.892,1.168,0.396,0.752c0,0,0.094-0.033,0.244-0.086c-0.504,0.143-0.734,0.143-0.658,0.033c0.127-0.188,0.461-0.461,0.461-0.461s0.399-0.4,0.399-0.801c0,0,0.128-0.588-1.604-0.225c-1.01,0.209-1.969,0.59-2.588,0.867C72.941,81.211,72.943,81.211,72.945,81.21L72.945,81.21z"/><path style="&st59;" d="M72.234,81.555l-0.004,0.002C72.232,81.557,72.234,81.555,72.234,81.555z"/><path style="&st59;" d="M88.057,76.014c-0.014,0.008-0.026,0.015-0.043,0.021C88.028,76.027,88.043,76.021,88.057,76.014z"/><path style="&st14;" d="M78.305,81.299c1.448-0.521,3.93-1.854,5.023-2.492C82.232,79.442,79.73,80.717,78.305,81.299z"/><path style="&st59;" d="M87.512,76.325c0.026-0.017,0.055-0.032,0.08-0.049C87.566,76.293,87.538,76.309,87.512,76.325z"/><path style="&st59;" d="M91.618,73.084c0.008-0.011,0.019-0.023,0.026-0.029C91.637,73.061,91.626,73.073,91.618,73.084z"/><path style="&st59;" d="M91.434,73.281c0.01-0.012,0.019-0.02,0.023-0.027C91.451,73.264,91.441,73.27,91.434,73.281z"/><path style="&st59;" d="M91.521,73.188c0.01-0.012,0.02-0.022,0.029-0.032C91.539,73.165,91.53,73.178,91.521,73.188z"/><path style="&st59;" d="M90.9,73.863c0.003-0.006,0.007-0.01,0.012-0.016C90.907,73.854,90.903,73.857,90.9,73.863z"/><path style="&st59;" d="M71.246,82.088c-0.014,0.008-0.023,0.018-0.036,0.022C71.221,82.105,71.232,82.096,71.246,82.088z"/><path style="&st59;" d="M91.346,73.375c0.008-0.008,0.014-0.015,0.021-0.021C91.359,73.36,91.354,73.367,91.346,73.375z"/><path style="&st59;" d="M91.077,73.669c0.006-0.006,0.01-0.011,0.013-0.015C91.087,73.659,91.083,73.663,91.077,73.669z"/><path style="&st59;" d="M91.251,73.479c0.007-0.006,0.015-0.012,0.021-0.021C91.266,73.463,91.255,73.473,91.251,73.479z"/><path style="&st59;" d="M90.987,73.768c0.004-0.006,0.01-0.012,0.016-0.021C90.997,73.756,90.991,73.762,90.987,73.768z"/><path style="&st59;" d="M91.161,73.578c0.006-0.006,0.011-0.014,0.017-0.02C91.172,73.564,91.165,73.572,91.161,73.578z"/><path style="&st59;" d="M71.816,81.764c-0.008,0.006-0.02,0.012-0.026,0.017C71.799,81.774,71.809,81.77,71.816,81.764z"/><path style="&st59;" d="M72.044,81.646c-0.006,0.004-0.012,0.006-0.019,0.009C72.032,81.652,72.038,81.649,72.044,81.646z"/><path style="&st59;" d="M71.305,82.055c-0.011,0.008-0.021,0.014-0.031,0.021C71.283,82.067,71.294,82.063,71.305,82.055z"/><path style="&st59;" d="M71.969,81.684c-0.008,0.004-0.015,0.009-0.021,0.014C71.953,81.692,71.961,81.688,71.969,81.684z"/><path style="&st59;" d="M72.109,81.613c-0.004,0.005-0.01,0.006-0.016,0.01C72.102,81.619,72.105,81.617,72.109,81.613z"/><path style="&st59;" d="M72.008,81.665c-0.007,0.004-0.013,0.007-0.021,0.011C71.994,81.672,72.001,81.669,72.008,81.665z"/><path style="&st59;" d="M72.206,81.566c-0.003,0.002-0.005,0.003-0.007,0.004C72.201,81.569,72.203,81.568,72.206,81.566z"/><path style="&st59;" d="M72.148,81.594c-0.008,0.004-0.016,0.01-0.024,0.015C72.135,81.604,72.141,81.598,72.148,81.594z"/><path style="&st59;" d="M71.928,81.707c-0.01,0.003-0.02,0.01-0.027,0.016C71.908,81.715,71.918,81.711,71.928,81.707z"/><path style="&st59;" d="M72.193,81.575c-0.006,0.001-0.01,0.003-0.014,0.004C72.184,81.578,72.189,81.575,72.193,81.575z"/><path style="&st59;" d="M72.172,81.585c-0.004,0.003-0.008,0.005-0.015,0.007C72.164,81.59,72.168,81.585,72.172,81.585z"/><path style="&st59;" d="M72.079,81.631c-0.008,0.002-0.013,0.004-0.019,0.006C72.066,81.635,72.071,81.633,72.079,81.631z"/><path style="&st59;" d="M71.866,81.739c-0.011,0.002-0.021,0.008-0.027,0.013C71.848,81.747,71.857,81.741,71.866,81.739z"/><path style="&st59;" d="M71.555,81.906c-0.018,0.012-0.033,0.02-0.052,0.029C71.521,81.924,71.539,81.918,71.555,81.906z"/><path style="&st59;" d="M72.219,81.561c0,0.002-0.002,0.002-0.002,0.004C72.217,81.563,72.219,81.563,72.219,81.561z"/><path style="&st59;" d="M71.421,81.986c-0.011,0.006-0.022,0.01-0.03,0.02C71.398,81.996,71.41,81.992,71.421,81.986z"/><path style="&st59;" d="M71.363,82.02c-0.012,0.005-0.021,0.013-0.032,0.021C71.342,82.032,71.354,82.024,71.363,82.02z"/><path style="&st59;" d="M71.482,81.948c-0.014,0.006-0.023,0.015-0.036,0.021C71.458,81.963,71.471,81.956,71.482,81.948z"/><path style="&st59;" d="M71.768,81.79c-0.01,0.004-0.018,0.009-0.024,0.017C71.751,81.799,71.758,81.794,71.768,81.79z"/><path style="&st59;" d="M91.708,72.984c0.013-0.014,0.024-0.028,0.04-0.042C91.734,72.956,91.723,72.971,91.708,72.984z"/><path style="&st59;" d="M71.717,81.818c-0.01,0.004-0.019,0.009-0.027,0.015C71.698,81.827,71.707,81.822,71.717,81.818z"/><path style="&st59;" d="M71.665,81.846c-0.011,0.006-0.021,0.014-0.028,0.018C71.645,81.858,71.654,81.852,71.665,81.846z"/><path style="&st59;" d="M71.609,81.875c-0.01,0.008-0.021,0.014-0.03,0.02C71.589,81.889,71.602,81.881,71.609,81.875z"/><path style="&st59;" d="M92.443,72.197c-0.021,0.021-0.037,0.039-0.055,0.061C92.406,72.238,92.423,72.217,92.443,72.197z"/><path style="&st59;" d="M92.359,72.287c-0.021,0.021-0.041,0.044-0.061,0.066C92.318,72.331,92.339,72.309,92.359,72.287z"/><path style="&st59;" d="M92.501,72.135c-0.011,0.015-0.021,0.023-0.028,0.033C92.48,72.157,92.49,72.148,92.501,72.135z"/><path style="&st59;" d="M91.786,72.899c0.022-0.021,0.042-0.042,0.062-0.063C91.828,72.857,91.807,72.878,91.786,72.899z"/><path style="&st59;" d="M92.273,72.379c-0.014,0.016-0.025,0.029-0.041,0.045C92.245,72.409,92.26,72.395,92.273,72.379z"/><path style="&st59;" d="M92.579,72.053c-0.013,0.012-0.021,0.021-0.03,0.032C92.559,72.074,92.569,72.063,92.579,72.053z"/><path style="&st59;" d="M92.762,71.858c-0.002,0-0.002,0-0.002,0.001C92.76,71.858,92.76,71.858,92.762,71.858z"/><path style="&st59;" d="M92.703,71.919c-0.004,0.005-0.01,0.013-0.014,0.017C92.693,71.928,92.699,71.924,92.703,71.919z"/><path style="&st59;" d="M87.938,76.074c-0.017,0.008-0.027,0.016-0.043,0.023C87.907,76.09,87.922,76.082,87.938,76.074z"/><path style="&st59;" d="M92.648,71.98c-0.012,0.011-0.021,0.021-0.029,0.029C92.629,72,92.637,71.991,92.648,71.98z"/><path style="&st59;" d="M87.666,76.229c-0.018,0.013-0.031,0.021-0.051,0.031C87.633,76.25,87.648,76.241,87.666,76.229z"/><path style="&st59;" d="M48.204,91.026c0,0-0.001,0-0.003,0.002C48.203,91.026,48.203,91.026,48.204,91.026z"/><path style="&st59;" d="M48.073,91.03c-0.007,0-0.013,0-0.021,0C48.06,91.03,48.066,91.03,48.073,91.03z"/><path style="&st59;" d="M48.136,91.028c-0.007,0.002-0.013,0.002-0.02,0.002C48.123,91.03,48.129,91.03,48.136,91.028z"/><path style="&st59;" d="M48.005,91.032c-0.003,0-0.007,0-0.012,0C47.998,91.032,48.002,91.032,48.005,91.032z"/><path style="&st59;" d="M47.94,91.035c-0.004,0-0.009,0-0.015,0C47.93,91.035,47.935,91.035,47.94,91.035z"/><path style="&st59;" d="M87.869,76.111c-0.014,0.006-0.021,0.015-0.039,0.021C87.848,76.126,87.857,76.117,87.869,76.111z"/><path style="&st59;" d="M87.807,76.146c-0.014,0.009-0.025,0.018-0.041,0.021C87.779,76.164,87.793,76.155,87.807,76.146z"/><path style="&st59;" d="M87.738,76.186c-0.016,0.011-0.028,0.018-0.044,0.024C87.71,76.203,87.723,76.196,87.738,76.186z"/><path style="&st59;" d="M87.951,76.067c0.02-0.011,0.035-0.021,0.054-0.027C87.986,76.047,87.971,76.057,87.951,76.067z"/><path style="&st59;" d="M87.719,77.52c0,0-0.082,0.064-0.193,0.147C87.592,77.621,87.664,77.566,87.719,77.52z"/><path style="&st59;" d="M92.205,72.452c-0.021,0.022-0.042,0.046-0.064,0.067C92.163,72.498,92.186,72.475,92.205,72.452z"/><path style="&st59;" d="M28.05,87.006c-0.019-0.007-0.037-0.016-0.056-0.021C28.013,86.991,28.031,86.999,28.05,87.006z"/><path style="&st59;" d="M71.051,82.217c-0.013,0.008-0.021,0.017-0.037,0.021C71.027,82.23,71.038,82.223,71.051,82.217z"/><path style="&st59;" d="M45.854,89.871c-0.024,0-0.049-0.004-0.074-0.004C45.806,89.867,45.831,89.871,45.854,89.871z"/><path style="&st59;" d="M27.678,86.883c0.02,0.004,0.039,0.01,0.058,0.019C27.717,86.893,27.696,86.887,27.678,86.883z"/><path style="&st59;" d="M27.555,86.844c0.038,0.012,0.078,0.022,0.119,0.037C27.633,86.869,27.593,86.854,27.555,86.844z"/><path style="&st59;" d="M27.862,86.941c-0.041-0.014-0.082-0.026-0.123-0.04C27.78,86.913,27.82,86.928,27.862,86.941z"/><path style="&st59;" d="M91.88,72.799c0.015-0.016,0.026-0.027,0.04-0.043C91.907,72.771,91.895,72.784,91.88,72.799z"/><path style="&st59;" d="M28.058,87.006c0.04,0.016,0.079,0.026,0.116,0.041C28.137,87.033,28.098,87.021,28.058,87.006z"/><path style="&st59;" d="M91.977,72.695c0.014-0.016,0.026-0.027,0.041-0.044C92.002,72.668,91.989,72.68,91.977,72.695z"/><path style="&st59;" d="M92.057,72.612c0.021-0.022,0.039-0.041,0.061-0.062C92.096,72.571,92.076,72.59,92.057,72.612z"/><path style="&st59;" d="M27.991,86.985c-0.021-0.009-0.041-0.017-0.062-0.022C27.95,86.969,27.97,86.977,27.991,86.985z"/><path style="&st59;" d="M71.133,82.162c0.021-0.013,0.037-0.021,0.055-0.036C71.17,82.139,71.152,82.149,71.133,82.162z"/><path style="&st59;" d="M46.361,89.926c-0.016-0.002-0.035-0.004-0.053-0.008C46.325,89.922,46.345,89.924,46.361,89.926z"/><path style="&st59;" d="M71.122,82.17c-0.019,0.012-0.034,0.021-0.049,0.032C71.088,82.191,71.105,82.18,71.122,82.17z"/><path style="&st59;" d="M46.439,89.939c-0.017-0.002-0.032-0.006-0.049-0.008C46.407,89.934,46.422,89.938,46.439,89.939z"/><path style="&st59;" d="M46.513,89.953c-0.016-0.005-0.031-0.007-0.047-0.011C46.481,89.946,46.497,89.948,46.513,89.953z"/><path style="&st59;" d="M46.096,89.891c-0.031-0.002-0.065-0.006-0.1-0.01C46.031,89.885,46.065,89.889,46.096,89.891z"/><path style="&st59;" d="M46.278,89.913c-0.02-0.002-0.041-0.004-0.061-0.006C46.237,89.909,46.259,89.911,46.278,89.913z"/><path style="&st59;" d="M46.19,89.904c-0.028-0.005-0.054-0.008-0.084-0.012C46.136,89.896,46.163,89.899,46.19,89.904z"/><path style="&st59;" d="M45.971,89.881c-0.025-0.005-0.051-0.006-0.079-0.009C45.92,89.875,45.945,89.877,45.971,89.881z"/><path style="&st59;" d="M27.926,86.961c-0.02-0.004-0.039-0.011-0.058-0.019C27.888,86.953,27.908,86.957,27.926,86.961z"/><path style="&st59;" d="M47.395,90.975c0.001,0.004,0.003,0.004,0.004,0.004C47.398,90.979,47.396,90.979,47.395,90.975z"/><path style="&st59;" d="M47.375,90.969c0.001,0,0.002,0,0.003,0C47.378,90.969,47.376,90.969,47.375,90.969z"/><path style="&st59;" d="M47.418,90.982L47.418,90.982L47.418,90.982z"/><path style="&st59;" d="M47.465,90.996c0.003,0,0.004,0.001,0.006,0.001C47.47,90.997,47.468,90.996,47.465,90.996z"/><path style="&st59;" d="M47.442,90.988c0.001,0,0.002,0.002,0.002,0.002L47.442,90.988z"/><path style="&st59;" d="M47.342,90.955L47.342,90.955L47.342,90.955z"/><path style="&st59;" d="M46.589,89.967c-0.02-0.002-0.036-0.009-0.054-0.013C46.553,89.959,46.57,89.965,46.589,89.967z"/><path style="&st59;" d="M46.764,90.012c-0.011-0.004-0.021-0.008-0.033-0.012C46.742,90.006,46.753,90.008,46.764,90.012z"/><path style="&st59;" d="M49.049,90.953c-0.01,0.001-0.021,0.002-0.032,0.004C49.028,90.955,49.038,90.954,49.049,90.953z"/><path style="&st59;" d="M46.659,89.984c-0.021-0.006-0.039-0.01-0.061-0.014C46.619,89.975,46.639,89.979,46.659,89.984z"/><path style="&st59;" d="M47.767,91.028c0.003,0,0.003,0,0.006,0C47.773,91.028,47.77,91.028,47.767,91.028z"/><path style="&st59;" d="M47.821,91.03c0.003,0,0.007,0,0.013,0C47.828,91.03,47.824,91.03,47.821,91.03z"/><path style="&st59;" d="M45.214,89.855c0.047,0,0.092,0,0.139,0C45.308,89.855,45.261,89.855,45.214,89.855z"/><path style="&st59;" d="M47.716,91.026c0.005,0,0.009,0,0.013,0.002C47.727,91.026,47.722,91.026,47.716,91.026z"/><path style="&st32;" d="M46.772,90.014c0,0,0.158,0.021,0.059,0.338c-0.1,0.313,0.06,0.451,0.475,0.594l0.023,0.006c0,0,0.001,0,0.002,0c-0.079-0.04-0.074-0.08-0.074-0.08s-0.01-0.078,0.078-0.216c0.087-0.136,0.009-0.369-0.293-0.536C47.044,90.118,46.967,90.07,46.772,90.014L46.772,90.014L46.772,90.014z"/><path style="&st59;" d="M47.869,91.032c0.006,0,0.012,0,0.018,0C47.881,91.032,47.875,91.032,47.869,91.032z"/><path style="&st59;" d="M47.495,91.002c0.001,0,0.004,0,0.004,0C47.497,91.002,47.496,91.002,47.495,91.002z"/><path style="&st59;" d="M47.677,91.024c0.004,0,0.007,0,0.01,0C47.684,91.024,47.681,91.024,47.677,91.024z"/><path style="&st59;" d="M47.529,91.006c0.001,0,0.002,0,0.002,0S47.53,91.006,47.529,91.006z"/><path style="&st59;" d="M47.559,91.01c0.002,0.002,0.005,0.002,0.008,0.002C47.566,91.012,47.561,91.01,47.559,91.01z"/><path style="&st59;" d="M47.594,91.016c0.002,0,0.004,0,0.008,0C47.599,91.016,47.596,91.016,47.594,91.016z"/><path style="&st59;" d="M46.711,89.997c-0.011-0.002-0.026-0.007-0.043-0.011C46.685,89.99,46.701,89.995,46.711,89.997z"/><path style="&st59;" d="M28.748,87.256c-0.008-0.003-0.018-0.007-0.025-0.01C28.731,87.25,28.739,87.254,28.748,87.256z"/><path style="&st59;" d="M28.776,87.27c-0.007-0.002-0.016-0.008-0.024-0.012C28.761,87.262,28.769,87.268,28.776,87.27z"/><path style="&st59;" d="M28.681,87.23c-0.008-0.004-0.021-0.006-0.03-0.01C28.66,87.225,28.672,87.227,28.681,87.23z"/><path style="&st59;" d="M45.66,89.862c0.026,0,0.052,0.005,0.074,0.005C45.711,89.865,45.686,89.865,45.66,89.862z"/><path style="&st59;" d="M28.797,87.275c-0.005-0.002-0.013-0.006-0.021-0.008C28.784,87.271,28.792,87.273,28.797,87.275z"/><path style="&st59;" d="M27.38,86.794c0.038,0.011,0.074,0.022,0.112,0.031C27.453,86.816,27.417,86.803,27.38,86.794z"/><path style="&st59;" d="M27.492,86.825c0.021,0.004,0.039,0.011,0.058,0.019C27.53,86.836,27.512,86.829,27.492,86.825z"/><path style="&st59;" d="M28.814,87.284c-0.003-0.002-0.006-0.005-0.012-0.007C28.808,87.279,28.811,87.282,28.814,87.284z"/><path style="&st59;" d="M28.64,87.219c-0.011-0.006-0.021-0.01-0.03-0.014C28.621,87.21,28.629,87.213,28.64,87.219z"/><path style="&st61;" d="M27.687,87.239c-0.014-0.013-0.023-0.022-0.03-0.032c-0.263-0.197-0.343-0.418-0.343-0.418l0.009-0.011c0.017,0.007,0.034,0.011,0.052,0.014c-0.291-0.075-0.5-0.104-0.479-0.018c0.015,0.061,0.131,0.153,0.269,0.245c0.174,0.094,0.346,0.187,0.522,0.279V87.239L27.687,87.239z"/><path style="&st59;" d="M28.716,87.245c-0.009-0.003-0.018-0.006-0.027-0.01C28.699,87.239,28.708,87.242,28.716,87.245z"/><path style="&st59;" d="M28.602,87.202c-0.013-0.004-0.027-0.01-0.042-0.015C28.574,87.192,28.59,87.198,28.602,87.202z"/><path style="&st59;" d="M28.841,87.293c0,0-0.006-0.004-0.022-0.009C28.835,87.29,28.841,87.293,28.841,87.293z"/><path style="&st59;" d="M28.232,87.068c-0.018-0.006-0.031-0.014-0.047-0.018C28.201,87.055,28.215,87.063,28.232,87.068z"/><path style="&st59;" d="M45.534,89.858c0.028,0,0.054,0.002,0.081,0.002C45.587,89.858,45.562,89.858,45.534,89.858z"/><path style="&st59;" d="M45.397,89.855c0.029,0,0.06,0,0.089,0C45.457,89.855,45.427,89.855,45.397,89.855z"/><path style="&st59;" d="M28.348,87.11c-0.034-0.013-0.07-0.025-0.106-0.039C28.278,87.085,28.314,87.098,28.348,87.11z"/><path style="&st59;" d="M28.506,87.168c-0.013-0.005-0.025-0.01-0.037-0.015C28.481,87.158,28.494,87.162,28.506,87.168z"/><path style="&st59;" d="M28.401,87.129c-0.013-0.006-0.028-0.011-0.043-0.015C28.373,87.118,28.388,87.123,28.401,87.129z"/><path style="&st59;" d="M28.557,87.186c-0.013-0.004-0.025-0.012-0.04-0.017C28.531,87.176,28.544,87.182,28.557,87.186z"/><path style="&st59;" d="M28.458,87.15c-0.016-0.008-0.031-0.014-0.047-0.018C28.427,87.137,28.442,87.143,28.458,87.15z"/><path style="&st59;" d="M70.02,84.389c0.004,0,0.006,0,0.006,0C70.023,84.389,70.023,84.389,70.02,84.389z"/><path style="&st59;" d="M70.789,84.087c-0.001,0.003-0.003,0.005-0.004,0.005C70.786,84.09,70.788,84.088,70.789,84.087z"/><path style="&st59;" d="M70.762,84.102c-0.002,0.002-0.004,0.002-0.006,0.004C70.758,84.104,70.76,84.104,70.762,84.102z"/><path style="&st59;" d="M70.732,84.116c-0.002,0.002-0.004,0.003-0.006,0.004C70.729,84.119,70.73,84.118,70.732,84.116z"/><path style="&st59;" d="M70.697,84.133c-0.001,0-0.002,0-0.002,0.002C70.695,84.133,70.696,84.133,70.697,84.133z"/><path style="&st59;" d="M70.417,84.249c0.006-0.001,0.009-0.002,0.011-0.002C70.426,84.247,70.423,84.248,70.417,84.249z"/><path style="&st59;" d="M70.389,84.262h0.002H70.389z"/><path style="&st59;" d="M70.662,84.146L70.662,84.146L70.662,84.146z"/><path style="&st59;" d="M70.316,84.289c0.002-0.002,0.007-0.003,0.009-0.003C70.321,84.286,70.318,84.287,70.316,84.289z"/><path style="&st59;" d="M70.285,84.299c0.003,0,0.005-0.002,0.009-0.004C70.29,84.297,70.288,84.299,70.285,84.299z"/><path style="&st59;" d="M70.354,84.275c0.002-0.002,0.002-0.002,0.002-0.002S70.354,84.273,70.354,84.275z"/><path style="&st59;" d="M48.946,90.965c-0.011,0-0.022,0.004-0.033,0.004C48.924,90.969,48.935,90.965,48.946,90.965z"/><path style="&st59;" d="M70.256,84.311c0.002,0,0.004,0,0.006-0.002C70.26,84.311,70.258,84.311,70.256,84.311z"/><path style="&st59;" d="M70.78,82.41c0.013-0.009,0.026-0.021,0.042-0.032C70.809,82.389,70.793,82.401,70.78,82.41z"/><path style="&st59;" d="M70.956,82.279c0.013-0.008,0.022-0.016,0.033-0.023C70.98,82.264,70.969,82.271,70.956,82.279z"/><path style="&st59;" d="M70.898,82.321c0.012-0.009,0.022-0.017,0.033-0.022C70.923,82.305,70.91,82.313,70.898,82.321z"/><path style="&st2;" d="M70.903,83.794c0.2,0.064,0.106,0.171-0.087,0.278l0.089-0.033c0,0,0.793-0.436,0.458-0.633c-0.338-0.198-1.129-0.275-0.613-0.969l0.02-0.02c-0.442,0.344-0.756,0.727-0.498,1.021C70.27,83.443,70.387,83.629,70.903,83.794z"/><path style="&st59;" d="M70.566,84.191c-0.002,0-0.006,0.002-0.008,0.003C70.561,84.193,70.564,84.191,70.566,84.191z"/><path style="&st59;" d="M70.631,84.163c-0.002,0.001-0.004,0.002-0.006,0.003C70.627,84.165,70.629,84.164,70.631,84.163z"/><path style="&st59;" d="M70.598,84.176c0,0.002-0.004,0.004-0.006,0.004C70.594,84.18,70.598,84.178,70.598,84.176z"/><path style="&st59;" d="M70.493,84.223c-0.003,0-0.003,0-0.007,0.002C70.49,84.223,70.49,84.223,70.493,84.223z"/><path style="&st59;" d="M70.459,84.233c-0.002,0-0.004,0.002-0.008,0.004C70.455,84.235,70.457,84.233,70.459,84.233z"/><path style="&st59;" d="M70.842,82.363c0.012-0.01,0.024-0.018,0.034-0.025C70.866,82.346,70.854,82.354,70.842,82.363z"/><path style="&st59;" d="M48.293,91.024c-0.007,0-0.016,0-0.023,0C48.277,91.024,48.286,91.024,48.293,91.024z"/><path style="&st59;" d="M48.444,91.014c-0.004,0-0.011,0-0.017,0C48.434,91.014,48.44,91.014,48.444,91.014z"/><path style="&st59;" d="M48.369,91.02c-0.009,0-0.017,0-0.027,0C48.352,91.02,48.359,91.02,48.369,91.02z"/><path style="&st8;" d="M50.023,89.904c0,0,0.362,0.225,1.673,0.285c0,0,0.45,0,0.468,0.035c0.016,0.028,0.036,0.056-0.068,0.102l0,0c0.06-0.021,0.793-0.254,0.476-0.391c-0.04-0.019-0.063-0.024-0.074-0.028c-0.006,0-0.013,0-0.019-0.003l0,0c-0.008-0.002-0.016-0.002-0.021-0.004c-0.007,0-0.009-0.001-0.013-0.001c-0.006-0.003-0.014-0.003-0.021-0.005c-0.004,0-0.009,0-0.015-0.002c-0.005,0-0.011-0.002-0.017-0.002c-0.004,0-0.011-0.002-0.017-0.004c-0.005,0-0.012,0-0.015,0c-0.008-0.002-0.014-0.002-0.018-0.004c-0.004,0-0.012,0-0.016-0.002c-0.005,0-0.012,0-0.018,0c-0.002-0.004-0.008-0.004-0.01-0.004c-0.011-0.002-0.015-0.003-0.021-0.003c-0.004,0-0.006-0.001-0.008-0.001c-0.01-0.001-0.021-0.001-0.028-0.002c0,0-0.002,0-0.004-0.002c-0.007,0-0.015,0-0.021,0c-0.005-0.002-0.007-0.002-0.012-0.002s-0.011,0-0.02,0c-0.004,0-0.006,0-0.008,0c-0.008-0.002-0.013-0.002-0.019-0.002c-0.003,0-0.007,0-0.009,0c-0.008,0-0.014-0.002-0.018-0.002c-0.005,0-0.009-0.003-0.012-0.003c-0.006,0-0.014,0-0.021,0c-0.004,0-0.004,0-0.006,0c-0.039-0.004-0.08-0.004-0.128-0.009c-0.002,0-0.004,0-0.004,0c-0.009,0-0.015-0.002-0.022-0.002c-0.002,0-0.007,0-0.011,0c-0.007,0-0.013,0-0.021,0c-0.004-0.002-0.01-0.002-0.014-0.002c-0.006,0-0.013-0.002-0.02-0.002c-0.005,0-0.011,0-0.016-0.002c-0.005,0-0.011,0-0.019,0c-0.01,0-0.02-0.002-0.028-0.004c-0.006,0-0.012,0-0.019,0c-0.008,0-0.018-0.002-0.028-0.002c-0.005,0-0.011-0.002-0.016-0.002c-0.008,0-0.019,0-0.024-0.001c-0.006-0.001-0.013-0.001-0.021-0.001c-0.007-0.002-0.018-0.002-0.026-0.004c-0.005,0-0.013-0.001-0.02-0.001c-0.008-0.001-0.018-0.003-0.026-0.003c-0.007-0.001-0.016-0.001-0.023-0.003c-0.01,0-0.019-0.002-0.027-0.002c-0.007-0.002-0.014-0.002-0.021-0.002c-0.012,0-0.024-0.003-0.035-0.005c-0.007,0-0.014,0-0.02,0c-0.02-0.004-0.037-0.006-0.057-0.006c-0.142-0.019-0.271-0.033-0.378-0.055l-0.187-0.025c0,0-0.47-0.014-0.653-0.316c-0.118-0.197,0.457-0.318,0.457-0.318s0.956-0.193,1.917-0.321c0,0-2.542,0.294-2.777,0.626C49.613,89.737,50.023,89.904,50.023,89.904L50.023,89.904z"/><path style="&st59;" d="M69.986,84.401L69.986,84.401L69.986,84.401z"/><path style="&st59;" d="M69.989,84.399c0.001,0,0.001,0,0.004,0C69.991,84.399,69.99,84.399,69.989,84.399z"/><path style="&st59;" d="M48.839,90.979c-0.007,0-0.015,0.002-0.021,0.002C48.824,90.98,48.831,90.979,48.839,90.979z"/><path style="&st59;" d="M48.727,90.988c-0.009,0-0.017,0.002-0.026,0.002C48.71,90.99,48.718,90.988,48.727,90.988z"/><path style="&st59;" d="M48.637,90.998c-0.009,0-0.019,0.001-0.029,0.003C48.619,90.999,48.628,90.998,48.637,90.998z"/><path style="&st59;" d="M48.55,91.004c-0.009,0-0.018,0.002-0.025,0.004C48.532,91.006,48.54,91.004,48.55,91.004z"/><path style="&st59;" d="M70.139,84.35c0.004,0,0.006-0.002,0.01-0.004C70.145,84.348,70.143,84.35,70.139,84.35z"/><path style="&st59;" d="M70.116,84.359c0.002-0.002,0.004-0.002,0.007-0.002C70.12,84.357,70.118,84.357,70.116,84.359z"/><path style="&st59;" d="M70.193,84.332c0.002,0,0.002-0.002,0.004-0.002C70.195,84.33,70.195,84.332,70.193,84.332z"/><path style="&st59;" d="M70.068,84.374c0.003,0,0.004,0,0.007-0.002C70.072,84.374,70.07,84.374,70.068,84.374z"/><path style="&st59;" d="M70.163,84.342c0.005,0,0.007-0.002,0.011-0.005C70.17,84.34,70.167,84.342,70.163,84.342z"/><path style="&st59;" d="M69.996,84.395c0.002,0,0.002,0,0.004,0C69.998,84.395,69.998,84.395,69.996,84.395z"/><path style="&st59;" d="M70.004,84.395c0.002,0,0.006-0.002,0.008-0.002C70.006,84.395,70.006,84.395,70.004,84.395z"/><path style="&st59;" d="M72.23,81.559c-0.002,0-0.004,0-0.004,0S72.229,81.559,72.23,81.559z"/><path style="&st59;" d="M70.053,84.379c0.002,0,0.002,0,0.004,0C70.053,84.379,70.053,84.379,70.053,84.379z"/><path style="&st59;" d="M70.036,84.385c0.001,0,0.003,0,0.004-0.002C70.039,84.385,70.037,84.385,70.036,84.385z"/><linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="414.2451" y1="568.2656" x2="509.0055" y2="545.7273" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st51;" d="M7.61,68.141c-0.065-0.062-0.112-0.105-0.139-0.131L7.45,68.021L7.61,68.141L7.61,68.141z"/><linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="416.6992" y1="578.5645" x2="511.8228" y2="555.9398" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st62;" d="M90.412,59.954l0.689,0.108c1.976-1.573,3.869-3.571,3.869-3.571s1.258-1.261,1.889-2.356c0.22-0.381,0.281-0.356,0.271-0.177c0.023-0.09,0.103-0.456-0.038-0.714c-0.094-0.176-0.381,0.288-0.83,0.861c0,0-2.013,2.926-5.798,5.816c-3.786,2.891-4.776,3.771-8.083,5.655c0,0-2.309,1.021-3.914,0.669c-1.246-0.271,0-1.547,0.271-2.699c0.271-1.146,0.063-1.58-0.225-1.807c-0.287-0.225-0.91-0.385-2.142-0.109c0,0-4.709,1.264-6.819,3.307c-1.918,1.854,0.478,2.619,1.021,2.875c0,0,0.78,0.338,0.719,0.672c-0.063,0.336-0.496,0.623-0.733,0.783c-0.239,0.16-3.338,1.977-8.324,2.764c-4.039,0.641-3.26,0.255-7.143,0.654c-3.881,0.399-4.952,0.72-8.068,1.453c-3.116,0.734-4.945,1.537-5.352,2.349c-0.336,0.671,0.479,1.103,0.991,1.407c0.511,0.304,1.423,0.781,1.119,1.293c-0.305,0.512-1.631,1.277-4.874,1.391c-3.243,0.114-4.569-0.336-5.16-1.04c-0.548-0.649-0.08-1.323,0.096-1.946c0,0,0.382-0.814,0.16-1.215c-0.224-0.398-0.737-0.494-1.278-0.559c-0.544-0.064-3.245-0.158-5.337-0.271c-2.372-0.127-5.208-0.211-8.611-0.928c0,0-2.237-0.441-3.69-1.262c-0.096-0.055-0.18-0.107-0.25-0.156c-0.11-0.059-0.194-0.122-0.25-0.209c-0.41-0.432-0.047-0.748-0.186-1.168c-0.121-0.359-0.352-0.878-0.896-1.501c-0.176-0.183-0.428-0.437-0.72-0.713c-0.08-0.069-0.165-0.144-0.254-0.214c-1.276-1.037-1.422-1.149-1.964-1.166c-0.542-0.019-0.235,0.895-0.129,1.246c0.041,0.136,0.139,0.328,0.242,0.508c-0.2-0.364-0.336-0.729-0.257-0.915c0.144-0.337,0.309-0.308,0.309-0.308s0.133-0.053,0.595,0.297c0.463,0.35,1.499,1.078,2.012,1.705c0.512,0.625,0.481,1.18,0.481,1.18s-0.103,0.563,0.451,1.17c0.555,0.604,1.733,1.714,5.859,2.349c0.021,0.005,0.041,0.005,0.06,0.009l0.193-0.549l0.568,0.663c0.006,0,0.01,0.001,0.016,0.002c3.592,0.519,5.544,0.563,5.544,0.563s4.709,0.164,5.982,0.164c1.271,0,1.035,0.664,1.035,0.664s-0.072,0.361-0.225,0.647c-0.153,0.288-0.524,1.365-0.144,1.94c0,0,0.585,1.426,4.382,1.527c0,0,3.324,0.267,5.643-0.688c2.317-0.954,0.224-2.277,0.224-2.277s-0.794-0.483-1.129-0.737c-0.308-0.233-0.184-0.48-0.122-0.646c0.061-0.163,0.297-0.355,0.564-0.492c0.265-0.134,1.241-0.652,5.365-1.722c4.124-1.067,6.587-1.183,6.587-1.183s0.021-0.004,0.062-0.006l0.334-0.656l0.845,0.559c0.732-0.061,1.686-0.129,2.537-0.17c1.691-0.083,4.341-0.475,5.879-0.811c1.539-0.342,3.869-1.059,5.591-1.951c1.724-0.891,1.808-1.519,1.808-1.519s0.328-0.472-0.391-0.995c-0.719-0.521-1.037-0.38-1.672-1.024c-0.638-0.646,0.553-1.619,0.553-1.619s0.615-0.865,4.021-2.177c3.408-1.313,3.98-0.873,4.156-0.728c0.175,0.142,0.195,0.613,0.123,0.933c-0.072,0.316-0.494,1.455-0.721,2.055c-0.227,0.592-0.316,1.402,0.604,1.6c0.924,0.193,2.215-0.009,3.427-0.443c2.893-1.033,3.757-2.295,8.535-5.764c0.011-0.01,0.021-0.016,0.029-0.023L90.412,59.954L90.412,59.954z"/><linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="415.4736" y1="573.4199" x2="510.5869" y2="550.7977" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st52;" d="M100.895,47.596c-0.635,1.186-1.164,2.608-1.443,3.5c-0.045,0.213-0.061,0.33-0.061,0.33s-0.119,0.654-0.054,1.036c0.028,0.161,0.069,0.279,0.106,0.375c0.021,0.052,0.039,0.095,0.055,0.134c0.02,0.045,0.031,0.082,0.033,0.111c0.007,0.082-0.044,0.614-0.27,1.23l0,0c0,0,0,0,0,0.002c-0.063,0.176-0.143,0.359-0.24,0.539c-0.024,0.05-0.053,0.095-0.074,0.139c-0.458,0.814-1.098,1.457-1.604,1.532c-0.324,0.049-0.484-0.117-0.557-0.386c0.014,0.369,0.086,0.738,0.289,0.963c0.406,0.441,1.563-0.795,1.563-0.795s0.688-0.789,0.965-2.062c0.406-1.875,0.187-2.248,0.187-2.248s-0.247-0.389-0.093-0.853c0.152-0.461,1.156-3.047,1.979-4.01l0.502-0.562c0-0.009,0.002-0.02,0.002-0.029l-0.211-0.521c-0.129,0.13-0.259,0.284-0.385,0.454C101.405,46.763,101.178,47.129,100.895,47.596L100.895,47.596z"/><linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="414.7754" y1="570.4785" x2="509.8697" y2="547.861" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st53;" d="M10.564,70.807L10.564,70.807c-0.146-0.092-0.315-0.229-0.469-0.356c-0.133-0.112-0.641-0.585-1.18-1.086c-0.212-0.194-0.411-0.382-0.589-0.55c-0.277-0.262-0.524-0.493-0.688-0.646l0.107,0.358c0.017,0.028,0.034,0.06,0.052,0.089c0.183,0.29,0.854,1.264,2.153,2.277c1.549,1.213,1.559,0.729,1.559,0.729s0.062-0.4-0.296-0.84c-0.063-0.076-0.131-0.167-0.202-0.27v0.002C11.011,70.516,12.023,71.998,10.564,70.807z"/><linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="414.915" y1="571.0664" x2="510.04" y2="548.4415" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st54;" d="M10.678,69.98c0.103,0.186,0.219,0.371,0.333,0.533C11,70.501,10.833,70.253,10.678,69.98z"/><linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="416.1035" y1="576.0654" x2="511.2286" y2="553.4405" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#EDEDEE"/><stop offset=".4176" stop-color="#FFF"/><stop offset=".6264" stop-color="#F8F9F9"/><stop offset=".9505" stop-color="#B2B4B6"/></linearGradient><path style="&st55;" d="M96.887,55.023c0,0,0.227-0.76,0.243-1.066c-0.003,0.014-0.005,0.021-0.005,0.021s-0.513,1.443-0.333,2.16C96.771,55.579,96.887,55.023,96.887,55.023z"/><path style="&st34;" d="M63.301,4.417l0.728,0.072c1.426-0.402,2.643-0.772,2.643-0.772s1.265-0.41,1.901-0.637c0.635-0.226,1.09-0.313,1.654-0.409c0.565-0.096,1.311-0.14,1.709-0.131c0.4,0.007,0.531,0.122,0.531,0.122s0.166,0.131,0.244,0.27c0.077,0.138,0.74,1.891,2.973,2.005c2.233,0.112,2.263-1.096,2.065-1.464c-0.226-0.427-0.896-0.863-0.896-0.863s-0.899-0.575-1.092-0.847c-0.191-0.27,0.034-0.357,0.104-0.375c0.065-0.017,2.435-0.497,2.729-0.609l0.021-0.021l-0.562-0.171c0,0-0.119,0.134-0.789,0.313c-0.67,0.179-1.235,0.246-1.742,0.313c-0.506,0.066-0.506,0.239-0.506,0.239l-0.086,0.136c-0.025,0.075-0.067,0.321,0.375,0.642c0.528,0.387,1.172,0.75,1.438,1.04s0.586,0.783,0.012,1.137C76.48,4.576,76.27,4.64,75.977,4.671c0.002,0.008,0,0.012,0,0.012c-0.248,0.021-0.457,0.03-0.638,0.03c-0.049,0.002-0.102,0.006-0.155,0.009l-0.017-0.013c-0.506-0.024-0.746-0.142-1.067-0.302c-0.442-0.223-0.758-0.73-0.92-1.087s-0.521-0.662-0.521-0.662c-0.588-0.336-1.695-0.343-2.813-0.15c-1.115,0.193-2.656,0.707-2.925,0.812c-0.268,0.104-1.616,0.551-2.307,0.73c-0.693,0.178-1.222,0.357-1.646,0.47c-0.427,0.111-3.432,1.005-4.556,1.339c-1.126,0.334-1.849,0.46-1.849,0.46c-1.688,0.172-2.193-0.134-2.193-0.134c-0.296-0.124-0.261-0.526-0.261-0.526l0.009-1.147c0,0-0.027-0.433-0.357-0.611c-0.328-0.179-0.779-0.252-1.593-0.29c-0.811-0.038-1.683,0.044-2.093,0.134c-0.408,0.09-1.189,0.313-1.764,0.952c-0.572,0.641-0.481,1.139-0.481,1.139s0.004,0.079,0.01,0.201c0.154,0.245,0.416,0.524,0.862,0.739c1.015,0.485-1.137,1.342-1.137,1.342l0,0c-0.479,0.208-1.191,0.478-2.208,0.777c-2.21,0.647-3.684,0.774-3.684,0.774l0.679,0.254c0,0,5.468-1.016,7.148-2.616c0,0,0.625-0.293,0.021-0.88c-0.606-0.585-0.898-0.761-0.898-0.761s-0.41-0.223,0.02-0.772c0.428-0.546,0.922-0.794,1.352-0.933c0.428-0.135,1.754-0.249,2.925-0.093c0,0,0.491,0.042,0.457,0.407c-0.032,0.365-0.087,0.873-0.077,1.028c0.01,0.157,0.025,0.515,0.399,0.845c0.379,0.332,1.098,0.453,1.098,0.453s1.257,0.228,2.845-0.218c1.586-0.444,3.65-1.141,5.438-1.629L63.301,4.417L63.301,4.417z"/><linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="412.6152" y1="535.3994" x2="501.5865" y2="514.8846" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#FFF"/><stop offset=".6538" stop-color="#FFF"/><stop offset="1" stop-color="#CBCCCE"/></linearGradient><path style="&st56;" d="M91.596,12.992l0.271,0.486c-0.021,0.01-0.034,0.014-0.034,0.014c-1.114,0.515-3.999,1.32-4.271,1.398c-0.271,0.08-0.166,0.234-0.166,0.234c0.029,0.078,0.988,1.106,0.988,1.106c1.178,1.249,0.494,2.296,0.494,2.296s-0.852,1.347-2.844,1.12c-1.993-0.227-2.618-1.767-2.729-2.049c-0.111-0.282-0.197-0.768-0.22-1.095c-0.022-0.33-0.272-0.32-0.272-0.32c-1.069-0.03-2.887,1.089-2.887,1.089c-0.824,0.47-1.682,1.147-3.479,1.958c-0.879,0.396-1.694,0.716-2.287,0.936l-0.967-0.173l0.091,0.482c-0.042,0.013-0.063,0.021-0.063,0.021s-2.268,0.822-4.529,1.553c-2.268,0.732-3.65,0.8-3.65,0.8s-1.336,0.12-2.266-0.266c-0.93-0.386-0.959-0.94-0.939-1.415c0.021-0.476,0.483-1.404,0.623-1.958c0.139-0.555-0.683-0.644-0.683-0.644s-1.958-0.236-3.65,0.296c-1.69,0.535-2.54,1.159-2.54,1.159c-0.91,0.512-0.863,0.957-0.863,0.957s-0.012,0.467,0.551,0.869s1.072,0.505,1.736,0.654c0.668,0.149,0.791,0.311,0.791,0.311c1.08,0.894,0.416,1.785,0.047,2.434c-0.631,1.113-3.674,1.653-3.674,1.653c-3.276,0.758-5.12,1.08-7.827,1.452l-0.876-0.46l-0.276,0.615c-7.089,0.936-10.065,1.877-11.065,2.135c-1,0.257-1.261,0.784-1.369,0.904c-0.108,0.12,0.079,0.171,0.079,0.171c0.427,0.137,0.647,0.442,0.647,0.442s1.399,1.697-0.012,3.108c-1.359,1.36-2.785,1.674-2.785,1.674s-2.177,0.737-4.077,0.341c-1.899-0.399-2.439-1.889-2.416-2.395c0.024-0.505,0.176-1.075,0.694-1.661c0.517-0.585,0.654-0.667,0.654-0.667s0.358-0.279,0.421-0.415c0.079-0.172-0.404-0.233-0.404-0.233c-1.034-0.13-3.496-0.097-5.822,0.131c-1.439,0.14-2.769,0.374-3.578,0.518l-0.223-0.48l-0.543,0.625l-3.12,0.504c-1.514,0.222-2.576-0.028-2.576-0.028s-1.331-0.397-1.479-1.252c-0.147-0.852,0.359-1.87,0.49-2.177c0.13-0.307,0.5-0.934,0.5-0.934s0.068-0.13,0.068-0.34c0-0.211-0.233-0.536-0.233-0.536s-0.205-0.396-0.886-0.38c-0.682,0.018-0.866,0.131-1.144,0.364c-0.044,0.038-0.079,0.081-0.108,0.127c0.021-0.064,0.045-0.117,0.073-0.158c0.21-0.309,0.65-0.668,1.401-0.7c0.748-0.034,1.041,0.228,1.041,0.228c0.719,0.82,0.115,1.845-0.351,2.76c-0.057,0.095-0.155,0.271-0.229,0.483c-0.032,0.076-0.062,0.153-0.087,0.227c-0.358,1.06,0.292,1.565,0.668,1.661c0.376,0.097,1.141,0.57,4.269-0.031c3.13-0.603,3.587-0.731,3.587-0.731s6.145-1.087,8.96-0.425l0.023,0.004c0,0,1.297,0.367,0.331,1.334c-0.966,0.966-1.729,1.617-1.504,2.377c0.223,0.762,1.267,1.903,3.646,1.603c0,0,0.842-0.113,1.105-0.165c1.733-0.336,2.899-1.268,2.899-1.268s0.972-0.721,0.782-1.631c-0.187-0.908-1.017-1.189-1.017-1.189s-0.659-0.424-0.141-1.237c0,0,0.141-0.69,2.553-1.317c2.412-0.626,6.813-1.518,10.555-1.989c3.49-0.408,9.652-1.575,10.89-2.08c1.235-0.508,1.497-1.4,1.521-1.708c0.024-0.31,0.072-0.83-1.14-1.09c-1.213-0.259-1.758-0.655-1.931-0.79c-0.172-0.138-0.545-0.483-0.545-1.275c0-0.791,1.607-1.745,3.392-2.35c1.78-0.606,3.927-0.34,3.927-0.34c1.948,0.167,0.936,1.963,0.936,1.963c-0.074,0.322-0.946,1.785,0.5,2.169c1.541,0.409,4.175-0.347,5.188-0.669c0.829-0.261,3.141-1.074,4.688-1.62c0.352-0.122,0.66-0.231,0.908-0.318c1.656-0.577,3.019-1.219,3.785-1.681c0.771-0.462,2.144-1.297,2.144-1.297s1.351-0.744,1.799-0.808c0.451-0.064,1.619-0.346,1.771,0.771c0.155,1.115,0.631,1.899,1.4,2.271c0.771,0.371,2.064,0.538,3.246-0.231c1.182-0.771,0.359-1.901,0.359-1.901c-0.021-0.028-0.039-0.057-0.062-0.085c-0.151-0.27-0.369-0.518-0.487-0.646c-0.388-0.47-0.736-0.822-0.736-0.822c-0.295-0.436,0.053-0.692,0.425-0.834c0.373-0.141,2.351-0.758,2.351-0.758c1.155-0.383,1.592-0.551,2.053-0.988c0.445-0.419-0.189-1.34-0.239-1.412l0.004-0.002l0.608,0.256c0.136,0.182,0.27,0.362,0.4,0.547l-0.007,0.005c0,0,0.226,0.527,0.054,0.799c-0.095,0.149-0.343,0.293-0.545,0.395L91.596,12.992L91.596,12.992z"/><linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="390.042" y1="485.6797" x2="390.042" y2="485.6797" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#FFF"/><stop offset=".6538" stop-color="#FFF"/><stop offset="1" stop-color="#CBCCCE"/></linearGradient><path style="&st57;" d="M-16.122-14.641"/><path style="&st34;" d="M57.455,92.28c-0.034-0.042-0.042-0.034-0.012-0.063c0.021-0.021,0.086-0.082,0.115-0.137c0,0-1.17-0.063-2.141,0.077c-0.962,0.137-1.933,0.335-1.933,0.335l0.301,0.146c0,0,0.127-0.055,1.047-0.183c0.921-0.128,1.267-0.128,1.267-0.128s0.808-0.063,0.969-0.063c0.162,0,0.061,0.104,0.061,0.104s-0.078,0.136,0.366,0.124c0,0,0.663-0.027,1.313-0.188C58.809,92.309,57.678,92.544,57.455,92.28z"/><path style="&st34;" d="M54.469,92.691c0,0,0.146,0.266-2.923,0.394c0,0,1.788,0.052,3.31-0.198C55.963,92.707,54.469,92.691,54.469,92.691L54.469,92.691z"/><path style="&st34;" d="M13.114,9.856c0,0-0.005,0.096,0.019,0.131c0.024,0.034,0.107,0.112,0.107,0.112s0.328-0.5,0.194-0.438c0,0-0.119,0.187-0.164,0.23c0,0-0.029,0.04-0.088,0.077C13.123,10.006,13.117,9.991,13.114,9.856L13.114,9.856z"/><path style="&st34;" d="M10.595,12.501c0,0-0.388,0.46,0,0.52l0.528-0.527c0,0,0.139-0.234,0.139-0.398C11.263,12.095,10.752,12.343,10.595,12.501L10.595,12.501z"/><path style="&st12;" d="M-16.122-14.641"/><path style="&st31;" d="M21.093,23.707c1.227,0.146,1.499-0.132,1.527-0.172c0.294-0.003,1.475-0.034,2.865-0.207c1.685-0.21,3.564-0.891,3.564-0.891s1.554-0.568,2.096-1.18l0.016-0.002c0,0-0.693-0.6-1.057-1.122c0,0-0.286-0.557,0.027-1.035c0.316-0.479,0.836-1.008,2.344-1.643c1.506-0.636,2.356-0.514,2.356-0.514s0.594-0.006,1.007,0.45c0.415,0.458,0.649,1.006,0.649,1.006s0.029,0.38-0.115,0.63c-0.141,0.251-0.155,0.277-0.155,0.277s0.049,0.017,0.378-0.007c0.329-0.021,1.165-0.142,2.67-0.506c1.508-0.363,3.407-0.972,3.407-0.972s4.9-1.578,5.407-1.714c0.507-0.135,1.357-0.436,1.357-0.436l0.027,0.059c0,0,0.405,0.663,0.392,1.269V16.94c0,0-0.021,0.301-0.698,0.818c-0.674,0.517-1.226,0.479-1.678,0.442c-0.452-0.039-0.665-0.071-0.794-0.045l-0.72,0.04c-0.787,0.111-1.224,0.407-1.224,0.407c-1.804,1.065,0.731,9.287,0.731,9.287c-3.742,0.47-8.143,1.363-10.555,1.989c-2.412,0.627-2.553,1.317-2.553,1.317c-0.519,0.813,0.141,1.236,0.141,1.236s0.829,0.283,1.017,1.19c0.19,0.91-0.783,1.629-0.783,1.629s-1.159,0.97-2.898,1.268c-1.738,0.298-2.396,0.35-3.429-0.47c-0.91-0.721-0.297-1.864,0.312-2.301c0.612-0.438,0.909-0.91,0.988-1.113c0.079-0.203,0.032-0.376,0.032-0.376l-0.58-0.534c-2.005-1.33-9.884,0.063-9.884,0.063c-0.213-1.169-0.362-1.171-0.282-3.117c0.051-1.244,0.291-1.752,0.291-1.752l0.058-0.164c0,0,0.448-1.443,1.141-2.44c0,0,0.602-0.172,1.364-0.349C20.616,23.793,21.093,23.707,21.093,23.707L21.093,23.707z"/><linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="231.2324" y1="-407.8711" x2="263.6191" y2="-407.8711" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#696969"/><stop offset=".3702" stop-color="#2E2E2E"/><stop offset=".4554" stop-color="#424242"/><stop offset=".6014" stop-color="#303030"/><stop offset=".6947" stop-color="#4A4A4A"/><stop offset="1" stop-color="#666666"/></linearGradient><path style="&st26;" d="M49.855,16.94c0,0-4.085,1.326-3.891,1.254c0,0-0.39,0.075-0.686,0.161c-0.294,0.086-0.539,0.247-0.539,0.247s-3.288,1.222-6.438,1.848c-3.148,0.627-2.977-0.361-2.708-0.83c0.232-0.409,0.829-1.112-0.188-1.254c-1.019-0.14-1.788,0.251-2.21,0.439c-0.422,0.189-3.162,1.362-1.251,2.254c0,0,1.423,0.642-0.377,1.755c0,0-1.816,1.16-5.355,1.77c0,0-0.565,0.063-1.88,0.111c-1.316,0.046-2.558,0.213-4.12,0.658c-1.378,0.391-1.992,0.579-2.744,1.065l0.194-0.501l0.2-0.462c1.069-0.533,3.719-1.288,5.717-1.378c1.997-0.089,2.908-0.16,4.721-0.624c2.134-0.546,2.702-1.019,2.93-1.163c0.194-0.123,0.771-0.479,0.493-0.633c-0.359-0.199-0.895-0.729-0.895-0.729c-0.217-0.256-0.39-0.373-0.158-1.046c0.356-1.029,2.196-1.644,2.196-1.644s1.028-0.534,2.334-0.514c1.305,0.021,1.287,0.752,1.287,0.752s0.062,0.34-0.268,0.827c0,0-0.503,0.579-0.049,0.656c0.454,0.081,1.622,0.179,5.48-1.028c3.859-1.207,8.085-2.611,8.085-2.611S49.855,16.66,49.855,16.94L49.855,16.94z"/><linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="231.623" y1="-407.063" x2="263.4941" y2="-407.063" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#525252"/><stop offset=".1856" stop-color="#333333"/><stop offset=".354" stop-color="#AEAEAE"/><stop offset=".4199" stop-color="#ADADAD"/><stop offset=".4276" stop-color="#9D9D9D"/><stop offset=".4433" stop-color="#818181"/><stop offset=".4611" stop-color="#6A6A6A"/><stop offset=".4814" stop-color="#585858"/><stop offset=".506" stop-color="#4C4C4C"/><stop offset=".539" stop-color="#444444"/><stop offset=".6166" stop-color="#424242"/><stop offset=".6684" stop-color="#454545"/><stop offset="1" stop-color="#BDBDBD"/></linearGradient><path style="&st58;" d="M31.145,21.257c-0.541,0.612-2.096,1.18-2.096,1.18s-1.88,0.68-3.564,0.891c-1.608,0.201-2.777,0.209-2.777,0.209l-0.082-0.002c-0.175,0.145-0.483,0.188-0.728,0.21c-0.244,0.023-0.806-0.039-0.806-0.039s-2.156,0.432-2.603,0.616c0,0-0.253,0.392-0.331,0.539c-0.08,0.146-0.299,0.594-0.299,0.594c1.069-0.534,3.718-1.289,5.717-1.379c1.997-0.089,2.908-0.159,4.721-0.624c2.134-0.546,2.702-1.019,2.929-1.163c0.195-0.123,0.771-0.479,0.493-0.633c-0.358-0.199-0.894-0.729-0.894-0.729c-0.217-0.256-0.391-0.373-0.158-1.046c0.356-1.029,2.196-1.644,2.196-1.644s1.028-0.533,2.333-0.514c1.306,0.021,1.287,0.753,1.287,0.753s0.062,0.34-0.269,0.826c0,0-0.503,0.579-0.049,0.657c0.455,0.08,1.622,0.178,5.48-1.028c3.858-1.208,8.085-2.612,8.085-2.612c-0.098-0.29-0.296-0.652-0.296-0.652s-0.85,0.301-1.358,0.436c-0.506,0.136-5.407,1.714-5.407,1.714s-1.9,0.608-3.407,0.972c-1.506,0.364-2.342,0.485-2.671,0.508c-0.329,0.021-0.378,0.006-0.378,0.006s0.013-0.027,0.156-0.279c0.144-0.248,0.115-0.629,0.115-0.629s-0.235-0.548-0.649-1.006c-0.414-0.457-1.007-0.45-1.007-0.45s-0.849-0.121-2.355,0.514c-1.508,0.636-2.029,1.164-2.346,1.643c-0.312,0.478-0.026,1.035-0.026,1.035c0.365,0.521,1.057,1.122,1.057,1.122"/><linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="236.917" y1="-417.333" x2="235.8882" y2="-410.5272" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)"><stop offset="0" stop-color="#969696"/><stop offset="1" stop-color="#000"/></linearGradient><path style="&st24;" d="M21.606,31.241c0,0-0.064-0.328,0.172-0.939c0.234-0.611,0.908-0.595,1.362-0.503c0.455,0.095,0.846,0.298,1.472-0.124c0.627-0.423,0.47-1.583,0.046-2.852c-0.423-1.267-0.328-2.128-0.328-2.128l-0.608-0.649l-0.237,0.696c0.047,1.316,0.657,3.226,0.829,3.759c0.173,0.533,0.297,0.8-0.735,0.517c-1.034-0.282-1.519,0.125-1.519,0.125c-1.332,0.862-1.082,2.161-1.082,2.161L21.606,31.241z"/><path style="&st60;" d="M27.498,36.633c-0.264-1.763-0.917-2.749-0.917-2.749c-0.25,0.188-0.513,0.693-0.513,0.693s0.179,0.208,0.471,1.568c0,0,0.141,0.106,0.438,0.279C27.273,36.597,27.498,36.633,27.498,36.633z"/><path style="&st60;" d="M33.152,32.881c0,0-0.78,0.907-0.378,2.336c0,0,0.454-0.379,0.585-0.68c0,0-0.145-0.458,0.138-1.017C33.5,33.52,33.37,33.1,33.152,32.881L33.152,32.881z"/><linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="428.7803" y1="532.0527" x2="429.5303" y2="524.4692" gradientTransform="matrix(1 0 0 1 -406.1641 -500.3203)"><stop offset="0" stop-color="#333333"/><stop offset=".431" stop-color="#000"/><stop offset="1" stop-color="#2E2E2E"/></linearGradient><path style="&st3;" d="M21.2,31.253c0.017-1.299,0.471-1.492,0.905-1.818c0.436-0.328,1.326-0.024,1.326-0.024s0.678,0.218,1.046-0.1c0.369-0.319-0.017-1.467-0.217-2.123c-0.202-0.653-0.41-1.599-0.445-2.262c-0.025-0.489-0.091-0.707-0.125-0.789l-0.205,0.604c0.047,1.316,0.657,3.226,0.829,3.759c0.173,0.533,0.297,0.8-0.735,0.517c-1.035-0.282-1.519,0.125-1.519,0.125c-1.332,0.862-1.082,2.162-1.082,2.162l0.259-0.027L21.2,31.253L21.2,31.253z"/><path style="&st21;" d="M26.239,34.29c0.045,0.06,0.421,0.597,0.736,2.113l0.005,0.025c0.294,0.17,0.519,0.205,0.519,0.205c-0.264-1.763-0.917-2.749-0.917-2.749C26.46,33.977,26.336,34.143,26.239,34.29L26.239,34.29z"/><path style="&st21;" d="M33.152,32.881c0,0-0.78,0.907-0.378,2.336c0,0,0.125-0.104,0.262-0.248l0.021-0.051c-0.304-1.033,0.283-1.763,0.283-1.763l0.004-0.003C33.291,33.053,33.225,32.957,33.152,32.881z"/><path style="&st10;" d="M17.159,8.189h0.117c-0.16,0.481-0.789,1.141-1.068,1.583c-0.156,0.248-0.252,0.572-0.474,0.751c0.038,0.043-0.003,0.003,0.04,0.04c0.088,0.052,0.813-0.139,0.95-0.236c0.082,0.015,0.076,0.011,0.12,0.039c0.042,0.07-0.481,0.991-0.595,1.109v0.04c0.196-0.023,0.502-0.056,0.634-0.16c0.383-0.299,0.47-0.937,0.75-1.346c-0.013-0.066-0.026-0.132-0.04-0.196c-0.222-0.04-0.681,0.02-0.87,0.157h-0.039c0.091-0.473,0.868-1.346,1.146-1.741c0.454-0.647,0.881-1.269,1.345-1.9c0.243-0.331,0.585-0.622,0.831-0.949c0.276-0.367,0.569-0.85,0.949-1.107V4.194h-0.158c-0.186,0.135-0.675,0.218-0.908,0.354c0.032,0.135,0.019,0.101,0.118,0.158c-0.139,0.386-0.598,0.673-0.832,0.991c-0.371,0.5-0.784,0.968-1.147,1.464c-0.123,0.164-0.205,0.421-0.356,0.553c-0.237,0.208-0.913,0.185-1.185,0.396h-0.08c0.056-0.332,0.907-1.392,1.147-1.622v-0.04c-0.408,0.057-0.724,0.273-0.989,0.473c0.044,0.091,0.037,0.073,0.12,0.12c-0.145,0.238-0.361,0.415-0.515,0.633c-0.197,0.275-0.305,0.602-0.514,0.871c0.014,0.04,0.028,0.077,0.04,0.118C15.948,8.641,17.001,8.307,17.159,8.189L17.159,8.189z M51.936,13.534c0.199,0.066,0.396,0.131,0.596,0.197c0.159,0.002,0.327-0.002,0.432-0.04c-0.009-0.654-0.364-0.913-0.593-1.345c-0.113-0.22-0.175-0.523-0.355-0.673c0.069-0.242,0.727-0.308,0.988-0.396c0.643-0.211,1.371-0.422,2.02-0.633c0.305-0.099,0.664-0.077,0.91-0.236c0.146,0.015,0.22,0.029,0.277,0.118c0.143,0.212,0.26,1.667,0.156,2.097c-0.398,1.663-0.896,2.963-1.938,3.958v0.039c0.385-0.062,0.568-0.436,0.83-0.632c1.051-0.794,1.762-1.972,2.137-3.444c0.221-0.865-0.14-1.713,0.199-2.452h-0.039c-0.074-0.188-1.082-0.553-1.388-0.555c-0.164,0.177-0.399,0.416-0.634,0.515c-0.357,0.152-0.838,0.109-1.146,0.315c-0.287-0.024-0.506-0.57-0.315-0.791c-0.011-0.09-0.009-0.112-0.04-0.158c-0.239-0.191-0.85-0.171-1.268-0.158c-0.133,0.125-0.252,0.15-0.314,0.358h-0.039c-0.021,0.076,0.02,0.05,0.039,0.078c0.025,0.016,0.163-0.007,0.236,0.04c0.449,0.047,0.438,0.566,0.675,0.831c-0.027,0.069-0.011,0.04-0.042,0.08c-0.155,0.123-1.301,0.453-1.543,0.515c-0.185,0.046-0.414-0.068-0.553-0.081c-0.336-0.028-0.633,0.16-0.831,0.277c0.107,0.157,0.434,0.118,0.554,0.276C51.368,12.193,51.556,12.913,51.936,13.534L51.936,13.534z M59.807,12.977c0.187,0.093,0.187,0.332,0.278,0.514c0.185,0.371,0.437,0.82,0.554,1.228v0.316c0.092,0.252,0.396,0.284,0.596,0.435c0.156-0.021,0.214-0.061,0.314-0.118c-0.066-0.753-0.525-1.378-0.791-1.979c-0.08-0.188-0.207-0.452-0.236-0.633c-0.021-0.109,0.063-0.169,0-0.276c-0.051-0.123-0.072-0.085-0.156-0.159c-0.059-0.04-0.031-0.016,0-0.078c0.068-0.144,0.213-0.287,0.275-0.436c0.133-0.313,0.127-0.576,0.396-0.751c-0.04-0.41-0.639-0.457-1.107-0.435c-0.057,0.042-0.156,0.064-0.24,0.077c0.05,0.103,0.082,0.124,0.199,0.157c0.113,1.161-0.699,2.225-1.229,2.928c-0.208,0.279-0.556,0.456-0.75,0.754h-0.04v0.038C58.395,14.473,59.54,13.383,59.807,12.977L59.807,12.977z M12.407,22.83c-0.081,0.017-0.076,0.009-0.117,0.039c-0.288,0.148-0.773,1.426-1.346,1.069c-0.292,0.002-0.319-0.055-0.476-0.16c0.02-0.376,0.659-1.063,0.913-1.226c0.031-0.604,0.187-1.252,0.118-1.819c-0.041-0.014-0.08-0.028-0.118-0.039c-0.14-0.046-0.25,0.168-0.357,0.276c-0.29,0.291-0.648,0.597-0.871,0.949c-0.337-0.003-1.414-0.013-1.623,0.119H8.411c0.099-0.256,0.86-1.096,0.633-1.464c-0.013-0.041-0.025-0.08-0.04-0.12c-0.722,0.002-1.592,1.287-1.82,1.82c-0.115,0.266-0.115,0.573-0.276,0.791v0.04c0.54-0.066,1.082-0.133,1.622-0.199c0.205-0.044,0.487,0.052,0.633-0.039h0.554c0.092-0.118,0.184-0.238,0.277-0.356c0.33-0.349,0.768-0.702,1.028-1.106h0.119v0.551c-0.303,0.273-0.773,0.695-0.91,1.108v0.316c-0.203,0.88,0.223,1.329,0.99,1.267c0.5-0.466,1.324-0.848,1.226-1.779C12.405,22.833,12.444,22.873,12.407,22.83L12.407,22.83z M7.819,22.118H7.58c0.109-0.436,0.537-0.935,1.069-0.95v0.197c-0.185,0.239-0.369,0.475-0.554,0.713C7.982,22.076,7.88,22.076,7.819,22.118z M93.044,22.315c-0.164-0.405-0.294-0.722-0.475-1.068c-0.3-0.574-0.613-1.414-1.464-1.425c-0.211,0.179-0.435,0.322-0.555,0.593c-0.777,1.762,0.819,3.747,1.543,4.71c0.256,0.339,0.557,0.712,0.948,0.908c-0.091,1.376-1.269,1.813-2.53,1.267c-0.899-0.386-1.617-1.237-2.179-1.979c-0.188-0.249-0.481-0.457-0.672-0.713c-0.177-0.239-0.304-0.507-0.515-0.713v-0.039h-0.078c0.107,0.426,0.354,0.815,0.514,1.188c0.669,1.538,1.52,2.614,2.811,3.521c0.608,0.428,1.621,1.104,2.494,0.475C94.412,27.942,93.669,23.851,93.044,22.315L93.044,22.315z M92.928,24.216c-0.104,0.1-0.539-0.419-0.635-0.515c-0.441-0.443-1.329-1.221-0.83-1.979h0.197c0.388,0.403,0.746,0.788,0.99,1.344c0.129,0.299,0.152,0.805,0.313,1.069C92.941,24.205,92.958,24.175,92.928,24.216L92.928,24.216z M66.693,32.128v-0.395c0.179-0.801,0.137-1.765,0.314-2.572c0.241-1.088-0.101-2.148,0.99-2.414c0.021-0.106,0.057-0.148,0-0.238c-0.025-0.067-0.009-0.039-0.04-0.079c-0.043-0.031-0.038-0.024-0.116-0.039c-0.305,0.222-1.131,0.373-1.543,0.474c-0.313,0.076-0.639,0.01-0.871,0.158c-0.039,0.013-0.078,0.027-0.119,0.04c0.014,0.079,0.025,0.159,0.041,0.237c0.451,0.147,0.867-0.031,1.067,0.356c0.13,0.252,0.112,1.157,0.039,1.504c-0.251,1.163-0.146,2.491-0.396,3.64c-0.086,0.397,0.022,1.171-0.157,1.463v0.08c-0.241-0.115-0.397-0.426-0.554-0.633c-0.354-0.467-0.875-0.84-1.229-1.305c-0.213-0.281-0.437-0.617-0.712-0.833c0.037-0.761,0.259-1.56,0.438-2.254c0.131-0.522,0.135-1.005,0.395-1.386c0.148-0.217,0.505-0.355,0.751-0.475c-0.002-0.1-0.004-0.146-0.04-0.198c-0.014-0.04-0.023-0.079-0.037-0.119c-0.543,0.081-1.003,0.341-1.505,0.475c-0.454,0.123-0.911,0.092-1.269,0.276c0.012,0.091,0.01,0.112,0.041,0.158c0.014,0.039,0.024,0.08,0.039,0.118c1.391-0.078,1.18,0.678,0.912,1.742c-0.084,0.326-0.029,0.775-0.199,1.028v0.079h-0.039c-0.285-0.433-0.713-0.852-1.067-1.227c-0.146-0.132-0.291-0.264-0.435-0.395c-0.104-0.137-0.16-0.312-0.278-0.436c0.024-0.437,0.38-0.549,0.713-0.672c-0.015-0.183-0.052-0.206-0.118-0.317c-1.031,0.151-1.927,0.73-3.086,0.791v0.041h-0.04c0.004,0.1,0.004,0.146,0.04,0.197v0.079c0.227,0.039,0.564-0.054,0.831,0.04c0.427,0.15,0.81,0.648,1.067,0.99c0.388,0.513,0.996,0.949,1.384,1.463c0.204,0.274,0.434,0.634,0.713,0.832c-0.038,0.696-0.229,1.428-0.396,2.058c-0.086,0.323-0.035,0.735-0.197,0.988c-0.025,0.069-0.01,0.039-0.041,0.08c-0.377-0.718-1.104-1.265-1.582-1.9c-0.918-1.22-1.938-2.319-2.889-3.521c0-0.167,0.01-0.268,0.08-0.356c0.073-0.229,0.359-0.443,0.633-0.476c0.015-0.12,0.033-0.135-0.039-0.238c-0.016-0.038-0.026-0.077-0.041-0.118c-0.803,0.123-1.521,0.497-2.293,0.714c-0.401,0.112-0.928,0.057-1.229,0.276c-0.04,0.013-0.08,0.026-0.117,0.04c0.021,0.152,0.061,0.176,0.117,0.277c0.314-0.005,0.646-0.092,0.949,0c0.793,0.241,1.361,1.137,1.818,1.742c0.201,0.266,0.513,0.483,0.713,0.751c0.849,1.129,1.808,2.146,2.65,3.285c0.328,0.442,0.771,0.825,1.066,1.304c0.179-0.004,0.216-0.025,0.316-0.079c0.213-0.929,0.332-1.866,0.596-2.81c0.119-0.432,0.269-0.942,0.314-1.424c0.327,0.117,0.592,0.607,0.793,0.871c0.618,0.821,1.491,1.502,2.057,2.373c0.164-0.007,0.182-0.026,0.277-0.078C66.352,34.819,66.521,33.473,66.693,32.128L66.693,32.128z M4.297,38.894c-0.013,2.467-0.142,6.269,1.781,6.806c0.7,0.193,1.087-0.271,1.306-0.595c0.786-1.17,0.565-3.446-0.199-4.43c-0.339,0.034-0.825,0.84-0.988,1.106c-0.082-0.016-0.075-0.011-0.119-0.04c-0.091-0.041-0.085-0.066-0.159-0.118c-0.06-0.933,0.127-1.802,0.159-2.691c1.044,0.102,1.941,0.696,3.007,0.751c-0.001-0.185,0-0.434,0.077-0.552c-0.009-0.092-0.007-0.112-0.04-0.16c-0.145-0.115-0.949-0.306-1.186-0.315v-0.04h-0.04c0.146-1.174-0.186-2.082-0.99-2.414c-0.449-0.08-0.897-0.16-1.346-0.239c-0.229-0.083-0.341-0.266-0.514-0.395c-0.058-0.38-0.133-0.806,0.159-1.029c-0.021-0.142-0.032-0.168-0.119-0.238v-0.039h-0.04c-0.133,0.228-0.245,0.493-0.315,0.792c-0.234,0.983,0.309,1.818,0.909,2.018c0.397,0.065,0.792,0.132,1.188,0.197c0.314,0.122,0.453,0.379,0.671,0.595c-0.009,0.512-0.5,0.568-0.91,0.435c-0.64-0.208-1.321-0.353-1.977-0.592c-0.172-0.064-0.333-0.17-0.555-0.199c-0.027,0.25-0.054,0.501-0.08,0.751c0.554,0.171,1.109,0.343,1.662,0.515c-0.023,1.398-0.574,3.074,0.119,4.153c0.084,0.021,0.143,0.037,0.198,0.08c0.78-0.054,0.943-0.68,1.345-1.108c0.342,0.82,0.086,2.253-0.671,2.453c-0.326,0.224-0.803-0.066-0.989-0.237c-0.648-0.599-0.785-1.511-1.027-2.532c-0.083-0.344,0.033-1.042-0.118-1.307c0.006-0.404,0.092-1.134-0.12-1.344v-0.039L4.297,38.894L4.297,38.894z M99.336,45.543c-0.143-0.666,0.055-1.478-0.08-2.097v-0.633c-0.097-0.453-0.059-1.056-0.156-1.502c-0.189-0.882-0.022-1.926-0.355-2.652c-0.197-0.047-0.393-0.084-0.671-0.08c-0.103,0.104-0.179,0.158-0.159,0.278c0.083,0.359,0.547,0.432,0.673,0.792c0.015,0.172,0.026,0.343,0.04,0.514c0.133,0.561,0.111,1.286,0.236,1.86v0.475c0.063,0.289,0.16,1.036,0.078,1.267c-0.139,0.41-0.584,0.78-0.868,1.068c-0.754,0.755-1.64,1.715-2.97,1.859c-0.025,0.068-0.01,0.039-0.041,0.08c0.022,0.494,0.476,0.396,0.793,0.594c0.08-0.014,0.158-0.028,0.236-0.042c0.122-0.074,0.191-0.242,0.276-0.356c0.2-0.261,0.563-0.399,0.751-0.671h0.04c0.002,1.205,0.028,2.561,0.04,3.718h0.117c0.272-1.172,0.252-2.61,0.238-4.039c0.521-0.486,0.853-1.19,1.385-1.66v-0.078h0.041c0.007,1.251,0.037,2.529,0.037,3.797c0,0.407-0.102,1.378,0,1.544v0.237h0.08c0.106-0.425,0.133-1.023,0.236-1.501v-0.674C99.451,47.107,99.45,46.078,99.336,45.543L99.336,45.543z M28.313,48.073c-0.347-0.144-0.776-0.461-0.989-0.751c-0.637-0.875-1.337-2.948-0.87-4.51c0.379-1.266,1.202-2.127,2.532-2.454c0.673-0.163,1.397,0.062,1.821,0.278c1.208,0.622,1.725,1.506,2.096,2.967c0.48,1.887-0.132,3.619-1.385,4.194c0.078,0.764,0.158,1.529,0.237,2.295c0.444-0.013,0.852-0.105,1.227-0.199c0.629-0.155,1.271-0.176,1.86-0.315c0.431-0.104,1.052-0.015,1.384-0.237c0.079-0.17-0.247-1.35-0.315-1.623c-0.057-0.229-0.009-0.461-0.119-0.633v-0.079c-0.091,0.012-0.185,0.025-0.277,0.039c0.018,1.195-0.834,1.032-1.781,1.267c-0.473,0.119-1.049,0.27-1.581,0.276c0-0.17,0-0.343-0.001-0.514c0.045-0.083,0.739-0.386,0.868-0.476c0.461-0.318,0.931-0.826,1.229-1.304c0.202-0.327,0.366-0.764,0.473-1.149c0.138-0.489,0.154-1.17,0.041-1.662c-0.079-0.338-0.048-0.603-0.158-0.91c-0.427-1.187-1.322-2.054-2.453-2.532c-0.513-0.216-1.093-0.224-1.7-0.356c-0.539-0.116-1.509,0.124-1.901,0.238c-1.905,0.562-3.198,1.48-3.799,3.323c-0.236,0.728-0.163,1.736,0.04,2.414c0.467,1.561,1.773,3.02,3.72,3.047v0.039c0.062,0.088,0.06,0.264,0.118,0.355c-0.024,0.067-0.009,0.039-0.04,0.08c-0.164,0.111-0.404,0.061-0.633,0.117c-0.47,0.118-1.986,0.486-2.334,0.158c-0.222-0.072-0.37-0.363-0.396-0.632c-0.099,0.004-0.146,0.004-0.197,0.039h-0.082c0.146,0.767,0.291,1.53,0.435,2.296h0.041v0.04c1.385-0.239,2.77-0.478,4.154-0.713c-0.198-0.728-0.395-1.451-0.593-2.179C28.873,48.139,28.517,48.159,28.313,48.073L28.313,48.073z M96.014,43.682c0.086,0.218,0.254,0.58,0.435,0.712c0.086,0.063,0.132,0.04,0.198,0.119c1.31,0.113,1.842-2.143,1.308-3.442c-0.095-0.225-0.517-0.885-0.911-0.633h-0.08c0.026-0.069,0.01-0.038,0.04-0.08c-0.001-0.188-0.021-0.25-0.077-0.356c-0.08-0.013-0.156-0.026-0.238-0.038c-0.039,0.031-0.01,0.014-0.078,0.038c0.027,0.24,0.111,0.247,0.119,0.514C96.09,41.099,95.545,42.497,96.014,43.682z M96.446,41.585c0.088-0.213,0.265-0.35,0.396-0.515c0.082-0.015,0.075-0.01,0.117-0.04c0.301-0.001,0.385,0.057,0.555,0.159c0.301,0.711,0.346,1.954-0.156,2.494c-0.077,0.085-0.229,0.116-0.315,0.197C96.214,43.817,96.146,42.305,96.446,41.585L96.446,41.585z M78.092,57.168c-0.445-0.273-0.507-1.675-0.673-2.294c-0.327-1.215-0.483-2.489-0.831-3.72c-0.223-0.788-0.523-1.605-0.435-2.572c0.139-0.138,0.231-0.32,0.396-0.436c0.223-0.154,0.58-0.229,0.752-0.436c0.027-0.051-0.019-0.128-0.041-0.238c-0.459,0.074-0.879,0.35-1.267,0.515c-0.792,0.337-1.567,0.536-2.373,0.87c-0.252,0.104-0.515,0.282-0.833,0.315v0.238c0.027,0.014,0.055,0.025,0.08,0.04c0.042,0.045,1.033-0.392,1.346-0.118c0.356,0.125,0.311,0.59,0.514,0.872c-0.061,0.614-0.672,1.558-0.912,2.097c-0.58,1.326-1.17,2.592-1.816,3.836c-0.248,0.477-0.543,1.334-0.871,1.701v0.039c-0.216-0.296-0.199-1.051-0.314-1.462c-0.353-1.235-0.578-2.591-0.951-3.798c-0.068-0.23-0.305-1.279-0.156-1.503c0.051-0.546,0.822-0.785,1.266-0.95c-0.012-0.092-0.024-0.186-0.039-0.277c-0.701,0.105-1.429,0.479-2.058,0.713c-0.595,0.223-1.14,0.313-1.741,0.516c-0.298,0.102-0.636,0.275-0.986,0.314v0.041h-0.041c0.015,0.112,0.025,0.172,0.078,0.237c0.162,0.107,1.03-0.352,1.386-0.077c0.557,0.19,0.573,1.075,0.752,1.66c0.481,1.579,0.728,3.327,1.187,4.947c0.115,0.404,0.391,1.686,0.119,2.018c-0.148,0.439-0.885,0.615-1.306,0.791c0.014,0.08,0.024,0.159,0.036,0.237c0.609-0.09,1.162-0.373,1.707-0.56c1.063-0.354,2.066-0.65,3.089-1.029c-0.017-0.092-0.027-0.186-0.041-0.275c-0.437,0.116-0.773,0.248-1.386,0.236c-0.08-0.068-0.157-0.133-0.235-0.199c-0.067-0.21-0.134-0.422-0.199-0.632c0.043-0.499,0.683-1.421,0.91-1.86c0.673-1.293,1.262-2.6,1.856-3.955c0.229-0.519,0.754-1.275,0.832-1.857c0.184,0.111,0.133,0.438,0.197,0.672c0.135,0.475,0.211,0.98,0.355,1.503c0.281,1,0.391,2.075,0.673,3.126c0.104,0.387,0.261,1.048,0.08,1.464c-0.179,0.404-0.841,0.673-1.267,0.83c0.017,0.084,0.037,0.183,0.08,0.238c0.004,0.007,0.906-0.288,1.064-0.354c1.104-0.471,2.236-0.959,3.361-1.386c-0.015-0.093-0.024-0.187-0.039-0.274C79.117,57.043,78.477,57.407,78.092,57.168L78.092,57.168z M96.803,60.498c-0.143,0.13-0.354,0.163-0.514,0.277c-0.501,0.359-1.025,0.962-1.385,1.463c-0.288,0.402-0.534,0.843-0.791,1.268c-0.112,0.188-0.137,0.402-0.277,0.553v0.08c0.346-0.059,0.549-0.283,0.792-0.436c0.659-0.408,1.249-0.781,1.858-1.225c0.295-0.217,0.515-0.551,0.83-0.754c0.029-0.473,0.125-0.844-0.077-1.188C97.115,60.512,96.975,60.496,96.803,60.498z M96.329,61.921c-0.239,0.177-0.47,0.423-0.712,0.595c-0.208,0.146-0.458,0.224-0.633,0.396h-0.04c0.13-0.408,0.817-1.107,1.146-1.344c0.17-0.124,0.383-0.157,0.557-0.279h0.156c0.036,0.046,0.034,0.044,0.08,0.08C96.846,61.667,96.523,61.774,96.329,61.921L96.329,61.921z M10.825,63.465c-0.166-0.502-0.278-0.99-0.435-1.465c-0.079-0.246-0.062-0.525-0.199-0.713v-0.118c0.269,0.097,0.679,0.087,0.911,0.238h0.201c-0.045-0.206-0.086-0.552-0.201-0.713c-0.12-0.195-0.886-0.197-1.106-0.354c-0.312-0.244-0.607-0.947-0.832-1.307c-0.56-0.887-1.302-1.832-2.137-2.453c-0.443-0.329-0.751-0.671-1.544-0.673c-0.092,0.065-0.185,0.132-0.276,0.198c-0.178,0.789,0.139,2.248,0.592,2.611v0.078c-0.189-0.051-0.393-0.152-0.514-0.275h-0.04c0.007,0.227,0.051,0.522,0.158,0.672c0.046,0.195,0.362,0.354,0.554,0.396c0.248,1.037,0.592,2.101,0.95,3.05c0.289,0.758,0.436,1.48,0.75,2.213c0.155,0.356,0.522,0.617,0.634,0.99h0.117c-0.089-0.334-0.271-0.646-0.394-0.949c-0.364-0.875-0.653-1.804-0.952-2.688C6.868,61.62,6.734,61.057,6.548,60.5c-0.069-0.21-0.049-0.427-0.158-0.595v-0.039c0.269,0.049,0.43,0.188,0.634,0.276c0.461,0.201,0.903,0.277,1.385,0.476c0.353,0.146,0.796,0.347,1.228,0.396c0.048,0.359,0.253,1.301,0.435,1.545v0.117c-0.602-0.412-0.589-1-1.663-0.91c-0.054,0.063-0.128,0.117-0.197,0.158c-0.098,0.244-0.104,0.646,0,0.909c0.257,0.646,1.072,1.991,1.741,2.179c0.257,0.184,0.634-0.043,0.75-0.24c0.242,0.127,0.293,0.682,0.395,0.951c0.212,0.558,0.522,1.289,1.031,1.543v0.041h0.083c-0.066-0.447-0.318-0.851-0.475-1.229C11.387,65.223,11.113,64.324,10.825,63.465L10.825,63.465z M9.678,60.26C9.26,60.23,8.905,60.067,8.57,59.945c-0.894-0.332-1.703-0.615-2.492-0.991c-0.095-0.358-0.76-1.644-0.396-2.095c0.026-0.04,0.053-0.081,0.079-0.12c0.081-0.019,0.077-0.011,0.119-0.039c1.219,0.146,2.442,1.629,3.046,2.452c0.236,0.32,0.43,0.799,0.752,1.029V60.26L9.678,60.26z M10.311,63.701c-0.12,0.146-0.237,0.291-0.356,0.436c-0.105,0.078-0.223,0.109-0.316,0.198c-0.68-0.021-0.704-0.686-0.989-1.108c0.005-0.389,0.152-0.39,0.315-0.594c0.092-0.007,0.112-0.007,0.158-0.037c0.614,0.004,0.753,0.278,1.109,0.515C10.29,63.344,10.327,63.445,10.311,63.701L10.311,63.701z M33.578,69.794c-0.165-0.271-0.49-0.342-0.713-0.554c-0.069-0.023-0.04-0.007-0.079-0.039c0.51-0.264,1.053-0.555,1.583-0.79c0.142,0.158,0.801,0.792,1.029,0.671c0.04-0.012,0.079-0.023,0.118-0.038c-0.013-0.224-0.025-0.448-0.04-0.673c-0.499-0.498-1.234-0.91-2.059-1.066v0.039h-0.039c0.093,0.273,0.398,0.534,0.636,0.672v0.119c-0.469,0.068-0.885,0.295-1.307,0.437c-0.289,0.093-0.638,0.08-0.873,0.235h-0.117c0.171-0.479,0.737-0.871,1.028-1.267c0.576-0.776,1.033-1.728,1.94-2.176c-0.024-0.365-1.076-1.12-1.464-0.871c-0.097,0.051-0.029-0.021-0.079,0.078c-0.059,0.144,0.137,0.321,0.079,0.554c-0.076,0.305-0.831,1.74-1.029,1.9v0.041c-0.408-0.139-0.718-0.523-1.107-0.713c0.069-0.364,0.375-0.644,0.554-0.91c0.453-0.684,0.816-1.335,1.503-1.782c-0.006-0.526-0.855-1.075-1.425-1.065c0.002,0.242,0.125,0.379,0.08,0.592c-0.14,0.646-0.435,1.297-0.672,1.861c-0.156,0.364-0.226,0.799-0.476,1.065c-0.054,0.03-0.492-0.006-0.594-0.077c-0.149-0.002-0.298,0.005-0.394,0.038v0.079c0.666,0.645,1.387,0.865,2.295,1.268c-0.126,0.655-0.786,1.092-1.108,1.584c-0.166,0-0.3-0.011-0.395-0.08c-0.091,0.017-0.098,0.021-0.158,0.041c0.016,0.582,0.5,1.077,0.987,1.188c0.327-0.366,0.737-0.543,1.228-0.751c0.449,0.468,0.578,1.137,0.751,1.897c0.075,0.332-0.047,0.697,0.04,0.988c0.152,0.514,0.426,0.667,0.672,1.027h0.277c0.174-0.93-0.253-1.832-0.475-2.571C33.71,70.43,33.644,70.111,33.578,69.794L33.578,69.794z M96.09,63.108c-0.238,0.202-0.57,0.296-0.83,0.475c-0.4,0.282-0.758,0.659-1.146,0.95c-0.177,0.134-0.435,0.253-0.556,0.436c-0.199,0.299-0.16,0.806-0.396,1.067v0.157c0.314-0.114,0.464-0.483,0.713-0.672c0.307-0.23,0.563-0.536,0.87-0.754c0.192-0.133,0.411-0.207,0.594-0.355c0.125,0.023,0.115,0.037,0.199,0.081c-0.021,1.005-0.549,1.714-0.871,2.454c-0.093,0.215-0.121,0.551-0.276,0.71c-0.074,0.076-0.229,0.094-0.314,0.157c-0.264,0.291-0.528,0.58-0.794,0.873c-0.25,0.344-0.365,0.803-0.632,1.146c-0.002,0.114-0.002,0.216,0.037,0.276c0.041,0.031,0.11,0.059,0.16,0.08c0.51-0.483,1.004-0.887,1.424-1.465c0.658-0.904,0.986-2.047,1.465-3.125c0.3-0.683,0.734-1.354,0.711-2.334c-0.047-0.045-0.084-0.102-0.117-0.158L96.09,63.108L96.09,63.108z M93.32,69.361V69.4h-0.04c0.069-0.475,0.43-0.606,0.596-0.952h0.079C93.904,68.842,93.605,69.194,93.32,69.361L93.32,69.361z M34.171,69.993c-0.08,0.342,0.76,1.106,1.027,1.308c0.133,0.1,0.312,0.328,0.515,0.235c0.104-0.008,0.136-0.019,0.199-0.04c0.046-0.105,0.115-0.24,0.039-0.354C35.93,70.645,34.64,70.088,34.171,69.993z M37.97,73.037c0.067,0.034,0.122,0.021,0.198-0.039c0.139-0.113,0.063-0.313,0.159-0.475c0.222-0.159,0.615-0.118,0.911-0.199c0.809-0.213,1.753-0.198,2.65-0.396c0.425-0.093,1.128,0.16,1.464-0.037c0.04-0.016,0.081-0.026,0.118-0.043c-0.019-0.517-1.009-0.737-1.545-0.588c-0.237,0.066-0.513,0.213-0.751,0.275c-0.185,0.014-0.37,0.027-0.555,0.038c-0.062-0.644-0.38-1.144-0.395-1.817c0.595-0.013,1.341-0.091,1.739-0.316c-0.008-0.2-0.045-0.2-0.118-0.314c-0.453-0.107-1.23-0.126-1.583,0.116c-0.1-0.004-0.147-0.004-0.197-0.039c-0.221-0.28-0.116-0.851-0.316-1.146v-0.158c0.426-0.092,1.122-0.168,1.345-0.475c0.031-0.041,0.014-0.011,0.039-0.078c-0.036-0.035-0.051-0.068-0.079-0.119c-0.619-0.156-0.887-0.049-1.423,0.158c-0.167-0.535,0.034-0.959-0.514-1.108c0.117-0.203,0.506-0.194,0.751-0.276c0.382-0.126,0.817-0.296,1.148-0.474c0.026-0.068,0.007-0.04,0.04-0.08c-0.022-0.2-0.078-0.193-0.159-0.316c-0.571-0.044-1.027,0.011-1.346,0.316h-0.076c0.047-0.295,0.231-0.718,0.394-0.949c0.112-0.162,0.318-0.14,0.396-0.356h0.04V64.1c-0.081-0.104-0.159-0.211-0.238-0.314c-0.186-0.13-0.454-0.143-0.632-0.279c-0.263-0.004-0.515-0.003-0.672,0.079c0.021,0.152,0.089,0.248,0.119,0.356c0.109,0.408-0.284,1.669-0.436,1.859c-0.123,0.154-1.551,0.672-1.939,0.555c-0.092-0.029-0.36-0.164-0.435-0.239c-0.032-0.039-0.015-0.008-0.04-0.077c0.561-0.527,0.965-1.702,1.741-1.939c0.014-0.064,0.027-0.131,0.041-0.196c-0.194-0.2-1.135-1.188-1.622-0.871c-0.04,0.014-0.079,0.022-0.117,0.038c0,0.338,0.168,0.593,0.078,0.949c-0.182,0.711-0.587,1.556-0.95,2.139c-0.218,0.35-0.693,0.729-0.712,1.229c0.646-0.064,0.802-0.731,1.304-0.912c0.146,0.135,0.29,0.267,0.436,0.396c0.207,0.311,0.168,0.778,0.276,1.186c0.185,0.856,0.371,1.715,0.554,2.571c0.025,0.425,0.052,0.845,0.08,1.269C37.246,72.28,37.561,72.945,37.97,73.037L37.97,73.037z M39.233,70.032c0.031,0.368,0.258,1.407,0.436,1.662c0.001,0.024,0.001,0.054,0.001,0.08c-0.477,0.102-0.973,0.239-1.504,0.237c-0.082-0.564-0.352-1.061-0.355-1.662C38.418,70.338,38.731,70.094,39.233,70.032z M36.939,66.75c0.063-0.107,1.113-0.273,1.228-0.199c0.42,0.195,0.27,0.813,0.514,1.188c-0.083,0.194-1.047,0.487-1.345,0.514C37.283,67.834,37.213,66.977,36.939,66.75L36.939,66.75z M38.76,68.253h0.04c0.076,0.36,0.119,0.978,0.317,1.267c-0.142,0.348-1.016,0.317-1.346,0.516c-0.138-0.083-0.32-1.076-0.316-1.346C37.757,68.662,38.541,68.402,38.76,68.253L38.76,68.253z M31.914,70.506c-0.06,0.135-0.053,0.354-0.117,0.514c-0.342,0.84-0.454,1.015,0.079,1.82c0.237,0,0.269-0.037,0.396-0.119C32.429,72.064,32.454,70.814,31.914,70.506L31.914,70.506z M77.023,70.744c-1.154-0.285-2.125,0.285-3.325,0.199c-0.114-0.121-0.2-0.19-0.275-0.356c-0.835,0.024-1.757,1.886-0.909,2.453c0.453,0.308,1.744,0.129,2.295,0c0.306-0.071,0.783-0.139,1.027,0.038c0.332,0.247,0.273,1.182,0.157,1.703c-0.132,0.975-0.265,1.951-0.396,2.929c-0.117,0.593-0.236,1.185-0.356,1.779c0.606-0.003,1.178-0.623,1.349-1.069c0.1-0.258,0.047-0.502,0.119-0.791c0.209-0.83,0.237-1.82,0.436-2.689c0.127-0.563,0.041-1.1,0.156-1.621c0.086-0.393,0.143-1.696,0.041-2.059C77.281,71.059,77.126,70.901,77.023,70.744z M22.857,82.695c-0.135-0.102-0.229-0.283-0.356-0.395c-0.473-0.42-1.029-0.826-1.543-1.188c-0.426-0.298-1.008-0.476-1.387-0.829c-0.01-0.086,0.123-0.296,0.041-0.516c-0.335-0.896-1.589-1.933-2.374-2.412c-0.363-0.225-0.972-0.328-1.305-0.555c-0.246-0.017-0.374-0.025-0.435,0.155c-0.097,0.218,0.209,0.521,0.315,0.675c0.271,0.381,0.581,0.826,0.95,1.104c0.276,0.209,0.591,0.392,0.83,0.635h0.119c-0.154-0.426-0.609-0.657-0.949-0.909c-0.311-0.229-0.449-0.632-0.712-0.909c0.021-0.125,0.035-0.115,0.08-0.199c1.093,0.009,1.802,1.012,2.294,1.662c0.22,0.291,0.571,0.461,0.594,0.951c-0.116,0-0.216,0-0.276-0.041h-0.119c0.188,0.522,0.824,0.479,1.267,0.754c0.888,0.549,1.603,1.409,2.373,2.094c0.262,0.234,0.719,0.466,0.791,0.873c-0.537-0.028-0.917-0.327-1.261-0.555c-0.614-0.4-1.597-1.1-2.019-1.662c-0.08-0.104-0.106-0.263-0.199-0.355c-0.109-0.111-0.261-0.145-0.355-0.275h-0.158c-0.039,0.41,0.407,0.705,0.671,0.948c0.819,0.75,1.696,1.442,2.73,1.979c0.373,0.191,1.053,0.521,1.465,0.275C23.874,83.434,23.227,82.975,22.857,82.695L22.857,82.695z M47.226,85.307c-2.014-1.379-4.985-2.775-8.427-2.689c-0.167,0.104-0.503,0.021-0.711,0.078c-0.288,0.076-0.464,0.223-0.672,0.355c-0.008,0.971,1.446,1.496,2.255,1.698c0.483,0.123,0.909-0.104,1.188-0.198c0.215-0.82-0.776-0.94-1.227-1.347h-0.081v-0.038c3.036-0.119,5.308,0.729,7.043,2.02c0.433,0.322,0.93,0.783,1.148,1.306c0.081,0.194,0.116,0.515,0,0.674c-0.159,0.44-0.685,0.401-1.188,0.515c-1.162,0.267-2.755-0.391-3.285-0.91c-0.108,0.189,0.049,0.48-0.118,0.674c-0.176,0.478-0.788,0.354-1.346,0.474c-0.917,0.199-2.353-0.271-2.888-0.632c-0.149-0.104-0.257-0.286-0.396-0.396c-0.007-0.103-0.018-0.136-0.041-0.199c0.081-0.073,0.177-0.187,0.237-0.275c1.139-0.085,1.718-0.027,2.376,0.596c-0.017,0.078-0.01,0.073-0.041,0.114c-0.074,0.152-0.245,0.17-0.474,0.161v0.074c0.417,0.004,0.593-0.059,0.83-0.197c0.013-0.079,0.027-0.159,0.04-0.236c-0.136-0.141-0.231-0.328-0.396-0.438c-0.65-0.426-1.991-0.641-2.729-0.156c-0.116,0.561,0.232,0.864,0.554,1.105c0.646,0.488,1.191,0.771,2.098,1.029c0.291,0.082,0.55,0.008,0.871,0.076c0.28,0.064,0.765,0.079,1.068,0c0.504-0.128,1.205-0.658,0.632-1.268v-0.037c0.299,0.109,0.544,0.402,0.831,0.556c0.761,0.397,2.021,0.726,3.167,0.476c0.562-0.125,1.143-0.125,1.303-0.635c0.179-0.277-0.068-0.668-0.156-0.826C48.322,86.151,47.836,85.721,47.226,85.307L47.226,85.307z M39.906,83.485c0.14,0.094,0.22,0.291,0.356,0.396c-0.003,0.1-0.004,0.148-0.04,0.199c-0.257,0.697-1.706,0.182-2.058-0.081c-0.11-0.08-0.153-0.248-0.236-0.354c0.015-0.082,0.01-0.076,0.041-0.116c0.108-0.306,0.417-0.203,0.671-0.354C39.142,83.174,39.596,83.274,39.906,83.485z M76.625,83.881h-0.396c-0.262,0.209-0.692,0.236-0.991,0.396c-0.263,0.141-0.581,0.332-0.829,0.515c-0.207,0.148-0.326,0.418-0.516,0.592c0.004,0.197,0.008,0.229,0.16,0.277c0.039,0.029,0.01,0.018,0.075,0.04c0.042-0.047,0.08-0.063,0.12-0.12c0.033-0.023-0.027-0.104-0.04-0.232c0.384-0.386,0.667-0.598,1.228-0.832c0.144-0.059,0.447-0.233,0.634-0.119h0.079c-0.026,0.391-0.916,1.591-1.188,1.781v0.115c0.729-0.188,1.215-1.643,1.702-2.174c-0.013-0.09-0.01-0.111-0.04-0.157L76.625,83.881L76.625,83.881z M73.459,86.809c-0.234,0.209-0.807,0.229-1.066,0.435h-0.041c0.104-0.149,0.291-0.213,0.396-0.354c0.076-0.104,0.107-0.226,0.197-0.315c-0.018-0.081-0.01-0.075-0.039-0.117v-0.08c-1.155-0.212-3.084,0.784-3.68,1.308c-0.155,0.135-0.248,0.336-0.396,0.477c0.003,0.111,0.016,0.168,0.039,0.236c0.701,0.047,2.016-0.383,2.174-0.949c0.031-0.025,0.012-0.002,0-0.04v-0.079c-0.479-0.027-1.124,0.075-1.422,0.355h-0.039c0.26-0.396,1.223-0.746,1.739-0.91c0.172-0.053,0.55-0.149,0.714-0.039c0.037,0.015,0.077,0.025,0.117,0.039c-0.094,0.396-0.657,0.838-1.029,0.949v0.08c0.607-0.141,1.163-0.416,1.7-0.634c0.368-0.149,0.786-0.188,1.108-0.396c0.229-0.149,1.008-1.207,1.068-1.504C74.086,85.409,74.012,86.313,73.459,86.809L73.459,86.809z M70.333,87.6v0.119c-0.075,0.049-0.129,0.156-0.198,0.196c-0.205,0.12-0.479,0.106-0.674,0.238c-0.09-0.011-0.109-0.009-0.156-0.041h-0.039C69.373,87.775,70.025,87.621,70.333,87.6L70.333,87.6z M53.835,91.317c0.015-0.037,0.025-0.078,0.039-0.117c-0.976-0.04-1.953-0.079-2.927-0.119c-0.123,0.082-0.312,0.035-0.475,0.079c-0.202,0.059-0.426,0.15-0.593,0.239c0.026,0.067,0.008,0.038,0.04,0.077c0.238,0.188,1.624,0.199,1.9,0h0.078v-0.077c-0.419-0.134-1.183,0.2-1.503,0h-0.041v-0.041c1.052-0.073,2.23-0.044,3.325-0.04c-0.105,0.072-0.328,0.051-0.436,0.119c-0.039,0.014-0.078,0.027-0.117,0.039v0.08c0.238,0.037,0.475,0.078,0.711,0.117c0.037,0.041-0.004,0.004,0.039,0.037c-0.35,0.233-1.254,0.139-1.581-0.037v-0.08c-0.178-0.082-0.991,0.084-1.148,0.117c-0.133,0.03-0.27-0.014-0.357,0.039c-0.165,0.01-0.181,0.029-0.276,0.079c0.022,0.128,0.035,0.115,0.08,0.198c0.255,0.06,0.696,0.064,0.987,0.156v-0.039h0.04v-0.039c-0.148-0.057-0.559-0.025-0.713-0.115h-0.079c0.132-0.104,1.425-0.278,1.663-0.119c0.067,0.023,0.039,0.007,0.079,0.039c-0.211,0.038-0.424,0.08-0.634,0.117c0.025,0.066,0.009,0.039,0.04,0.078c0.065,0.045,0.193,0.045,0.316,0.039c-0.04,0.074-0.054,0.109-0.119,0.158c0.013,0.023,0.027,0.051,0.04,0.078c0.561,0,1.031-0.057,1.502-0.156c0.28-0.062,0.624,0.052,0.831-0.08h0.317v-0.078c-0.539-0.002-1.885-0.055-2.215,0.158h-0.117c0.033-0.043-0.004-0.004,0.038-0.041c0.155-0.18,0.471-0.09,0.75-0.156c0.44-0.104,1.168-0.284,1.544,0c0.105,0.064,0.04-0.008,0.039,0.117c0.107-0.002,0.181-0.002,0.236-0.036h0.277v-0.081c-0.359-0.088-0.889-0.251-1.188-0.434C54.057,91.488,54.135,91.344,53.835,91.317L53.835,91.317z M13.635,18.359c-0.088,0.32-0.274,0.593-0.395,0.87c-0.268,0.613-0.507,1.225-0.751,1.822c-0.207,0.496-0.335,1.295-0.633,1.699v0.079c0.416-0.074,0.698-0.493,0.949-0.751c0.617-0.634,1.92-2.22,1.9-3.402c-0.062-0.061-0.119-0.162-0.159-0.237C14.3,18.38,13.982,18.353,13.635,18.359z M13.794,20.022c-0.181,0.298-0.281,0.592-0.476,0.871c-0.178,0.255-0.46,0.452-0.633,0.713h-0.041c0.051-0.302,0.214-0.546,0.319-0.792c0.235-0.561,0.396-1.118,0.671-1.621c0.152,0.003,0.268,0.015,0.356,0.078c0.095,0.052,0.028-0.018,0.079,0.08C14.15,19.548,13.89,19.862,13.794,20.022L13.794,20.022z M84.023,7.875c-0.414-0.416-0.729-0.938-1.147-1.346V6.49c-0.205,0.073-0.899,0.688-1.028,0.871c-0.25-0.095-0.391-0.365-0.594-0.514c-0.676-0.508-1.313-1.167-2.49-1.147c-0.148,0.115-0.367,0.118-0.556,0.197c-0.53,0.23-1.083,0.688-1.305,1.227c-0.249,0.602,0.004,1.491,0.196,1.939c0.392,0.904,1.03,1.667,1.582,2.414c0.457,0.615,0.973,1.252,1.819,1.464c0.956,0.238,1.422-0.884,1.781-1.308c0.37-0.435,1.182-0.539,1.464-1.107c0.104-0.207,0.034-0.615-0.039-0.791c-0.18-0.426-1.066-1.622-1.425-1.859c0.024-0.239,0.135-0.247,0.235-0.396c0.248,0.121,0.338,0.471,0.516,0.673c0.227,0.258,0.546,0.396,0.791,0.632c0.378,0.003,0.604-0.094,0.79-0.277h0.041C84.561,8.243,84.212,8.06,84.023,7.875L84.023,7.875z M81.77,12.148c-0.699,0.165-1.047-0.293-1.424-0.673c-0.938-0.935-1.57-2.093-2.298-3.244c-0.247-0.396-0.885-1.134-0.554-1.702h0.156c0.199,0.299,0.539,0.507,0.754,0.792c0.591,0.784,1.313,1.469,1.898,2.255c0.359,0.485,0.758,0.94,1.106,1.424c0.178,0.249,0.315,0.565,0.556,0.751C81.924,11.931,81.848,12.015,81.77,12.148L81.77,12.148z M82.361,9.339c0.32,0.439,0.755,0.688,0.751,1.463c-0.122,0.116-0.157,0.224-0.356,0.276c-0.039,0.032-0.011,0.015-0.078,0.041c-0.56-0.932-1.367-1.711-2.017-2.573c-0.212-0.282-0.541-0.511-0.752-0.791c-0.362-0.48-0.793-0.864-1.188-1.305c-0.113-0.131-0.168-0.257-0.313-0.357c0.033-0.086,0.031-0.057,0.076-0.118c0.672,0.006,0.994,0.458,1.386,0.753C80.837,7.453,81.648,8.354,82.361,9.339L82.361,9.339z"/><radialGradient id="SVGID_43_" cx="251.8086" cy="-408.3613" r="72.7509" gradientTransform="matrix(1 0 0 -1 -213.7637 -386.502)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000" stop-opacity="0"/><stop offset=".8022" stop-color="#000" stop-opacity=".08"/><stop offset="1" stop-color="#000" stop-opacity=".3882"/></radialGradient><path style="&st15;" d="M49.885,17.037c0.014-0.606-0.392-1.27-0.392-1.27l-0.025-0.058c0,0-0.487-0.949-1.302-1.228c-0.815-0.278-1.478,0.342-1.478,0.342s-0.114,0.131-0.429,0.494c-0.313,0.364-0.507,0.666-1.198,0.938c-0.692,0.271-1.379,0.204-1.743,0.033c-0.364-0.172-0.457-0.537-0.457-0.537s-0.229-0.722-0.313-1.049c-0.086-0.331-0.309-1.694-0.309-1.694s-0.491-2.747-0.534-3.304c0,0,1.475-0.126,3.687-0.775c2.299-0.673,3.043-1.206,3.043-1.206s-0.432-0.156-0.484-0.662c-0.051-0.507-0.089-1.19-0.089-1.19s-0.089-0.5,0.483-1.139c0.571-0.64,1.354-0.863,1.762-0.953c0.41-0.089,1.281-0.17,2.093-0.134c0.812,0.038,1.267,0.112,1.593,0.291c0.328,0.178,0.357,0.61,0.357,0.61l-0.008,1.146c0,0-0.037,0.402,0.261,0.529c0,0,0.505,0.305,2.196,0.133c0,0,0.72-0.126,1.846-0.46c1.125-0.335,4.129-1.229,4.554-1.341c0.425-0.111,0.953-0.291,1.646-0.469c0.691-0.179,2.039-0.626,2.308-0.73c0.271-0.104,1.812-0.618,2.927-0.81c1.115-0.195,2.227-0.186,2.813,0.149c0,0,0.357,0.304,0.521,0.662c0.163,0.358,0.478,0.863,0.923,1.088c0.454,0.227,0.752,0.371,1.875,0.273c0,0,0.022-0.096-0.395-0.37c-0.417-0.277-0.991-0.701-0.991-0.701S74.29,3.4,74.215,3.198c-0.072-0.202-0.043-0.306-0.043-0.306l0.877-1.406c0,0,0-0.172,0.508-0.238c0.506-0.067,1.071-0.134,1.74-0.313c0.67-0.178,0.788-0.312,0.788-0.312l0.58,0.178c0,0,3.546,2.853,4.655,3.583l0.199-0.239c0,0,0.436,0.018,0.826,0.172c0.394,0.154,0.979,0.562,0.979,0.562s1.612,1.31,2.071,2.2l0.223,0.679l-0.102,0.161c0,0,0.918,1.307,2.096,2.602c0,0,1.227,1.664,1.689,2.09c0,0-0.108-0.399-0.201-0.849l0.336-0.226l0.203-0.144l0.617,0.259c3.573,4.811,6.432,10.424,8.141,16.328l-0.12,0.484l0.395,0.501c1.128,4.212,1.728,8.643,1.728,13.211c0,1.122-0.036,2.236-0.107,3.339l-0.304,0.511l0.225,0.555c-2.231,26.1-24.124,46.584-50.801,46.584c-18.502,0-34.702-9.854-43.637-24.6L7.674,68.2l-0.205-0.153c-3.387-5.742-5.682-12.205-6.595-19.103l0.212-0.525L0.75,47.936c-0.213-1.892-0.322-3.812-0.322-5.756c0-2.985,0.255-5.909,0.748-8.755l0.25-0.562l-0.087-0.328c1.157-6.048,3.383-11.716,6.474-16.799l0.684-0.384l0.081,0.032c0,0,0.233-0.169,0.354-0.217l0.076-0.023c0,0,1.179-1.971,1.625-2.601c0,0,0.542-0.348,0.745-0.407c0,0,0.124-0.016,0.189,0.076c0,0,0.496-0.432,1.699-2.054c0.004-0.005,0.007-0.011,0.012-0.017c0,0-0.114-0.076-0.131-0.174c-0.018-0.097,0.108-0.591,0.173-0.717c0.065-0.126,0.108-0.156,0.108-0.156s1.722-2.032,3.151-3.238c0,0,0.26-0.202,0.678-0.25c0,0,1.472-0.613,3.264-2.184c0,0,0.051-0.289,0.478-0.858c0.428-0.57,1.456-1.163,2.222-1.337c0.764-0.174,0.896-0.038,0.896-0.038l0.064,0.065l0.515,0.766c0,0,0.565-0.316,1.413-0.604c0.847-0.289,0.979-0.262,0.979-0.262l0.825,1.336l-0.987,2c0,0-0.644,1.421-1.655,2.185c0,0-0.472,0.284-1.12,0.127c-0.648-0.157-1.072,0.333-1.072,0.333l-0.17,0.14c0,0,0.14-0.024,0.346-0.103c0,0,0.158,0.065,0.274,0.223c0.114,0.158,0.913,1.175,0.913,1.175s0.005,0.837-0.415,1.938c-0.419,1.1-1.467,2.891-1.467,2.891s-0.733,1.424-1.075,2.253c-0.342,0.829-0.515,1.765-0.488,2.262c0,0,0.187,0.062,0.707-0.202c0.655-0.332,1.083,0.027,1.083,0.027s0.719,0.53,1.041,0.881c0.262,0.289,0.802,1.765,0.209,3.224c0,0-0.402,1.008-1.377,1.724c0,0-0.216,0.332-1.529,0.174c-0.368-0.043-0.585-0.276-1.372-0.2c-0.785,0.077-1.231,0.815-1.231,0.815l0.013-0.024c-0.692,0.999-1.154,2.458-1.154,2.458l-0.057,0.165c0,0-0.241,0.509-0.292,1.752c-0.053,1.284,0.284,3.109,0.284,3.109s7.876-1.387,9.88-0.055l0.58,0.532c0,0,0.046,0.174-0.031,0.376c-0.08,0.204-0.375,0.673-0.987,1.113c-0.611,0.438-1.222,1.583-0.313,2.304c1.034,0.818,1.691,0.766,3.43,0.468c1.74-0.297,2.898-1.269,2.898-1.269s0.972-0.72,0.783-1.628c-0.188-0.908-1.017-1.189-1.017-1.189s-0.658-0.423-0.141-1.238c0,0,0.141-0.689,2.553-1.316c2.414-0.626,6.812-1.52,10.556-1.989c0,0-2.539-8.223-0.737-9.289c0,0,0.438-0.296,1.224-0.408l0.721-0.037c0.131-0.027,0.344,0.005,0.796,0.045c0.452,0.038,1.001,0.076,1.678-0.441c0.676-0.519,0.697-0.819,0.697-0.819"/></svg> \ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/basic-rect.html b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/basic-rect.html index e36d778..6cacec0 100644 --- a/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/basic-rect.html +++ b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/basic-rect.html
@@ -1,10 +1,9 @@ <!DOCTYPE html> -<html class=reftest-wait> +<html> <title>Canvas.drawElement: green rect</title> <link rel="help" href="https://github.com/WICG/html-in-canvas"> <link rel="author" href="mailto:vmpstr@chromium.org"> <link rel="match" href="basic-rect-ref.html"> -<script src="/common/reftest-wait.js"></script> <style> #child { width: 100px; @@ -23,7 +22,6 @@ <script> function runTest() { canvas.getContext("2d").drawElement(child, 20, 30); - requestAnimationFrame(takeScreenshot); } onload = () => runTest();
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-foreign-object.html b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-foreign-object.html new file mode 100644 index 0000000..10f6073 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-foreign-object.html
@@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html> +<title>Canvas.drawElement: SVG foreignObject green rect</title> +<link rel="help" href="https://github.com/WICG/html-in-canvas"> +<link rel="author" href="mailto:schenney@chromium.org"> +<link rel="match" href="basic-rect-ref.html"> +<style> +#canvas { + background: grey; +} +</style> + +<canvas id=canvas width="200" height="200" layoutsubtree=true> + <svg id=child width="200px" height="200px"> + <foreignElement x="50" y="50" width="200" height="200"> + <div style="width: 100px; height: 100px; background: green;"></div> + </foreignElement> + </svg> +</canvas> + +<script> +function runTest() { + canvas.getContext("2d").drawElement(child, 20, 30); +} + +onload = () => runTest(); + +</script> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-rect.html b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-rect.html new file mode 100644 index 0000000..235e6ce --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/html/canvas/drawElement/svg-rect.html
@@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<title>Canvas.drawElement: SVG green rect</title> +<link rel="help" href="https://github.com/WICG/html-in-canvas"> +<link rel="author" href="mailto:schenney@chromium.org"> +<link rel="match" href="basic-rect-ref.html"> +<style> +#canvas { + background: grey; +} +</style> + +<canvas id=canvas width="200" height="200" layoutsubtree=true> + <svg id=child width="200px" height="200px"> + <rect fill="green" x="0" y="0" width="100" height="100"/> + </svg> +</canvas> + +<script> +function runTest() { + canvas.getContext("2d").drawElement(child, 20, 30); +} + +onload = () => runTest(); + +</script> +</html>
diff --git a/third_party/boringssl/src b/third_party/boringssl/src index c5795a3..9295969 160000 --- a/third_party/boringssl/src +++ b/third_party/boringssl/src
@@ -1 +1 @@ -Subproject commit c5795a328880eadb879088fc59cd0087edc8dc20 +Subproject commit 9295969e1dad2c31d0d99481734c1c68dcbc6403
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src index a6f7c1a..689e2e2 160000 --- a/third_party/compiler-rt/src +++ b/third_party/compiler-rt/src
@@ -1 +1 @@ -Subproject commit a6f7c1ae19c301452a66fdfeceef4d7c47d86107 +Subproject commit 689e2e2268b19ff47d6a7e3a0cedd6d5ac19d0a7
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 137e867..c67d1c72 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 137e867406255293753ba0fa2f8cd95f80b01771 +Subproject commit c67d1c724ab9dcf466346f2e95b92bd0012982bc
diff --git a/third_party/lit/v3_0/BUILD.gn b/third_party/lit/v3_0/BUILD.gn index 60378312..bf300e3 100644 --- a/third_party/lit/v3_0/BUILD.gn +++ b/third_party/lit/v3_0/BUILD.gn
@@ -35,6 +35,7 @@ "//chrome/browser/resources/discards:build_ts", "//chrome/browser/resources/downloads:build_ts", "//chrome/browser/resources/extensions:build_ts", + "//chrome/browser/resources/extensions_zero_state_promo:build_ts", "//chrome/browser/resources/family_link_user_internals:build_ts", "//chrome/browser/resources/feedback:build_ts", "//chrome/browser/resources/history:build_ts",
diff --git a/third_party/perfetto b/third_party/perfetto index 82c60ea..dd35b29 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 82c60ea0d2b453aded71857c93b9e6a2637da79b +Subproject commit dd35b295cd359ba094404218414955f961a0d6ae
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock index 333b0a2..79df612 100644 --- a/third_party/rust/chromium_crates_io/Cargo.lock +++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -128,7 +128,7 @@ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clap_builder", @@ -136,7 +136,7 @@ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anstyle", @@ -228,7 +228,7 @@ [[package]] name = "derivre" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow", @@ -657,7 +657,7 @@ [[package]] name = "llguidance" -version = "0.7.19" +version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "anyhow",
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml index d5b880e..a5a7dff 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/config.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -80,10 +80,10 @@ [policy."cfg-if:1.0.0"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."clap:4.5.37"] +[policy."clap:4.5.38"] criteria = ["crypto-safe", "safe-to-run"] -[policy."clap_builder:4.5.37"] +[policy."clap_builder:4.5.38"] criteria = ["crypto-safe", "safe-to-run"] [policy."clap_lex:0.7.4"] @@ -113,7 +113,7 @@ [policy."derive_arbitrary:1.4.1"] criteria = [] -[policy."derivre:0.3.7"] +[policy."derivre:0.3.8"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."diplomat-runtime:0.11.0"] @@ -254,7 +254,7 @@ [policy."litemap:0.8.0"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."llguidance:0.7.19"] +[policy."llguidance:0.7.21"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."log:0.4.27"]
diff --git a/third_party/rust/chromium_crates_io/vendor/clap-v4/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/clap-v4/.cargo_vcs_info.json index 5c2f1a3..e078b04 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap-v4/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/clap-v4/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "f209bce2203498e743b171b7ac64f0fb9d3ae590" + "sha1": "6b12a81bafe7b9d013b06981f520ab4c70da5510" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.lock index e25d08e..a8d844c 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.lock
@@ -134,7 +134,7 @@ [[package]] name = "clap" -version = "4.5.37" +version = "4.5.38" dependencies = [ "automod", "clap-cargo", @@ -159,9 +159,9 @@ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2" +checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" dependencies = [ "anstream", "anstyle", @@ -331,9 +331,9 @@ [[package]] name = "jiff" -version = "0.2.6" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f33145a5cbea837164362c7bd596106eb7c5198f97d1ba6f6ebb3223952e488" +checksum = "27e77966151130221b079bcec80f1f34a9e414fa489d99152a201c07fd2182bc" dependencies = [ "jiff-static", "jiff-tzdb-platform", @@ -341,14 +341,14 @@ "portable-atomic", "portable-atomic-util", "serde", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "jiff-static" -version = "0.2.6" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ce13c40ec6956157a3635d97a1ee2df323b263f09ea14165131289cb0f5c19" +checksum = "97265751f8a9a4228476f2fc17874a9e7e70e96b893368e42619880fe143b48a" dependencies = [ "proc-macro2", "quote",
diff --git a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml index 293c0ab..683bfde 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.74" name = "clap" -version = "4.5.37" +version = "4.5.38" build = false include = [ "build.rs", @@ -510,7 +510,7 @@ required-features = ["derive"] [dependencies.clap_builder] -version = "=4.5.37" +version = "=4.5.38" default-features = false [dependencies.clap_derive]
diff --git a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml.orig index d55d95f9..e3c58a8 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/clap-v4/Cargo.toml.orig
@@ -99,7 +99,7 @@ [package] name = "clap" -version = "4.5.37" +version = "4.5.38" description = "A simple to use, efficient, and full-featured Command Line Argument Parser" categories = ["command-line-interface"] keywords = [ @@ -176,7 +176,7 @@ bench = false [dependencies] -clap_builder = { path = "./clap_builder", version = "=4.5.37", default-features = false } +clap_builder = { path = "./clap_builder", version = "=4.5.38", default-features = false } clap_derive = { path = "./clap_derive", version = "=4.5.32", optional = true } [dev-dependencies]
diff --git a/third_party/rust/chromium_crates_io/vendor/clap-v4/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/clap-v4/src/lib.rs index fa4603c..fe66d61b 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap-v4/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/clap-v4/src/lib.rs
@@ -7,11 +7,11 @@ //! //! Quick Links: //! - Derive [tutorial][_derive::_tutorial] and [reference][_derive] -//! - Builder [tutorial][_tutorial] and [reference](index.html) +//! - Builder [tutorial][_tutorial] and [reference][Command] //! - [Cookbook][_cookbook] //! - [FAQ][_faq] //! - [Discussions](https://github.com/clap-rs/clap/discussions) -//! - [CHANGELOG](https://github.com/clap-rs/clap/blob/v4.5.37/CHANGELOG.md) (includes major version migration +//! - [CHANGELOG](https://github.com/clap-rs/clap/blob/v4.5.38/CHANGELOG.md) (includes major version migration //! guides) //! //! ## Aspirations
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/.cargo_vcs_info.json index ad9432a..b9baf347 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "f209bce2203498e743b171b7ac64f0fb9d3ae590" + "sha1": "6b12a81bafe7b9d013b06981f520ab4c70da5510" }, "path_in_vcs": "clap_builder" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.lock index a668c8d9..2a74c74 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.lock
@@ -101,7 +101,7 @@ [[package]] name = "clap_builder" -version = "4.5.37" +version = "4.5.38" dependencies = [ "anstream", "anstyle",
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml index b0be359..2a06164a 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.74" name = "clap_builder" -version = "4.5.37" +version = "4.5.38" build = false include = [ "build.rs",
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml.orig index 30a10c33..1277d71 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/Cargo.toml.orig
@@ -1,6 +1,6 @@ [package] name = "clap_builder" -version = "4.5.37" +version = "4.5.38" description = "A simple to use, efficient, and full-featured Command Line Argument Parser" categories = ["command-line-interface"] keywords = [
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/builder/action.rs b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/builder/action.rs index 0d2ca7b..37214f20 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/builder/action.rs +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/builder/action.rs
@@ -341,11 +341,11 @@ /// .action(clap::ArgAction::Version) /// ); /// - /// // Existing help still exists + /// // Existing version still exists /// let err = cmd.clone().try_get_matches_from(["mycmd", "--version"]).unwrap_err(); /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion); /// - /// // New help available + /// // New version available /// let err = cmd.try_get_matches_from(["mycmd", "--special-version"]).unwrap_err(); /// assert_eq!(err.kind(), clap::error::ErrorKind::DisplayVersion); /// ```
diff --git a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/output/help_template.rs b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/output/help_template.rs index 98d9aad9..801fcbf 100644 --- a/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/output/help_template.rs +++ b/third_party/rust/chromium_crates_io/vendor/clap_builder-v4/src/output/help_template.rs
@@ -789,7 +789,7 @@ .aliases .iter() .filter(|&als| als.1) // visible - .map(|als| als.0.as_str()) // name + .map(|als| format!("--{}", als.0)) // name .collect::<Vec<_>>() .join(", "); if !als.is_empty() { @@ -801,7 +801,7 @@ .short_aliases .iter() .filter(|&als| als.1) // visible - .map(|&als| als.0.to_string()) // name + .map(|&als| format!("-{}", als.0)) // name .collect::<Vec<_>>() .join(", "); if !als.is_empty() {
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.cargo_vcs_info.json index c3fab1a..c233376 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "97bc7eb6e6f449423f67c98b2caf7afb638c9b39" + "sha1": "c68f60791d191a05131796771f38c2e904417074" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.github/workflows/rust.yml b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.github/workflows/rust.yml index 536b4d56..07d6f15f 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.github/workflows/rust.yml +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/.github/workflows/rust.yml
@@ -13,9 +13,7 @@ jobs: build: - runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - run: cargo fmt --check @@ -25,6 +23,19 @@ - name: Run tests run: cargo test --verbose + msrv: + name: MSRV Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Rust + uses: dtolnay/rust-toolchain@1.80.0 + with: + components: clippy + - run: cargo build --verbose --locked + - run: cargo test --verbose --locked + - run: cargo clippy --all-targets --all-features -- -D warnings + crates: name: Upload to crates.io runs-on: ubuntu-latest
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.lock index 8306e57c..6387a12 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.lock
@@ -56,7 +56,7 @@ [[package]] name = "derivre" -version = "0.3.7" +version = "0.3.8" dependencies = [ "ahash", "anyhow",
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml index 4cce52c7..75f6987 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml
@@ -11,8 +11,9 @@ [package] edition = "2021" +rust-version = "1.80.0" name = "derivre" -version = "0.3.7" +version = "0.3.8" authors = ["Michal Moskal <michal@moskal.me>"] build = false exclude = ["scripts/*"]
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml.orig index 2f08783b..f48c751 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/Cargo.toml.orig
@@ -1,12 +1,13 @@ [package] name = "derivre" -version = "0.3.7" +version = "0.3.8" edition = "2021" authors = ["Michal Moskal <michal@moskal.me>"] license = "MIT" description = "A derivative-based regular expression engine" repository = "https://github.com/microsoft/derivre" exclude = ["scripts/*"] +rust-version = "1.80.0" [lib] name = "derivre"
diff --git a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/src/syntax.rs b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/src/syntax.rs index a36fadc..17588a9 100644 --- a/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/src/syntax.rs +++ b/third_party/rust/chromium_crates_io/vendor/derivre-v0_3/src/syntax.rs
@@ -118,7 +118,7 @@ if !self.any_unicode.is_valid() && ranges.len() == 1 - && ranges[0].start() == char::MIN + && ranges[0].start() == '\0' && ranges[0].end() == char::MAX { self.any_unicode = r; @@ -126,7 +126,7 @@ if !self.any_unicode_non_nl.is_valid() && ranges.len() == 2 - && ranges[0].start() == char::MIN + && ranges[0].start() == '\0' && ranges[0].end() == (b'\n' - 1) as char && ranges[1].start() == (b'\n' + 1) as char && ranges[1].end() == char::MAX
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/.cargo_vcs_info.json index b0f9ab2a..ae47b38 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "22a09129eaa895ea2a746023a05834fcda597f4d", + "sha1": "5f43908e1cbebdb713a83f309e807f37fc1b4ed4", "dirty": true }, "path_in_vcs": "parser"
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.lock index 9714b1e..aa8cd95f 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.lock
@@ -126,9 +126,9 @@ [[package]] name = "derivre" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a605f30e6a1460a323cc4de7bc62dea81df1d9d67eb92194d3a983a8a9601c4" +checksum = "786c7c65c4ef0c7deb05de3005e01991612a8f09fe0844fc0969c68b90468ba8" dependencies = [ "ahash", "anyhow", @@ -434,7 +434,7 @@ [[package]] name = "llguidance" -version = "0.7.19" +version = "0.7.21" dependencies = [ "anyhow", "derivre", @@ -816,9 +816,9 @@ [[package]] name = "toktrie" -version = "0.7.19" +version = "0.7.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69200397314cd578aa0623a5161342c44877ac2ebcea1e9d20e2f65120e81e8d" +checksum = "279e477cd582ba1b60765c07e34fea21eefd32f1862c223ff434f6c52498df1e" dependencies = [ "anyhow", "bytemuck",
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml index 39a65ed..95fe81b 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml
@@ -12,7 +12,7 @@ [package] edition = "2021" name = "llguidance" -version = "0.7.19" +version = "0.7.21" build = "build.rs" autolib = false autobins = false @@ -55,7 +55,7 @@ version = "1.0.95" [dependencies.derivre] -version = "=0.3.7" +version = "=0.3.8" features = ["compress"] default-features = false @@ -95,7 +95,7 @@ features = ["preserve_order"] [dependencies.toktrie] -version = "0.7.19" +version = "0.7.21" [dev-dependencies.regex] version = "1.11.1"
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml.orig index 13883167..839a8bc10 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/Cargo.toml.orig
@@ -1,14 +1,14 @@ [package] name = "llguidance" -version = "0.7.19" +version = "0.7.21" edition = "2021" license = "MIT" description = "Super-fast Structured Outputs" repository = "https://github.com/guidance-ai/llguidance" [dependencies] -toktrie = { version = "0.7.19" } -derivre = { version = "=0.3.7", default-features = false, features = ["compress"] } +toktrie = { version = "0.7.21" } +derivre = { version = "=0.3.8", default-features = false, features = ["compress"] } serde = { version = "1.0.217", features = ["derive"] } serde_json = { version = "1.0.138", features = ["preserve_order"] } anyhow = "1.0.95"
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/build.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/build.rs index ae7b955c0b..ec62ff1 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/build.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/build.rs
@@ -5,7 +5,7 @@ let required_vars = [ "CARGO", - "CARGO_MANIFEST_PATH", + // "CARGO_MANIFEST_PATH", "CARGO_PKG_NAME", "CARGO_PKG_VERSION", "OUT_DIR",
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/llguidance.h b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/llguidance.h index 06c2d0f..efd0167e 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/llguidance.h +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/llguidance.h
@@ -494,7 +494,7 @@ const uint32_t *llg_matcher_get_mask(struct LlgMatcher *matcher); /** - * Return pointer to the mask computed by llg_matcher_compute_mask(), if any. + * Return the size of the mask in bytes. */ size_t llg_matcher_get_mask_byte_size(struct LlgMatcher *matcher);
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/constraint.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/constraint.rs index 9b5d045e..8bdf2ef 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/constraint.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/constraint.rs
@@ -137,7 +137,7 @@ /// The splice is never returned when ff_tokens are disabled in InferenceCapabilities. /// After this returns, commit_token() must be called with the sampled token if any. pub fn compute_mask(&mut self) -> Result<&StepResult> { - panic_utils::catch_unwind(std::panic::AssertUnwindSafe(|| self.compute_mask_inner())) + self.catch_unwind(|s| s.compute_mask_inner()) .map(|_| &self.last_res) } @@ -185,6 +185,14 @@ self.parser.validate_tokens_raw(tokens) } + fn catch_unwind<F, R>(&mut self, f: F) -> Result<R> + where + F: FnOnce(&mut Self) -> Result<R>, + { + panic_utils::catch_unwind(std::panic::AssertUnwindSafe(|| f(self))) + .map_err(|e| anyhow::anyhow!(self.parser.augment_err(e))) + } + /// commit_token() is a top-level method in this file and is called by /// the LLInterpreter::commit_token(). /// @@ -194,9 +202,7 @@ /// It only returns 'STOP' if previous compute_mask() already returned 'STOP' /// (in which case there's little point calling commit_token()). pub fn commit_token(&mut self, sampled_token: Option<TokenId>) -> Result<CommitResult> { - panic_utils::catch_unwind(std::panic::AssertUnwindSafe(|| { - self.commit_token_inner(sampled_token) - })) + self.catch_unwind(|s| s.commit_token_inner(sampled_token)) } fn commit_token_inner(&mut self, sampled_token: Option<TokenId>) -> Result<CommitResult> {
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/ffi.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/ffi.rs index d48c438..7bd5350 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/ffi.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/ffi.rs
@@ -554,9 +554,12 @@ /// Check if constraint is stopped (cannot be extended further). #[no_mangle] pub extern "C" fn llg_is_stopped(cc: &LlgConstraint) -> bool { - cc.constraint - .as_ref() - .is_none_or(|c| c.step_result().is_stop()) + if let Some(c) = &cc.constraint { + c.step_result().is_stop() + } else { + // if there is no constraint, we consider it stopped + true + } } /// Compute mask for the next token sampling @@ -1102,7 +1105,7 @@ .map_or(std::ptr::null(), |m| m.as_ptr()) } -/// Return pointer to the mask computed by llg_matcher_compute_mask(), if any. +/// Return the size of the mask in bytes. #[no_mangle] pub extern "C" fn llg_matcher_get_mask_byte_size(matcher: &mut LlgMatcher) -> usize { matcher.mask_elts() * 4
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/json/formats.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/json/formats.rs index 05812a15..880581b 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/json/formats.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/json/formats.rs
@@ -27,9 +27,15 @@ "duration" => { r"P(?:(?P<dur_date>(?:(?P<dur_year>[0-9]+Y(?:[0-9]+M(?:[0-9]+D)?)?)|(?P<dur_month>[0-9]+M(?:[0-9]+D)?)|(?P<dur_day>[0-9]+D))(?:T(?:(?P<dur_hour>[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?)|(?P<dur_minute>[0-9]+M(?:[0-9]+S)?)|(?P<dur_second>[0-9]+S)))?)|(?P<dur_time>T(?:(?P<dur_hour2>[0-9]+H(?:[0-9]+M(?:[0-9]+S)?)?)|(?P<dur_minute2>[0-9]+M(?:[0-9]+S)?)|(?P<dur_second2>[0-9]+S)))|(?P<dur_week>[0-9]+W))" } - "email" => { - r"(?P<local_part>(?P<dot_string>[^\s@\.]+(\.[^\s@\.]+)*))@((?P<domain>(?P<sub_domain>[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)(\.(?P<sub_domain2>[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?))*)|\[(?P<ipv4>((([0-9])|(([1-9])[0-9]|(25[0-5]|(2[0-4]|(1)[0-9])[0-9])))\.){3}(([0-9])|(([1-9])[0-9]|(25[0-5]|(2[0-4]|(1)[0-9])[0-9]))))\])" - } + // https://www.rfc-editor.org/rfc/inline-errata/rfc5321.html 4.1.2 -> Mailbox + "email" => concat!( + r"(?P<local_part>(?P<dot_string>[a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+(\.[a-zA-Z0-9!#$%&'*+\-/=?\^_`{|}~]+)*))", + r"@(", + r"(?P<domain>(?P<sub_domain>[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)(\.(?P<sub_domain2>[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?))*)", + r"|", + r"\[(?P<ipv4>((([0-9])|(([1-9])[0-9]|(25[0-5]|(2[0-4]|(1)[0-9])[0-9])))\.){3}(([0-9])|(([1-9])[0-9]|(25[0-5]|(2[0-4]|(1)[0-9])[0-9]))))\]", + r")" + ), "hostname" => { r"[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*" }
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/matcher.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/matcher.rs index d5439d5..38df990 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/matcher.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/matcher.rs
@@ -1,4 +1,4 @@ -use anyhow::{anyhow, ensure, Result}; +use anyhow::{anyhow, bail, ensure, Result}; use toktrie::{SimpleVob, TokEnv, TokenId}; use crate::{api::StopReason, earley::ParserStats, panic_utils, TokenParser}; @@ -48,8 +48,9 @@ match r { Ok(r) => Ok(r), Err(e) => { - self.0 = MatcherState::Error(e.to_string()); - Err(e) + let msg = inner.parser.augment_err(e); + self.0 = MatcherState::Error(msg.clone()); + bail!(msg); } } }
diff --git a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/tokenparser.rs b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/tokenparser.rs index 1e97e74a..0ef203b 100644 --- a/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/tokenparser.rs +++ b/third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/src/tokenparser.rs
@@ -1,4 +1,4 @@ -use std::{hint::black_box, panic::AssertUnwindSafe, sync::Arc, time::Duration}; +use std::{fmt::Display, hint::black_box, panic::AssertUnwindSafe, sync::Arc, time::Duration}; use crate::{ api::{GrammarInit, ParserLimits, StopReason}, @@ -22,6 +22,9 @@ max_step_stats: ParserStats, eos_token: TokenId, + had_rollback: bool, + had_backtrack: bool, + is_accepting_cache: Option<bool>, ff_tokens_cache: Option<(Vec<TokenId>, Vec<u8>)>, stop_reason: StopReason, @@ -110,6 +113,8 @@ max_tokens_total: max_tokens, last_bias_time: Duration::from_secs(0), is_fresh: true, + had_backtrack: false, + had_rollback: false, }) } @@ -268,6 +273,34 @@ res_prompt } + pub fn augment_err(&self, e: impl Display) -> String { + format!("{e}\n<state>\n{}\n</state>", self.dump_state()) + } + + pub fn dump_state(&self) -> String { + format!( + "Tokens: {}\n{} tokens, {} bytes; grm_prefix: {:?}\nFlags:{}{}\nLexer: {}\nParser: {}\nStop: {}\nError: {}", + self.tok_trie().tokens_dbg(&self.llm_tokens), + self.llm_tokens.len(), + self.llm_bytes.len(), + String::from_utf8_lossy(&self.grm_prefix), + if self.had_backtrack { + " had_backtrack" + } else { + "" + }, + if self.had_rollback { + " had_rollback" + } else { + "" + }, + self.parser.lexer_stats(), + self.parser.stats(), + self.stop_reason, + self.error_message.as_deref().unwrap_or("None"), + ) + } + fn clear_caches(&mut self) { self.is_accepting_cache = None; self.ff_tokens_cache = None; @@ -332,6 +365,8 @@ // this will fail in case we're in error state or not initialized self.check_initialized("rollback")?; + self.had_rollback = true; + let new_len = self.llm_tokens.len() - n_tokens; let mut bytes_to_drop = 0; for tok in &self.llm_tokens[new_len..] { @@ -522,6 +557,7 @@ self.llm_bytes.extend_from_slice(tok_bytes); if backtrack_bytes0 != 0 { + self.had_backtrack = true; let mut backtrack_bytes: isize = backtrack_bytes0.try_into().unwrap(); let mut backtrack_tokens = 0; while backtrack_bytes > 0 {
diff --git a/third_party/rust/clap/v4/BUILD.gn b/third_party/rust/clap/v4/BUILD.gn index f8ebeae..d1d84fd 100644 --- a/third_party/rust/clap/v4/BUILD.gn +++ b/third_party/rust/clap/v4/BUILD.gn
@@ -153,7 +153,7 @@ edition = "2021" cargo_pkg_name = "clap" cargo_pkg_description = "A simple to use, efficient, and full-featured Command Line Argument Parser" - cargo_pkg_version = "4.5.37" + cargo_pkg_version = "4.5.38" allow_unsafe = false
diff --git a/third_party/rust/clap/v4/README.chromium b/third_party/rust/clap/v4/README.chromium index a46fa31..eee755a 100644 --- a/third_party/rust/clap/v4/README.chromium +++ b/third_party/rust/clap/v4/README.chromium
@@ -1,7 +1,7 @@ Name: clap URL: https://crates.io/crates/clap -Version: 4.5.37 -Revision: f209bce2203498e743b171b7ac64f0fb9d3ae590 +Version: 4.5.38 +Revision: 6b12a81bafe7b9d013b06981f520ab4c70da5510 License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/clap-v4/LICENSE-APACHE Shipped: no
diff --git a/third_party/rust/clap_builder/v4/BUILD.gn b/third_party/rust/clap_builder/v4/BUILD.gn index a6c659e..aa0eb54 100644 --- a/third_party/rust/clap_builder/v4/BUILD.gn +++ b/third_party/rust/clap_builder/v4/BUILD.gn
@@ -78,7 +78,7 @@ edition = "2021" cargo_pkg_name = "clap_builder" cargo_pkg_description = "A simple to use, efficient, and full-featured Command Line Argument Parser" - cargo_pkg_version = "4.5.37" + cargo_pkg_version = "4.5.38" allow_unsafe = false
diff --git a/third_party/rust/clap_builder/v4/README.chromium b/third_party/rust/clap_builder/v4/README.chromium index 4dce490..c83abb5 100644 --- a/third_party/rust/clap_builder/v4/README.chromium +++ b/third_party/rust/clap_builder/v4/README.chromium
@@ -1,7 +1,7 @@ Name: clap_builder URL: https://crates.io/crates/clap_builder -Version: 4.5.37 -Revision: f209bce2203498e743b171b7ac64f0fb9d3ae590 +Version: 4.5.38 +Revision: 6b12a81bafe7b9d013b06981f520ab4c70da5510 License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/clap_builder-v4/LICENSE-APACHE Shipped: no
diff --git a/third_party/rust/derivre/v0_3/BUILD.gn b/third_party/rust/derivre/v0_3/BUILD.gn index 6a827e0..87a7060 100644 --- a/third_party/rust/derivre/v0_3/BUILD.gn +++ b/third_party/rust/derivre/v0_3/BUILD.gn
@@ -37,7 +37,7 @@ cargo_pkg_authors = "Michal Moskal <michal@moskal.me>" cargo_pkg_name = "derivre" cargo_pkg_description = "A derivative-based regular expression engine" - cargo_pkg_version = "0.3.7" + cargo_pkg_version = "0.3.8" allow_unsafe = false
diff --git a/third_party/rust/derivre/v0_3/README.chromium b/third_party/rust/derivre/v0_3/README.chromium index d8ec73f..9b3cb22 100644 --- a/third_party/rust/derivre/v0_3/README.chromium +++ b/third_party/rust/derivre/v0_3/README.chromium
@@ -1,7 +1,7 @@ Name: derivre URL: https://crates.io/crates/derivre -Version: 0.3.7 -Revision: 97bc7eb6e6f449423f67c98b2caf7afb638c9b39 +Version: 0.3.8 +Revision: c68f60791d191a05131796771f38c2e904417074 License: MIT License File: //third_party/rust/chromium_crates_io/vendor/derivre-v0_3/LICENSE Shipped: yes
diff --git a/third_party/rust/llguidance/v0_7/BUILD.gn b/third_party/rust/llguidance/v0_7/BUILD.gn index 6ffb278..d0ee53b 100644 --- a/third_party/rust/llguidance/v0_7/BUILD.gn +++ b/third_party/rust/llguidance/v0_7/BUILD.gn
@@ -67,7 +67,7 @@ edition = "2021" cargo_pkg_name = "llguidance" cargo_pkg_description = "Super-fast Structured Outputs" - cargo_pkg_version = "0.7.19" + cargo_pkg_version = "0.7.21" allow_unsafe = true
diff --git a/third_party/rust/llguidance/v0_7/README.chromium b/third_party/rust/llguidance/v0_7/README.chromium index c121f8b..5bad587 100644 --- a/third_party/rust/llguidance/v0_7/README.chromium +++ b/third_party/rust/llguidance/v0_7/README.chromium
@@ -1,7 +1,7 @@ Name: llguidance URL: https://crates.io/crates/llguidance -Version: 0.7.19 -Revision: 22a09129eaa895ea2a746023a05834fcda597f4d +Version: 0.7.21 +Revision: 5f43908e1cbebdb713a83f309e807f37fc1b4ed4 License: MIT License File: //third_party/rust/chromium_crates_io/vendor/llguidance-v0_7/LICENSE Shipped: yes
diff --git a/third_party/skia b/third_party/skia index 956fd8b..f42bb59 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 956fd8b14e2205fa33f36de216e6231314e67d03 +Subproject commit f42bb59753feff1eb831991ad29075150bbec626
diff --git a/third_party/webrtc b/third_party/webrtc index 5099aef..447950d 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit 5099aef700c439ca6091e33333664fd7fc725a04 +Subproject commit 447950dc42025d50e9789a022bbed3a0c8a74be0
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium index 53cc85c..1644ed94 100644 --- a/third_party/wpt_tools/README.chromium +++ b/third_party/wpt_tools/README.chromium
@@ -2,7 +2,7 @@ Short Name: wpt URL: https://github.com/web-platform-tests/wpt/ Version: N/A -Revision: c518eee7a46a7f77a9721270c2b5d6af4cecdc03 +Revision: 307dcacd9bccd9e66e062f3675c56e49efeca81d License: BSD-3-Clause Security Critical: no Shipped: no
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/browser.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/browser.py index 7b34fcc9..da39c3b 100644 --- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/browser.py +++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/modules/browser.py
@@ -1,4 +1,4 @@ -from typing import Any, Mapping, MutableMapping +from typing import Any, Mapping, MutableMapping, Optional from ._module import BidiModule, command @@ -27,8 +27,19 @@ return result["clientWindows"] @command - def create_user_context(self) -> Mapping[str, Any]: - return {} + def create_user_context( + self, accept_insecure_certs: Optional[bool] = None, + proxy: Optional[Mapping[str, Any]] = None + ) -> Mapping[str, Any]: + params: MutableMapping[str, Any] = {} + + if accept_insecure_certs is not None: + params["acceptInsecureCerts"] = accept_insecure_certs + + if proxy is not None: + params["proxy"] = proxy + + return params @create_user_context.result def _create_user_context(self, result: Mapping[str, Any]) -> Any:
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py index 08bc02cb..93b26a73 100644 --- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py +++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -47,6 +47,7 @@ DevicePostureProtocolPart, VirtualPressureSourceProtocolPart, DisplayFeaturesProtocolPart, + WebExtensionsProtocolPart, merge_dicts) @@ -738,6 +739,24 @@ def clear_display_features(self): raise NotImplementedError("clear_display_features not yet implemented") + +class MarionetteWebExtensionsProtocolPart(WebExtensionsProtocolPart): + def setup(self): + self.addons = Addons(self.parent.marionette) + + def install_web_extension(self, extension): + if extension["type"] == "base64": + extension_id = self.addons.install(data=extension["value"], temp=True) + else: + path = self.parent.test_dir + extension["path"] + extension_id = self.addons.install(path, temp=True) + + return {'extension': extension_id} + + def uninstall_web_extension(self, extension_id): + return self.addons.uninstall(extension_id) + + class MarionetteProtocol(Protocol): implements = [MarionetteBaseProtocolPart, MarionetteTestharnessProtocolPart, @@ -761,7 +780,8 @@ MarionetteVirtualSensorProtocolPart, MarionetteDevicePostureProtocolPart, MarionetteVirtualPressureSourceProtocolPart, - MarionetteDisplayFeaturesProtocolPart] + MarionetteDisplayFeaturesProtocolPart, + MarionetteWebExtensionsProtocolPart] def __init__(self, executor, browser, capabilities=None, timeout_multiplier=1, e10s=True, ccov=False): do_delayed_imports() @@ -955,6 +975,10 @@ self.protocol.testharness.load_runner(new_environment["protocol"]) def do_test(self, test): + # TODO: followup to do this properly, pass test as state on the CallbackHandler: + # https://phabricator.services.mozilla.com/D244400?id=1030480#inline-1369921 + self.protocol.test_dir = os.path.dirname(test.path) + timeout = (test.timeout * self.timeout_multiplier if self.debug_info is None else None)
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py index 6b9a0de9..af32f48 100644 --- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py +++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
@@ -335,6 +335,21 @@ pass +class WebExtensionsProtocolPart(ProtocolPart): + """Protocol part for managing WebExtensions""" + __metaclass__ = ABCMeta + + name = "web_extensions" + + @abstractmethod + def install_web_extension(self, extension): + pass + + @abstractmethod + def uninstall_web_extension(self, extension_id): + pass + + class BidiBluetoothProtocolPart(ProtocolPart): """Protocol part for managing BiDi events""" __metaclass__ = ABCMeta
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 6ecf2dd..2f4ab49 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -408,6 +408,10 @@ "META": {"sizes": {"includes": [120],}}, "includes": [3920], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/extensions_zero_state_promo/resources.grd": { + "META": {"sizes": {"includes": [8],}}, + "includes": [3925], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/family_link_user_internals/resources.grd": { "META": {"sizes": {"includes": [5]}}, "includes": [3930],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 2b3b68875..a0140a1 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -250,16 +250,6 @@ <int value="9" label="Rejected Due to Decoder Shutdown"/> </enum> -<enum name="AdsHeuristicCookieOverride"> - <int value="0" label="kNone"/> - <int value="1" label="kNotAd"/> - <int value="2" label="kAny"/> - <int value="3" label="kSkipHeuristics"/> - <int value="4" label="kSkipMetadata"/> - <int value="5" label="kSkipSupport"/> - <int value="6" label="kSkipTopLevelSupport"/> -</enum> - <enum name="AdsInterventionStatus"> <int value="0" label="Expired"/> <int value="1" label="Would Block"/> @@ -273,12 +263,6 @@ <int value="3" label="kOverlayPopupAd"/> </enum> -<enum name="AggregationServiceObserverReportStatus"> - <int value="0" label="Sent"/> - <int value="1" label="Failed to assemble"/> - <int value="2" label="Failed to send"/> -</enum> - <enum name="AllowedUsersPoliciesInvalidState"> <summary> For recording which of the 4 disallowed combinations of allow_new_users and @@ -342,16 +326,6 @@ <int value="2" label="Missing Version"/> </enum> -<enum name="AntiFingerprintingBlockListResult"> - <summary> - The possible results from checking a network resource URL against the - anti-fingerprinting blocklist. - </summary> - <int value="0" label="Third-party resource Blocked"/> - <int value="1" label="Third-party resource Allowed"/> - <int value="2" label="First-party resource Allowed"/> -</enum> - <enum name="AppBoundEncryptionSupportLevel"> <int value="0" label="Supported"/> <int value="1" label="Not supported as not running system-level"/> @@ -2031,25 +2005,6 @@ <int value="107" label="Person with megaphone"/> </enum> -<enum name="ClearOnExitSyncEvent"> - <int value="0" label="Profile startup, sync is disabled"/> - <int value="1" label="Profile startup, sync is paused"/> - <int value="2" label="Profile startup, sync is active"/> - <int value="3" label="Re-login to a sync paused account"/> - <int value="4" label="Logout of a sync paused account"/> - <int value="5" - label="Profile shutdown, sync is active, started paused, consent change"/> - <int value="6" - label="Profile shutdown, sync is active, started paused, no consent - change"/> - <int value="7" - label="Profile shutdown, sync is active, started active, consent change"/> - <int value="8" - label="Profile shutdown, sync is active, started active, no consent - change"/> - <int value="9" label="Profile shutdown, sync is paused"/> -</enum> - <enum name="ClientAppId"> <int value="0" label="Other"/> <int value="1" label="Gmail"/> @@ -2517,13 +2472,6 @@ <int value="4" label="The network is validated"/> </enum> -<enum name="ConsentAuditorFeature"> - <int value="0" label="CHROME_SYNC"/> - <int value="1" label="PLAY_STORE"/> - <int value="2" label="BACKUP_AND_RESTORE"/> - <int value="3" label="GOOGLE_LOCATION_SERVICE"/> -</enum> - <enum name="ContentIndexCategory"> <summary> The type of a Content Index entry. Corresponds to @@ -2544,24 +2492,6 @@ <int value="5" label="DETECT_IMPORTANT_CONTENT"/> </enum> -<!-- LINT.IfChange(ContentSettingPatternScope) --> - -<enum name="ContentSettingPatternScope"> - <int value="0" label="Origin scoped"/> - <int value="1" label="With domain wildcard"/> - <int value="2" label="With port wildcard"/> - <int value="3" label="With scheme wildcard"/> - <int value="4" label="With scheme and port wildcard"/> - <int value="5" label="With domain and port wildcard"/> - <int value="6" label="With domain and scheme wildcard"/> - <int value="7" label="With domain and scheme and port wildcard"/> - <int value="8" label="Full wildcard"/> - <int value="9" label="File path"/> - <int value="10" label="Custom scope"/> -</enum> - -<!-- LINT.ThenChange(//components/content_settings/core/common/content_settings_pattern.h:Scope) --> - <!-- LINT.IfChange(ContentType) --> <enum name="ContentType"> @@ -2853,27 +2783,6 @@ <int value="3" label="Both read and wrote cookies"/> </enum> -<!-- LINT.IfChange(CookieControlsMode) --> - -<enum name="CookieControlsMode"> - <int value="0" label="Off"/> - <int value="1" label="BlockThirdParty"/> - <int value="2" label="IncognitoOnly"/> - <int value="3" label="Limited"/> -</enum> - -<!-- LINT.ThenChange(/components/content_settings/core/browser/cookie_settings.h:CookieControlsMode, /chrome/browser/resources/settings/site_settings/constants.ts:CookieControlsMode) --> - -<enum name="CookieDeprecationFacilitatedTestingProfileEligibility"> - <int value="0" label="Eligible"/> - <int value="1" label="Ineligible: 3P Cookies blocked"/> - <int value="2" label="Ineligible: Has not seen Ads API GA notice"/> - <int value="3" label="Ineligible: New user"/> - <int value="4" label="Ineligible: Enterprise user"/> - <int value="5" label="Ineligible: PWA or TWA installed on Android"/> - <int value="6" label="Eligible: Forced via kForceEligibleForTesting"/> -</enum> - <enum name="CookieHeuristicInteractionType"> <int value="0" label="Authentication"/> <int value="1" label="UserActivation"/> @@ -3600,57 +3509,6 @@ <int value="61" label="Content Transfer"/> </enum> -<enum name="DeleteBrowsingDataAction"> - <int value="0" label="CBD dialog"/> - <int value="1" label="Clear on exit"/> - <int value="2" label="Close Incognito tabs"/> - <int value="3" label="Cookies in use dialog"/> - <int value="4" label="Site settings page"/> - <int value="5" label="History Page Entries"/> - <int value="6" label="Quick delete"/> - <int value="7" label="Page info permission reset"/> - <int value="8" label="RWS delete all data"/> -</enum> - -<!--LINT.IfChange(DeleteBrowsingDataDialogAction) --> - -<enum name="DeleteBrowsingDataDialogAction"> - <int value="0" label="Browsing History Toggled On"/> - <int value="1" label="Browsing History Toggled Off"/> - <int value="2" label="Tabs Toggled On"/> - <int value="3" label="Tabs Toggled Off"/> - <int value="4" label="Site Data Toggled On"/> - <int value="5" label="Site Data Toggled Off"/> - <int value="6" label="Cache Toggled On"/> - <int value="7" label="Cache Toggled Off"/> - <int value="8" label="Passwords Toggled On"/> - <int value="9" label="Passwords Toggled Off"/> - <int value="10" label="Autofill Toggled On"/> - <int value="11" label="Autofill Toggled Off"/> - <int value="12" label="Confirm data type selection changes"/> - <int value="13" label="Cancel data type selection changes"/> - <int value="14" label="Sign out footer link opened"/> - <int value="15" label="Last 15 Minutes selected"/> - <int value="16" label="Last Hour selected"/> - <int value="17" label="Last day selected"/> - <int value="18" label="Last week selected"/> - <int value="19" label="Last four weeks selected"/> - <int value="20" label="Older than 30 days selected"/> - <int value="21" label="All time selected"/> - <int value="22" label="Browsing data row selected"/> - <int value="23" label="Search history link opened"/> - <int value="24" label="My Activity link opened"/> - <int value="25" label="Deletion selected"/> - <int value="26" label="Cancel selected"/> - <int value="27" label="Dialog dismissed implicitly"/> - <int value="28" label="Menu item entry point (i.e. three dot menu) selected"/> - <int value="29" label="History page entry point selected"/> - <int value="30" label="Privacy page entry point selected"/> - <int value="31" label="Keyboard entry point selected"/> -</enum> - -<!--LINT.ThenChange(//components/browsing_data/core/browsing_data_utils.h:DeleteBrowsingDataDialogAction) --> - <enum name="DemoModeApp"> <summary> Pre-installed app or other window type available in Chrome OS Demo Mode. @@ -3929,61 +3787,6 @@ <int value="44" label="Unknown owner no key, no policy"/> </enum> -<enum name="DIPSDeletionAction"> - <int value="0" label="Disallowed"/> - <int value="1" label="ExceptedAs1p"/> - <int value="2" label="ExceptedAs3p"/> - <int value="3" label="Enforced"/> - <int value="4" label="Ignored: Due to empty site."/> - <int value="5" label="Excepted"/> -</enum> - -<enum name="DIPSDirectNavigationSource"> - <int value="0" label="Unknown"/> - <int value="1" label="Omnibar"/> - <int value="2" label="Bookmark"/> -</enum> - -<enum name="DIPSErrorCode"> - <int value="0" label="No DIPSDatabase::Read error was encountered"/> - <int value="1" - label="DIPSDatabase::Read Error: A range in the db has an open-range - (NULL, end]."/> - <int value="2" - label="DIPSDatabase::Read Error: A range in the db has an open-range - [start, NULL)."/> - <int value="3" - label="DIPSDatabase::Read Error: `bounce_times` doesn't fully contain - `stateful_bounce_times`."/> - <int value="4" - label="DIPSDatabase::Read Error: A query was made for an empty `site`; - db has an entry with an empty `site`."/> - <int value="5" - label="DIPSDatabase::Read Error: A query was made for an empty `site`; - db does not have an entry with an empty `site`."/> - <int value="6" label="No DIPSDatabase::Write error was encountered"/> - <int value="7" label="DIPSDatabase::Write Error: `site` is empty."/> -</enum> - -<enum name="DIPSRedirectCategory"> - <int value="0" label="No cookies accessed; no previous site engagement"/> - <int value="1" label="Cookies only read; no previous site engagement"/> - <int value="2" label="Cookies only written; no previous site engagement"/> - <int value="3" label="Cookies read and written; no previous site engagement"/> - <int value="4" label="No cookies accessed; site has previous engagement"/> - <int value="5" label="Cookies only read; site has previous engagement"/> - <int value="6" label="Cookies only written; site has previous engagement"/> - <int value="7" - label="Cookies read and written; site has previous engagement"/> - <int value="8" label="Unknown cookie access; no previous site engagement"/> - <int value="9" label="Unknown cookie access; site has previous engagement"/> -</enum> - -<enum name="DIPSRedirectType"> - <int value="0" label="Client redirect"/> - <int value="1" label="Server redirect"/> -</enum> - <enum name="DirectFromSellerSignalsRequestType"> <int value="0" label="Network service fetch"/> <int value="1" label="Cache"/> @@ -9328,6 +9131,7 @@ <int value="-1808477331" label="MidiManagerCros:disabled"/> <int value="-1808445397" label="ShareByDefaultInCCT:disabled"/> <int value="-1807797669" label="google-doodle-url"/> + <int value="-1807481332" label="NewContentForCheckerboardedScrolls:disabled"/> <int value="-1807092388" label="ReduceUserAgentPlatformOsCpu:enabled"/> <int value="-1806998617" label="CCTPredictiveBackGesture:enabled"/> <int value="-1806739839" @@ -9577,6 +9381,7 @@ label="VirtualKeyboardMultipasteSuggestion:disabled"/> <int value="-1699505493" label="QuickDeleteAndroidFollowup:enabled"/> <int value="-1698438797" label="TabGroupsCollapseFreezing:enabled"/> + <int value="-1698059272" label="NewContentForCheckerboardedScrolls:enabled"/> <int value="-1696778023" label="HappinessTrackingSurveysForDesktopSettings:disabled"/> <int value="-1696619241" label="OmniboxWrapPopupPosition:disabled"/> @@ -22871,312 +22676,6 @@ <int value="11" label="No RenderFrame"/> </enum> -<!-- LINT.IfChange(PrivacySandboxActSurveyStatus) --> - -<enum name="PrivacySandboxActSurveyStatus"> - <int value="0" label="Survey was successfully launched"/> - <int value="1" label="Feature not enabled"/> - <int value="2" label="Failed to fetch HaTS service"/> - <int value="3" label="Failed to launch survey"/> - <int value="4" label="Not in Incognito profile"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/incognito/privacy_sandbox_incognito_survey_service.h:PrivacySandboxActSurveyStatus) --> - -<enum name="PrivacySandboxAggregationServiceKeyFetcherStatus"> - <int value="0" label="Success"/> - <int value="1" label="Download error"/> - <int value="2" label="Json parse error"/> - <int value="3" label="Invalid key error"/> - <int value="4" label="Expired key error"/> -</enum> - -<enum name="PrivacySandboxAggregationServiceReportAssemblerStatus"> - <int value="0" label="Ok"/> - <int value="1" label="Public key fetch error"/> - <int value="2" label="Assembly error"/> - <int value="3" label="Too many requests error"/> -</enum> - -<enum name="PrivacySandboxAggregationServiceReportSenderStatus"> - <int value="0" label="Ok"/> - <int value="1" label="Network error"/> - <int value="2" label="Server error"/> -</enum> - -<enum name="PrivacySandboxAggregationServiceStorageSqlInitStatus"> - <int value="0" label="Success"/> - <int value="1" label="Failed to open DB in memory"/> - <int value="2" label="Failed to open DB file"/> - <int value="3" label="Failed to create directory"/> - <int value="4" label="Failed to initialize schema"/> -</enum> - -<enum name="PrivacySandboxApiAllowed"> - <int value="0" label="Allowed"/> - <int value="1" label="Restricted"/> - <int value="2" label="Incognito profile"/> - <int value="3" label="Apis disabled"/> - <int value="4" label="Site data access blocked"/> - <int value="5" label="Mismatched Consent"/> - <int value="6" label="Attestation failed"/> - <int value="7" - label="Deprecated. Component installer has not yet checked the - attestations file, or attestations file not present"/> - <int value="8" label="Attestations downloaded, not yet loaded"/> - <int value="9" label="Attestations file corrupt"/> - <int value="10" label="Protected Audience joining blocked due to top frame"/> - <int value="11" - label="Disabled by third-party cookie deprecation experiment"/> - <int value="12" - label="Component installer has not yet checked the attestations file"/> - <int value="13" label="Attestations file not present"/> -</enum> - -<enum name="PrivacySandboxAttestationLoadAPKAssetStatus"> - <int value="0" label="Success"/> - <int value="1" label="Fail to open the attestations list from APK assets"/> - <int value="2" - label="Fail to create a memory mapped file of the attestations list - from APK assets"/> - <int value="3" label="Fail to parse the content of the attestations list"/> -</enum> - -<enum name="PrivacySandboxAttestationParsingStatus"> - <int value="0" label="Success"/> - <int value="1" label="NotNewerVersion"/> - <int value="2" label="FileNotExist"/> - <int value="3" label="SentinelFilePresent"/> - <int value="4" label="CannotCreateSentinel"/> - <int value="5" label="CannotRemoveSentinel"/> - <int value="6" label="CannotParseFile"/> -</enum> - -<enum name="PrivacySandboxAttestationsFileSource"> - <int value="0" label="Pre-installed"/> - <int value="1" label="Downloaded"/> -</enum> - -<!-- LINT.IfChange(PrivacySandboxCctAdsNoticeSurveyFailures) --> - -<enum name="PrivacySandboxCctAdsNoticeSurveyFailures"> - <int value="0" label="Feature not enabled"/> - <int value="1" label="App ID mismatch"/> - <int value="2" label="No notice interaction found"/> - <int value="3" label="Invalid prompt type found"/> - <int value="4" label="Failed to find survey config for EEA accepted"/> - <int value="5" label="Failed to find survey config for EEA declined"/> - <int value="6" label="Failed to find survey config for EEA control"/> - <int value="7" label="Failed to find survey config for ROW acknowledged"/> - <int value="8" label="Failed to find survey config for ROW control"/> -</enum> - -<!-- LINT.ThenChange(/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java:PrivacySandboxCctAdsNoticeSurveyFailures) --> - -<!-- LINT.IfChange(PrivacySandboxDialogCallbackState) --> - -<enum name="PrivacySandboxDialogCallbackState"> - <int value="0" label="SingleActionCallbackDNE"/> - <int value="1" label="MultiActionCallbackDNE"/> - <int value="2" label="CallbackUnknownBeforeShown"/> -</enum> - -<!-- LINT.ThenChange(//chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h:PrivacySandboxDialogCallbackState) --> - -<!-- LINT.IfChange(PrivacySandboxNoticeAction) --> - -<enum name="PrivacySandboxNoticeAction"> - <int value="0" label="NotSet"/> - <int value="1" label="Ack"/> - <int value="2" label="Closed"/> - <int value="3" label="LearnMore"/> - <int value="4" label="OptIn"/> - <int value="5" label="OptOut"/> - <int value="6" label="Other"/> - <int value="7" label="Settings"/> - <int value="8" label="UnknownActionPreMigration"/> - <int value="9" label="TimedOut"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/notice/notice_storage.h:NoticeActionTaken) --> - -<!-- LINT.IfChange(PrivacySandboxNoticeActionBehavior) --> - -<enum name="PrivacySandboxNoticeActionBehavior"> - <int value="0" label="Success"/> - <int value="1" label="ActionBeforeShown"/> - <int value="2" label="DuplicateActionTaken"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/notice/notice_storage.h:NoticeActionBehavior) --> - -<!-- LINT.IfChange(PrivacySandboxNoticeEvent) --> - -<enum name="PrivacySandboxNoticeEvent"> - <int value="0" label="Ack"/> - <int value="1" label="Closed"/> - <int value="2" label="OptIn"/> - <int value="3" label="OptOut"/> - <int value="4" label="Settings"/> - <int value="5" label="Shown"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/notice/notice.mojom:PrivacySandboxNoticeEvent) --> - -<!-- LINT.IfChange(PrivacySandboxPrimaryAccountUserGroups) --> - -<enum name="PrivacySandboxPrimaryAccountUserGroups"> - <int value="0" label="NotSet"/> - <int value="1" label="SignedOut"/> - <int value="2" label="SignedInCapabilityFalse"/> - <int value="3" label="SignedInCapabilityTrue"/> - <int value="4" label="SignedInCapabilityUnknown"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/privacy_sandbox_service.h:PrimaryAccountUserGroups) --> - -<enum name="PrivacySandboxPrivateAggregationBudgeterBudgetValidityStatus2"> - <int value="0" label="Valid"/> - <int value="1" label="Valid but empty; no budget data stored"/> - <int value="2" - label="Valid but contains an entry with a stale entry, i.e. a window - from over a day ago"/> - <int value="3" label="Contains a value with a timestamp in the future"/> - <int value="4" - label="Contains a value with a value that exceeds the budget limit"/> - <int value="5" - label="Contains an entry with a timestamp that is not rounded to a - minute"/> - <int value="6" label="Contains budget data that spans more than a day"/> - <int value="7" label="Contains an entry with a nonpositive budget value"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationBudgeterRequestResult3"> - <int value="0" label="Approved"/> - <int value="1" label="Insufficient budget left in 10-min scope"/> - <int value="2" label="Insufficient budget left in daily scope"/> - <int value="3" label="Requested more than total budget"/> - <int value="4" label="Too many pending calls"/> - <int value="5" label="Storage initialization failed"/> - <int value="6" label="Bad values on disk"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationBudgetStorageInitStatus"> - <int value="0" label="Success"/> - <int value="1" label="Failed to open DB in memory"/> - <int value="2" label="Failed to open DB file"/> - <int value="3" label="Failed to create directory"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationHostFilteringIdStatus"> - <int value="0" label="No filtering ID, default max bytes"/> - <int value="1" label="Filtering ID provided, default max bytes"/> - <int value="2" label="No filtering ID, custom max bytes"/> - <int value="3" label="Filtering ID provided, custom max bytes"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationHostPipeResult"> - <int value="0" label="Report success"/> - <int value="1" - label="Report success but truncated due to too many contributions"/> - <int value="2" label="No report, but no error"/> - <int value="3" label="API disabled in settings"/> - <int value="4" label="Enable debug mode called multiple times"/> - <int value="5" label="Negative value"/> - <int value="6" label="Filtering ID invalid"/> - <int value="7" label="Necessary feature not enabled"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationHostTimeoutResult"> - <int value="0" label="Occurred before remote disconnection"/> - <int value="1" label="Occurred after remote disconnection"/> - <int value="2" label="Canceled due to error"/> - <int value="3" label="Still scheduled on shutdown"/> -</enum> - -<enum name="PrivacySandboxPrivateAggregationManagerRequestResult"> - <int value="0" label="Sent with contributions"/> - <int value="1" label="Sent without contributions"/> - <int value="2" label="Sent but contributions cleared due to budget denial"/> - <int value="3" label="Not sent"/> -</enum> - -<!-- LINT.IfChange(PrivacySandboxPrivateAggregationTruncationResult) --> - -<enum name="PrivacySandboxPrivateAggregationTruncationResult"> - <int value="0" label="No truncation occurred"/> - <int value="1" - label="Truncation occurred with the unconditional contributions alone - exceeding the limit"/> - <int value="2" - label="Truncation occurred but the unconditional contributions alone - did not exceed the limit"/> -</enum> - -<!-- LINT.ThenChange(/content/browser/private_aggregation/private_aggregation_pending_contributions.h:TruncationResult) --> - -<!-- LINT.IfChange(PrivacySandboxPromptSuppressionReason) --> - -<enum name="PrivacySandboxPromptSuppressionReason"> -<!-- Used as a bitfield so values must be ascending powers of 2 --> - - <int value="0" label="None"/> - <int value="1" label="3PC_Blocked"/> - <int value="2" label="CapabilityFalse"/> - <int value="4" label="ManagedDevice"/> - <int value="8" label="NoticeShownBefore"/> -</enum> - -<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/privacy_sandbox_service.h:FakeNoticePromptSuppressionReason) --> - -<!-- LINT.IfChange(PrivacySandboxSentimentSurveyStatus) --> - -<enum name="PrivacySandboxSentimentSurveyStatus"> - <int value="0" label="Survey was successfully launched"/> - <int value="1" label="Feature not enabled"/> - <int value="2" label="Failed to fetch HaTS service"/> - <int value="3" label="Failed to launch survey"/> - <int value="4" label="Failed to find survey config"/> -</enum> - -<!-- LINT.ThenChange(/components/privacy_sandbox/privacy_sandbox_survey_service.h:PrivacySandboxSentimentSurveyStatus) --> - -<enum name="PrivacySandboxStorageActivityType"> - <int value="0" label="Received kOther (partial CCT or unknown) type"/> - <int value="1" label="Received kTabbed (BrowserApp) type"/> - <int value="2" label="Received kAGSACustomTab type"/> - <int value="3" label="Received kNonAGSACustomTab type"/> - <int value="4" label="Received kTrustedWebActivity type"/> - <int value="5" label="Received kWebapp type"/> - <int value="6" label="Received kWebApk type"/> - <int value="7" label="Received kPreFirstTab type"/> -</enum> - -<enum name="PrivacySandboxStorageUserSegmentByRecentActivity"> - <int value="0" label="kHasOther"/> - <int value="1" label="kHasBrowserApp"/> - <int value="2" label="kHasAGSACCT"/> - <int value="3" label="kHasNonAGSACCT"/> - <int value="4" label="kHasPWA"/> - <int value="5" label="kHasTWA"/> - <int value="6" label="kHasWebapp"/> - <int value="7" label="kHasPreFirstTab"/> -</enum> - -<!-- LINT.IfChange(PrivacySandboxSurveyTypesEnums) --> - -<enum name="PrivacySandboxSurveyTypes"> - <int value="0" label="Unknown Survey"/> - <int value="1" label="Sentiment Survey"/> - <int value="2" label="Accepted EEA Survey"/> - <int value="3" label="Declined EEA Survey"/> - <int value="4" label="Control EEA Survey"/> - <int value="5" label="Acknowledged ROW Survey"/> - <int value="6" label="Control ROW Survey"/> -</enum> - -<!-- LINT.ThenChange(/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java:PrivacySandboxSurveyTypes) --> - <enum name="ProbeResult"> <int value="0" label="No internet"/> <int value="1" label="Server error"/> @@ -23435,24 +22934,6 @@ <int value="3" label="TTS_EVENT_OTHER"/> </enum> -<enum name="QuickDeleteAction"> - <int value="0" label="Entry from menu item clicked"/> - <int value="1" label="Delete button on dialog clicked"/> - <int value="2" label="Cancel button on dialog clicked"/> - <int value="3" - label="Dialog dismissed due to reasons other than Cancel or Delete"/> - <int value="4" label="Entry from tab switcher menu item clicked"/> - <int value="5" label="More options button on dialog clicked"/> - <int value="6" label="My activity link on dialog clicked"/> - <int value="7" label="Search history link on dialog clicked"/> - <int value="8" label="last 15 minutes deletion time range selected"/> - <int value="9" label="last hour minutes deletion time range selected"/> - <int value="10" label="last day minutes deletion time range selected"/> - <int value="11" label="last week minutes deletion time range selected"/> - <int value="12" label="last four weeks deletion time range selected"/> - <int value="13" label="All time deletion time range selected"/> -</enum> - <enum name="QuickofficeErrorTypes"> <int value="0" label="doc uncaught js exception"/> <int value="1" label="docx uncaught js exception"/> @@ -24276,12 +23757,6 @@ <int value="2" label="SCROLLING_ON_MAIN"/> </enum> -<enum name="SecCookieDeprecationHeaderStatus"> - <int value="0" label="kSet"/> - <int value="1" label="kNoLabel"/> - <int value="2" label="kNoCookie"/> -</enum> - <!-- LINT.IfChange(SecureChannelConnectionAttemptFailureReason) --> <enum name="SecureChannelConnectionAttemptFailureReason"> @@ -25639,12 +25114,6 @@ <int value="1" label="SearchEngine"/> </enum> -<enum name="ThirdPartySiteDataAccessType"> - <int value="0" label="Any blocked third-party site data accesses"/> - <int value="1" label="Any allowed third-party site data accesses"/> - <int value="2" label="No third-party site data accesses"/> -</enum> - <enum name="TimeZoneRequestEvent"> <int value="0" label="Request start"/> <int value="1" label="Response success"/> @@ -26658,6 +26127,18 @@ <!--LINT.ThenChange(//components/page_info/core/page_info_action.h:PageInfoAction) --> +<!-- LINT.IfChange(WebStoreLinkClicked) --> + +<enum name="WebStoreLinkClicked"> + <int value="0" label="'Discover Extensions' link"/> + <int value="1" label="'Find Coupons' link"/> + <int value="2" label="'Write Better' link"/> + <int value="3" label="'Boost Productivity' link"/> + <int value="4" label="'Enhance with AI' link"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo.mojom:WebStoreLinkClicked) --> + <enum name="WebUsbChooserClosed"> <int value="0" label="User cancelled"/> <int value="1" label="User cancelled, no devices available"/>
diff --git a/tools/metrics/histograms/histograms_xml_files.gni b/tools/metrics/histograms/histograms_xml_files.gni index 1eef44c..3035dee 100644 --- a/tools/metrics/histograms/histograms_xml_files.gni +++ b/tools/metrics/histograms/histograms_xml_files.gni
@@ -205,6 +205,7 @@ "//tools/metrics/histograms/metadata/preloading/histograms.xml", "//tools/metrics/histograms/metadata/printing/enums.xml", "//tools/metrics/histograms/metadata/printing/histograms.xml", + "//tools/metrics/histograms/metadata/privacy/enums.xml", "//tools/metrics/histograms/metadata/privacy/histograms.xml", "//tools/metrics/histograms/metadata/privacy_budget/enums.xml", "//tools/metrics/histograms/metadata/privacy_budget/histograms.xml",
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/enums.xml b/tools/metrics/histograms/metadata/attribution_reporting/enums.xml index f432027..a744fb4 100644 --- a/tools/metrics/histograms/metadata/attribution_reporting/enums.xml +++ b/tools/metrics/histograms/metadata/attribution_reporting/enums.xml
@@ -441,6 +441,15 @@ <!-- LINT.ThenChange(//content/browser/attribution_reporting/attribution_storage_sql.h:InitStatus) --> +<!-- LINT.IfChange(ConversionTriggerDataMatching) --> + +<enum name="ConversionTriggerDataMatching"> + <int value="0" label="modulus"/> + <int value="1" label="exact"/> +</enum> + +<!-- LINT.ThenChange(//components/attribution_reporting/trigger_data_matching.mojom:TriggerDataMatching) --> + <!-- LINT.IfChange(ConversionTriggerRegistrationError) --> <enum name="ConversionTriggerRegistrationError">
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml index ac0fe51..ba3ed99 100644 --- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml +++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -1421,6 +1421,29 @@ </summary> </histogram> +<histogram name="Conversions.TriggerDataMatchingModulusSameInputOutput" + units="bool" expires_after="2025-08-24"> + <owner>tquintanilla@chromium.org</owner> + <owner>apaseltiner@chromium.org</owner> + <owner>measurement-api-dev+metrics@google.com</owner> + <summary> + When a chosen source for attribution contains the trigger data matching mode + `modulus`, measures whether the passed trigger data equals the source's + chosen trigger data. Recorded when creating an event-level report. + </summary> +</histogram> + +<histogram name="Conversions.TriggerDataMatchingRegistration" + enum="ConversionTriggerDataMatching" expires_after="2025-08-24"> + <owner>tquintanilla@chromium.org</owner> + <owner>apaseltiner@chromium.org</owner> + <owner>measurement-api-dev+metrics@google.com</owner> + <summary> + Records the trigger data matching mode when registering a source (modulus is + the default mode). Recorded on successful source registration. + </summary> +</histogram> + <histogram name="Conversions.TriggerRegistrationError11" enum="ConversionTriggerRegistrationError" expires_after="2025-08-24"> <owner>tquintanilla@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/collaboration_service/histograms.xml b/tools/metrics/histograms/metadata/collaboration_service/histograms.xml index cf71d8a..5fc2d048 100644 --- a/tools/metrics/histograms/metadata/collaboration_service/histograms.xml +++ b/tools/metrics/histograms/metadata/collaboration_service/histograms.xml
@@ -57,7 +57,7 @@ </summary> </histogram> -<histogram name="CollaborationService.Latency2.{CollaborationServiceStep}" +<histogram name="CollaborationService.Latency.{CollaborationServiceStep}" units="ms" expires_after="2025-10-11"> <owner>haileywang@google.com</owner> <owner>chrome-tab-group-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml index d2d76c3..8d31f98b 100644 --- a/tools/metrics/histograms/metadata/compositing/histograms.xml +++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -757,16 +757,6 @@ </summary> </histogram> -<histogram name="Compositing.SurfaceAggregator.CopiedSurfaceCount" - units="surfaces" expires_after="2025-06-01"> - <owner>kylechar@chromium.org</owner> - <owner>jonross@chromium.org</owner> - <summary> - The number of surfaces where the active CompositorFrame was copied into the - AggregateFrame during surface aggregation. This is logged once per frame. - </summary> -</histogram> - <histogram name="Compositing.SurfaceAggregator.CopyUs" units="microseconds" expires_after="2025-08-03"> <owner>kylechar@chromium.org</owner> @@ -807,16 +797,6 @@ </token> </histogram> -<histogram name="Compositing.SurfaceAggregator.PrewalkedSurfaceCount" - units="surfaces" expires_after="2025-06-01"> - <owner>kylechar@chromium.org</owner> - <owner>jonross@chromium.org</owner> - <summary> - The number of surfaces that were looked at during the prewalk phase of - surface aggregation. This is logged once per frame. - </summary> -</histogram> - <histogram name="Compositing.SurfaceAggregator.PrewalkUs" units="microseconds" expires_after="2025-08-03"> <owner>kylechar@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml index 7bacc5d..c36ee2c 100644 --- a/tools/metrics/histograms/metadata/enterprise/enums.xml +++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2234,6 +2234,7 @@ <int value="1363" label="TLS13EarlyDataEnabled"/> <int value="1364" label="LocalNetworkAccessRestrictionsEnabled"/> <int value="1365" label="PrefetchWithServiceWorkerEnabled"/> + <int value="1366" label="AIModeSearchSuggestSettings"/> </enum> <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml index ec2bec4..34a0cf1 100644 --- a/tools/metrics/histograms/metadata/extensions/histograms.xml +++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -5601,6 +5601,17 @@ </summary> </histogram> +<histogram name="Extensions.ZeroStatePromo.WebStoreLinkClicked.{Link}" + enum="WebStoreLinkClicked" expires_after="2025-07-27"> + <owner>uwyiming@chromium.org</owner> + <owner>cws-consumer-team@google.com</owner> + <summary> + Records that the users clicked a link or button in the Extension Zero State + promo page. The value indicates the link that the user clicked. + </summary> + <token key="Link"/> +</histogram> + <histogram name="Extensions.{ExtensionSource}ForceInstalledFailureManifestInvalidErrorDetail2" enum="ManifestInvalidError" expires_after="never">
diff --git a/tools/metrics/histograms/metadata/glic/enums.xml b/tools/metrics/histograms/metadata/glic/enums.xml index 8ac04c8..03bff14 100644 --- a/tools/metrics/histograms/metadata/glic/enums.xml +++ b/tools/metrics/histograms/metadata/glic/enums.xml
@@ -253,6 +253,7 @@ <int value="5" label="NoMatchingDocument"/> <int value="6" label="SearchRangeInvalid"/> <int value="7" label="TabContextPermissionDisabled"/> + <int value="8" label="DroppedByWebClient"/> </enum> <!-- LINT.ThenChange(//chrome/browser/glic/host/glic.mojom:ScrollToErrorReason) -->
diff --git a/tools/metrics/histograms/metadata/glic/histograms.xml b/tools/metrics/histograms/metadata/glic/histograms.xml index e6111f8f..e8f8a53 100644 --- a/tools/metrics/histograms/metadata/glic/histograms.xml +++ b/tools/metrics/histograms/metadata/glic/histograms.xml
@@ -71,6 +71,7 @@ <variant name="ClosePanelAndShutdown"/> <variant name="CreateTab"/> <variant name="DetachPanel"/> + <variant name="DropScrollToHighlight"/> <variant name="EnableDragResize"/> <variant name="GetContextFromFocusedTab"/> <variant name="GetOsMicrophonePermissionStatus"/>
diff --git a/tools/metrics/histograms/metadata/memory/enums.xml b/tools/metrics/histograms/metadata/memory/enums.xml index 0a9b31e7..61bc14c 100644 --- a/tools/metrics/histograms/metadata/memory/enums.xml +++ b/tools/metrics/histograms/metadata/memory/enums.xml
@@ -56,6 +56,7 @@ <enum name="SelfCompactionCancellationReason"> <int value="0" label="Frozen by App Freezer"/> <int value="1" label="Page resumed"/> + <int value="2" label="Timeout"/> </enum> <enum name="VmmmsRequestPriority">
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml index cc5aa85..da5ed16 100644 --- a/tools/metrics/histograms/metadata/memory/histograms.xml +++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -2757,7 +2757,7 @@ </summary> </histogram> -<histogram name="Memory.RunningOrSelfCompact.Renderer.CancellationReason" +<histogram name="Memory.RunningOrSelfCompact.Renderer.Cancellation.Reason" enum="SelfCompactionCancellationReason" expires_after="2025-10-06"> <owner>thiabaud@google.com</owner> <owner>lizeb@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index b919774..c3d85e9 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -2717,7 +2717,6 @@ <histogram name="Network.Shill.Cellular.TimeToRedirectFound" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> <owner>hugobenichi@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -2900,7 +2899,6 @@ <histogram name="Network.Shill.Ethernet.TimeToRedirectFound" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> <owner>hugobenichi@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -3750,7 +3748,7 @@ <histogram name="Network.Shill.WiFi.Ap80211kSupport" enum="WiFiAp80211kSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -3760,7 +3758,7 @@ <histogram name="Network.Shill.WiFi.Ap80211rSupport" enum="WiFiAp80211rSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -3780,7 +3778,7 @@ <histogram name="Network.Shill.WiFi.Ap80211vBSSMaxIdlePeriodSupport" enum="WiFiAp80211vBSSMaxIdlePeriodSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -3791,7 +3789,7 @@ <histogram name="Network.Shill.WiFi.Ap80211vBSSTransitionSupport" enum="WiFiAp80211vBSSTransitionSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -3802,7 +3800,7 @@ <histogram name="Network.Shill.WiFi.Ap80211vDMSSupport" enum="WiFiAp80211vDMSSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -3823,7 +3821,7 @@ <histogram name="Network.Shill.WiFi.ApChannelSwitch" enum="WiFiApChannelSwitch" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network usage metric sampled when an AP switches channels. Shows @@ -3887,7 +3885,7 @@ <histogram name="Network.Shill.WiFi.AutoConnectableServices" units="units" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of wifi services available for @@ -3897,7 +3895,7 @@ <histogram name="Network.Shill.WiFi.AvailableBSSesAtConnect" units="units" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of BSSes (endpoints) available @@ -3929,7 +3927,7 @@ <histogram name="Network.Shill.WiFi.BSSTransitionManagementSupport" enum="WiFiBSSTransitionManagementSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric recording BSS Transition Management statuses. This @@ -3950,7 +3948,7 @@ <histogram name="Network.Shill.WiFi.CiscoAdaptiveFTSupport" enum="WiFiCiscoAdaptiveFTSupport" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of Wireless Access Points that @@ -4014,7 +4012,7 @@ <histogram name="Network.Shill.Wifi.EapInnerProtocol" enum="EAPInnerProtocol" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network usage metric sampled on each successful 802.1x wireless @@ -4024,7 +4022,7 @@ <histogram name="Network.Shill.Wifi.EapOuterProtocol" enum="EAPOuterProtocol" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network usage metric sampled on each successful 802.1x wireless @@ -4125,7 +4123,7 @@ <histogram name="Network.Shill.WiFi.MBOSupport" enum="MBOSupport" expires_after="2025-12-31"> - <owner>matthewmwang@google.com</owner> + <owner>norvez@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric that tracks the Multi-Band Operation (MBO) support @@ -4352,7 +4350,6 @@ <histogram name="Network.Shill.Wifi.PortalResult" enum="NetworkPortalResult" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> <owner>hugobenichi@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -4374,7 +4371,7 @@ <histogram name="Network.Shill.WiFi.RememberedNetworkCount" units="units" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network diagnostic metric sampling the number of 802.11 wireless @@ -4387,7 +4384,7 @@ <histogram name="Network.Shill.WiFi.RememberedSystemNetworkCount{ShillWiFiRememberedNetworkSecurityMode}" units="units" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of 802.11 wireless networks @@ -4409,7 +4406,7 @@ <histogram name="Network.Shill.WiFi.RememberedUserNetworkCount{ShillWiFiRememberedNetworkSecurityMode}" units="units" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric sampling the number of 802.11 wireless networks @@ -4425,7 +4422,7 @@ <histogram name="Network.Shill.WiFi.RoamComplete{RoamSecurityType}" enum="WiFiRoamComplete" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric recording roam successes or failures. This is @@ -4436,7 +4433,7 @@ <histogram name="Network.Shill.WiFi.RoamTime{RoamSecurityType}" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric recording roam time in milliseconds. This is @@ -4502,7 +4499,7 @@ <histogram name="Network.Shill.WiFi.SessionLength{RoamSecurityType}" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric recording session length in milliseconds. This is @@ -4532,7 +4529,7 @@ <histogram name="Network.Shill.Wifi.SignalAtDisconnect" units="negative dBm" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network metric indicating the negative of the dBm received signal @@ -4592,7 +4589,7 @@ <histogram name="Network.Shill.WiFi.TimeResumeToReadyHB" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network performance metric sampling the time from the resume event @@ -4604,7 +4601,7 @@ <histogram name="Network.Shill.WiFi.TimeResumeToReadyLB" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network performance metric sampling the time from the resume event @@ -4616,7 +4613,7 @@ <histogram name="Network.Shill.WiFi.TimeResumeToReadyUHB" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> + <owner>norvez@chromium.org</owner> <owner>cros-network-metrics@google.com</owner> <summary> ChromeOS network performance metric sampling the time from the resume event @@ -4686,7 +4683,6 @@ <histogram name="Network.Shill.Wifi.TimeToPortal" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> <owner>hugobenichi@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary> @@ -4698,7 +4694,6 @@ <histogram name="Network.Shill.Wifi.TimeToRedirectFound" units="ms" expires_after="2025-12-31"> - <owner>matthewmwang@chromium.org</owner> <owner>hugobenichi@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/enums.xml b/tools/metrics/histograms/metadata/optimization/enums.xml index a87ce8e..fb19ea5 100644 --- a/tools/metrics/histograms/metadata/optimization/enums.xml +++ b/tools/metrics/histograms/metadata/optimization/enums.xml
@@ -87,6 +87,18 @@ <int value="5" label="[Deprecated] Host Model Features"/> </enum> +<!-- Use following code to get the hash from the model version. +import struct +import hashlib +version='2025.5.5.2308' +struct.unpack('>L', hashlib.md5(version.encode('utf-8')).digest()[4:8])[0] +--> + +<enum name="OnDeviceBaseModelVersion"> + <summary>The versions for the foundational model</summary> + <int value="946907700" label="2025.5.5.2308"/> +</enum> + <enum name="OnDeviceModelAdaptationAvailability"> <int value="0" label="Adaptation model was available"/> <int value="1" label="Base model was not available"/>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index 79da50e..9e932f6 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -962,6 +962,26 @@ <token key="ModelExecutionFeature" variants="ModelExecutionFeature"/> </histogram> +<histogram name="OptimizationGuide.ModelExecution.OnDeviceBaseModelLoadResult" + enum="LoadPlatformModelStatus" expires_after="2025-10-12"> + <owner>rajendrant@chromium.org</owner> + <owner>sophiechang@chromium.org</owner> + <summary> + Records the result of loading the base model, whether it succeeded or failed + with various reasons. + </summary> +</histogram> + +<histogram name="OptimizationGuide.ModelExecution.OnDeviceBaseModelLoadVersion" + enum="OnDeviceBaseModelVersion" expires_after="2025-10-12"> + <owner>rajendrant@chromium.org</owner> + <owner>sophiechang@chromium.org</owner> + <summary> + Records the hash code of base model version that is loaded. Recorded on + every load of the base model. + </summary> +</histogram> + <histogram name="OptimizationGuide.ModelExecution.OnDeviceContextFinishedProcessing.{ModelExecutionFeature}" enum="Boolean" expires_after="2025-06-27">
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index b84da91..772a983 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -239,6 +239,7 @@ <variant name=".CustomizeChrome"/> <variant name=".DataSharingBubble"/> <variant name=".Emoji"/> + <variant name=".ExtensionsWebStoreZeroStatePromo"/> <variant name=".Feed"/> <variant name=".HistoryClustersSidePanel"/> <variant name=".HistorySidePanel"/>
diff --git a/tools/metrics/histograms/metadata/privacy/enums.xml b/tools/metrics/histograms/metadata/privacy/enums.xml new file mode 100644 index 0000000..575bfeb --- /dev/null +++ b/tools/metrics/histograms/metadata/privacy/enums.xml
@@ -0,0 +1,564 @@ +<!-- +Copyright 2025 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<!-- + +This file describes the enumerations referenced by entries in histograms.xml for +this directory. Some enums may instead be listed in the central enums.xml file +at src/tools/metrics/histograms/enums.xml when multiple files use them. + +For best practices on writing enumerations descriptions, see +https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md#Enum-Histograms + +Please follow the instructions in the OWNERS file in this directory to find a +reviewer. If no OWNERS file exists, please consider signing up at +go/reviewing-metrics (Googlers only), as all subdirectories are expected to +have an OWNERS file. As a last resort you can send the CL to +chromium-metrics-reviews@google.com. +--> + +<histogram-configuration> + +<!-- Enum types --> + +<enums> + +<enum name="AdsHeuristicCookieOverride"> + <int value="0" label="kNone"/> + <int value="1" label="kNotAd"/> + <int value="2" label="kAny"/> + <int value="3" label="kSkipHeuristics"/> + <int value="4" label="kSkipMetadata"/> + <int value="5" label="kSkipSupport"/> + <int value="6" label="kSkipTopLevelSupport"/> +</enum> + +<enum name="AggregationServiceObserverReportStatus"> + <int value="0" label="Sent"/> + <int value="1" label="Failed to assemble"/> + <int value="2" label="Failed to send"/> +</enum> + +<enum name="AntiFingerprintingBlockListResult"> + <summary> + The possible results from checking a network resource URL against the + anti-fingerprinting blocklist. + </summary> + <int value="0" label="Third-party resource Blocked"/> + <int value="1" label="Third-party resource Allowed"/> + <int value="2" label="First-party resource Allowed"/> +</enum> + +<enum name="ClearOnExitSyncEvent"> + <int value="0" label="Profile startup, sync is disabled"/> + <int value="1" label="Profile startup, sync is paused"/> + <int value="2" label="Profile startup, sync is active"/> + <int value="3" label="Re-login to a sync paused account"/> + <int value="4" label="Logout of a sync paused account"/> + <int value="5" + label="Profile shutdown, sync is active, started paused, consent change"/> + <int value="6" + label="Profile shutdown, sync is active, started paused, no consent + change"/> + <int value="7" + label="Profile shutdown, sync is active, started active, consent change"/> + <int value="8" + label="Profile shutdown, sync is active, started active, no consent + change"/> + <int value="9" label="Profile shutdown, sync is paused"/> +</enum> + +<enum name="ConsentAuditorFeature"> + <int value="0" label="CHROME_SYNC"/> + <int value="1" label="PLAY_STORE"/> + <int value="2" label="BACKUP_AND_RESTORE"/> + <int value="3" label="GOOGLE_LOCATION_SERVICE"/> +</enum> + +<!-- LINT.IfChange(ContentSettingPatternScope) --> + +<enum name="ContentSettingPatternScope"> + <int value="0" label="Origin scoped"/> + <int value="1" label="With domain wildcard"/> + <int value="2" label="With port wildcard"/> + <int value="3" label="With scheme wildcard"/> + <int value="4" label="With scheme and port wildcard"/> + <int value="5" label="With domain and port wildcard"/> + <int value="6" label="With domain and scheme wildcard"/> + <int value="7" label="With domain and scheme and port wildcard"/> + <int value="8" label="Full wildcard"/> + <int value="9" label="File path"/> + <int value="10" label="Custom scope"/> +</enum> + +<!-- LINT.ThenChange(//components/content_settings/core/common/content_settings_pattern.h:Scope) --> + +<!-- LINT.IfChange(CookieControlsMode) --> + +<enum name="CookieControlsMode"> + <int value="0" label="Off"/> + <int value="1" label="BlockThirdParty"/> + <int value="2" label="IncognitoOnly"/> + <int value="3" label="Limited"/> +</enum> + +<!-- LINT.ThenChange(//components/content_settings/core/browser/cookie_settings.h:CookieControlsMode, //chrome/browser/resources/settings/site_settings/constants.ts:CookieControlsMode) --> + +<enum name="CookieDeprecationFacilitatedTestingProfileEligibility"> + <int value="0" label="Eligible"/> + <int value="1" label="Ineligible: 3P Cookies blocked"/> + <int value="2" label="Ineligible: Has not seen Ads API GA notice"/> + <int value="3" label="Ineligible: New user"/> + <int value="4" label="Ineligible: Enterprise user"/> + <int value="5" label="Ineligible: PWA or TWA installed on Android"/> + <int value="6" label="Eligible: Forced via kForceEligibleForTesting"/> +</enum> + +<enum name="DeleteBrowsingDataAction"> + <int value="0" label="CBD dialog"/> + <int value="1" label="Clear on exit"/> + <int value="2" label="Close Incognito tabs"/> + <int value="3" label="Cookies in use dialog"/> + <int value="4" label="Site settings page"/> + <int value="5" label="History Page Entries"/> + <int value="6" label="Quick delete"/> + <int value="7" label="Page info permission reset"/> + <int value="8" label="RWS delete all data"/> +</enum> + +<!--LINT.IfChange(DeleteBrowsingDataDialogAction) --> + +<enum name="DeleteBrowsingDataDialogAction"> + <int value="0" label="Browsing History Toggled On"/> + <int value="1" label="Browsing History Toggled Off"/> + <int value="2" label="Tabs Toggled On"/> + <int value="3" label="Tabs Toggled Off"/> + <int value="4" label="Site Data Toggled On"/> + <int value="5" label="Site Data Toggled Off"/> + <int value="6" label="Cache Toggled On"/> + <int value="7" label="Cache Toggled Off"/> + <int value="8" label="Passwords Toggled On"/> + <int value="9" label="Passwords Toggled Off"/> + <int value="10" label="Autofill Toggled On"/> + <int value="11" label="Autofill Toggled Off"/> + <int value="12" label="Confirm data type selection changes"/> + <int value="13" label="Cancel data type selection changes"/> + <int value="14" label="Sign out footer link opened"/> + <int value="15" label="Last 15 Minutes selected"/> + <int value="16" label="Last Hour selected"/> + <int value="17" label="Last day selected"/> + <int value="18" label="Last week selected"/> + <int value="19" label="Last four weeks selected"/> + <int value="20" label="Older than 30 days selected"/> + <int value="21" label="All time selected"/> + <int value="22" label="Browsing data row selected"/> + <int value="23" label="Search history link opened"/> + <int value="24" label="My Activity link opened"/> + <int value="25" label="Deletion selected"/> + <int value="26" label="Cancel selected"/> + <int value="27" label="Dialog dismissed implicitly"/> + <int value="28" label="Menu item entry point (i.e. three dot menu) selected"/> + <int value="29" label="History page entry point selected"/> + <int value="30" label="Privacy page entry point selected"/> + <int value="31" label="Keyboard entry point selected"/> +</enum> + +<!--LINT.ThenChange(//components/browsing_data/core/browsing_data_utils.h:DeleteBrowsingDataDialogAction) --> + +<enum name="DIPSDeletionAction"> + <int value="0" label="Disallowed"/> + <int value="1" label="ExceptedAs1p"/> + <int value="2" label="ExceptedAs3p"/> + <int value="3" label="Enforced"/> + <int value="4" label="Ignored: Due to empty site."/> + <int value="5" label="Excepted"/> +</enum> + +<enum name="DIPSDirectNavigationSource"> + <int value="0" label="Unknown"/> + <int value="1" label="Omnibar"/> + <int value="2" label="Bookmark"/> +</enum> + +<enum name="DIPSErrorCode"> + <int value="0" label="No DIPSDatabase::Read error was encountered"/> + <int value="1" + label="DIPSDatabase::Read Error: A range in the db has an open-range + (NULL, end]."/> + <int value="2" + label="DIPSDatabase::Read Error: A range in the db has an open-range + [start, NULL)."/> + <int value="3" + label="DIPSDatabase::Read Error: `bounce_times` doesn't fully contain + `stateful_bounce_times`."/> + <int value="4" + label="DIPSDatabase::Read Error: A query was made for an empty `site`; + db has an entry with an empty `site`."/> + <int value="5" + label="DIPSDatabase::Read Error: A query was made for an empty `site`; + db does not have an entry with an empty `site`."/> + <int value="6" label="No DIPSDatabase::Write error was encountered"/> + <int value="7" label="DIPSDatabase::Write Error: `site` is empty."/> +</enum> + +<enum name="DIPSRedirectCategory"> + <int value="0" label="No cookies accessed; no previous site engagement"/> + <int value="1" label="Cookies only read; no previous site engagement"/> + <int value="2" label="Cookies only written; no previous site engagement"/> + <int value="3" label="Cookies read and written; no previous site engagement"/> + <int value="4" label="No cookies accessed; site has previous engagement"/> + <int value="5" label="Cookies only read; site has previous engagement"/> + <int value="6" label="Cookies only written; site has previous engagement"/> + <int value="7" + label="Cookies read and written; site has previous engagement"/> + <int value="8" label="Unknown cookie access; no previous site engagement"/> + <int value="9" label="Unknown cookie access; site has previous engagement"/> +</enum> + +<enum name="DIPSRedirectType"> + <int value="0" label="Client redirect"/> + <int value="1" label="Server redirect"/> +</enum> + +<!-- LINT.IfChange(PrivacySandboxActSurveyStatus) --> + +<enum name="PrivacySandboxActSurveyStatus"> + <int value="0" label="Survey was successfully launched"/> + <int value="1" label="Feature not enabled"/> + <int value="2" label="Failed to fetch HaTS service"/> + <int value="3" label="Failed to launch survey"/> + <int value="4" label="Not in Incognito profile"/> +</enum> + +<!-- LINT.ThenChange(/chrome/browser/privacy_sandbox/incognito/privacy_sandbox_incognito_survey_service.h:PrivacySandboxActSurveyStatus) --> + +<enum name="PrivacySandboxAggregationServiceKeyFetcherStatus"> + <int value="0" label="Success"/> + <int value="1" label="Download error"/> + <int value="2" label="Json parse error"/> + <int value="3" label="Invalid key error"/> + <int value="4" label="Expired key error"/> +</enum> + +<enum name="PrivacySandboxAggregationServiceReportAssemblerStatus"> + <int value="0" label="Ok"/> + <int value="1" label="Public key fetch error"/> + <int value="2" label="Assembly error"/> + <int value="3" label="Too many requests error"/> +</enum> + +<enum name="PrivacySandboxAggregationServiceReportSenderStatus"> + <int value="0" label="Ok"/> + <int value="1" label="Network error"/> + <int value="2" label="Server error"/> +</enum> + +<enum name="PrivacySandboxAggregationServiceStorageSqlInitStatus"> + <int value="0" label="Success"/> + <int value="1" label="Failed to open DB in memory"/> + <int value="2" label="Failed to open DB file"/> + <int value="3" label="Failed to create directory"/> + <int value="4" label="Failed to initialize schema"/> +</enum> + +<enum name="PrivacySandboxApiAllowed"> + <int value="0" label="Allowed"/> + <int value="1" label="Restricted"/> + <int value="2" label="Incognito profile"/> + <int value="3" label="Apis disabled"/> + <int value="4" label="Site data access blocked"/> + <int value="5" label="Mismatched Consent"/> + <int value="6" label="Attestation failed"/> + <int value="7" + label="Deprecated. Component installer has not yet checked the + attestations file, or attestations file not present"/> + <int value="8" label="Attestations downloaded, not yet loaded"/> + <int value="9" label="Attestations file corrupt"/> + <int value="10" label="Protected Audience joining blocked due to top frame"/> + <int value="11" + label="Disabled by third-party cookie deprecation experiment"/> + <int value="12" + label="Component installer has not yet checked the attestations file"/> + <int value="13" label="Attestations file not present"/> +</enum> + +<enum name="PrivacySandboxAttestationLoadAPKAssetStatus"> + <int value="0" label="Success"/> + <int value="1" label="Fail to open the attestations list from APK assets"/> + <int value="2" + label="Fail to create a memory mapped file of the attestations list + from APK assets"/> + <int value="3" label="Fail to parse the content of the attestations list"/> +</enum> + +<enum name="PrivacySandboxAttestationParsingStatus"> + <int value="0" label="Success"/> + <int value="1" label="NotNewerVersion"/> + <int value="2" label="FileNotExist"/> + <int value="3" label="SentinelFilePresent"/> + <int value="4" label="CannotCreateSentinel"/> + <int value="5" label="CannotRemoveSentinel"/> + <int value="6" label="CannotParseFile"/> +</enum> + +<enum name="PrivacySandboxAttestationsFileSource"> + <int value="0" label="Pre-installed"/> + <int value="1" label="Downloaded"/> +</enum> + +<!-- LINT.IfChange(PrivacySandboxCctAdsNoticeSurveyFailures) --> + +<enum name="PrivacySandboxCctAdsNoticeSurveyFailures"> + <int value="0" label="Feature not enabled"/> + <int value="1" label="App ID mismatch"/> + <int value="2" label="No notice interaction found"/> + <int value="3" label="Invalid prompt type found"/> + <int value="4" label="Failed to find survey config for EEA accepted"/> + <int value="5" label="Failed to find survey config for EEA declined"/> + <int value="6" label="Failed to find survey config for EEA control"/> + <int value="7" label="Failed to find survey config for ROW acknowledged"/> + <int value="8" label="Failed to find survey config for ROW control"/> +</enum> + +<!-- LINT.ThenChange(//chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java:PrivacySandboxCctAdsNoticeSurveyFailures) --> + +<!-- LINT.IfChange(PrivacySandboxDialogCallbackState) --> + +<enum name="PrivacySandboxDialogCallbackState"> + <int value="0" label="SingleActionCallbackDNE"/> + <int value="1" label="MultiActionCallbackDNE"/> + <int value="2" label="CallbackUnknownBeforeShown"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.h:PrivacySandboxDialogCallbackState) --> + +<!-- LINT.IfChange(PrivacySandboxNoticeAction) --> + +<enum name="PrivacySandboxNoticeAction"> + <int value="0" label="NotSet"/> + <int value="1" label="Ack"/> + <int value="2" label="Closed"/> + <int value="3" label="LearnMore"/> + <int value="4" label="OptIn"/> + <int value="5" label="OptOut"/> + <int value="6" label="Other"/> + <int value="7" label="Settings"/> + <int value="8" label="UnknownActionPreMigration"/> + <int value="9" label="TimedOut"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/privacy_sandbox/notice/notice_storage.h:NoticeActionTaken) --> + +<!-- LINT.IfChange(PrivacySandboxNoticeActionBehavior) --> + +<enum name="PrivacySandboxNoticeActionBehavior"> + <int value="0" label="Success"/> + <int value="1" label="ActionBeforeShown"/> + <int value="2" label="DuplicateActionTaken"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/privacy_sandbox/notice/notice_storage.h:NoticeActionBehavior) --> + +<!-- LINT.IfChange(PrivacySandboxNoticeEvent) --> + +<enum name="PrivacySandboxNoticeEvent"> + <int value="0" label="Ack"/> + <int value="1" label="Closed"/> + <int value="2" label="OptIn"/> + <int value="3" label="OptOut"/> + <int value="4" label="Settings"/> + <int value="5" label="Shown"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/privacy_sandbox/notice/notice.mojom:PrivacySandboxNoticeEvent) --> + +<enum name="PrivacySandboxPrimaryAccountUserGroups"> + <int value="0" label="NotSet"/> + <int value="1" label="SignedOut"/> + <int value="2" label="SignedInCapabilityFalse"/> + <int value="3" label="SignedInCapabilityTrue"/> + <int value="4" label="SignedInCapabilityUnknown"/> +</enum> + +<!-- LINT.IfChange(PrivacySandboxPrimaryAccountUserGroups) --> + +<enum name="PrivacySandboxPrivateAggregationBudgeterBudgetValidityStatus2"> + <int value="0" label="Valid"/> + <int value="1" label="Valid but empty; no budget data stored"/> + <int value="2" + label="Valid but contains an entry with a stale entry, i.e. a window + from over a day ago"/> + <int value="3" label="Contains a value with a timestamp in the future"/> + <int value="4" + label="Contains a value with a value that exceeds the budget limit"/> + <int value="5" + label="Contains an entry with a timestamp that is not rounded to a + minute"/> + <int value="6" label="Contains budget data that spans more than a day"/> + <int value="7" label="Contains an entry with a nonpositive budget value"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/privacy_sandbox/privacy_sandbox_service.h:PrimaryAccountUserGroups) --> + +<enum name="PrivacySandboxPrivateAggregationBudgeterRequestResult3"> + <int value="0" label="Approved"/> + <int value="1" label="Insufficient budget left in 10-min scope"/> + <int value="2" label="Insufficient budget left in daily scope"/> + <int value="3" label="Requested more than total budget"/> + <int value="4" label="Too many pending calls"/> + <int value="5" label="Storage initialization failed"/> + <int value="6" label="Bad values on disk"/> +</enum> + +<enum name="PrivacySandboxPrivateAggregationBudgetStorageInitStatus"> + <int value="0" label="Success"/> + <int value="1" label="Failed to open DB in memory"/> + <int value="2" label="Failed to open DB file"/> + <int value="3" label="Failed to create directory"/> +</enum> + +<enum name="PrivacySandboxPrivateAggregationHostFilteringIdStatus"> + <int value="0" label="No filtering ID, default max bytes"/> + <int value="1" label="Filtering ID provided, default max bytes"/> + <int value="2" label="No filtering ID, custom max bytes"/> + <int value="3" label="Filtering ID provided, custom max bytes"/> +</enum> + +<enum name="PrivacySandboxPrivateAggregationHostPipeResult"> + <int value="0" label="Report success"/> + <int value="1" + label="Report success but truncated due to too many contributions"/> + <int value="2" label="No report, but no error"/> + <int value="3" label="API disabled in settings"/> + <int value="4" label="Enable debug mode called multiple times"/> + <int value="5" label="Negative value"/> + <int value="6" label="Filtering ID invalid"/> + <int value="7" label="Necessary feature not enabled"/> +</enum> + +<enum name="PrivacySandboxPrivateAggregationHostTimeoutResult"> + <int value="0" label="Occurred before remote disconnection"/> + <int value="1" label="Occurred after remote disconnection"/> + <int value="2" label="Canceled due to error"/> + <int value="3" label="Still scheduled on shutdown"/> +</enum> + +<enum name="PrivacySandboxPrivateAggregationManagerRequestResult"> + <int value="0" label="Sent with contributions"/> + <int value="1" label="Sent without contributions"/> + <int value="2" label="Sent but contributions cleared due to budget denial"/> + <int value="3" label="Not sent"/> +</enum> + +<!-- LINT.IfChange(PrivacySandboxPrivateAggregationTruncationResult) --> + +<enum name="PrivacySandboxPrivateAggregationTruncationResult"> + <int value="0" label="No truncation occurred"/> + <int value="1" + label="Truncation occurred with the unconditional contributions alone + exceeding the limit"/> + <int value="2" + label="Truncation occurred but the unconditional contributions alone + did not exceed the limit"/> +</enum> + +<!-- LINT.ThenChange(//content/browser/private_aggregation/private_aggregation_pending_contributions.h:TruncationResult) --> + +<!-- LINT.IfChange(PrivacySandboxPromptSuppressionReason) --> + +<enum name="PrivacySandboxPromptSuppressionReason"> +<!-- Used as a bitfield so values must be ascending powers of 2 --> + + <int value="0" label="None"/> + <int value="1" label="3PC_Blocked"/> + <int value="2" label="CapabilityFalse"/> + <int value="4" label="ManagedDevice"/> + <int value="8" label="NoticeShownBefore"/> +</enum> + +<!-- LINT.ThenChange(//chrome/browser/privacy_sandbox/privacy_sandbox_service.h:FakeNoticePromptSuppressionReason) --> + +<!-- LINT.IfChange(PrivacySandboxSentimentSurveyStatus) --> + +<enum name="PrivacySandboxSentimentSurveyStatus"> + <int value="0" label="Survey was successfully launched"/> + <int value="1" label="Feature not enabled"/> + <int value="2" label="Failed to fetch HaTS service"/> + <int value="3" label="Failed to launch survey"/> + <int value="4" label="Failed to find survey config"/> +</enum> + +<!-- LINT.ThenChange(//components/privacy_sandbox/privacy_sandbox_survey_service.h:PrivacySandboxSentimentSurveyStatus) --> + +<enum name="PrivacySandboxStorageActivityType"> + <int value="0" label="Received kOther (partial CCT or unknown) type"/> + <int value="1" label="Received kTabbed (BrowserApp) type"/> + <int value="2" label="Received kAGSACustomTab type"/> + <int value="3" label="Received kNonAGSACustomTab type"/> + <int value="4" label="Received kTrustedWebActivity type"/> + <int value="5" label="Received kWebapp type"/> + <int value="6" label="Received kWebApk type"/> + <int value="7" label="Received kPreFirstTab type"/> +</enum> + +<enum name="PrivacySandboxStorageUserSegmentByRecentActivity"> + <int value="0" label="kHasOther"/> + <int value="1" label="kHasBrowserApp"/> + <int value="2" label="kHasAGSACCT"/> + <int value="3" label="kHasNonAGSACCT"/> + <int value="4" label="kHasPWA"/> + <int value="5" label="kHasTWA"/> + <int value="6" label="kHasWebapp"/> + <int value="7" label="kHasPreFirstTab"/> +</enum> + +<!-- LINT.IfChange(PrivacySandboxSurveyTypesEnums) --> + +<enum name="PrivacySandboxSurveyTypes"> + <int value="0" label="Unknown Survey"/> + <int value="1" label="Sentiment Survey"/> + <int value="2" label="Accepted EEA Survey"/> + <int value="3" label="Declined EEA Survey"/> + <int value="4" label="Control EEA Survey"/> + <int value="5" label="Acknowledged ROW Survey"/> + <int value="6" label="Control ROW Survey"/> +</enum> + +<!-- LINT.ThenChange(//chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java:PrivacySandboxSurveyTypes) --> + +<enum name="QuickDeleteAction"> + <int value="0" label="Entry from menu item clicked"/> + <int value="1" label="Delete button on dialog clicked"/> + <int value="2" label="Cancel button on dialog clicked"/> + <int value="3" + label="Dialog dismissed due to reasons other than Cancel or Delete"/> + <int value="4" label="Entry from tab switcher menu item clicked"/> + <int value="5" label="More options button on dialog clicked"/> + <int value="6" label="My activity link on dialog clicked"/> + <int value="7" label="Search history link on dialog clicked"/> + <int value="8" label="last 15 minutes deletion time range selected"/> + <int value="9" label="last hour minutes deletion time range selected"/> + <int value="10" label="last day minutes deletion time range selected"/> + <int value="11" label="last week minutes deletion time range selected"/> + <int value="12" label="last four weeks deletion time range selected"/> + <int value="13" label="All time deletion time range selected"/> +</enum> + +<enum name="SecCookieDeprecationHeaderStatus"> + <int value="0" label="kSet"/> + <int value="1" label="kNoLabel"/> + <int value="2" label="kNoCookie"/> +</enum> + +<enum name="ThirdPartySiteDataAccessType"> + <int value="0" label="Any blocked third-party site data accesses"/> + <int value="1" label="Any allowed third-party site data accesses"/> + <int value="2" label="No third-party site data accesses"/> +</enum> + +</enums> + +</histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml index a4be133..bba7139 100644 --- a/tools/metrics/histograms/metadata/settings/histograms.xml +++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -850,6 +850,54 @@ </histogram> <histogram + name="Settings.SafetyHub.DisruptiveNotificationRevocations.DailyDistribution.{RevocationState}.SiteEngagement" + units="EngagementScore" expires_after="2026-02-26"> + <owner>olesiamarukhnno@google.com</owner> + <owner>antoniosartori@chromium.org</owner> + <summary> + Records the site engagement for revoked disruptive notification sites. + Recorded on every run of the disruptive notification sites Safety Hub check. + </summary> + <token key="RevocationState"> + <variant name="Acknowledged"/> + <variant name="Proposed"/> + <variant name="Regranted"/> + <variant name="Revoked"/> + </token> +</histogram> + +<histogram + name="Settings.SafetyHub.DisruptiveNotificationRevocations.DailyDistribution.{RevocationState}.SiteEngagement{SiteEngagement}.DaysSinceRevocation" + units="days" expires_after="2026-02-26"> + <owner>olesiamarukhnno@google.com</owner> + <owner>antoniosartori@chromium.org</owner> + <summary> + Records the number of days since revocation for revoked disruptive + notification sites, and their current state and site engagement. Recorded on + every run of the disruptive notification sites Safety Hub check. For + proposed revocation, days are computed since the proposal. + </summary> + <token key="RevocationState"> + <variant name="Acknowledged"/> + <variant name="Proposed"/> + <variant name="Regranted"/> + <variant name="Revoked"/> + </token> + <token key="SiteEngagement"> + <variant name="0"/> + <variant name="1"/> + <variant name="2"/> + <variant name="3"/> + <variant name="4"/> + <variant name="5"/> + <variant name="6-7"/> + <variant name="8-10"/> + <variant name="11-15"/> + <variant name=">15"/> + </token> +</histogram> + +<histogram name="Settings.SafetyHub.DisruptiveNotificationRevocations.FalsePositive.SiteEngagement" units="EngagementScore" expires_after="2026-02-26"> <owner>olesiamarukhnno@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ui/enums.xml b/tools/metrics/histograms/metadata/ui/enums.xml index 205ce25..bb78a4f9 100644 --- a/tools/metrics/histograms/metadata/ui/enums.xml +++ b/tools/metrics/histograms/metadata/ui/enums.xml
@@ -725,6 +725,7 @@ <int value="-485494550" label="chrome://interventions-internals/"/> <int value="-451371558" label="chrome://serviceworker-internals/"/> <int value="-443189279" label="chrome://enterprise-profile-welcome/"/> + <int value="-412283693" label="chrome://extensions-zero-state/"/> <int value="-407160627" label="chrome://on-device-translation-internals/"/> <int value="-394586044" label="chrome://confirm-password-change/"/> <int value="-377028639" label="chrome://copresence/"/>
diff --git a/tools/metrics/histograms/metadata/ui/histograms.xml b/tools/metrics/histograms/metadata/ui/histograms.xml index 36fd60f..4ccc2b5 100644 --- a/tools/metrics/histograms/metadata/ui/histograms.xml +++ b/tools/metrics/histograms/metadata/ui/histograms.xml
@@ -60,6 +60,7 @@ <variant name=".CustomizeChrome"/> <variant name=".DataSharingBubble"/> <variant name=".Emoji"/> + <variant name=".ExtensionsWebStoreZeroStatePromo"/> <variant name=".Feed"/> <variant name=".HistoryClustersSidePanel"/> <variant name=".HistorySidePanel"/>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml index 7787c1a..c487862 100644 --- a/tools/metrics/histograms/metadata/windows/histograms.xml +++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -165,6 +165,38 @@ </summary> </histogram> +<histogram name="Windows.InstallerDownloader.DownloadSucceed" enum="Boolean" + expires_after="2025-12-31"> + <owner>koretadaniel@chromium.org</owner> + <owner>top-chrome-desktop-ui@google.com</owner> + <summary> + Outcome of the download that runs after the user accepts: true for a fully + completed download, false for any failure or interruption. Logged once per + download attempt. + </summary> +</histogram> + +<histogram name="Windows.InstallerDownloader.InfobarShown" enum="Boolean" + expires_after="2025-12-31"> + <owner>koretadaniel@chromium.org</owner> + <owner>top-chrome-desktop-ui@google.com</owner> + <summary> + Logged once per browser session when the Installer Downloader infobar is + displayed for the first time. Always true, since the metric records how + often the prompt surfaces. + </summary> +</histogram> + +<histogram name="Windows.InstallerDownloader.RequestAccepted" enum="Boolean" + expires_after="2025-12-31"> + <owner>koretadaniel@chromium.org</owner> + <owner>top-chrome-desktop-ui@google.com</owner> + <summary> + Records the user’s response to the infobar. Logged exactly once per prompt: + - true: user accepted the prompt. - false: user dismissed the prompt. + </summary> +</histogram> + <histogram name="Windows.InstallerPinUnpinned" enum="IsPinnedToTaskbarResult" expires_after="2023-11-12"> <owner>davidbienvenu@chromium.org</owner> @@ -338,6 +370,17 @@ </summary> </histogram> +<histogram name="Windows.TaskbarPinFromFRESucceeded" enum="Boolean" + expires_after="2025-12-01"> + <owner>davidbienvenu@chromium.org</owner> + <owner>jessemckenna@google.com</owner> + <summary> + The result of calling PinAppToTaskbar() in the first run experience, logged + when it is called. It is called when the user has agreed to set Chrome as + the default browser and pin Chrome to the taskbar. + </summary> +</histogram> + <histogram name="Windows.TaskbarPinResult" enum="TaskbarPinResult" expires_after="2025-12-01"> <owner>davidbienvenu@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 6563386..60985fb1 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@ }, "win": { "hash": "51a7438fd3099888e9543e8b1360318c556c3573", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/72b133f729dcf236741d7224406c44b1615760f4/trace_processor_shell.exe" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/7e5757999c0e9f06b12c33bf4d861cc0ff10ed8c/trace_processor_shell.exe" }, "linux_arm": { "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v50.1/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "1f6f5eec2d61555c5c0cbc6bb26503dd5cc99d4b", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/72b133f729dcf236741d7224406c44b1615760f4/trace_processor_shell" + "hash": "48b1a4909b4df12760653f09a084984e1a97c166", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/6281f236ce89284e6c468dfd78d0eb0c595531fe/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/android/java/src/org/chromium/ui/interpolators/Interpolators.java b/ui/android/java/src/org/chromium/ui/interpolators/Interpolators.java index c4f8efb..bab6e695 100644 --- a/ui/android/java/src/org/chromium/ui/interpolators/Interpolators.java +++ b/ui/android/java/src/org/chromium/ui/interpolators/Interpolators.java
@@ -28,9 +28,10 @@ // that mimics a spring. public static final Interpolator DEFAULT_SPATIAL = PathInterpolatorCompat.create(0.38f, 1.21f, 0.22f, 1f); + public static final Interpolator STANDARD_DEFAULT_EFFECTS = + PathInterpolatorCompat.create(0.34f, 0.80f, 0.34f, 1f); public static final Interpolator STANDARD_ACCELERATE = PathInterpolatorCompat.create(0.3f, 0f, 1f, 1f); - public static final AccelerateInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator(); public static final DecelerateInterpolator DECELERATE_INTERPOLATOR =
diff --git a/ui/gfx/gpu_memory_buffer.cc b/ui/gfx/gpu_memory_buffer.cc index a481e02b..3e20b83 100644 --- a/ui/gfx/gpu_memory_buffer.cc +++ b/ui/gfx/gpu_memory_buffer.cc
@@ -89,7 +89,7 @@ base::UnsafeSharedMemoryRegion region) : type(GpuMemoryBufferType::SHARED_MEMORY_BUFFER), region_(std::move(region)) { - CHECK(region_.IsValid(), base::NotFatalUntil::M138); + CHECK(region_.IsValid(), base::NotFatalUntil::M141); } #if BUILDFLAG(IS_WIN)
diff --git a/ui/views/controls/image_view.cc b/ui/views/controls/image_view.cc index 22084ad..25cdc3fb 100644 --- a/ui/views/controls/image_view.cc +++ b/ui/views/controls/image_view.cc
@@ -12,9 +12,11 @@ #include "base/trace_event/trace_event.h" #include "cc/paint/paint_flags.h" #include "skia/ext/image_operations.h" +#include "third_party/skia/include/core/SkPath.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/themed_vector_icon.h" #include "ui/gfx/canvas.h" +#include "ui/gfx/geometry/skia_conversions.h" #include "ui/gfx/image/image_skia_rep.h" #include "ui/gfx/paint_vector_icon.h" @@ -50,11 +52,26 @@ return image_size_.value_or(image_model_.Size()); } +void ImageView::SetCornerRadius(int corner_radius) { + corner_radius_ = corner_radius; +} + +int ImageView::GetCornerRadius() const { + return corner_radius_; +} + void ImageView::OnPaint(gfx::Canvas* canvas) { // This inlines View::OnPaint in order to OnPaintBorder() after OnPaintImage // so the border can paint over content (for rounded corners that overlap // content). TRACE_EVENT1("views", "ImageView::OnPaint", "class", GetClassName()); + if (corner_radius_) { + SkPath mask; + mask.addRoundRect(gfx::RectToSkRect(GetImageBounds()), corner_radius_, + corner_radius_); + canvas->ClipPath(mask, true); + } + OnPaintBackground(canvas); OnPaintImage(canvas); OnPaintBorder(canvas);
diff --git a/ui/views/controls/image_view.h b/ui/views/controls/image_view.h index 0b8a0b4..5b36ba7 100644 --- a/ui/views/controls/image_view.h +++ b/ui/views/controls/image_view.h
@@ -50,6 +50,10 @@ ui::ImageModel GetImageModel() const; + // Set or get the `corner_radius`. + void SetCornerRadius(int corner_radius); + int GetCornerRadius() const; + // Overridden from View: void OnPaint(gfx::Canvas* canvas) override; @@ -79,10 +83,13 @@ // Caches the scaled image reps. gfx::ImageSkia scaled_image_; + + int corner_radius_ = 0; }; BEGIN_VIEW_BUILDER(VIEWS_EXPORT, ImageView, ImageViewBase) VIEW_BUILDER_OVERLOAD_METHOD(SetImage, const ui::ImageModel&) +VIEW_BUILDER_PROPERTY(int, CornerRadius) END_VIEW_BUILDER } // namespace views
diff --git a/ui/views/widget/widget_delegate.h b/ui/views/widget/widget_delegate.h index febaf77b..d2011a5 100644 --- a/ui/views/widget/widget_delegate.h +++ b/ui/views/widget/widget_delegate.h
@@ -363,6 +363,13 @@ // The widget's title, if any. // TODO(ellyjones): Should it be illegal to have show_title && !title? std::u16string title; + + // If set to true, force using desktop widget (DesktopNativeWidgetAura). + // Otherwise, widget type is determined automatically. + // This is used for child widgets on Desktop Aura (i.e. Windows and Linux) + // when they need to be rendered beyond their parent window's boundary. + // This setting has no effect on other platforms (e.g. ChromeOS or macOS). + bool use_desktop_widget_override = false; }; class OwnedByWidgetPassKey { @@ -814,6 +821,13 @@ void set_internal_name(std::string name) { params_.internal_name = name; } std::string internal_name() const { return params_.internal_name; } + void set_use_desktop_widget_override(bool use_desktop_widget_override) { + params_.use_desktop_widget_override = use_desktop_widget_override; + } + bool use_desktop_widget_override() { + return params_.use_desktop_widget_override; + } + bool has_desired_bounds_delegate() const { return static_cast<bool>(params_.desired_bounds_delegate); }
diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc index 95f3a677..20f12f5 100644 --- a/ui/views/window/dialog_client_view.cc +++ b/ui/views/window/dialog_client_view.cc
@@ -28,6 +28,7 @@ #include "ui/views/controls/button/checkbox.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/button/md_text_button.h" +#include "ui/views/layout/flex_layout.h" #include "ui/views/layout/layout_provider.h" #include "ui/views/layout/table_layout.h" #include "ui/views/metadata/view_factory.h" @@ -41,6 +42,14 @@ namespace views { +namespace features { +// Gates the ability of the Dialog to use a vertical button layout, if other +// conditions permit. This is a killswitch and is on by default. +BASE_FEATURE(kDialogVerticalButtonFallback, + "DialogVerticalButtonFallback", + base::FEATURE_ENABLED_BY_DEFAULT); +} // namespace features + namespace { // The group used by the buttons. This name is chosen voluntarily big not to @@ -430,6 +439,22 @@ return {{first, second, third}}; } +std::vector<View*> DialogClientView::GetButtonColumnViews() const { + // Note: Unlike the horizontal layout, the Okay button is always at the + // bottom, independent of platform-specific style. + std::vector<View*> views; + if (ShouldShow(extra_view_)) { + views.push_back(extra_view_.get()); + } + if (cancel_button_) { + views.push_back(cancel_button_); + } + if (ok_button_) { + views.push_back(ok_button_); + } + return views; +} + void DialogClientView::UpdateExtraViewFromDelegate() { // DisownExtraView() returns nullopt if the extra view was not updated. auto maybe_new_extra_view = GetDialogDelegate()->DisownExtraView(); @@ -468,16 +493,9 @@ UpdateExtraViewFromDelegate(); std::array<View*, kNumButtons> views = GetButtonRowViews(); - if (std::ranges::count(views, nullptr) == kNumButtons) { return; } - - // This will also clobber any existing layout manager and clear any settings - // it may already have. - auto* layout = button_row_container_->SetLayoutManager( - std::make_unique<views::TableLayout>()); - layout->SetMinimumSize(minimum_size_); if (extra_view_) { // TableLayout will force its child views to be visible if they aren't // explicitly ignored, which will cause the extra view the client supplied @@ -487,6 +505,36 @@ !extra_view_->GetVisible()); } + // Attempt to lay out the buttons horizontally. If the width of the resulting + // layout exceeds the specified fixed width of the dialog, conditionally + // use a vertical button layout instead, to minimize horizontal growth. + SetupHorizontalLayout(); + const int fixed_width = GetDialogDelegate()->fixed_width(); + if (GetDialogDelegate()->allow_vertical_buttons() && + base::FeatureList::IsEnabled( + views::features::kDialogVerticalButtonFallback) && + ShouldShow(extra_view_) && fixed_width && + button_row_container_->GetPreferredSize({}).width() > fixed_width) { + SetupVerticalLayout(); + } + + // The default focus is lost when child views are added back into the + // dialog. This restores focus if the button is still available. + View* previously_focused_view = view_tracker.view(); + if (previously_focused_view && !focus_manager->GetFocusedView() && + Contains(previously_focused_view)) { + previously_focused_view->RequestFocus(); + } +} + +void DialogClientView::SetupHorizontalLayout() { + std::array<View*, kNumButtons> views = GetButtonRowViews(); + CHECK(std::ranges::count(views, nullptr) != kNumButtons); + + auto* layout = button_row_container_->SetLayoutManager( + std::make_unique<views::TableLayout>()); + layout->SetMinimumSize(minimum_size_); + // The |resize_percent| constants. There's only one stretchy column (padding // to the left of ok/cancel buttons). constexpr float kFixed = views::TableLayout::kFixedSize; @@ -547,14 +595,26 @@ } layout->LinkColumnSizes(cols); } +} - // The default focus is lost when child views are added back into the dialog. - // This restores focus if the button is still available. - View* previously_focused_view = view_tracker.view(); - if (previously_focused_view && !focus_manager->GetFocusedView() && - Contains(previously_focused_view)) { - previously_focused_view->RequestFocus(); +void DialogClientView::SetupVerticalLayout() { + auto views = GetButtonColumnViews(); + CHECK_GT(views.size(), 0u); + + for (size_t i = 0; i < views.size(); ++i) { + button_row_container_->ReorderChildView(views[i], i); } + + button_row_container_->SetLayoutManager(std::make_unique<views::FlexLayout>()) + ->SetOrientation(views::LayoutOrientation::kVertical) + .SetMainAxisAlignment(views::LayoutAlignment::kCenter) + .SetCrossAxisAlignment(views::LayoutAlignment::kStretch) + .SetInteriorMargin(button_row_insets_) + .SetCollapseMargins(true) + .SetDefault(kMarginsKey, + gfx::Insets::VH(LayoutProvider::Get()->GetDistanceMetric( + DISTANCE_RELATED_CONTROL_VERTICAL), + 0)); } void DialogClientView::UpdateButtonsFromModel() {
diff --git a/ui/views/window/dialog_client_view.h b/ui/views/window/dialog_client_view.h index 2a55767..a3623018 100644 --- a/ui/views/window/dialog_client_view.h +++ b/ui/views/window/dialog_client_view.h
@@ -5,8 +5,10 @@ #ifndef UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ #define UI_VIEWS_WINDOW_DIALOG_CLIENT_VIEW_H_ +#include <array> #include <memory> #include <utility> +#include <vector> #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" @@ -27,6 +29,10 @@ class MdTextButton; class Widget; +namespace features { +VIEWS_EXPORT BASE_DECLARE_FEATURE(kDialogVerticalButtonFallback); +} + // DialogClientView provides adornments for a dialog's content view, including // custom-labeled [OK] and [Cancel] buttons with [Enter] and [Esc] accelerators. // The view also displays the delegate's extra view alongside the buttons. The @@ -159,9 +165,19 @@ // a View should not appear, it will be null. std::array<View*, kNumButtons> GetButtonRowViews(); + // Returns Views in column order. This is used when the buttons don't fit in + // a row, and the buttons are laid out vertically instead. + std::vector<View*> GetButtonColumnViews() const; + // Installs and configures the LayoutManager for `button_row_container_`. void SetupLayout(); + // Horizontal and vertical variations of button layout logic. The vertical + // layout is utilized if the horizontal layout exceeds a maximum width + // criteria. + void SetupHorizontalLayout(); + void SetupVerticalLayout(); + // Creates or deletes any buttons that are required. Updates data members. // After calling this, no button row Views will be in the view hierarchy. void UpdateButtonsFromModel();
diff --git a/ui/views/window/dialog_client_view_unittest.cc b/ui/views/window/dialog_client_view_unittest.cc index 1643b4a..ddc3bb9 100644 --- a/ui/views/window/dialog_client_view_unittest.cc +++ b/ui/views/window/dialog_client_view_unittest.cc
@@ -11,9 +11,11 @@ #include <utility> #include "base/memory/raw_ptr.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" #include "ui/base/mojom/dialog_button.mojom.h" #include "ui/base/ui_base_types.h" #include "ui/events/base_event_utils.h" @@ -34,10 +36,13 @@ #include "ui/views/test/test_views.h" #include "ui/views/test/views_test_utils.h" #include "ui/views/test/widget_test.h" +#include "ui/views/views_features.h" #include "ui/views/widget/unique_widget_ptr.h" #include "ui/views/widget/widget.h" #include "ui/views/window/dialog_delegate.h" +using ui::mojom::DialogButton; + namespace views { class DialogClientViewTest; @@ -140,6 +145,11 @@ return passed_view; } + void SetFixedWidth(int width) { + delegate_->set_fixed_width(width); + delegate_->DialogModelChanged(); + } + void SetSizeConstraints(const gfx::Size& min_size, const gfx::Size& preferred_size, const gfx::Size& max_size) { @@ -148,6 +158,25 @@ max_size_ = max_size; } + void SetAllowVerticalButtons(bool allow) { + delegate_->set_allow_vertical_buttons(allow); + delegate_->DialogModelChanged(); + } + + void SetThreeWideButtonConfiguration() { + // Ensure the wide button label will be wider than fixed dialog width. + constexpr int kFixedWidth = 100; + const std::u16string kLongLabel(kFixedWidth, 'a'); + + SetAllowVerticalButtons(true); + SetFixedWidth(kFixedWidth); + SetDialogButtons(static_cast<int>(DialogButton::kCancel) | + static_cast<int>(DialogButton::kOk)); + SetExtraView( + std::make_unique<LabelButton>(Button::PressedCallback(), u"extra")); + SetDialogButtonLabel(ui::mojom::DialogButton::kOk, kLongLabel); + } + View* FocusableViewAfter(View* view) { const bool dont_loop = false; const bool reverse = false; @@ -859,7 +888,7 @@ extra->SetVisible(false); // Re-layout but do not resize the widget. If we resized it without the extra - // view, it would get narrower and the other buttons would love. + // view, it would get narrower and the other buttons would move. EXPECT_TRUE(widget()->GetContentsView()->needs_layout()); views::test::RunScheduledLayout(widget()); @@ -867,4 +896,91 @@ EXPECT_EQ(cancel_left, cancel->bounds().x()); } +MATCHER(HasHorizontalButtons, "") { + const auto ok_bounds = arg->ok_button()->bounds(); + const auto cancel_bounds = arg->cancel_button()->bounds(); + + EXPECT_EQ(ok_bounds.CenterPoint().y(), cancel_bounds.CenterPoint().y()); + + // Order from the top is always Extra, Cancel, Ok (unlike horizontal + // platform-specific ordering). + if (arg->extra_view()) { + const auto extra_bounds = arg->extra_view()->bounds(); + EXPECT_EQ(ok_bounds.CenterPoint().y(), extra_bounds.CenterPoint().y()); + } + + return true; +} + +MATCHER(HasVerticalButtons, "") { + EXPECT_NE(arg->extra_view(), nullptr); + if (!arg->extra_view()) { + return false; + } + + const auto ok_bounds = arg->ok_button()->bounds(); + const auto cancel_bounds = arg->cancel_button()->bounds(); + const auto extra_bounds = arg->extra_view()->bounds(); + + // Buttons should have the same width and be vertically-aligned. + EXPECT_EQ(ok_bounds.width(), cancel_bounds.width()); + EXPECT_EQ(ok_bounds.width(), extra_bounds.width()); + EXPECT_EQ(ok_bounds.x(), cancel_bounds.x()); + EXPECT_EQ(ok_bounds.x(), extra_bounds.x()); + + // Order from the top is always Extra, Cancel, Ok (unlike horizontal + // platform-specific ordering). + EXPECT_LT(extra_bounds.y(), cancel_bounds.y()); + EXPECT_LT(cancel_bounds.y(), ok_bounds.y()); + + return true; +} + +TEST_F(DialogClientViewTest, WideButtonsRenderVertically) { + SetThreeWideButtonConfiguration(); + + widget()->Show(); + SizeAndLayoutWidget(); + EXPECT_THAT(client_view(), HasVerticalButtons()); +} + +TEST_F(DialogClientViewTest, WideButtonsStayHorizontalIfFeatureDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + views::features::kDialogVerticalButtonFallback); + + SetThreeWideButtonConfiguration(); + + widget()->Show(); + SizeAndLayoutWidget(); + EXPECT_THAT(client_view(), HasHorizontalButtons()); +} + +TEST_F(DialogClientViewTest, WideButtonsStayHorizontalIfNotFixedWidth) { + SetThreeWideButtonConfiguration(); + SetFixedWidth(0); + + widget()->Show(); + SizeAndLayoutWidget(); + EXPECT_THAT(client_view(), HasHorizontalButtons()); +} + +TEST_F(DialogClientViewTest, WideButtonsStayHorizontalIfNoExtraButton) { + SetThreeWideButtonConfiguration(); + SetExtraView(std::unique_ptr<View>()); + + widget()->Show(); + SizeAndLayoutWidget(); + EXPECT_THAT(client_view(), HasHorizontalButtons()); +} + +TEST_F(DialogClientViewTest, WideButtonsStayHorizontalIfVerticalNotAllowed) { + SetThreeWideButtonConfiguration(); + SetAllowVerticalButtons(false); + + widget()->Show(); + SizeAndLayoutWidget(); + EXPECT_THAT(client_view(), HasHorizontalButtons()); +} + } // namespace views
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index 809e00e..fa171a29 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -148,11 +148,16 @@ #if !BUILDFLAG(IS_APPLE) // Web-modal (ui::mojom::ModalType::kChild) dialogs with parents are marked as // child widgets to prevent top-level window behavior (independent movement, - // etc). On Mac, however, the parent may be a native window (not a - // views::Widget), and so the dialog must be considered top-level to gain - // focus and input method behaviors. - params.child = - parent && (delegate->GetModalType() == ui::mojom::ModalType::kChild); + // etc). However, on Mac or when forcing to use desktop widget, the + // dialog must be considered top-level to gain focus and input method + // behaviors. + // TODO(crbug.com/346974105): This might be wrong because it implies multiple + // focus managers in a widget tree. A widget tree should have a single focus + // manager, so that it is impossible for two widgets to have focus + // simultaneously. + params.child = parent && + (delegate->GetModalType() == ui::mojom::ModalType::kChild) && + !delegate->use_desktop_widget_override(); #endif if (BubbleDialogDelegate* bubble = delegate->AsBubbleDialogDelegate()) {
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index 8005433..92d4dc5 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h
@@ -587,6 +587,11 @@ // Returns the corner radius that is used for this dialog. int GetCornerRadius() const; + bool allow_vertical_buttons() const { return allow_vertical_buttons_; } + void set_allow_vertical_buttons(bool allow) { + allow_vertical_buttons_ = allow; + } + protected: // Overridden from WidgetDelegate: ax::mojom::Role GetAccessibleWindowRole() override; @@ -645,6 +650,15 @@ // Ownership of the views::Widget created by CreateDialogWidget(). Widget::InitParams::Ownership ownership_of_new_widget_ = Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET; + + // If set, allows the dialog buttons to be arranged in a vertical + // layout to maintain fixed dialog width. Specifically, if an extra view has + // been supplied (commonly a third button), and the width of the resulting + // row of buttons exceeds the specified `fixed_width_`, buttons are stacked + // in a column instead. Conventionally, three-button dialogs are designed + // with a width large enough to accommodate the required horizontal width. + // This switch is an experiment to explore an alternate approach. + bool allow_vertical_buttons_ = false; }; // A DialogDelegate implementation that is-a View. Used to override GetWidget()
diff --git a/ui/webui/resources/cr_components/certificate_manager/BUILD.gn b/ui/webui/resources/cr_components/certificate_manager/BUILD.gn index abc3111..e9a69760 100644 --- a/ui/webui/resources/cr_components/certificate_manager/BUILD.gn +++ b/ui/webui/resources/cr_components/certificate_manager/BUILD.gn
@@ -4,20 +4,17 @@ import("//chrome/common/features.gni") import("//crypto/features.gni") +import("//mojo/public/tools/bindings/mojom.gni") import("//ui/webui/resources/tools/build_webui.gni") -assert(use_nss_certs || chrome_root_store_cert_management_ui) +assert(chrome_root_store_cert_management_ui) -if (chrome_root_store_cert_management_ui) { - import("//mojo/public/tools/bindings/mojom.gni") +mojom("mojom") { + sources = [ "certificate_manager_v2.mojom" ] - mojom("mojom") { - sources = [ "certificate_manager_v2.mojom" ] + public_deps = [ "//mojo/public/mojom/base" ] - public_deps = [ "//mojo/public/mojom/base" ] - - webui_module_path = "chrome://resources/cr_components/certificate_manager/" - } + webui_module_path = "chrome://resources/cr_components/certificate_manager/" } build_webui("build") { @@ -28,25 +25,6 @@ static_files = [] css_files = [] - if (use_nss_certs) { - web_component_files += [ - "ca_trust_edit_dialog.ts", - "certificate_delete_confirmation_dialog.ts", - "certificate_entry.ts", - "certificate_list.ts", - "certificate_manager.ts", - "certificate_password_decryption_dialog.ts", - "certificate_password_encryption_dialog.ts", - "certificate_subentry.ts", - "certificates_error_dialog.ts", - ] - ts_files += [ - "certificate_manager_types.ts", - "certificates_browser_proxy.ts", - ] - css_files += [ "certificate_shared.css" ] - } - if (chrome_root_store_cert_management_ui) { static_files += [ "favicon.svg" ] web_component_files += [ @@ -82,7 +60,11 @@ "certificate_provisioning_entry.ts", "certificate_provisioning_list.ts", ] - ts_files += [ "certificate_provisioning_browser_proxy.ts" ] + css_files += [ "certificate_shared.css" ] + ts_files += [ + "certificate_provisioning_browser_proxy.ts", + "certificate_manager_types.ts", + ] } ts_out_dir =
diff --git a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html deleted file mode 100644 index 9ac93dc..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.html +++ /dev/null
@@ -1,43 +0,0 @@ - <style include="certificate-shared"> - cr-checkbox, - #description { - margin: 15px 0; - } - - .spinner { - background-image: url(//resources/images/throbber_small.svg); - background-size: 100%; - height: 28px; - width: 28px; - } - </style> - - <cr-dialog id="dialog" close-text="[[i18n('close')]]"> - <div slot="title"> - [[i18n('certificateManagerCaTrustEditDialogTitle')]] - </div> - <div slot="body"> - <div>[[explanationText_]]</div> - <div id="description"> - [[i18n('certificateManagerCaTrustEditDialogDescription')]] - </div> - <cr-checkbox id="ssl" checked="[[trustInfo_.ssl]]"> - [[i18n('certificateManagerCaTrustEditDialogSsl')]] - </cr-checkbox> - <cr-checkbox id="email" checked="[[trustInfo_.email]]"> - [[i18n('certificateManagerCaTrustEditDialogEmail')]] - </cr-checkbox> - <cr-checkbox id="objSign" checked="[[trustInfo_.objSign]]"> - [[i18n('certificateManagerCaTrustEditDialogObjSign')]] - </cr-checkbox> - </div> - <div slot="button-container"> - <div class="spinner" id="spinner" hidden></div> - <cr-button class="cancel-button" on-click="onCancelClick_"> - [[i18n('cancel')]] - </cr-button> - <cr-button id="ok" class="action-button" on-click="onOkClick_"> - [[i18n('ok')]] - </cr-button> - </div> - </cr-dialog>
diff --git a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts deleted file mode 100644 index 14f3173a..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts +++ /dev/null
@@ -1,125 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview 'ca-trust-edit-dialog' allows the user to: - * - specify the trust level of a certificate authority that is being - * imported. - * - edit the trust level of an already existing certificate authority. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; -import '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import './certificate_shared.css.js'; - -import type {CrCheckboxElement} from '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; -import type {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {loadTimeData} from '//resources/js/load_time_data.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './ca_trust_edit_dialog.html.js'; -import type {CaTrustInfo, CertificatesBrowserProxy, CertificateSubnode, NewCertificateSubNode} from './certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl} from './certificates_browser_proxy.js'; - -export interface CaTrustEditDialogElement { - $: { - dialog: CrDialogElement, - email: CrCheckboxElement, - objSign: CrCheckboxElement, - ok: HTMLElement, - spinner: HTMLElement, - ssl: CrCheckboxElement, - }; -} - -const CaTrustEditDialogElementBase = I18nMixin(PolymerElement); - -export class CaTrustEditDialogElement extends CaTrustEditDialogElementBase { - static get is() { - return 'ca-trust-edit-dialog'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - model: Object, - trustInfo_: Object, - explanationText_: String, - }; - } - - declare model: CertificateSubnode|NewCertificateSubNode; - declare private trustInfo_: CaTrustInfo|null; - declare private explanationText_: string; - private browserProxy_: CertificatesBrowserProxy|null = null; - - override ready() { - super.ready(); - this.browserProxy_ = CertificatesBrowserProxyImpl.getInstance(); - } - - override connectedCallback() { - super.connectedCallback(); - - this.explanationText_ = loadTimeData.getStringF( - 'certificateManagerCaTrustEditDialogExplanation', this.model.name); - - // A non existing |model.id| indicates that a new certificate is being - // imported, otherwise an existing certificate is being edited. - if ((this.model as CertificateSubnode).id) { - this.browserProxy_! - .getCaCertificateTrust((this.model as CertificateSubnode).id) - .then(trustInfo => { - this.trustInfo_ = trustInfo; - this.$.dialog.showModal(); - }); - } else { - this.$.dialog.showModal(); - } - } - - private onCancelClick_() { - this.$.dialog.close(); - } - - private onOkClick_() { - this.$.spinner.hidden = false; - - const whenDone = (this.model as CertificateSubnode).id ? - this.browserProxy_!.editCaCertificateTrust( - (this.model as CertificateSubnode).id, this.$.ssl.checked, - this.$.email.checked, this.$.objSign.checked) : - this.browserProxy_!.importCaCertificateTrustSelected( - this.$.ssl.checked, this.$.email.checked, this.$.objSign.checked); - - whenDone.then( - () => { - this.$.spinner.hidden = true; - this.$.dialog.close(); - }, - error => { - if (error === null) { - return; - } - this.$.dialog.close(); - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error: error, anchor: null}, - })); - }); - } -} - -declare global { - interface HTMLElementTagNameMap { - 'ca-trust-edit-dialog': CaTrustEditDialogElement; - } -} - -customElements.define(CaTrustEditDialogElement.is, CaTrustEditDialogElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html deleted file mode 100644 index 126dd50c..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.html +++ /dev/null
@@ -1,17 +0,0 @@ - <style include="certificate-shared"></style> - <cr-dialog id="dialog" show-on-attach close-text="[[i18n('close')]]"> - <div slot="title"> - [[getTitleText_(model, certificateType)]] - </div> - <div slot="body"> - <div>[[getDescriptionText_(model, certificateType)]]</div> - </div> - <div slot="button-container"> - <cr-button class="cancel-button" on-click="onCancelClick_"> - [[i18n('cancel')]] - </cr-button> - <cr-button id="ok" class="action-button" on-click="onOkClick_"> - [[i18n('ok')]] - </cr-button> - </div> - </cr-dialog>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts deleted file mode 100644 index d21384b..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts +++ /dev/null
@@ -1,121 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A confirmation dialog allowing the user to delete various types - * of certificates. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import './certificate_shared.css.js'; - -import type {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {assertNotReached} from '//resources/js/assert.js'; -import {loadTimeData} from '//resources/js/load_time_data.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_delete_confirmation_dialog.html.js'; -import type {CertificateSubnode} from './certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl, CertificateType} from './certificates_browser_proxy.js'; - -export interface CertificateDeleteConfirmationDialogElement { - $: { - dialog: CrDialogElement, - ok: HTMLElement, - }; -} - -const CertificateDeleteConfirmationDialogElementBase = - I18nMixin(PolymerElement); - -export class CertificateDeleteConfirmationDialogElement extends - CertificateDeleteConfirmationDialogElementBase { - static get is() { - return 'certificate-delete-confirmation-dialog'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - model: Object, - certificateType: String, - }; - } - - declare model: CertificateSubnode; - declare certificateType: CertificateType; - - private getTitleText_(): string { - const getString = (localizedMessageId: string) => - loadTimeData.getStringF(localizedMessageId, this.model.name); - - switch (this.certificateType) { - case CertificateType.PERSONAL: - return getString('certificateManagerDeleteUserTitle'); - case CertificateType.SERVER: - return getString('certificateManagerDeleteServerTitle'); - case CertificateType.CA: - return getString('certificateManagerDeleteCaTitle'); - case CertificateType.OTHER: - return getString('certificateManagerDeleteOtherTitle'); - default: - assertNotReached(); - } - } - - private getDescriptionText_(): string { - const getString = loadTimeData.getString.bind(loadTimeData); - switch (this.certificateType) { - case CertificateType.PERSONAL: - return getString('certificateManagerDeleteUserDescription'); - case CertificateType.SERVER: - return getString('certificateManagerDeleteServerDescription'); - case CertificateType.CA: - return getString('certificateManagerDeleteCaDescription'); - case CertificateType.OTHER: - return ''; - default: - assertNotReached(); - } - } - - private onCancelClick_() { - this.$.dialog.close(); - } - - private onOkClick_() { - CertificatesBrowserProxyImpl.getInstance() - .deleteCertificate(this.model.id) - .then( - () => { - this.$.dialog.close(); - }, - error => { - if (error === null) { - return; - } - this.$.dialog.close(); - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error: error, anchor: null}, - })); - }); - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-delete-confirmation-dialog': - CertificateDeleteConfirmationDialogElement; - } -} - -customElements.define( - CertificateDeleteConfirmationDialogElement.is, - CertificateDeleteConfirmationDialogElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html b/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html deleted file mode 100644 index b4d283c..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.html +++ /dev/null
@@ -1,27 +0,0 @@ - <style include="certificate-shared"> - .expand-box { - align-items: center; - border-top: var(--cr-separator-line); - display: flex; - min-height: 48px; - padding: 0 20px; - } - </style> - <div class="expand-box"> - <div class="flex">[[model.id]]</div> - <cr-policy-indicator indicator-type="[[getPolicyIndicatorType_(model)]]"> - </cr-policy-indicator> - <cr-expand-button no-hover expanded="{{expanded_}}" - aria-label="[[i18n('certificateManagerExpandA11yLabel')]]"> - </cr-expand-button> - </div> - <template is="dom-if" if="[[expanded_]]"> - <div class="list-frame"> - <template is="dom-repeat" items="[[model.subnodes]]"> - <certificate-subentry model="[[item]]" - certificate-type="[[certificateType]]" - is-last$="[[isLast_(index, model)]]"> - </certificate-subentry> - </template> - </div> - </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts deleted file mode 100644 index 55d37352..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_entry.ts +++ /dev/null
@@ -1,54 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview An element that represents an SSL certificate entry. - */ -import '//resources/cr_elements/cr_expand_button/cr_expand_button.js'; -import '//resources/cr_elements/policy/cr_policy_indicator.js'; -import './certificate_shared.css.js'; -import './certificate_subentry.js'; - -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_types.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_entry.html.js'; -import type {CertificatesOrgGroup, CertificateType} from './certificates_browser_proxy.js'; - -const CertificateEntryElementBase = I18nMixin(PolymerElement); - -class CertificateEntryElement extends CertificateEntryElementBase { - static get is() { - return 'certificate-entry'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - model: Object, - certificateType: String, - }; - } - - declare model: CertificatesOrgGroup; - declare certificateType: CertificateType; - - /** - * @return Whether the given index corresponds to the last sub-node. - */ - private isLast_(index: number): boolean { - return index === this.model.subnodes.length - 1; - } - - private getPolicyIndicatorType_(): CrPolicyIndicatorType { - return this.model.containsPolicyCerts ? CrPolicyIndicatorType.USER_POLICY : - CrPolicyIndicatorType.NONE; - } -} - -customElements.define(CertificateEntryElement.is, CertificateEntryElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html b/ui/webui/resources/cr_components/certificate_manager/certificate_list.html deleted file mode 100644 index dd58e2f..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_list.html +++ /dev/null
@@ -1,32 +0,0 @@ - <style include="certificate-shared"> - .button-box { - align-items: center; - display: flex; - margin-bottom: 24px; - min-height: 48px; - padding: 0 20px; - } - - /* TODO(aee): add platform conditional after crbug/964506 is fixed. */ - #importAndBind { - margin-inline-start: 8px; - } - </style> - <div class="button-box"> - <span class="flex"> - [[getDescription_(certificateType, certificates)]]</span> - <cr-button id="import" on-click="onImportClick_" - hidden="[[!canImport_(certificateType, importAllowed, isKiosk_)]]"> - [[i18n('certificateManagerImport')]]</cr-button> -<if expr="is_chromeos"> - <cr-button id="importAndBind" on-click="onImportAndBindClick_" - hidden="[[!canImportAndBind_(certificateType, importAllowed, - isGuest_)]]"> - [[i18n('certificateManagerImportAndBind')]]</cr-button> -</if> - </div> - <template is="dom-repeat" items="[[certificates]]"> - <certificate-entry model="[[item]]" - certificate-type="[[certificateType]]"> - </certificate-entry> - </template>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts deleted file mode 100644 index b26af296..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts +++ /dev/null
@@ -1,188 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview 'certificate-list' is an element that displays a list of - * certificates. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import './certificate_entry.js'; -import './certificate_shared.css.js'; - -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {assertNotReached} from '//resources/js/assert.js'; -import {loadTimeData} from '//resources/js/load_time_data.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_list.html.js'; -import {CertificateAction, CertificateActionEvent} from './certificate_manager_types.js'; -import type {CertificatesError, CertificatesImportError, CertificatesOrgGroup, NewCertificateSubNode} from './certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl, CertificateType} from './certificates_browser_proxy.js'; - -export interface CertificateListElement { - $: { - import: HTMLElement, - // <if expr="is_chromeos"> - importAndBind: HTMLElement, - // </if> - }; -} - -const CertificateListElementBase = I18nMixin(PolymerElement); - -export class CertificateListElement extends CertificateListElementBase { - static get is() { - return 'certificate-list'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - certificates: { - type: Array, - value() { - return []; - }, - }, - - certificateType: String, - importAllowed: Boolean, - - // <if expr="is_chromeos"> - isGuest_: { - type: Boolean, - value() { - return loadTimeData.valueExists('isGuest') && - loadTimeData.getBoolean('isGuest'); - }, - }, - // </if> - - isKiosk_: { - type: Boolean, - value() { - return loadTimeData.valueExists('isKiosk') && - loadTimeData.getBoolean('isKiosk'); - }, - }, - }; - } - - declare certificates: CertificatesOrgGroup[]; - declare certificateType: CertificateType; - declare importAllowed: boolean; - // <if expr="is_chromeos"> - declare private isGuest_: boolean; - // </if> - declare private isKiosk_: boolean; - - private getDescription_(): string { - if (this.certificates.length === 0) { - return this.i18n('certificateManagerNoCertificates'); - } - - switch (this.certificateType) { - case CertificateType.PERSONAL: - return this.i18n('certificateManagerYourCertificatesDescription'); - case CertificateType.SERVER: - return this.i18n('certificateManagerServersDescription'); - case CertificateType.CA: - return this.i18n('certificateManagerAuthoritiesDescription'); - case CertificateType.OTHER: - return this.i18n('certificateManagerOthersDescription'); - default: - assertNotReached(); - } - } - - private canImport_(): boolean { - return !this.isKiosk_ && this.certificateType !== CertificateType.OTHER && - this.importAllowed; - } - - // <if expr="is_chromeos"> - private canImportAndBind_(): boolean { - return !this.isGuest_ && - this.certificateType === CertificateType.PERSONAL && this.importAllowed; - } - // </if> - - /** - * Handles a rejected Promise returned from |browserProxy_|. - */ - private onRejected_( - anchor: HTMLElement, - error: CertificatesError|CertificatesImportError|null) { - if (error === null) { - // Nothing to do here. Null indicates that the user clicked "cancel" on a - // native file chooser dialog or that the request was ignored by the - // handler due to being received while another was still being processed. - return; - } - - // Otherwise propagate the error to the parents, such that a dialog - // displaying the error will be shown. - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error, anchor}, - })); - } - - private dispatchImportActionEvent_( - subnode: NewCertificateSubNode|null, anchor: HTMLElement) { - this.dispatchEvent(new CustomEvent(CertificateActionEvent, { - bubbles: true, - composed: true, - detail: { - action: CertificateAction.IMPORT, - subnode: subnode, - certificateType: this.certificateType, - anchor: anchor, - }, - })); - } - - private onImportClick_(e: Event) { - this.handleImport_(false, e.target as HTMLElement); - } - - // <if expr="is_chromeos"> - private onImportAndBindClick_(e: Event) { - this.handleImport_(true, e.target as HTMLElement); - } - // </if> - - private handleImport_(useHardwareBacked: boolean, anchor: HTMLElement) { - const browserProxy = CertificatesBrowserProxyImpl.getInstance(); - if (this.certificateType === CertificateType.PERSONAL) { - browserProxy.importPersonalCertificate(useHardwareBacked) - .then(showPasswordPrompt => { - if (showPasswordPrompt) { - this.dispatchImportActionEvent_(null, anchor); - } - }, this.onRejected_.bind(this, anchor)); - } else if (this.certificateType === CertificateType.CA) { - browserProxy.importCaCertificate().then(certificateName => { - this.dispatchImportActionEvent_({name: certificateName}, anchor); - }, this.onRejected_.bind(this, anchor)); - } else if (this.certificateType === CertificateType.SERVER) { - browserProxy.importServerCertificate().catch( - this.onRejected_.bind(this, anchor)); - } else { - assertNotReached(); - } - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-list': CertificateListElement; - } -} - -customElements.define(CertificateListElement.is, CertificateListElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html deleted file mode 100644 index 6a2414d..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html +++ /dev/null
@@ -1,71 +0,0 @@ - <style include="cr-hidden-style"> - cr-tabs { - --cr-tabs-font-size: inherit; - --cr-tabs-height: 40px; - margin-bottom: 24px; - } - </style> - - <template is="dom-if" if="[[showCaTrustEditDialog_]]" restamp> - <ca-trust-edit-dialog model="[[dialogModel_]]"> - </ca-trust-edit-dialog> - </template> - <template is="dom-if" if="[[showDeleteConfirmationDialog_]]" restamp> - <certificate-delete-confirmation-dialog - model="[[dialogModel_]]" - certificate-type="[[dialogModelCertificateType_]]"> - </certificate-delete-confirmation-dialog> - </template> - <template is="dom-if" if="[[showPasswordEncryptionDialog_]]" restamp> - <certificate-password-encryption-dialog> - </certificate-password-encryption-dialog> - </template> - <template is="dom-if" if="[[showPasswordDecryptionDialog_]]" restamp> - <certificate-password-decryption-dialog> - </certificate-password-decryption-dialog> - </template> - <template is="dom-if" if="[[showErrorDialog_]]" restamp> - <certificates-error-dialog model="[[errorDialogModel_]]"> - </certificates-error-dialog> - </template> - - <cr-tabs selected="{{selected}}" tab-names="[[tabNames_]]"></cr-tabs> - <cr-page-selector selected="[[selected]]"> - <div> - <certificate-list id="personalCerts" - certificates="[[personalCerts]]" - certificate-type="[[certificateTypeEnum_.PERSONAL]]" - import-allowed="[[clientImportAllowed]]"> - </certificate-list> -<if expr="is_chromeos"> - <certificate-provisioning-list></certificate-provisioning-list> -</if> - </div> - <div> - <template is="dom-if" if="[[isTabSelected_(selected, 1)]]"> - <certificate-list id="serverCerts" - certificates="[[serverCerts]]" - certificate-type="[[certificateTypeEnum_.SERVER]]" - import-allowed="true"> - </certificate-list> - </template> - </div> - <div> - <template is="dom-if" if="[[isTabSelected_(selected, 2)]]"> - <certificate-list id="caCerts" - certificates="[[caCerts]]" - certificate-type="[[certificateTypeEnum_.CA]]" - import-allowed="[[caImportAllowed]]"> - </certificate-list> - </template> - </div> - <div> - <template is="dom-if" if="[[isTabSelected_(selected, 3)]]"> - <certificate-list id="otherCerts" - certificates="[[otherCerts]]" - certificate-type="[[certificateTypeEnum_.OTHER]]" - import-allowed="false"> - </certificate-list> - </template> - </div> - </cr-page-selector>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts deleted file mode 100644 index 4ef7b8c7..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts +++ /dev/null
@@ -1,290 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview The 'certificate-manager' component manages SSL certificates. - */ -import '//resources/cr_elements/cr_tabs/cr_tabs.js'; -import '//resources/cr_elements/cr_hidden_style.css.js'; -import '//resources/cr_elements/cr_page_selector/cr_page_selector.js'; -import './ca_trust_edit_dialog.js'; -import './certificate_delete_confirmation_dialog.js'; -import './certificate_list.js'; -import './certificate_password_decryption_dialog.js'; -import './certificate_password_encryption_dialog.js'; -import './certificates_error_dialog.js'; -// <if expr="is_chromeos"> -import './certificate_provisioning_list.js'; - -// </if> - -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {WebUiListenerMixin} from '//resources/cr_elements/web_ui_listener_mixin.js'; -import {focusWithoutInk} from '//resources/js/focus_without_ink.js'; -import {loadTimeData} from '//resources/js/load_time_data.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_manager.html.js'; -import {CertificateAction, CertificateActionEvent} from './certificate_manager_types.js'; -import type {CertificatesError, CertificatesImportError, CertificatesOrgGroup, CertificateSubnode, NewCertificateSubNode} from './certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl, CertificateType} from './certificates_browser_proxy.js'; - -const CertificateManagerElementBase = - WebUiListenerMixin(I18nMixin(PolymerElement)); - -export class CertificateManagerElement extends CertificateManagerElementBase { - static get is() { - return 'certificate-manager'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - selected: { - type: Number, - value: 0, - }, - - personalCerts: { - type: Array, - value() { - return []; - }, - }, - - serverCerts: { - type: Array, - value() { - return []; - }, - }, - - caCerts: { - type: Array, - value() { - return []; - }, - }, - - otherCerts: { - type: Array, - value() { - return []; - }, - }, - - /** - * Indicates if client certificate import is allowed - * by Chrome OS specific policy ClientCertificateManagementAllowed. - * Value exists only for Chrome OS. - */ - clientImportAllowed: { - type: Boolean, - value: false, - }, - - /** - * Indicates if CA certificate import is allowed - * by Chrome OS specific policy CACertificateManagementAllowed. - * Value exists only for Chrome OS. - */ - caImportAllowed: { - type: Boolean, - value: false, - }, - - certificateTypeEnum_: { - type: Object, - value: CertificateType, - readOnly: true, - }, - - showCaTrustEditDialog_: Boolean, - showDeleteConfirmationDialog_: Boolean, - showPasswordEncryptionDialog_: Boolean, - showPasswordDecryptionDialog_: Boolean, - showErrorDialog_: Boolean, - - /** - * The model to be passed to dialogs that refer to a given certificate. - */ - dialogModel_: Object, - - /** - * The certificate type to be passed to dialogs that refer to a given - * certificate. - */ - dialogModelCertificateType_: String, - - /** - * The model to be passed to the error dialog. - */ - errorDialogModel_: Object, - - /** - * The element to return focus to, when the currently shown dialog is - * closed. - */ - activeDialogAnchor_: Object, - - isKiosk_: { - type: Boolean, - value() { - return loadTimeData.valueExists('isKiosk') && - loadTimeData.getBoolean('isKiosk'); - }, - }, - - tabNames_: { - type: Array, - computed: 'computeTabNames_(isKiosk_)', - }, - }; - } - - declare selected: number; - declare personalCerts: CertificatesOrgGroup[]; - declare serverCerts: CertificatesOrgGroup[]; - declare caCerts: CertificatesOrgGroup[]; - declare otherCerts: CertificatesOrgGroup[]; - declare clientImportAllowed: boolean; - declare caImportAllowed: boolean; - declare private showCaTrustEditDialog_: boolean; - declare private showDeleteConfirmationDialog_: boolean; - declare private showPasswordEncryptionDialog_: boolean; - declare private showPasswordDecryptionDialog_: boolean; - declare private showErrorDialog_: boolean; - declare private dialogModel_: CertificateSubnode|NewCertificateSubNode|null; - declare private dialogModelCertificateType_: CertificateType|null; - declare private errorDialogModel_: CertificatesError|CertificatesImportError| - null; - declare private activeDialogAnchor_: HTMLElement|null; - declare private isKiosk_: boolean; - declare private tabNames_: string[]; - - - override connectedCallback() { - super.connectedCallback(); - this.addWebUiListener('certificates-changed', this.set.bind(this)); - this.addWebUiListener( - 'client-import-allowed-changed', - this.setClientImportAllowed.bind(this)); - this.addWebUiListener( - 'ca-import-allowed-changed', this.setCaImportAllowed.bind(this)); - CertificatesBrowserProxyImpl.getInstance().refreshCertificates(); - } - - private setClientImportAllowed(allowed: boolean) { - this.clientImportAllowed = allowed; - } - - private setCaImportAllowed(allowed: boolean) { - this.caImportAllowed = allowed; - } - - /** - * @return Whether to show tab at |tabIndex|. - */ - private isTabSelected_(selectedIndex: number, tabIndex: number): boolean { - return selectedIndex === tabIndex; - } - - override ready() { - super.ready(); - this.addEventListener(CertificateActionEvent, event => { - this.dialogModel_ = event.detail.subnode; - this.dialogModelCertificateType_ = event.detail.certificateType; - - if (event.detail.action === CertificateAction.IMPORT) { - if (event.detail.certificateType === CertificateType.PERSONAL) { - this.openDialog_( - 'certificate-password-decryption-dialog', - 'showPasswordDecryptionDialog_', event.detail.anchor); - } else if (event.detail.certificateType === CertificateType.CA) { - this.openDialog_( - 'ca-trust-edit-dialog', 'showCaTrustEditDialog_', - event.detail.anchor); - } - } else { - if (event.detail.action === CertificateAction.EDIT) { - this.openDialog_( - 'ca-trust-edit-dialog', 'showCaTrustEditDialog_', - event.detail.anchor); - } else if (event.detail.action === CertificateAction.DELETE) { - this.openDialog_( - 'certificate-delete-confirmation-dialog', - 'showDeleteConfirmationDialog_', event.detail.anchor); - } else if (event.detail.action === CertificateAction.EXPORT_PERSONAL) { - this.openDialog_( - 'certificate-password-encryption-dialog', - 'showPasswordEncryptionDialog_', event.detail.anchor); - } - } - - event.stopPropagation(); - }); - - this.addEventListener('certificates-error', event => { - const detail = event.detail; - this.errorDialogModel_ = detail.error; - this.openDialog_( - 'certificates-error-dialog', 'showErrorDialog_', detail.anchor); - event.stopPropagation(); - }); - } - - /** - * Opens a dialog and registers a listener for removing the dialog from the - * DOM once is closed. The listener is destroyed when the dialog is removed - * (because of 'restamp'). - * - * @param dialogTagName The tag name of the dialog to be shown. - * @param domIfBooleanName The name of the boolean variable - * corresponding to the dialog. - * @param anchor The element to focus when the dialog is - * closed. If null, the previous anchor element should be reused. This - * happens when a 'certificates-error-dialog' is opened, which when closed - * should focus the anchor of the previous dialog (the one that generated - * the error). - */ - private openDialog_( - dialogTagName: string, domIfBooleanName: string, - anchor: HTMLElement|null) { - if (anchor) { - this.activeDialogAnchor_ = anchor; - } - this.set(domIfBooleanName, true); - window.setTimeout(() => { - const dialog = this.shadowRoot!.querySelector(dialogTagName)!; - dialog.addEventListener('close', () => { - this.set(domIfBooleanName, false); - focusWithoutInk(this.activeDialogAnchor_!); - }); - }, 0); - } - - private computeTabNames_(): string[] { - return [ - loadTimeData.getString('certificateManagerYourCertificates'), - ...(this.isKiosk_ ? - [] : - [ - loadTimeData.getString('certificateManagerServers'), - loadTimeData.getString('certificateManagerAuthorities'), - ]), - loadTimeData.getString('certificateManagerOthers'), - ]; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-manager': CertificateManagerElement; - } -} - -customElements.define(CertificateManagerElement.is, CertificateManagerElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts index 45ebfafc..5536be5 100644 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts +++ b/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
@@ -2,60 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/** - * @fileoverview Closure compiler typedefs. - */ - -// clang-format off -// <if expr="is_chromeos"> import type {CertificateProvisioningProcess} from './certificate_provisioning_browser_proxy.js'; -// </if> -import type {CertificatesError, CertificatesImportError,CertificateSubnode, CertificateType, NewCertificateSubNode} from './certificates_browser_proxy.js'; -// clang-format on /** - * The payload of the 'certificate-action' event. - */ -export interface CertificateActionEventDetail { - action: CertificateAction; - subnode: CertificateSubnode|NewCertificateSubNode|null; - certificateType: CertificateType; - anchor: HTMLElement; -} - -/** - * The payload of the 'certificates-error' event. - */ -export interface CertificatesErrorEventDetail { - error: CertificatesError|CertificatesImportError|null; - anchor: HTMLElement|null; -} - -/** - * Enumeration of actions that require a popup menu to be shown to the user. - */ -export enum CertificateAction { - DELETE = 0, - EDIT = 1, - EXPORT_PERSONAL = 2, - IMPORT = 3, -} - -/** - * The name of the event fired when a certificate action is selected from the - * dropdown menu. CertificateActionEventDetail is passed as the event detail. - */ -export const CertificateActionEvent = 'certificate-action'; - -// <if expr="is_chromeos"> -/** * The payload of the 'certificate-provisioning-view-details-action' event. */ export interface CertificateProvisioningActionEventDetail { model: CertificateProvisioningProcess; anchor: HTMLElement; } -// </if> /** * The name of the event fired when a the "View Details" action is selected on @@ -67,11 +22,7 @@ declare global { interface HTMLElementEventMap { - 'certificates-error': CustomEvent<CertificatesErrorEventDetail>; - 'certificate-action': CustomEvent<CertificateActionEventDetail>; - // <if expr="is_chromeos"> 'certificate-provisioning-view-details-action': CustomEvent<CertificateProvisioningActionEventDetail>; - // </if> } }
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html deleted file mode 100644 index 3985ca0..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.html +++ /dev/null
@@ -1,24 +0,0 @@ - <style include="certificate-shared"> - cr-input { - --cr-input-error-display: none; - } - </style> - <cr-dialog id="dialog" show-on-attach close-text="[[i18n('close')]]"> - <div slot="title"> - [[i18n('certificateManagerDecryptPasswordTitle')]] - </div> - <div slot="body"> - <cr-input type="password" id="password" - label="[[i18n('certificateManagerPassword')]]" - value="{{password_}}" autofocus> - </cr-input> - </div> - <div slot="button-container"> - <cr-button class="cancel-button" on-click="onCancelClick_"> - [[i18n('cancel')]] - </cr-button> - <cr-button id="ok" class="action-button" on-click="onOkClick_"> - [[i18n('ok')]] - </cr-button> - </div> - </cr-dialog>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts deleted file mode 100644 index 41d10ac..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts +++ /dev/null
@@ -1,87 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A dialog prompting the user for a decryption password such that - * a previously exported personal certificate can be imported. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import '//resources/cr_elements/cr_input/cr_input.js'; -import './certificate_shared.css.js'; - -import type {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js'; -import type {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_password_decryption_dialog.html.js'; -import {CertificatesBrowserProxyImpl} from './certificates_browser_proxy.js'; - -export interface CertificatePasswordDecryptionDialogElement { - $: { - dialog: CrDialogElement, - ok: CrButtonElement, - }; -} - -const CertificatePasswordDecryptionDialogElementBase = - I18nMixin(PolymerElement); - -export class CertificatePasswordDecryptionDialogElement extends - CertificatePasswordDecryptionDialogElementBase { - static get is() { - return 'certificate-password-decryption-dialog'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - password_: { - type: String, - value: '', - }, - }; - } - - declare private password_: string; - - private onCancelClick_() { - this.$.dialog.close(); - } - - private onOkClick_() { - CertificatesBrowserProxyImpl.getInstance() - .importPersonalCertificatePasswordSelected(this.password_) - .then( - () => { - this.$.dialog.close(); - }, - error => { - if (error === null) { - return; - } - this.$.dialog.close(); - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error: error, anchor: null}, - })); - }); - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-password-decryption-dialog': - CertificatePasswordDecryptionDialogElement; - } -} - -customElements.define( - CertificatePasswordDecryptionDialogElement.is, - CertificatePasswordDecryptionDialogElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html deleted file mode 100644 index b66b419..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.html +++ /dev/null
@@ -1,35 +0,0 @@ - <style include="certificate-shared"> - cr-input { - --cr-input-error-display: none; - margin-top: var(--cr-form-field-bottom-spacing); - } - - .password-buttons { - margin-bottom: 20px; - } - </style> - <cr-dialog id="dialog" close-text="[[i18n('close')]]"> - <div slot="title"> - [[i18n('certificateManagerEncryptPasswordTitle')]] - </div> - <div slot="body"> - <div>[[i18n('certificateManagerEncryptPasswordDescription')]]</div> - <div class="password-buttons"> - <cr-input type="password" value="{{password_}}" id="password" - label="[[i18n('certificateManagerPassword')]]" - on-input="validate_" autofocus></cr-input> - <cr-input type="password" - value="{{confirmPassword_}}" id="confirmPassword" - label="[[i18n('certificateManagerConfirmPassword')]]" - on-input="validate_"></cr-input> - </div> - </div> - <div slot="button-container"> - <cr-button class="cancel-button" on-click="onCancelClick_"> - [[i18n('cancel')]] - </cr-button> - <cr-button id="ok" class="action-button" on-click="onOkClick_" disabled> - [[i18n('ok')]] - </cr-button> - </div> - </cr-dialog>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts deleted file mode 100644 index af44033..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts +++ /dev/null
@@ -1,105 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A dialog prompting the user to encrypt a personal certificate - * before it is exported to disk. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import '//resources/cr_elements/cr_input/cr_input.js'; -import '//resources/cr_elements/cr_shared_vars.css.js'; -import './certificate_shared.css.js'; - -import type {CrButtonElement} from '//resources/cr_elements/cr_button/cr_button.js'; -import type {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './certificate_password_encryption_dialog.html.js'; -import {CertificatesBrowserProxyImpl} from './certificates_browser_proxy.js'; - -export interface CertificatePasswordEncryptionDialogElement { - $: { - dialog: CrDialogElement, - ok: CrButtonElement, - }; -} - -const CertificatePasswordEncryptionDialogElementBase = - I18nMixin(PolymerElement); - -export class CertificatePasswordEncryptionDialogElement extends - CertificatePasswordEncryptionDialogElementBase { - static get is() { - return 'certificate-password-encryption-dialog'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - password_: { - type: String, - value: '', - }, - - confirmPassword_: { - type: String, - value: '', - }, - }; - } - - declare private password_: string; - declare private confirmPassword_: string; - - override connectedCallback() { - super.connectedCallback(); - this.$.dialog.showModal(); - } - - private onCancelClick_() { - this.$.dialog.close(); - } - - private onOkClick_() { - CertificatesBrowserProxyImpl.getInstance() - .exportPersonalCertificatePasswordSelected(this.password_) - .then( - () => { - this.$.dialog.close(); - }, - error => { - if (error === null) { - return; - } - this.$.dialog.close(); - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error: error, anchor: null}, - })); - }); - } - - private validate_() { - const isValid = - this.password_ !== '' && this.password_ === this.confirmPassword_; - this.$.ok.disabled = !isValid; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-password-encryption-dialog': - CertificatePasswordEncryptionDialogElement; - } -} - -customElements.define( - CertificatePasswordEncryptionDialogElement.is, - CertificatePasswordEncryptionDialogElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html b/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html deleted file mode 100644 index 93fcea93..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.html +++ /dev/null
@@ -1,52 +0,0 @@ - <style include="certificate-shared cr-icons"> - .name { - flex: auto; - } - - .untrusted { - color: #d32f2f; /* --paper-red-700 */ - font-weight: 500; - margin-inline-end: 16px; - text-transform: uppercase; - } - - :host([is-last]) .list-item { - border-bottom: none; - } - </style> - <div class="list-item underbar"> - <div class="untrusted" hidden$="[[!model.untrusted]]"> - [[i18n('certificateManagerUntrusted')]] - </div> - <div class="name">[[model.name]]</div> - <cr-policy-indicator indicator-type="[[getPolicyIndicatorType_(model)]]"> - </cr-policy-indicator> - <cr-icon-button class="icon-more-vert" id="dots" - title="[[i18n('moreActions')]]" on-click="onDotsClick_"> - </cr-icon-button> - <cr-lazy-render id="menu"> - <template> - <cr-action-menu role-description="[[i18n('menu')]]"> - <button class="dropdown-item" id="view" - on-click="onViewClick_"> - [[i18n('certificateManagerView')]] - </button> - <button class="dropdown-item" id="edit" - hidden$="[[!canEdit_(model)]]" - on-click="onEditClick_"> - [[i18n('edit')]] - </button> - <button class="dropdown-item" id="export" - hidden$="[[!canExport_(certificateType, model)]]" - on-click="onExportClick_"> - [[i18n('certificateManagerExport')]] - </button> - <button class="dropdown-item" id="delete" - hidden$="[[!canDelete_(model)]]" - on-click="onDeleteClick_"> - [[i18n('certificateManagerDelete')]] - </button> - </cr-action-menu> - </template> - </cr-lazy-render> - <div>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts deleted file mode 100644 index b676a7d9..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts +++ /dev/null
@@ -1,168 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview certificate-subentry represents an SSL certificate sub-entry. - */ - -import '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; -import '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; -import '//resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; -import '//resources/cr_elements/policy/cr_policy_indicator.js'; -import '//resources/cr_elements/icons.html.js'; -import './certificate_shared.css.js'; - -import type {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; -import type {CrLazyRenderElement} from '//resources/cr_elements/cr_lazy_render/cr_lazy_render.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_types.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {CertificateAction, CertificateActionEvent} from './certificate_manager_types.js'; -import {getTemplate} from './certificate_subentry.html.js'; -import type {CertificatesBrowserProxy, CertificatesError, CertificateSubnode} from './certificates_browser_proxy.js'; -import {CertificatesBrowserProxyImpl, CertificateType} from './certificates_browser_proxy.js'; - -export interface CertificateSubentryElement { - $: { - menu: CrLazyRenderElement<CrActionMenuElement>, - dots: HTMLElement, - }; -} - -const CertificateSubentryElementBase = I18nMixin(PolymerElement); - -export class CertificateSubentryElement extends CertificateSubentryElementBase { - static get is() { - return 'certificate-subentry'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - model: Object, - certificateType: String, - }; - } - - declare model: CertificateSubnode; - declare certificateType: CertificateType; - private browserProxy_: CertificatesBrowserProxy = - CertificatesBrowserProxyImpl.getInstance(); - - /** - * Dispatches an event indicating which certificate action was tapped. It is - * used by the parent of this element to display a modal dialog accordingly. - */ - private dispatchCertificateActionEvent_(action: CertificateAction) { - this.dispatchEvent(new CustomEvent(CertificateActionEvent, { - bubbles: true, - composed: true, - detail: { - action: action, - subnode: this.model, - certificateType: this.certificateType, - anchor: this.$.dots, - }, - })); - } - - /** - * Handles the case where a call to the browser resulted in a rejected - * promise. - */ - private onRejected_(error: CertificatesError|null) { - if (error === null) { - // Nothing to do here. Null indicates that the user clicked "cancel" on a - // native file chooser dialog or that the request was ignored by the - // handler due to being received while another was still being processed. - return; - } - - // Otherwise propagate the error to the parents, such that a dialog - // displaying the error will be shown. - this.dispatchEvent(new CustomEvent('certificates-error', { - bubbles: true, - composed: true, - detail: {error, anchor: null}, - })); - } - - private onViewClick_() { - this.closePopupMenu_(); - this.browserProxy_.viewCertificate(this.model.id); - } - - private onEditClick_() { - this.closePopupMenu_(); - this.dispatchCertificateActionEvent_(CertificateAction.EDIT); - } - - private onDeleteClick_() { - this.closePopupMenu_(); - this.dispatchCertificateActionEvent_(CertificateAction.DELETE); - } - - private onExportClick_() { - this.closePopupMenu_(); - if (this.certificateType === CertificateType.PERSONAL) { - this.browserProxy_.exportPersonalCertificate(this.model.id).then(() => { - this.dispatchCertificateActionEvent_(CertificateAction.EXPORT_PERSONAL); - }, this.onRejected_.bind(this)); - } else { - this.browserProxy_.exportCertificate(this.model.id); - } - } - - /** - * @return Whether the certificate can be edited. - */ - private canEdit_(model: CertificateSubnode): boolean { - return model.canBeEdited; - } - - /** - * @return Whether the certificate can be exported. - */ - private canExport_( - certificateType: CertificateType, model: CertificateSubnode): boolean { - if (certificateType === CertificateType.PERSONAL) { - return model.extractable; - } - return true; - } - - /** - * @return Whether the certificate can be deleted. - */ - private canDelete_(model: CertificateSubnode): boolean { - return model.canBeDeleted; - } - - private closePopupMenu_() { - this.shadowRoot!.querySelector('cr-action-menu')!.close(); - } - - private onDotsClick_() { - this.$.menu.get().showAt(this.$.dots); - } - - private getPolicyIndicatorType_(model: CertificateSubnode): - CrPolicyIndicatorType { - return model.policy ? CrPolicyIndicatorType.USER_POLICY : - CrPolicyIndicatorType.NONE; - } -} - -declare global { - interface HTMLElementTagNameMap { - 'certificate-subentry': CertificateSubentryElement; - } -} - -customElements.define( - CertificateSubentryElement.is, CertificateSubentryElement);
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts b/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts deleted file mode 100644 index fcffc3f5..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificates_browser_proxy.ts +++ /dev/null
@@ -1,232 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A helper object used from the "Manage certificates" section - * to interact with the browser. - */ - -import {sendWithPromise} from '//resources/js/cr.js'; - -/** - * @see chrome/browser/ui/webui/settings/certificates_handler.cc - */ -export interface CertificateSubnode { - extractable: boolean; - id: string; - name: string; - policy: boolean; - webTrustAnchor: boolean; - canBeDeleted: boolean; - canBeEdited: boolean; - untrusted: boolean; -} - -/** - * A data structure describing a certificate that is currently being imported, - * therefore it has no ID yet, but it has a name. Used within JS only. - */ -export interface NewCertificateSubNode { - name: string; -} - -/** - * Top-level grouping node in a certificate list, representing an organization - * and containing certs that belong to the organization in |subnodes|. If a - * certificate does not have an organization name, it will be grouped under its - * own CertificatesOrgGroup with |name| set to its display name. - * @see chrome/browser/ui/webui/settings/certificates_handler.cc - */ -export interface CertificatesOrgGroup { - id: string; - name: string; - containsPolicyCerts: boolean; - subnodes: CertificateSubnode[]; -} - -export interface CaTrustInfo { - ssl: boolean; - email: boolean; - objSign: boolean; -} - -/** - * Generic error returned from C++ via a Promise reject callback. - * @see chrome/browser/ui/webui/settings/certificates_handler.cc - */ -export interface CertificatesError { - title: string; - description: string; -} - -/** - * Enumeration of all possible certificate types. - */ -export enum CertificateType { - CA = 'ca', - OTHER = 'other', - PERSONAL = 'personal', - SERVER = 'server', -} - - -/** - * Error returned from C++ via a Promise reject callback, when some certificates - * fail to be imported. - * @see chrome/browser/ui/webui/settings/certificates_handler.cc - */ -export interface CertificatesImportError { - title: string; - description: string; - certificateErrors: Array<{name: string, error: string}>; -} - -export interface CertificatesBrowserProxy { - /** - * Triggers 5 events in the following order - * 1x 'client-import-allowed-changed' event. - * 1x 'ca-import-allowed-changed' event. - * 4x 'certificates-changed' event, one for each certificate category. - */ - refreshCertificates(): void; - - viewCertificate(id: string): void; - - exportCertificate(id: string): void; - - /** - * @return A promise resolved when the certificate has been - * deleted successfully or rejected with a CertificatesError. - */ - deleteCertificate(id: string): Promise<void>; - - getCaCertificateTrust(id: string): Promise<CaTrustInfo>; - - editCaCertificateTrust( - id: string, ssl: boolean, email: boolean, - objSign: boolean): Promise<void>; - - cancelImportExportCertificate(): void; - - /** - * @return A promise firing once the user has selected - * the export location. A prompt should be shown to asking for a - * password to use for encrypting the file. The password should be - * passed back via a call to - * exportPersonalCertificatePasswordSelected(). - */ - exportPersonalCertificate(id: string): Promise<void>; - - exportPersonalCertificatePasswordSelected(password: string): Promise<void>; - - /** - * @return A promise firing once the user has selected - * the file to be imported. If true a password prompt should be shown to - * the user, and the password should be passed back via a call to - * importPersonalCertificatePasswordSelected(). - */ - importPersonalCertificate(useHardwareBacked: boolean): Promise<boolean>; - - importPersonalCertificatePasswordSelected(password: string): Promise<void>; - - /** - * @return A promise firing once the user has selected - * the file to be imported, or failing with CertificatesError. - * Upon success, a prompt should be shown to the user to specify the - * trust levels, and that information should be passed back via a call - * to importCaCertificateTrustSelected(). - */ - importCaCertificate(): Promise<string>; - - /** - * @return A promise firing once the trust level for the imported - * certificate has been successfully set. The promise is rejected if an - * error occurred with either a CertificatesError or - * CertificatesImportError. - */ - importCaCertificateTrustSelected( - ssl: boolean, email: boolean, objSign: boolean): Promise<void>; - - /** - * @return A promise firing once the certificate has been - * imported. The promise is rejected if an error occurred, with either - * a CertificatesError or CertificatesImportError. - */ - importServerCertificate(): Promise<void>; -} - -export class CertificatesBrowserProxyImpl implements CertificatesBrowserProxy { - refreshCertificates() { - chrome.send('refreshCertificates'); - } - - viewCertificate(id: string) { - chrome.send('viewCertificate', [id]); - } - - exportCertificate(id: string) { - chrome.send('exportCertificate', [id]); - } - - deleteCertificate(id: string) { - return sendWithPromise('deleteCertificate', id); - } - - exportPersonalCertificate(id: string) { - return sendWithPromise('exportPersonalCertificate', id); - } - - exportPersonalCertificatePasswordSelected(password: string) { - return sendWithPromise( - 'exportPersonalCertificatePasswordSelected', password); - } - - importPersonalCertificate(useHardwareBacked: boolean) { - return sendWithPromise('importPersonalCertificate', useHardwareBacked); - } - - importPersonalCertificatePasswordSelected(password: string) { - return sendWithPromise( - 'importPersonalCertificatePasswordSelected', password); - } - - getCaCertificateTrust(id: string) { - return sendWithPromise('getCaCertificateTrust', id); - } - - editCaCertificateTrust( - id: string, ssl: boolean, email: boolean, objSign: boolean) { - return sendWithPromise('editCaCertificateTrust', id, ssl, email, objSign); - } - - importCaCertificateTrustSelected( - ssl: boolean, email: boolean, objSign: boolean) { - return sendWithPromise( - 'importCaCertificateTrustSelected', ssl, email, objSign); - } - - cancelImportExportCertificate() { - chrome.send('cancelImportExportCertificate'); - } - - importCaCertificate() { - return sendWithPromise('importCaCertificate'); - } - - importServerCertificate() { - return sendWithPromise('importServerCertificate'); - } - - static getInstance(): CertificatesBrowserProxy { - return instance || (instance = new CertificatesBrowserProxyImpl()); - } - - static setInstance(obj: CertificatesBrowserProxy) { - instance = obj; - } -} - -// The singleton instance_ is replaced with a test version of this wrapper -// during testing. -let instance: CertificatesBrowserProxy|null = null;
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html b/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html deleted file mode 100644 index d61a1ec..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.html +++ /dev/null
@@ -1,17 +0,0 @@ - <style include="certificate-shared"></style> - <cr-dialog id="dialog" show-on-attach close-text="[[i18n('close')]]"> - <div slot="title">[[model.title]]</div> - <div slot="body"> - <div>[[model.description]]</div> - <template is="dom-if" if="[[model.certificateErrors]]"> - <template is="dom-repeat" items="[[model.certificateErrors]]"> - <div>[[getCertificateErrorText_(item)]]</div> - </template> - </template> - </div> - <div slot="button-container"> - <cr-button id="ok" class="action-button" on-click="onOkClick_"> - [[i18n('ok')]] - </cr-button> - </div> - </cr-dialog>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts deleted file mode 100644 index 30b3008..0000000 --- a/ui/webui/resources/cr_components/certificate_manager/certificates_error_dialog.ts +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview A dialog for showing SSL certificate related error messages. - * The user can only close the dialog, there is no other possible interaction. - */ -import '//resources/cr_elements/cr_button/cr_button.js'; -import '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import './certificate_shared.css.js'; - -import type {CrDialogElement} from '//resources/cr_elements/cr_dialog/cr_dialog.js'; -import {I18nMixin} from '//resources/cr_elements/i18n_mixin.js'; -import {loadTimeData} from '//resources/js/load_time_data.js'; -import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import type {CertificatesError, CertificatesImportError} from './certificates_browser_proxy.js'; -import {getTemplate} from './certificates_error_dialog.html.js'; - -interface CertificatesErrorDialogElement { - $: { - dialog: CrDialogElement, - }; -} - -const CertificatesErrorDialogElementBase = I18nMixin(PolymerElement); - -class CertificatesErrorDialogElement extends - CertificatesErrorDialogElementBase { - static get is() { - return 'certificates-error-dialog'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - model: Object, - }; - } - - declare model: CertificatesError|CertificatesImportError; - - private onOkClick_() { - this.$.dialog.close(); - } - - private getCertificateErrorText_(importError: {name: string, error: string}): - string { - return loadTimeData.getStringF( - 'certificateImportErrorFormat', importError.name, importError.error); - } -} - -customElements.define( - CertificatesErrorDialogElement.is, CertificatesErrorDialogElement);
diff --git a/ui/webui/resources/cr_components/searchbox/searchbox_dropdown.html b/ui/webui/resources/cr_components/searchbox/searchbox_dropdown.html index 20ad7d3c..b83728cb 100644 --- a/ui/webui/resources/cr_components/searchbox/searchbox_dropdown.html +++ b/ui/webui/resources/cr_components/searchbox/searchbox_dropdown.html
@@ -32,7 +32,6 @@ .header { align-items: center; box-sizing: border-box; - cursor: pointer; display: flex; font-size: inherit; font-weight: inherit;
diff --git a/v8 b/v8 index d39bd40..6cd9d55 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit d39bd40aa3585340bba5d178b96ec4a7ee597a50 +Subproject commit 6cd9d55b3be68f3ba3ad48c83f878a156bc0430a