From 03380ed6c99e6856b2f605202b63765b0eee6b09 Mon Sep 17 00:00:00 2001 From: Sophie Chang Date: Thu, 16 Dec 2021 23:52:32 +0000 Subject: [PATCH 01/71] Support multiple batch update hints fetches in flight Without this, requests will get dropped if multiple come in without the previous one finishing. The limit of max requests is finch-able similarly to the page navigation fetches. Bug: 1279536 Change-Id: I582a987024f8fb3bbb381a9e5e09c785a84b76ef Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3337086 Reviewed-by: Michael Crouse Commit-Queue: Sophie Chang Cr-Commit-Position: refs/heads/main@{#952581} --- .../optimization_guide/core/hints_manager.cc | 121 ++++++++++++------ .../optimization_guide/core/hints_manager.h | 59 +++++++-- .../core/hints_manager_unittest.cc | 109 ++++++++++++---- .../core/optimization_guide_features.cc | 9 ++ .../core/optimization_guide_features.h | 6 +- .../metadata/optimization/histograms.xml | 11 ++ 6 files changed, 235 insertions(+), 80 deletions(-) diff --git a/components/optimization_guide/core/hints_manager.cc b/components/optimization_guide/core/hints_manager.cc index 394d4c18e13bfe..800f42431b3b2d 100644 --- a/components/optimization_guide/core/hints_manager.cc +++ b/components/optimization_guide/core/hints_manager.cc @@ -302,6 +302,7 @@ HintsManager::HintsManager( hint_cache_( std::make_unique(hint_store, features::MaxHostKeyedHintCacheSize())), + batch_update_hints_fetchers_(features::MaxConcurrentBatchUpdateFetches()), page_navigation_hints_fetchers_( features::MaxConcurrentPageNavigationFetches()), hints_fetcher_factory_(std::make_unique( @@ -671,11 +672,6 @@ void HintsManager::FetchHintsForActiveTabs() { if (top_hosts.empty() && active_tab_urls_to_refresh.empty()) return; - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } - // Add hosts of active tabs to list of hosts to fetch for. Since we are mainly // fetching for updated information on tabs, add those to the front of the // list. @@ -695,7 +691,12 @@ void HintsManager::FetchHintsForActiveTabs() { registered_optimization_types_, active_tab_urls_to_refresh, top_hosts); - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( + if (!active_tabs_batch_update_hints_fetcher_) { + DCHECK(hints_fetcher_factory_); + active_tabs_batch_update_hints_fetcher_ = + hints_fetcher_factory_->BuildInstance(); + } + active_tabs_batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( top_hosts, active_tab_urls_to_refresh, registered_optimization_types_, proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, application_locale_, base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched, @@ -729,9 +730,12 @@ void HintsManager::OnPageNavigationHintsFetched( const base::flat_set& page_navigation_hosts_requested, absl::optional> get_hints_response) { + if (navigation_url) { + CleanUpFetcherForNavigation(*navigation_url); + } + if (!get_hints_response.has_value() || !get_hints_response.value()) { if (navigation_url) { - CleanUpFetcherForNavigation(*navigation_url); PrepareToInvokeRegisteredCallbacks(*navigation_url); } return; @@ -776,7 +780,6 @@ void HintsManager::OnFetchedPageNavigationHintsStored( navigation_data_weak_ptr.MaybeValid()); if (navigation_url) { - CleanUpFetcherForNavigation(*navigation_url); PrepareToInvokeRegisteredCallbacks(*navigation_url); } } @@ -809,7 +812,7 @@ void HintsManager::LoadHintForURL(const GURL& url, base::OnceClosure callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!url.has_host()) { - std::move(callback).Run(); + MaybeRunUpdateClosure(std::move(callback)); return; } @@ -825,34 +828,44 @@ void HintsManager::LoadHintForHost(const std::string& host, std::move(callback))); } -void HintsManager::FetchHintsForURLs(std::vector target_urls, +void HintsManager::FetchHintsForURLs(const std::vector& urls, proto::RequestContext request_context) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Collect hosts, stripping duplicates, but preserving the ordering. + InsertionOrderedSet target_urls; InsertionOrderedSet target_hosts; - for (const auto& url : target_urls) { + for (const auto& url : urls) { target_hosts.insert(url.host()); + target_urls.insert(url); } if (target_hosts.empty() && target_urls.empty()) return; - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } + MaybeLogGetHintRequestInfo(request_context, registered_optimization_types_, + target_urls.vector(), target_hosts.vector()); + + std::pair request_id_and_fetcher = + CreateAndTrackBatchUpdateHintsFetcher(); // Use the batch update hints fetcher for fetches off the SRP since we are - // not fetching for the current navigation, even though we are fetching using - // the page navigation context. However, since we do want to load the hints - // returned, we pass this through to the page navigation callback. - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( - target_hosts.vector(), target_urls, registered_optimization_types_, - request_context, application_locale_, - base::BindOnce(&HintsManager::OnPageNavigationHintsFetched, - weak_ptr_factory_.GetWeakPtr(), nullptr, absl::nullopt, - target_urls, target_hosts.set())); + // not fetching for the current navigation. + // + // Caller does not expect to be notified when relevant hints have been fetched + // and stored. + request_id_and_fetcher.second->FetchOptimizationGuideServiceHints( + target_hosts.vector(), target_urls.vector(), + registered_optimization_types_, request_context, application_locale_, + base::BindOnce( + &HintsManager::OnBatchUpdateHintsFetched, + weak_ptr_factory_.GetWeakPtr(), request_id_and_fetcher.first, + request_context, target_hosts.set(), target_urls.set(), + registered_optimization_types_, + base::DoNothingAs&)>())); } void HintsManager::OnHintLoaded(base::OnceClosure callback, @@ -864,7 +877,7 @@ void HintsManager::OnHintLoaded(base::OnceClosure callback, // Run the callback now that the hint is loaded. This is used as a signal by // tests. - std::move(callback).Run(); + MaybeRunUpdateClosure(std::move(callback)); } void HintsManager::RegisterOptimizationTypes( @@ -1015,46 +1028,51 @@ void HintsManager::CanApplyOptimizationOnDemand( urls_to_fetch.vector(), hosts_to_fetch.vector()); // Fetch the data for the entries we don't have all information for. - if (!batch_update_hints_fetcher_) { - DCHECK(hints_fetcher_factory_); - batch_update_hints_fetcher_ = hints_fetcher_factory_->BuildInstance(); - } - batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( + std::pair request_id_and_fetcher = + CreateAndTrackBatchUpdateHintsFetcher(); + request_id_and_fetcher.second->FetchOptimizationGuideServiceHints( hosts_to_fetch.vector(), urls_to_fetch.vector(), registered_optimization_types_, request_context, application_locale_, - base::BindOnce(&HintsManager::OnOnDemandHintsFetched, - weak_ptr_factory_.GetWeakPtr(), hosts_to_fetch.set(), - urls_to_fetch.set(), optimization_types, callback)); + base::BindOnce(&HintsManager::OnBatchUpdateHintsFetched, + weak_ptr_factory_.GetWeakPtr(), + request_id_and_fetcher.first, request_context, + hosts_to_fetch.set(), urls_to_fetch.set(), + optimization_types, callback)); } -void HintsManager::OnOnDemandHintsFetched( +void HintsManager::OnBatchUpdateHintsFetched( + int32_t request_id, + proto::RequestContext request_context, const base::flat_set& hosts_requested, const base::flat_set& urls_requested, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback, absl::optional> get_hints_response) { + CleanUpBatchUpdateHintsFetcher(request_id); + if (!get_hints_response.has_value() || !get_hints_response.value()) { - OnReadyToInvokeOnDemandHintsCallbackForURLs(urls_requested, - optimization_types, callback); + OnBatchUpdateHintsStored(urls_requested, optimization_types, callback); return; } - // TODO(crbug/1278015: Figure out if the update time duration is the right + // TODO(crbug/1278015): Figure out if the update time duration is the right // one. hint_cache_->UpdateFetchedHints( std::move(*get_hints_response), clock_->Now() + features::GetActiveTabsFetchRefreshDuration(), hosts_requested, urls_requested, - base::BindOnce(&HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs, + base::BindOnce(&HintsManager::OnBatchUpdateHintsStored, weak_ptr_factory_.GetWeakPtr(), urls_requested, optimization_types, callback)); - if (switches::IsDebugLogsEnabled()) - DVLOG(0) << "OptimizationGuide: OnOnDemandHintsFetched complete"; + if (switches::IsDebugLogsEnabled()) { + DVLOG(0) << "OptimizationGuide: OnBatchUpdateHintsFetched for " + << proto::RequestContext_Name(request_context) << " complete"; + } } -void HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs( +void HintsManager::OnBatchUpdateHintsStored( const base::flat_set& urls, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback) { @@ -1071,6 +1089,27 @@ void HintsManager::OnReadyToInvokeOnDemandHintsCallbackForURLs( } } +std::pair +HintsManager::CreateAndTrackBatchUpdateHintsFetcher() { + DCHECK(hints_fetcher_factory_); + std::unique_ptr hints_fetcher = + hints_fetcher_factory_->BuildInstance(); + HintsFetcher* hints_fetcher_ptr = hints_fetcher.get(); + batch_update_hints_fetchers_.Put(batch_update_hints_fetcher_request_id_++, + std::move(hints_fetcher)); + UMA_HISTOGRAM_COUNTS_100( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", + batch_update_hints_fetchers_.size()); + return std::make_pair(batch_update_hints_fetcher_request_id_, + hints_fetcher_ptr); +} + +void HintsManager::CleanUpBatchUpdateHintsFetcher(int32_t request_id) { + auto it = batch_update_hints_fetchers_.Peek(request_id); + if (it != batch_update_hints_fetchers_.end()) + batch_update_hints_fetchers_.Erase(it); +} + void HintsManager::InvokeOnDemandHintsCallbackForURL( const GURL& url, const base::flat_set& optimization_types, diff --git a/components/optimization_guide/core/hints_manager.h b/components/optimization_guide/core/hints_manager.h index 549652e7c5e385..94aaa3d71cea80 100644 --- a/components/optimization_guide/core/hints_manager.h +++ b/components/optimization_guide/core/hints_manager.h @@ -134,11 +134,6 @@ class HintsManager : public OptimizationHintsComponentObserver, // and in memory ones. void ClearHostKeyedHints(); - // Returns the current batch update hints fetcher. - HintsFetcher* batch_update_hints_fetcher() const { - return batch_update_hints_fetcher_.get(); - } - // Overrides |hints_fetcher_factory| for testing. void SetHintsFetcherFactoryForTesting( std::unique_ptr hints_fetcher_factory); @@ -164,7 +159,7 @@ class HintsManager : public OptimizationHintsComponentObserver, void OnDeferredStartup(); // Fetch the hints for the given URLs with the provided |request_context|. - void FetchHintsForURLs(std::vector target_urls, + void FetchHintsForURLs(const std::vector& target_urls, proto::RequestContext request_context); // PushNotificationManager::Delegate: @@ -194,6 +189,7 @@ class HintsManager : public OptimizationHintsComponentObserver, private: friend class ::OptimizationGuideTestAppInterfaceWrapper; + friend class HintsManagerTest; // Processes the optimization filters contained in the hints component. void ProcessOptimizationFilters( @@ -249,10 +245,12 @@ class HintsManager : public OptimizationHintsComponentObserver, absl::optional> get_hints_response); - // Called when the on demand hints have been fetched from the remote + // Called when the batch update hints have been fetched from the remote // Optimization Guide Service and are ready for parsing. This is used when - // fetching hints on demand. - void OnOnDemandHintsFetched( + // fetching hints on demand or from SRP. + void OnBatchUpdateHintsFetched( + int32_t request_id, + proto::RequestContext request_context, const base::flat_set& hosts_fetched, const base::flat_set& urls_fetched, const base::flat_set& optimization_types, @@ -260,13 +258,26 @@ class HintsManager : public OptimizationHintsComponentObserver, absl::optional> get_hints_response); - // Called when information is ready such that we can invoke the on-demand - // hints callback. - void OnReadyToInvokeOnDemandHintsCallbackForURLs( + // Called when information is ready such that we can invoke any callbacks that + // require returning decisions to consumer features. + // + // TODO(crbug/1279536): Clean this up when we clean up some of the existing + // interfaces. + void OnBatchUpdateHintsStored( const base::flat_set& urls_fetched, const base::flat_set& optimization_types, OnDemandOptimizationGuideDecisionRepeatingCallback callback); + // Creates a hints fetcher and stores it in |batch_update_hints_fetchers_| and + // returns the request ID associated with the fetch. It is expected to call + // `CleanUpBatchUpdateHintsFetcher` with the returned request ID once the + // fetch has finished. + std::pair CreateAndTrackBatchUpdateHintsFetcher(); + + // Called to inform |this| that the batch fetcher with |request_id| is no + // longer needed removes the request from |batch_update_hints_fetchers_| + void CleanUpBatchUpdateHintsFetcher(int32_t request_id); + // Returns decisions for |url| and |optimization_types| based on what's cached // locally. base::flat_map @@ -366,6 +377,20 @@ class HintsManager : public OptimizationHintsComponentObserver, HintsFetcherFactory* GetHintsFetcherFactory(); + // Returns the number of batch update hints fetches initiated. + // + // Exposed here for testing. + int32_t num_batch_update_hints_fetches_initiated() const { + return batch_update_hints_fetcher_request_id_; + } + + // Returns the current active tabs batch update hints fetcher. + // + // Exposed here for testing. + HintsFetcher* active_tabs_batch_update_hints_fetcher() const { + return active_tabs_batch_update_hints_fetcher_.get(); + } + // The information of the latest component delivered by // |optimization_guide_service_|. absl::optional hints_component_info_; @@ -412,9 +437,15 @@ class HintsManager : public OptimizationHintsComponentObserver, // fetched from the remote Optimization Guide Service. std::unique_ptr hint_cache_; - // The fetcher that handles making requests for hints for multiple hosts from + // The fetcher that handles making requests for hints for active tabs from // the remote Optimization Guide Service. - std::unique_ptr batch_update_hints_fetcher_; + std::unique_ptr active_tabs_batch_update_hints_fetcher_; + + // A map from request ID to the fetcher that handles making requests for hints + // for multiple hosts from the remote Optimization Guide Service. + base::LRUCache> + batch_update_hints_fetchers_; + int32_t batch_update_hints_fetcher_request_id_ = 0; // A cache keyed by navigation URL to the fetcher making a request for a hint // for that URL and/or host to the remote Optimization Guide Service that diff --git a/components/optimization_guide/core/hints_manager_unittest.cc b/components/optimization_guide/core/hints_manager_unittest.cc index c40566095b993e..8dd0d403295a74 100644 --- a/components/optimization_guide/core/hints_manager_unittest.cc +++ b/components/optimization_guide/core/hints_manager_unittest.cc @@ -453,9 +453,13 @@ class HintsManagerTest : public ProtoDatabaseProviderTestBase { HintsManager* hints_manager() const { return hints_manager_.get(); } - TestHintsFetcher* batch_update_hints_fetcher() const { + int32_t num_batch_update_hints_fetches_initiated() const { + return hints_manager()->num_batch_update_hints_fetches_initiated(); + } + + TestHintsFetcher* active_tabs_batch_update_hints_fetcher() const { return static_cast( - hints_manager()->batch_update_hints_fetcher()); + hints_manager()->active_tabs_batch_update_hints_fetcher()); } GURL url_with_hints() const { @@ -1565,7 +1569,7 @@ TEST_F(HintsManagerFetchingDisabledTest, MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerTest, @@ -1794,7 +1798,8 @@ class HintsManagerFetchingTest : public HintsManagerTest { { { features::kRemoteOptimizationGuideFetching, - {{"max_concurrent_page_navigation_fetches", "2"}}, + {{"max_concurrent_page_navigation_fetches", "2"}, + {"max_concurrent_batch_update_fetches", "2"}}, }, }, {features::kRemoteOptimizationGuideFetchingAnonymousDataConsent}); @@ -1820,7 +1825,7 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire and schedule a hints fetch. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, @@ -1841,8 +1846,8 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire and schedule a hints fetch but the fetch is not made. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); - // Hints fetcher should not be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, @@ -1873,8 +1878,8 @@ TEST_F(HintsManagerFetchingTest, // Force timer to expire after random delay and schedule a hints fetch. MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(0, top_host_provider->get_num_top_hosts_called()); - // Hints fetcher should not be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsOrUrlsToFetch) { @@ -1901,15 +1906,15 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsOrUrlsToFetch) { MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(1, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - // Hints fetcher should not be even created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); EXPECT_EQ(2, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - // Still no hosts or URLs, so hints fetcher should still not be even created. - EXPECT_FALSE(batch_update_hints_fetcher()); + // Hints fetcher should not even be created. + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { @@ -1940,10 +1945,13 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { MoveClockForwardBy(base::Seconds(60 * 2)); EXPECT_EQ(1, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); - EXPECT_EQ("en-US", batch_update_hints_fetcher()->locale_requested()); - EXPECT_EQ(proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, - batch_update_hints_fetcher()->request_context_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ("en-US", + active_tabs_batch_update_hints_fetcher()->locale_requested()); + EXPECT_EQ( + proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + active_tabs_batch_update_hints_fetcher()->request_context_requested()); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); @@ -1952,7 +1960,8 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherEnabledNoHostsButHasUrlsToFetch) { EXPECT_EQ(2, top_host_provider->get_num_top_hosts_called()); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); // Urls didn't change and we have all URLs cached in store. - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); } @@ -1982,7 +1991,7 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherTimerFetchOnStartup) { RunUntilIdle(); histogram_tester.ExpectTotalCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0); - EXPECT_EQ(nullptr, batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); EXPECT_EQ(0, tab_url_provider()->get_num_urls_called()); // Force timer to expire after random delay and schedule a hints fetch that @@ -1991,14 +2000,16 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherTimerFetchOnStartup) { histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); } // Verifies the deferred startup mode that fetches hints for active tab URLs on @@ -2035,14 +2046,16 @@ TEST_F(HintsManagerFetchingTest, HintsFetcherDeferredStartup) { histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); // Move it forward again to make sure timer is scheduled. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); histogram_tester.ExpectBucketCount( "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0, 1); EXPECT_EQ(2, tab_url_provider()->get_num_urls_called()); - EXPECT_EQ(1, batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); } TEST_F(HintsManagerFetchingTest, @@ -3172,6 +3185,54 @@ TEST_F(HintsManagerFetchingTest, }, run_loop.get())); run_loop->Run(); + + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 1, 1); +} + +TEST_F(HintsManagerFetchingTest, BatchUpdateCalledMoreThanMaxConcurrent) { + base::HistogramTester histogram_tester; + + hints_manager()->RegisterOptimizationTypes({proto::COMPRESS_PUBLIC_IMAGES}); + InitializeWithDefaultConfig("1.0.0.0"); + + // Set to online so fetch is activated. + SetConnectionOnline(); + + hints_manager()->SetHintsFetcherFactoryForTesting( + BuildTestHintsFetcherFactory( + {HintsFetcherEndState::kFetchSuccessWithURLHints})); + + // Call this over the max count. + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + hints_manager()->CanApplyOptimizationOnDemand( + {url_with_url_keyed_hint()}, {proto::COMPRESS_PUBLIC_IMAGES}, + proto::RequestContext::CONTEXT_BOOKMARKS, + base::DoNothingAs&)>()); + + // The third one is over the max and should evict another one. + histogram_tester.ExpectTotalCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 3); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 1, 1); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ConcurrentBatchUpdateFetches", 2, 2); } TEST_F( @@ -3286,7 +3347,7 @@ TEST_F(HintsManagerFetchingNoBatchUpdateTest, // Force timer to expire and schedule a hints fetch. MoveClockForwardBy(base::Seconds(kUpdateFetchHintsTimeSecs)); // Hints fetcher should not even be created. - EXPECT_FALSE(batch_update_hints_fetcher()); + EXPECT_FALSE(active_tabs_batch_update_hints_fetcher()); } } // namespace optimization_guide diff --git a/components/optimization_guide/core/optimization_guide_features.cc b/components/optimization_guide/core/optimization_guide_features.cc index 354fc064776929..cff2fd08e8b478 100644 --- a/components/optimization_guide/core/optimization_guide_features.cc +++ b/components/optimization_guide/core/optimization_guide_features.cc @@ -233,6 +233,15 @@ base::TimeDelta GetActiveTabsStalenessTolerance() { "active_tabs_staleness_tolerance_in_days", 90)); } +size_t MaxConcurrentBatchUpdateFetches() { + // If overridden, this needs to be large enough where we do not thrash the + // inflight batch update fetches since if we approach the limit here, we will + // abort the oldest batch update fetch that is in flight. + return GetFieldTrialParamByFeatureAsInt(kRemoteOptimizationGuideFetching, + "max_concurrent_batch_update_fetches", + 20); +} + size_t MaxConcurrentPageNavigationFetches() { // If overridden, this needs to be large enough where we do not thrash the // inflight page navigations since if we approach the limit here, we will diff --git a/components/optimization_guide/core/optimization_guide_features.h b/components/optimization_guide/core/optimization_guide_features.h index 79da969ed9bf66..1596ac11e88795 100644 --- a/components/optimization_guide/core/optimization_guide_features.h +++ b/components/optimization_guide/core/optimization_guide_features.h @@ -107,7 +107,11 @@ base::TimeDelta GetActiveTabsFetchRefreshDuration(); base::TimeDelta GetActiveTabsStalenessTolerance(); // Returns the max number of concurrent fetches to the remote Optimization Guide -// Service that should be allowed. +// Service that should be allowed for batch updates +size_t MaxConcurrentBatchUpdateFetches(); + +// Returns the max number of concurrent fetches to the remote Optimization Guide +// Service that should be allowed for navigations. size_t MaxConcurrentPageNavigationFetches(); // Returns the minimum number of seconds to randomly delay before starting to diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml index fa298aed0a0620..dc74ed907bc5e4 100644 --- a/tools/metrics/histograms/metadata/optimization/histograms.xml +++ b/tools/metrics/histograms/metadata/optimization/histograms.xml @@ -393,6 +393,17 @@ chromium-metrics-reviews@google.com. + + sophiechang@chromium.org + mcrouse@chromium.org + + The number of active batch update hints fetches initiated by the hints + manager. Recorded when a fetch is initiated to the remote Optimization Guide + Service for a batch update context (i.e. on SRP, other UI surfaces, etc.). + + + From 206c7780c0c731ed529d52cfc2aadd12b279a472 Mon Sep 17 00:00:00 2001 From: Brandon Jones Date: Thu, 16 Dec 2021 23:53:26 +0000 Subject: [PATCH 02/71] Add depth16unorm enum to Blink Forgot to propagate this change to Blink when finishing up this work in Dawn. Bug: 1279848 Change-Id: I5b25e66780e79d2b2e0d29bffa20fa2e864e56b1 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345962 Commit-Queue: Brandon Jones Auto-Submit: Brandon Jones Reviewed-by: Austin Eng Commit-Queue: Austin Eng Cr-Commit-Position: refs/heads/main@{#952582} --- .../blink/renderer/modules/webgpu/dawn_enum_conversions.cc | 3 +++ .../blink/renderer/modules/webgpu/gpu_texture_descriptor.idl | 1 + 2 files changed, 4 insertions(+) diff --git a/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc b/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc index 43cfde69a359d9..b6a44f9ce0a538 100644 --- a/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc +++ b/third_party/blink/renderer/modules/webgpu/dawn_enum_conversions.cc @@ -299,6 +299,9 @@ WGPUTextureFormat AsDawnEnum( if (webgpu_enum == "depth24plus-stencil8") { return WGPUTextureFormat_Depth24PlusStencil8; } + if (webgpu_enum == "depth16unorm") { + return WGPUTextureFormat_Depth16Unorm; + } // Block Compression (BC) formats if (webgpu_enum == "bc1-rgba-unorm") { diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl index 7fcb5bedc18ac8..c560a7c7d52261 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl +++ b/third_party/blink/renderer/modules/webgpu/gpu_texture_descriptor.idl @@ -66,6 +66,7 @@ enum GPUTextureFormat { "depth32float", "depth24plus", "depth24plus-stencil8", + "depth16unorm", /* Block Compression (BC) formats */ "bc1-rgba-unorm", "bc1-rgba-unorm-srgb", From 0e970a23e0467edc974d04c527f19c98e573ec37 Mon Sep 17 00:00:00 2001 From: Wen-Chien Wang Date: Thu, 16 Dec 2021 23:55:47 +0000 Subject: [PATCH 03/71] Reduce margin for separator under continue section with dense config In tablet mode, we want to have the margin of the separator, which locates between continue section and apps grid view, be 8 pixels when using the dense AppListConfig instead of 16 pixels. Bug: 1280345 Change-Id: I8552e1d6a5982ea97ec23be5bac50b8c478f0ca1 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345976 Reviewed-by: Toni Barzic Commit-Queue: Wen-Chien Wang Cr-Commit-Position: refs/heads/main@{#952583} --- ash/app_list/views/apps_container_view.cc | 26 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc index 305f29d7001d7a..790b567a7908ec 100644 --- a/ash/app_list/views/apps_container_view.cc +++ b/ash/app_list/views/apps_container_view.cc @@ -135,8 +135,10 @@ constexpr int kContinueColumnCount = 4; // The vertical spacing between recent apps and continue section view. constexpr int kRecentAppsTopMargin = 16; -// The vertical spacing above and below the separator. -constexpr int kSeparatorVerticalInset = 16; +// The vertical spacing above and below the separator when using kRegular/kDense +// AppListConfigType. +constexpr int kRegularSeparatorVerticalInset = 16; +constexpr int kDenseSeparatorVerticalInset = 8; // The width of the separator. constexpr int kSeparatorWidth = 240; @@ -285,8 +287,10 @@ class AppsContainerView::ContinueContainer : public views::View { ColorProvider::ContentLayerType::kSeparatorColor)); separator_->SetPreferredSize( gfx::Size(kSeparatorWidth, views::Separator::kThickness)); + // Initially set the vertical inset to kRegularSeparatorVerticalInset. The + // value will be updated in `AppsContainerView::UpdateAppListConfig()` separator_->SetProperty(views::kMarginsKey, - gfx::Insets(kSeparatorVerticalInset, 0)); + gfx::Insets(kRegularSeparatorVerticalInset, 0)); separator_->SetPaintToLayer(); separator_->layer()->SetFillsBoundsOpaquely(false); separator_->SetProperty(views::kCrossAxisAlignmentKey, @@ -315,6 +319,18 @@ class AppsContainerView::ContinueContainer : public views::View { return recent_apps_ && recent_apps_->GetVisible(); } + void UpdateAppListConfig(AppListConfig* config) { + if (recent_apps_) + recent_apps_->UpdateAppListConfig(config); + + const int separator_vertical_inset = + config->type() == AppListConfigType::kRegular + ? kRegularSeparatorVerticalInset + : kDenseSeparatorVerticalInset; + separator_->SetProperty(views::kMarginsKey, + gfx::Insets(separator_vertical_inset, 0)); + } + ContinueSectionView* continue_section() { return continue_section_; } RecentAppsView* recent_apps() { return recent_apps_; } views::View* separator() { return separator_; } @@ -494,8 +510,8 @@ void AppsContainerView::UpdateAppListConfig(const gfx::Rect& contents_bounds) { apps_grid_view()->UpdateAppListConfig(app_list_config_.get()); app_list_folder_view()->UpdateAppListConfig(app_list_config_.get()); - if (GetRecentApps()) - GetRecentApps()->UpdateAppListConfig(app_list_config_.get()); + if (continue_container_) + continue_container_->UpdateAppListConfig(app_list_config_.get()); } void AppsContainerView::OnActiveAppListModelsChanged( From 3050c213f7f45f2b8b984fa8504f94ae000de18d Mon Sep 17 00:00:00 2001 From: James Cook Date: Thu, 16 Dec 2021 23:56:44 +0000 Subject: [PATCH 04/71] Fix crash in OnWallpaperColorsChanged with ProductivityLauncher If wallpaper sync completes when the productivity launcher is visible, but the fullscreen launcher has not been created, it can cause a crash on a null AppListView. I think this is the cause of flakiness in the tast launcher.BubbleSmoke test. Bug: 1254420 Test: added to ash_unittests Change-Id: I34ea2079fb337a1e5246a8cfa7bae252048c4821 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346101 Commit-Queue: James Cook Auto-Submit: James Cook Reviewed-by: Toni Barzic Commit-Queue: Toni Barzic Cr-Commit-Position: refs/heads/main@{#952584} --- ash/app_list/app_list_controller_impl.cc | 8 ++++++-- ash/app_list/app_list_controller_impl_unittest.cc | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 8719724aa9a9b0..a013d755bdf4af 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc @@ -859,8 +859,12 @@ void AppListControllerImpl::OnTabletModeEnded() { } void AppListControllerImpl::OnWallpaperColorsChanged() { - if (IsVisible(last_visible_display_id_)) - fullscreen_presenter_->GetView()->OnWallpaperColorsChanged(); + // Clamshell ProductivityLauncher doesn't use wallpaper prominent color. + if (IsVisible(last_visible_display_id_) && !ShouldShowAppListBubble()) { + AppListView* app_list_view = fullscreen_presenter_->GetView(); + DCHECK(app_list_view); + app_list_view->OnWallpaperColorsChanged(); + } } void AppListControllerImpl::OnWallpaperPreviewStarted() { diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index 057bde9cd327a2..5cecc6a3506102 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc @@ -1281,6 +1281,15 @@ TEST_F(AppListControllerImplAppListBubbleTest, EnteringTabletModeClosesBubble) { EXPECT_FALSE(controller->bubble_presenter_for_test()->IsShowing()); } +TEST_F(AppListControllerImplAppListBubbleTest, + WallpaperColorChangeDoesNotCrash) { + auto* controller = Shell::Get()->app_list_controller(); + controller->ShowAppList(); + // Simulate synced wallpaper update while bubble is open. + controller->OnWallpaperColorsChanged(); + // No crash. +} + class AppListControllerWithAssistantTest : public AppListControllerImplTest { public: AppListControllerWithAssistantTest() From 744daaa7d4870af5c61f335547cdf854b26c678a Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Thu, 16 Dec 2021 23:58:05 +0000 Subject: [PATCH 05/71] Restore TestWSSExpired on macOS This was disabled in https://chromium-review.googlesource.com/c/chromium/src/+/2693314. With SpawnedTestServer moved to Python 3, we have TLS 1.2 available. Bug: 1248530 Change-Id: Ief9a8b6419c06cb1a9b8170ca57fc52dc3f904f2 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3344777 Auto-Submit: David Benjamin Reviewed-by: Carlos IL Commit-Queue: Carlos IL Cr-Commit-Position: refs/heads/main@{#952585} --- chrome/browser/ssl/ssl_browsertest.cc | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc index 47d5810fc75147..ea8b348302ead4 100644 --- a/chrome/browser/ssl/ssl_browsertest.cc +++ b/chrome/browser/ssl/ssl_browsertest.cc @@ -4099,15 +4099,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrors, TestWSS) { // --ignore-certificate-errors-spki-list. The connection should be established // without interstitial page showing. #if !BUILDFLAG(IS_CHROMEOS_ASH) // Chrome OS does not support the flag. -// TODO(crbug.com/1176880): Disabled on macOS because the WSS SpawnedTestServer -// does not support modern TLS on the macOS bots. -#if defined(OS_MAC) -#define MAYBE_TestWSSExpired DISABLED_TestWSSExpired -#else -#define MAYBE_TestWSSExpired TestWSSExpired -#endif -IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, - MAYBE_TestWSSExpired) { +IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrorsBySPKIWSS, TestWSSExpired) { ASSERT_TRUE(wss_server_expired_.Start()); // Setup page title observer. From bd6c8bb6f9cbfd04f2abc7de03f1edcda0e9564d Mon Sep 17 00:00:00 2001 From: Byungwoo Lee Date: Thu, 16 Dec 2021 23:58:17 +0000 Subject: [PATCH 06/71] Fix ChromiumPerf/mac-m1_mini_2020-perf/blink_perf.css regression Perf test regression was reported after a CL merged. - CL commit : a3beacbe1eaa89b5e1555fea8e017df4404d0904 - Regression Bug: https://crbug.com/1279044 - TC : blink_perf.css/PseudoClassSelectors/PseudoClassSelectors.html The regression was from the changes in the CSSSelectorParser. - CSSSelectorParser::ConsumePseudo To fix the performance regression, removed the changes of adding flags to CSSSelector, CSSSelectorParser, SelectorCheckingContext. To set the computed style flags, iterate has argument selector to check whether it contains pseudo in the argument when matching ':has'. This is the perf test result with this change. - pinpoint: https://pinpoint-dot-chromeperf.appspot.com/job/106a0b0ef20000 - result: (8,194.124 -> 8,404.958 : +2.6%) Bug: 1279044 Change-Id: If2cadf3323aac6af59bf39728d691c4f74feba25 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3338229 Reviewed-by: Rune Lillesveen Commit-Queue: Byungwoo Lee Cr-Commit-Position: refs/heads/main@{#952586} --- .../core/css/affected_by_pseudo_test.cc | 102 ++----------- .../blink/renderer/core/css/css_selector.cc | 8 +- .../blink/renderer/core/css/css_selector.h | 7 - .../core/css/parser/css_parser_selector.cc | 4 - .../core/css/parser/css_parser_selector.h | 1 - .../core/css/parser/css_selector_parser.cc | 10 -- .../core/css/parser/css_selector_parser.h | 5 - .../renderer/core/css/selector_checker.cc | 134 +++++++++++------- .../renderer/core/css/selector_checker.h | 2 - 9 files changed, 97 insertions(+), 176 deletions(-) diff --git a/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc b/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc index a69bb9e58c9c49..6a3fb442ffdf1c 100644 --- a/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc +++ b/third_party/blink/renderer/core/css/affected_by_pseudo_test.cc @@ -483,19 +483,19 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); EXPECT_TRUE( GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div2") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_FALSE( GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div3") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_FALSE( GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); + EXPECT_TRUE(GetElementById("div4") + ->GetComputedStyle() + ->AncestorsAffectedByHoverInHas()); EXPECT_TRUE( GetElementById("div5")->GetComputedStyle()->AffectedByPseudoInHas()); EXPECT_TRUE(GetElementById("div5") @@ -547,66 +547,6 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); unsigned element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(0U, element_count); - GetElementById("div3")->SetHovered(false); - UpdateAllLifecyclePhasesForTest(); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->SetHovered(true); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(0U, element_count); - GetElementById("div4")->SetHovered(false); - UpdateAllLifecyclePhasesForTest(); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->setAttribute(html_names::kClassAttr, "b"); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(3U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->setAttribute(html_names::kClassAttr, "b"); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(1U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_TRUE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->SetHovered(true); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; ASSERT_EQ(1U, element_count); GetElementById("div3")->SetHovered(false); UpdateAllLifecyclePhasesForTest(); @@ -620,7 +560,7 @@ TEST_F(AffectedByPseudoTest, UpdateAllLifecyclePhasesForTest(); start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div3")->setAttribute(html_names::kClassAttr, ""); + GetElementById("div4")->setAttribute(html_names::kClassAttr, "b"); UpdateAllLifecyclePhasesForTest(); element_count = GetStyleEngine().StyleForElementCount() - start_count; ASSERT_EQ(1U, element_count); @@ -641,28 +581,6 @@ TEST_F(AffectedByPseudoTest, ->GetComputedStyle() ->AncestorsAffectedByHoverInHas()); - start_count = GetStyleEngine().StyleForElementCount(); - GetElementById("div4")->setAttribute(html_names::kClassAttr, ""); - UpdateAllLifecyclePhasesForTest(); - element_count = GetStyleEngine().StyleForElementCount() - start_count; - ASSERT_EQ(3U, element_count); - - EXPECT_TRUE( - GetElementById("div2")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div2") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div3")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div3") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - EXPECT_FALSE( - GetElementById("div4")->GetComputedStyle()->AffectedByPseudoInHas()); - EXPECT_FALSE(GetElementById("div4") - ->GetComputedStyle() - ->AncestorsAffectedByHoverInHas()); - start_count = GetStyleEngine().StyleForElementCount(); GetElementById("div6")->SetHovered(true); UpdateAllLifecyclePhasesForTest(); diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index 1321970f8c832f..2ceb47eb1bf11d 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc @@ -1058,11 +1058,6 @@ void CSSSelector::SetSelectorList( data_.rare_data_->selector_list_ = std::move(selector_list); } -void CSSSelector::SetContainsPseudoInsideHasPseudoClass() { - CreateRareData(); - data_.rare_data_->contains_pseudo_inside_has_pseudo_class_ = true; -} - static bool ValidateSubSelector(const CSSSelector* selector) { switch (selector->Match()) { case CSSSelector::kTag: @@ -1263,8 +1258,7 @@ CSSSelector::RareData::RareData(const AtomicString& value) serializing_value_(value), bits_(), attribute_(AnyQName()), - argument_(g_null_atom), - contains_pseudo_inside_has_pseudo_class_(false) {} + argument_(g_null_atom) {} CSSSelector::RareData::~RareData() = default; diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index 85c7d64b74f8c5..027a42e59ddd93 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h @@ -354,11 +354,6 @@ class CORE_EXPORT CSSSelector { const Vector* PartNames() const { return has_rare_data_ ? data_.rare_data_->part_names_.get() : nullptr; } - bool ContainsPseudoInsideHasPseudoClass() const { - return has_rare_data_ - ? data_.rare_data_->contains_pseudo_inside_has_pseudo_class_ - : false; - } #ifndef NDEBUG void Show() const; @@ -371,7 +366,6 @@ class CORE_EXPORT CSSSelector { void SetArgument(const AtomicString&); void SetSelectorList(std::unique_ptr); void SetPartNames(std::unique_ptr>); - void SetContainsPseudoInsideHasPseudoClass(); void SetNth(int a, int b); bool MatchNth(unsigned count) const; @@ -492,7 +486,6 @@ class CORE_EXPORT CSSSelector { selector_list_; // Used for :-webkit-any and :not std::unique_ptr> part_names_; // Used for ::part() selectors. - bool contains_pseudo_inside_has_pseudo_class_; // Used for :has() selectors private: RareData(const AtomicString& value); diff --git a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc index 737a646a5f0581..362d4faef74036 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_selector.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_selector.cc @@ -58,10 +58,6 @@ void CSSParserSelector::SetSelectorList( selector_->SetSelectorList(std::move(selector_list)); } -void CSSParserSelector::SetContainsPseudoInsideHasPseudoClass() { - selector_->SetContainsPseudoInsideHasPseudoClass(); -} - void CSSParserSelector::AppendTagHistory( CSSSelector::RelationType relation, std::unique_ptr selector) { diff --git a/third_party/blink/renderer/core/css/parser/css_parser_selector.h b/third_party/blink/renderer/core/css/parser/css_parser_selector.h index 2e244c65d8c572..fff17e17e29f31 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_selector.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_selector.h @@ -79,7 +79,6 @@ class CORE_EXPORT CSSParserSelector { Vector>& selector_vector); void SetSelectorList(std::unique_ptr); void SetAtomics(std::unique_ptr); - void SetContainsPseudoInsideHasPseudoClass(); bool IsHostPseudoSelector() const; diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc index 8c2f145fb61731..8f8074b3565abc 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc @@ -784,9 +784,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( bool has_arguments = token.GetType() == kFunctionToken; selector->UpdatePseudoType(value, *context_, has_arguments, context_->Mode()); - if (UNLIKELY(is_inside_has_argument_)) - found_pseudo_in_has_argument_ = true; - if (selector->Match() == CSSSelector::kPseudoElement) { switch (selector->GetPseudoType()) { case CSSSelector::kPseudoBefore: @@ -880,11 +877,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( DisallowPseudoElementsScope scope(this); base::AutoReset resist_namespace(&resist_default_namespace_, true); - base::AutoReset is_inside_has_argument(&is_inside_has_argument_, - true); - base::AutoReset found_pseudo_in_has_argument( - &found_pseudo_in_has_argument_, false); - std::unique_ptr selector_list = std::make_unique(); *selector_list = ConsumeRelativeSelectorList(block); @@ -892,8 +884,6 @@ std::unique_ptr CSSSelectorParser::ConsumePseudo( return nullptr; selector->SetSelectorList(std::move(selector_list)); - if (UNLIKELY(found_pseudo_in_has_argument_)) - selector->SetContainsPseudoInsideHasPseudoClass(); return selector; } case CSSSelector::kPseudoNot: { diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.h b/third_party/blink/renderer/core/css/parser/css_selector_parser.h index b227d976dc4cd3..b2047bd21f834b 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.h +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.h @@ -150,11 +150,6 @@ class CORE_EXPORT CSSSelectorParser { // the default namespace is '*' while this flag is true. bool ignore_default_namespace_ = false; - // The 'found_pseudo_in_has_argument flag is true when we found any pseudo in - // ':has()' argument while parsing. - bool found_pseudo_in_has_argument_ = false; - bool is_inside_has_argument_ = false; - class DisallowPseudoElementsScope { STACK_ALLOCATED(); diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index 145ee2de4d8f6c..da5378ad4c73bd 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc @@ -664,8 +664,6 @@ bool SelectorChecker::CheckPseudoHas(const SelectorCheckingContext& context, sub_context.scope = context.scope; // sub_context.is_inside_visited_link is false (by default) to disable // :visited matching when it is in the :has argument - sub_context.is_inside_has_pseudo_class = true; - sub_context.pseudo_has_in_rightmost_compound = context.in_rightmost_compound; DCHECK(context.selector->SelectorList()); for (const CSSSelector* selector = context.selector->SelectorList()->First(); @@ -817,6 +815,69 @@ bool SelectorChecker::CheckPseudoHas(const SelectorCheckingContext& context, return false; } +namespace { + +struct HasPseudoClassArgumentInfo { + bool contains_pseudo = false; + bool contains_hover = false; + bool contains_active = false; + bool contains_focus = false; + bool contains_focus_visible = false; + + explicit HasPseudoClassArgumentInfo(const CSSSelectorList* selector_list) { + DCHECK(selector_list); + + for (const CSSSelector* relative_selector = selector_list->First(); + relative_selector; + relative_selector = CSSSelectorList::Next(*relative_selector)) { + DCHECK(relative_selector); + + for (const CSSSelector* simple = relative_selector; + simple && + simple->GetPseudoType() != CSSSelector::kPseudoRelativeLeftmost; + simple = simple->TagHistory()) { + switch (simple->GetPseudoType()) { + case CSSSelector::kPseudoUnknown: + break; + case CSSSelector::kPseudoHover: + contains_pseudo = true; + contains_hover = true; + break; + case CSSSelector::kPseudoActive: + contains_pseudo = true; + contains_active = true; + break; + case CSSSelector::kPseudoFocus: + case CSSSelector::kPseudoFocusWithin: + contains_pseudo = true; + contains_focus = true; + break; + case CSSSelector::kPseudoFocusVisible: + contains_pseudo = true; + contains_focus_visible = true; + break; + default: + contains_pseudo = true; + break; + } + } + } + } + + void SetDynamicRestyleFlagsForHas(ComputedStyle* style) { + if (contains_hover) + style->SetAncestorsAffectedByHoverInHas(); + if (contains_active) + style->SetAncestorsAffectedByActiveInHas(); + if (contains_focus) + style->SetAncestorsAffectedByFocusInHas(); + if (contains_focus_visible) + style->SetAncestorsAffectedByFocusVisibleInHas(); + } +}; + +} // namespace + bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, MatchResult& result) const { Element& element = *context.element; @@ -1012,38 +1073,19 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, } return element.IsDragged(); case CSSSelector::kPseudoFocus: - if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusInHas(); - } else { - if (!context.in_rightmost_compound) - element.SetChildrenOrSiblingsAffectedByFocus(); - } - } + if (mode_ == kResolvingStyle && !context.in_rightmost_compound) + element.SetChildrenOrSiblingsAffectedByFocus(); return MatchesFocusPseudoClass(element); case CSSSelector::kPseudoFocusVisible: - if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusVisibleInHas(); - } else { - if (!context.in_rightmost_compound) - element.SetChildrenOrSiblingsAffectedByFocusVisible(); - } - } + if (mode_ == kResolvingStyle && !context.in_rightmost_compound) + element.SetChildrenOrSiblingsAffectedByFocusVisible(); return MatchesFocusVisiblePseudoClass(element); case CSSSelector::kPseudoFocusWithin: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByFocusInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByFocusWithin(); - else - element.SetChildrenOrSiblingsAffectedByFocusWithin(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByFocusWithin(); + else + element.SetChildrenOrSiblingsAffectedByFocusWithin(); } probe::ForcePseudoState(&element, CSSSelector::kPseudoFocusWithin, &force_pseudo_state); @@ -1052,15 +1094,10 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, return element.HasFocusWithin(); case CSSSelector::kPseudoHover: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByHoverInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByHover(); - else - element.SetChildrenOrSiblingsAffectedByHover(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByHover(); + else + element.SetChildrenOrSiblingsAffectedByHover(); } if (!ShouldMatchHoverOrActive(context)) return false; @@ -1071,15 +1108,10 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, return element.IsHovered(); case CSSSelector::kPseudoActive: if (mode_ == kResolvingStyle) { - if (UNLIKELY(context.is_inside_has_pseudo_class)) { - if (context.pseudo_has_in_rightmost_compound) - element_style_->SetAncestorsAffectedByActiveInHas(); - } else { - if (context.in_rightmost_compound) - element_style_->SetAffectedByActive(); - else - element.SetChildrenOrSiblingsAffectedByActive(); - } + if (context.in_rightmost_compound) + element_style_->SetAffectedByActive(); + else + element.SetChildrenOrSiblingsAffectedByActive(); } if (!ShouldMatchHoverOrActive(context)) return false; @@ -1289,8 +1321,14 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, // ':has()' selector. element_style_->SetAffectedByHas(); element_style_->SetAncestorsAffectedByHas(); - if (selector.ContainsPseudoInsideHasPseudoClass()) + + // TODO(blee@igalia.com) Move the logic in HasPseudoClassArgumentInfo + // to HasArgumentMatchContext + HasPseudoClassArgumentInfo argument(selector.SelectorList()); + if (argument.contains_pseudo) element_style_->SetAffectedByPseudoInHas(); + if (context.in_rightmost_compound) + argument.SetDynamicRestyleFlagsForHas(element_style_); } // TODO(blee@igalia.com) non-terminal ':has() is not supported yet } diff --git a/third_party/blink/renderer/core/css/selector_checker.h b/third_party/blink/renderer/core/css/selector_checker.h index 038dc688057a29..1b9deca24432c5 100644 --- a/third_party/blink/renderer/core/css/selector_checker.h +++ b/third_party/blink/renderer/core/css/selector_checker.h @@ -122,8 +122,6 @@ class CORE_EXPORT SelectorChecker { bool in_nested_complex_selector = false; bool is_inside_visited_link = false; const ContainerNode* relative_leftmost_element = nullptr; - bool is_inside_has_pseudo_class = false; - bool pseudo_has_in_rightmost_compound = true; }; struct MatchResult { From 1a1202bd47277906b5821c1414e9c439de7f7c6f Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Thu, 16 Dec 2021 23:59:09 +0000 Subject: [PATCH 07/71] Roll Perfetto Trace Processor Linux from 9c674c8ed684 to cefb3e0ec3a0 https://android.googlesource.com/platform/external/perfetto.git/+log/9c674c8ed684..cefb3e0ec3a0 If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/perfetto-trace-processor-linux-chromium Please CC perfetto-bugs@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Tbr: perfetto-bugs@google.com Change-Id: Ib99a5a1936e8206e156252d317da855db2236697 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345977 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952587} --- tools/perf/core/perfetto_binary_roller/binary_deps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index f8ee8ee14f980a..8bb4d07b7db128 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json @@ -17,8 +17,8 @@ "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "linux": { - "hash": "def284ce32dd30683650ebe712d279573ff15359", - "remote_path": "perfetto_binaries/trace_processor_shell/linux/9c674c8ed6844fb88b545a8df9282a9405f8a072/trace_processor_shell" + "hash": "9e5e4909b2b6a6f4e1aeb2b5bc081567935aeea0", + "remote_path": "perfetto_binaries/trace_processor_shell/linux/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell" } }, "power_profile.sql": { From daf3d29ddb47682d9155cb8c01f78522114a0ef4 Mon Sep 17 00:00:00 2001 From: Renjie Tang Date: Fri, 17 Dec 2021 00:02:23 +0000 Subject: [PATCH 08/71] Roll src/net/third_party/quiche/src/ 66b78407d..ed970f7c3 (9 commits) https://quiche.googlesource.com/quiche.git/+log/66b78407d91d..ed970f7c3838 $ git log 66b78407d..ed970f7c3 --date=short --no-merges --format='%ad %ae %s' 2021-12-14 quiche-dev Allow visitor_.OnFrameSent() to propagate a fatal send error, and do not retry sending on fatal send errors. 2021-12-14 quiche-dev Adds validation for 204 responses, which should carry no body. 2021-12-14 vasilvv Add public_key_type() accessor to quic::CertificateView. 2021-12-14 quiche-dev Return an nghttp2-compatible error value for OgHttp2Session::Send(). 2021-12-14 quiche-dev Simplifies HeaderValidator error codes. 2021-12-14 quiche-dev Supports the `:protocol` pseudo-header for connect requests if SETTINGS_ENABLE_CONNECT_PROTOCOL is sent. 2021-12-13 quiche-dev Fix use-after-move in TlsConnection 2021-12-13 quiche-dev Don't crash if QuicServerConfigProtobuf is invalid. 2021-12-13 quiche-dev Return the vector of config ids by value, not via an output parameter. Created with: roll-dep src/net/third_party/quiche/src src/third_party/quic_trace/src Change-Id: Idc4985b77d31ebd138da3633acbda099fc6434e4 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345624 Auto-Submit: Renjie Tang Reviewed-by: David Schinazi Commit-Queue: David Schinazi Cr-Commit-Position: refs/heads/main@{#952588} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index e23d33993711ee..9c9ec4b3d0ea18 100644 --- a/DEPS +++ b/DEPS @@ -364,7 +364,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': '66b78407d91da2836206ee9ef904db81ecdc3694', + 'quiche_revision': 'ed970f7c38381309e9306982efa8dcfac1201269', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. From 0cad164bfb79717ef489943ee25ce00ea01e9ce9 Mon Sep 17 00:00:00 2001 From: xiangdong kong Date: Fri, 17 Dec 2021 00:06:44 +0000 Subject: [PATCH 09/71] feedback: add metrics to track success rate of offline report submission - Added boolean histogram "Feedback.ReportSending.Online" to track whether the user is online when the feedback report was submitted. - Added enum histogram "Feedback.ReportSending.Result" where the enum is defined as the following: Bug: b:201334144 Change-Id: Iacede645898146c2bf8281f4067db06ba2d541c8 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346020 Reviewed-by: Zentaro Kavanagh Commit-Queue: Xiangdong Kong Cr-Commit-Position: refs/heads/main@{#952589} --- components/feedback/feedback_uploader.cc | 21 +++++++++++++++++++ .../api/feedback_private/feedback_service.cc | 4 ++++ tools/metrics/histograms/enums.xml | 9 ++++++++ .../histograms/metadata/others/histograms.xml | 19 +++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/components/feedback/feedback_uploader.cc b/components/feedback/feedback_uploader.cc index 791cc2673297a4..3a7e98c36d5ae5 100644 --- a/components/feedback/feedback_uploader.cc +++ b/components/feedback/feedback_uploader.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" +#include "base/metrics/histogram_macros.h" #include "base/task/post_task.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -23,6 +24,17 @@ namespace feedback { namespace { +constexpr char kReportSendingResultHistogramName[] = + "Feedback.ReportSending.Result"; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class FeedbackReportSendingResult { + kSuccessAtFirstTry = 0, // The report was uploaded successfully without retry + kSuccessAfterRetry = 1, // The report was uploaded successfully after retry + kDropped = 2, // The report is corrupt or invalid and was dropped + kMaxValue = kDropped, +}; + constexpr base::FilePath::CharType kFeedbackReportPath[] = FILE_PATH_LITERAL("Feedback Reports"); @@ -111,6 +123,13 @@ void FeedbackUploader::StartDispatchingReport() { } void FeedbackUploader::OnReportUploadSuccess() { + if (retry_delay_ == g_minimum_retry_delay) { + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kSuccessAtFirstTry); + } else { + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kSuccessAfterRetry); + } retry_delay_ = g_minimum_retry_delay; is_dispatching_ = false; // Explicitly release the successfully dispatched report. @@ -128,6 +147,8 @@ void FeedbackUploader::OnReportUploadFailure(bool should_retry) { } else { // The report won't be retried, hence explicitly delete its file on disk. report_being_dispatched_->DeleteReportOnDisk(); + UMA_HISTOGRAM_ENUMERATION(kReportSendingResultHistogramName, + FeedbackReportSendingResult::kDropped); } // The report dispatching failed, and should either be retried or not. In all diff --git a/extensions/browser/api/feedback_private/feedback_service.cc b/extensions/browser/api/feedback_private/feedback_service.cc index 4bff145bc3c92a..a5a055cf507c1d 100644 --- a/extensions/browser/api/feedback_private/feedback_service.cc +++ b/extensions/browser/api/feedback_private/feedback_service.cc @@ -13,6 +13,7 @@ #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" #include "base/metrics/statistics_recorder.h" #include "base/time/time.h" #include "build/chromeos_buildflags.h" @@ -152,6 +153,9 @@ void FeedbackService::OnAttachedFileAndScreenshotFetched( // True means report will be sent shortly. // False means report will be sent once the device is online. const bool status = !net::NetworkChangeNotifier::IsOffline(); + + UMA_HISTOGRAM_BOOLEAN("Feedback.ReportSending.Online", status); + // Notify client that data submitted has been received successfully. The // report will be sent out once further processing is done. std::move(callback).Run(status); diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index b75dda8258831a..0f9b4b66894e4a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -36125,6 +36125,15 @@ Called by update_permissions_policy_enum.py.--> + + + + + + + + diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index c64f5dadbf09b5..ea3d87550be49d 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml @@ -6465,6 +6465,25 @@ chromium-metrics-reviews@google.com. + + xiangdongkong@google.com + cros-feedback-app@google.com + + Records whether the user is online when the feedback report was submitted. + + + + + xiangdongkong@google.com + cros-feedback-app@google.com + + Records the feedback report sending states to help track the success rate of + feedback report offline submission. + + + afakhry@chromium.org From a84774d006321d99924d11273a4ccfb6e3175c1f Mon Sep 17 00:00:00 2001 From: "K. Moon" Date: Fri, 17 Dec 2021 00:08:44 +0000 Subject: [PATCH 10/71] Add kmoon to //chrome/browser/resources/pdf/OWNERS Adds myself to the OWNERS file for the PDF viewer's JavaScript code. I've been making a lot of changes in this directory, and our team needs additional OWNERS coverage. Change-Id: Idb5512e829e7b2ad653bc8eda241847456a1ec24 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346261 Auto-Submit: K. Moon Reviewed-by: Daniel Hosseinian Commit-Queue: Daniel Hosseinian Cr-Commit-Position: refs/heads/main@{#952590} --- chrome/browser/resources/pdf/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/chrome/browser/resources/pdf/OWNERS b/chrome/browser/resources/pdf/OWNERS index ef4a59d0a1f062..a806db94bc0869 100644 --- a/chrome/browser/resources/pdf/OWNERS +++ b/chrome/browser/resources/pdf/OWNERS @@ -1,3 +1,4 @@ dhoss@chromium.org dpapad@chromium.org +kmoon@chromium.org rbpotter@chromium.org From 1f0dcf5bd81f0843c5344b0aa3e40ad06ecca16a Mon Sep 17 00:00:00 2001 From: Juliet Levesque Date: Fri, 17 Dec 2021 00:10:14 +0000 Subject: [PATCH 11/71] [Fast Pair] Log the result of creating a Gatt connection. Adds a boolean success metric to log the success or failure from creating a Gatt connection. Change-Id: Ie36b6a8c220b4f4617bab7237d027be02a4b9763 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3331622 Reviewed-by: Shane Fitzpatrick Reviewed-by: Kyle Horimoto Commit-Queue: Juliet Levesque Cr-Commit-Position: refs/heads/main@{#952591} --- ash/quick_pair/common/fast_pair/fast_pair_metrics.cc | 6 ++++++ ash/quick_pair/common/fast_pair/fast_pair_metrics.h | 3 +++ .../fast_pair_gatt_service_client_impl.cc | 2 ++ .../fast_pair_gatt_service_client_unittest.cc | 8 ++++++++ .../histograms/metadata/bluetooth/histograms.xml | 12 ++++++++++++ 5 files changed, 31 insertions(+) diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc index e87c5e63d31343..71b1f38e54b7be 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.cc @@ -27,6 +27,8 @@ const char kRetroactivePairingResultMetric[] = "Bluetooth.ChromeOS.FastPair.RetroactivePairing.Result"; const char kTotalGattConnectionTimeMetric[] = "Bluetooth.ChromeOS.FastPair.TotalGattConnectionTime"; +const char kGattConnectionResult[] = + "Bluetooth.ChromeOS.FastPair.GattConnection.Result"; const char kFastPairPairFailureInitialMetric[] = "Bluetooth.ChromeOS.FastPair.PairFailure.InitialPairingProtocol"; const char kFastPairPairFailureSubsequentMetric[] = @@ -119,6 +121,10 @@ void RecordTotalGattConnectionTime(base::TimeDelta total_gatt_connection_time) { total_gatt_connection_time); } +void RecordGattConnectionResult(bool success) { + base::UmaHistogramBoolean(kGattConnectionResult, success); +} + void RecordPairingResult(const Device& device, bool success) { switch (device.protocol) { case Protocol::kFastPairInitial: diff --git a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h index 3989b4e81039ef..c637d4c2a3f2dc 100644 --- a/ash/quick_pair/common/fast_pair/fast_pair_metrics.h +++ b/ash/quick_pair/common/fast_pair/fast_pair_metrics.h @@ -81,6 +81,9 @@ void RecordRetroactivePairingResult(bool success); COMPONENT_EXPORT(QUICK_PAIR_COMMON) void RecordTotalGattConnectionTime(base::TimeDelta total_gatt_connection_time); +COMPONENT_EXPORT(QUICK_PAIR_COMMON) +void RecordGattConnectionResult(bool success); + COMPONENT_EXPORT(QUICK_PAIR_COMMON) void RecordPairingFailureReason(const Device& device, PairFailure failure); diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc index d68674c8f91435..1d1aeaa4596454 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc @@ -125,6 +125,8 @@ FastPairGattServiceClientImpl::~FastPairGattServiceClientImpl() = default; void FastPairGattServiceClientImpl::OnGattConnection( std::unique_ptr gatt_connection, absl::optional error_code) { + RecordGattConnectionResult(/*success=*/!error_code.has_value()); + if (error_code) { QP_LOG(WARNING) << "Error creating GATT connection to device due to error: " << error_code.value(); diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc index 81842b062cc28d..4caaf651e845d0 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_unittest.cc @@ -40,6 +40,8 @@ using ErrorCallback = const char kTotalGattConnectionTime[] = "Bluetooth.ChromeOS.FastPair.TotalGattConnectionTime"; +const char kGattConnectionResult[] = + "Bluetooth.ChromeOS.FastPair.GattConnection.Result"; constexpr base::TimeDelta kConnectingTestTimeout = base::Seconds(5); @@ -537,6 +539,7 @@ class FastPairGattServiceClientTest : public testing::Test { TEST_F(FastPairGattServiceClientTest, GattServiceDiscoveryTimeout) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); SuccessfulGattConnectionSetUp(); FastForwardTimeByConnetingTimeout(); NotifyGattDiscoveryCompleteForService(); @@ -544,21 +547,26 @@ TEST_F(FastPairGattServiceClientTest, GattServiceDiscoveryTimeout) { PairFailure::kGattServiceDiscoveryTimeout); EXPECT_FALSE(ServiceIsSet()); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, FailedGattConnection) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); FailedGattConnectionSetUp(); EXPECT_EQ(GetInitializedCallbackResult(), PairFailure::kCreateGattConnection); EXPECT_FALSE(ServiceIsSet()); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, GattConnectionSuccess) { histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 0); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 0); SuccessfulGattConnectionSetUp(); NotifyGattDiscoveryCompleteForService(); histogram_tester().ExpectTotalCount(kTotalGattConnectionTime, 1); + histogram_tester().ExpectTotalCount(kGattConnectionResult, 1); } TEST_F(FastPairGattServiceClientTest, IgnoreNonFastPairServices) { diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml index 8c62c8a5191e8b..be8d52b9b6ef04 100644 --- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml +++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml @@ -245,6 +245,18 @@ chromium-metrics-reviews@google.com. + + shanefitz@google.com + julietlevesque@google.com + chromeos-cross-device-eng@google.com + + Records success or failure of creating a Gatt connection during the Fast + Pair pairing protocol. Emitted following the attempted creation of the Gatt + service client during the key based pairing exchange. + + + shanefitz@google.com From 4c19af25abd84556f49772a99d8b5e4823a1d185 Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Fri, 17 Dec 2021 00:14:05 +0000 Subject: [PATCH 12/71] Roll Chrome Win32 PGO Profile Roll Chrome Win32 PGO profile from chrome-win32-main-1639677539-d3b89857331ec31b3fb9a2f0baec586c99a0d583.profdata to chrome-win32-main-1639688280-ba821917029425b878fa80c2307eb31d28fa7e99.profdata If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/pgo-win32-chromium Please CC pgo-profile-sheriffs@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium main branch: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chrome.try:win-chrome Tbr: pgo-profile-sheriffs@google.com Change-Id: I12902393d07ebd2b0aeb47dbcaff37034a9e6ddb Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346040 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952592} --- chrome/build/win32.pgo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 8e5ee8c1cdbf6f..46fbe815afb17d 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt @@ -1 +1 @@ -chrome-win32-main-1639677539-d3b89857331ec31b3fb9a2f0baec586c99a0d583.profdata +chrome-win32-main-1639688280-ba821917029425b878fa80c2307eb31d28fa7e99.profdata From 5e8afc7e3e3456d1fbc7b0a1e93588beb6fdbd27 Mon Sep 17 00:00:00 2001 From: Courtney Wong Date: Fri, 17 Dec 2021 00:20:23 +0000 Subject: [PATCH 13/71] Add APIs for the Projector app to open the Chrome feedback dialog Screencast: http://shortn/_dTIckx5o3z b: 205776059 Change-Id: I186300354c7cb1f16af3449b9c055f7c955a1872 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3330217 Reviewed-by: Li Lin Reviewed-by: Ahmed Fakhry Reviewed-by: Dana Fried Commit-Queue: Courtney Wong Cr-Commit-Position: refs/heads/main@{#952593} --- ash/webui/projector_app/projector_app_client.h | 3 +++ .../projector_app/projector_message_handler.cc | 11 +++++++++++ .../projector_app/projector_message_handler.h | 3 +++ .../app/trusted/trusted_app_comm_factory.js | 3 +++ .../app/untrusted/untrusted_app_comm_factory.js | 9 +++++++++ .../communication/projector_app.externs.js | 9 ++++++++- .../communication/projector_browser_proxy.js | 12 ++++++++++++ ash/webui/projector_app/test/mock_app_client.h | 1 + .../test/projector_message_handler_unittest.cc | 14 ++++++++++++++ .../ui/ash/projector/projector_app_client_impl.cc | 15 +++++++++++++++ .../ui/ash/projector/projector_app_client_impl.h | 1 + chrome/browser/ui/chrome_pages.h | 1 + tools/metrics/histograms/enums.xml | 2 ++ 13 files changed, 83 insertions(+), 1 deletion(-) diff --git a/ash/webui/projector_app/projector_app_client.h b/ash/webui/projector_app/projector_app_client.h index edd30c023683ef..26e1c23b09baa3 100644 --- a/ash/webui/projector_app/projector_app_client.h +++ b/ash/webui/projector_app/projector_app_client.h @@ -117,6 +117,9 @@ class ProjectorAppClient { // language pack has finished. virtual void OnSodaInstalled() = 0; + // Triggers the opening of the Chrome feedback dialog. + virtual void OpenFeedbackDialog() = 0; + protected: ProjectorAppClient(); virtual ~ProjectorAppClient(); diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc index 2d3996be711527..b68458c43497c0 100644 --- a/ash/webui/projector_app/projector_message_handler.cc +++ b/ash/webui/projector_app/projector_message_handler.cc @@ -208,6 +208,10 @@ void ProjectorMessageHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "setUserPref", base::BindRepeating(&ProjectorMessageHandler::SetUserPref, base::Unretained(this))); + web_ui()->RegisterMessageCallback( + "openFeedbackDialog", + base::BindRepeating(&ProjectorMessageHandler::OpenFeedbackDialog, + base::Unretained(this))); } void ProjectorMessageHandler::OnScreencastsPendingStatusChanged( @@ -405,6 +409,13 @@ void ProjectorMessageHandler::SetUserPref( ResolveJavascriptCallback(args[0], base::Value()); } +void ProjectorMessageHandler::OpenFeedbackDialog( + const base::Value::ConstListView args) { + AllowJavascript(); + ProjectorAppClient::Get()->OpenFeedbackDialog(); + ResolveJavascriptCallback(args[0], base::Value()); +} + void ProjectorMessageHandler::OnAccessTokenRequestCompleted( const std::string& js_callback_id, const std::string& email, diff --git a/ash/webui/projector_app/projector_message_handler.h b/ash/webui/projector_app/projector_message_handler.h index 24a0538665cff0..ca950e7b6ece64 100644 --- a/ash/webui/projector_app/projector_message_handler.h +++ b/ash/webui/projector_app/projector_message_handler.h @@ -97,6 +97,9 @@ class ProjectorMessageHandler : public content::WebUIMessageHandler, // Requested by the Projector SWA to set the value of a user pref. void SetUserPref(const base::Value::ConstListView args); + // Requested by the Projector SWA to open the Chrome feedback dialog. + void OpenFeedbackDialog(const base::Value::ConstListView args); + // Called when OAuth token fetch request is completed by // ProjectorOAuthTokenFetcher. Resolves the javascript promise created by // ProjectorBrowserProxy.getOAuthTokenForAccount by calling the diff --git a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js index 00899bd7bf01b7..b66630497f109e 100644 --- a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js @@ -121,6 +121,9 @@ export class TrustedAppRequestHandler extends RequestHandler { } return this.browserProxy_.setUserPref(args[0], args[1]); }); + this.registerMethod('openFeedbackDialog', (args) => { + return this.browserProxy_.openFeedbackDialog(); + }); } } diff --git a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js index d45162bd25ed9a..088342fc29ec8f 100644 --- a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js +++ b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js @@ -144,6 +144,15 @@ const CLIENT_DELEGATE = { return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( 'setUserPref', [userPref, value]); }, + + /** + * Triggers the opening of the Chrome feedback dialog. + * @return {!Promise} + */ + openFeedbackDialog() { + return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( + 'openFeedbackDialog', []); + }, }; /** diff --git a/ash/webui/projector_app/resources/communication/projector_app.externs.js b/ash/webui/projector_app/resources/communication/projector_app.externs.js index de945148de1d88..4cae94a624e1ef 100644 --- a/ash/webui/projector_app/resources/communication/projector_app.externs.js +++ b/ash/webui/projector_app/resources/communication/projector_app.externs.js @@ -310,6 +310,13 @@ projectorApp.ClientDelegate.prototype.getUserPref = function(userPref) {}; projectorApp.ClientDelegate.prototype.setUserPref = function( userPref, value) {}; +/** + * Opens the Chrome feedback dialog. If not successful, the promise will be + * rejected with an error string. + * @return {!Promise} + */ +projectorApp.ClientDelegate.prototype.openFeedbackDialog = function() {}; + /** * The client Api for interacting with the Projector app instance. * @record @@ -350,4 +357,4 @@ projectorApp.AppApi.prototype.onSodaInstallProgressUpdated = function( /** * Notifies the Projector App when there is a SODA installation error. */ -projectorApp.AppApi.prototype.onSodaInstallError = function() {}; +projectorApp.AppApi.prototype.onSodaInstallError = function() {}; \ No newline at end of file diff --git a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js index c481ed430453a5..d76d71af53f741 100644 --- a/ash/webui/projector_app/resources/communication/projector_browser_proxy.js +++ b/ash/webui/projector_app/resources/communication/projector_browser_proxy.js @@ -114,6 +114,13 @@ export class ProjectorBrowserProxy { * @return {!Promise} Promise resolved when the request was handled. */ setUserPref(userPref, value) {} + + /** + * Opens the Chrome feedback dialog. The returned promise will be rejected if + * the dialog open is not successful. + * @return {!Promise} + */ + openFeedbackDialog() {} } /** @@ -186,6 +193,11 @@ export class ProjectorBrowserProxyImpl { setUserPref(userPref, value) { return sendWithPromise('setUserPref', [userPref, value]); } + + /** @override */ + openFeedbackDialog() { + return sendWithPromise('openFeedbackDialog'); + } } addSingletonGetter(ProjectorBrowserProxyImpl); diff --git a/ash/webui/projector_app/test/mock_app_client.h b/ash/webui/projector_app/test/mock_app_client.h index 36cc1ebb7e0d77..9222f044c0baf6 100644 --- a/ash/webui/projector_app/test/mock_app_client.h +++ b/ash/webui/projector_app/test/mock_app_client.h @@ -53,6 +53,7 @@ class MockAppClient : public ProjectorAppClient { MOCK_METHOD1(OnSodaInstallProgress, void(int)); MOCK_METHOD0(OnSodaInstallError, void()); MOCK_METHOD0(OnSodaInstalled, void()); + MOCK_METHOD0(OpenFeedbackDialog, void()); void SetAutomaticIssueOfAccessTokens(bool success); void WaitForAccessRequest(const std::string& account_email); diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc index 6bd56d464ae98a..f8e28880119894 100644 --- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc +++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc @@ -51,6 +51,8 @@ const char kShouldDownloadSodaCallback[] = "shouldDownloadSodaCallbck"; const char kInstallSodaCallback[] = "installSodaCallback"; const char kGetPendingScreencastsCallback[] = "getPendingScreencastsCallback"; +const char kOpenFeedbackDialogCallback[] = "openFeedbackDialog"; + const char kSetUserPrefCallback[] = "setUserPrefCallback"; const char kGetUserPrefCallback[] = "getUserPrefCallback"; @@ -440,6 +442,18 @@ TEST_F(ProjectorMessageHandlerUnitTest, SetCreationFlowEnabledInvalidValue) { EXPECT_EQ(*(rejected_args->FindPath(kRejectedRequestArgsKey)), func_args); } +TEST_F(ProjectorMessageHandlerUnitTest, OpenFeedbackDialog) { + base::ListValue list_args; + list_args.Append(base::Value(kOpenFeedbackDialogCallback)); + + web_ui().HandleReceivedMessage("openFeedbackDialog", &list_args); + base::RunLoop().RunUntilIdle(); + + const content::TestWebUI::CallData& call_data = FetchCallData(0); + EXPECT_EQ(call_data.function_name(), kWebUIResponse); + EXPECT_EQ(call_data.arg1()->GetString(), kOpenFeedbackDialogCallback); +} + TEST_F(ProjectorMessageHandlerUnitTest, SetCreationFlowEnabledUnsupportedPref) { base::ListValue list_args; list_args.Append(base::Value(kSetUserPrefCallback)); diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc index 31bf81bccfb0a3..c1c568d12fa4c6 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc @@ -9,12 +9,14 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/projector/projector_controller.h" +#include "ash/webui/projector_app/public/cpp/projector_app_constants.h" #include "base/bind.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/ui/chrome_pages.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/soda/constants.h" @@ -144,3 +146,16 @@ bool ProjectorAppClientImpl::IsSpeechRecognitionAvailable() { soda_installation_controller_->IsSodaAvailable( GetLocaleLanguageCode()); } + +void ProjectorAppClientImpl::OpenFeedbackDialog() { + Profile* profile = ProfileManager::GetActiveUserProfile(); + constexpr char kProjectorAppFeedbackCategoryTag[] = "FromProjectorApp"; + chrome::ShowFeedbackPage(GURL(ash::kChromeUITrustedProjectorUrl), profile, + chrome::kFeedbackSourceProjectorApp, + /*description_template=*/std::string(), + /*description_placeholder_text=*/std::string(), + kProjectorAppFeedbackCategoryTag, + /*extra_diagnostics=*/std::string()); + // TODO(crbug/1048368): Communicate the dialog failing to open by returning an + // error string. For now, assume that the dialog has opened successfully. +} diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.h b/chrome/browser/ui/ash/projector/projector_app_client_impl.h index a5930c7a282cc3..25cf3c0670d424 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.h +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.h @@ -49,6 +49,7 @@ class ProjectorAppClientImpl : public ash::ProjectorAppClient { void OnSodaInstallProgress(int combined_progress) override; void OnSodaInstallError() override; void OnSodaInstalled() override; + void OpenFeedbackDialog() override; private: void NotifyScreencastsPendingStatusChanged( diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h index e0c47e56d6c62f..01a660e0c244b9 100644 --- a/chrome/browser/ui/chrome_pages.h +++ b/chrome/browser/ui/chrome_pages.h @@ -79,6 +79,7 @@ enum FeedbackSource { kFeedbackSourceQuickAnswers, kFeedbackSourceWhatsNew, kFeedbackSourceConnectivityDiagnostics, + kFeedbackSourceProjectorApp, // Must be last. kFeedbackSourceCount, diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 0f9b4b66894e4a..6d973204f39bb0 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -36156,6 +36156,8 @@ Called by update_permissions_policy_enum.py.--> + + From 1396f440528f1c6960f78ca10eb275786216a3cc Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Fri, 17 Dec 2021 00:20:37 +0000 Subject: [PATCH 14/71] media: Fix use-after-free of image to video copy FrameReadyCallback https://crrev.com/c/3315346 introduced a fallback to ReadYUVPixelsAsync if CopyRGBATextureToVideoFrame fails, but this causes a use-after-free since the FrameReadyCallback is consumed in case of failure and cannot be reused. Morever, the fallback already happens in |blit_done_lambda| in case of failure. Bug: 1278727 Change-Id: Ibbc9fc389da52a31f67f3b3d159cf21b6a0521db Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3343217 Auto-Submit: Sunny Sachanandani Reviewed-by: ccameron chromium Reviewed-by: Juanmi Huertas Commit-Queue: Juanmi Huertas Cr-Commit-Position: refs/heads/main@{#952594} --- ...atic_bitmap_image_to_video_frame_copier.cc | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc index 53db27382955ed..59e3e620c96b6f 100644 --- a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc +++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc @@ -116,16 +116,18 @@ void StaticBitmapImageToVideoFrameCopier::Convert( // StaticBitmapImages are 8-bit sRGB. Expose the color space and pixel // format that is backing `image->GetMailboxHolder()`, or, alternatively, // expose an accelerated SkImage. - if (accelerated_frame_pool_->CopyRGBATextureToVideoFrame( - viz::SkColorTypeToResourceFormat(kRGBA_8888_SkColorType), - gfx::Size(image->width(), image->height()), - gfx::ColorSpace::CreateSRGB(), - image->IsOriginTopLeft() ? kTopLeft_GrSurfaceOrigin - : kBottomLeft_GrSurfaceOrigin, - image->GetMailboxHolder(), gfx::ColorSpace::CreateREC709(), - std::move(blit_done_callback))) { - return; - } + accelerated_frame_pool_->CopyRGBATextureToVideoFrame( + viz::SkColorTypeToResourceFormat(kRGBA_8888_SkColorType), + gfx::Size(image->width(), image->height()), + gfx::ColorSpace::CreateSRGB(), + image->IsOriginTopLeft() ? kTopLeft_GrSurfaceOrigin + : kBottomLeft_GrSurfaceOrigin, + image->GetMailboxHolder(), gfx::ColorSpace::CreateREC709(), + std::move(blit_done_callback)); + // Early out even if the above fails since it would've already invoked the + // FrameReadyCallback with a null VideoFrame to indicate failure, and that + // will cause us to the take the fallback path in |blit_done_lambda|. + return; } ReadYUVPixelsAsync(image, context_provider->ContextProvider(), std::move(callback)); From aac06dc09df5347583e21702ee92f4a1634e9e88 Mon Sep 17 00:00:00 2001 From: Caitlin Fischer Date: Fri, 17 Dec 2021 00:21:32 +0000 Subject: [PATCH 15/71] Add metrics to help diagnose issues with the beacon file on Android. Also, add some comments to values.h and json_file_value_serializer.h about persisting enum values to logs because a histogram being added in this change, Variations.ExtendedSafeMode.BeaconFileDeserializationError, relies on the enums in those files. Also, tweak the Deserialize() function comments as they were stale. Bug: 1280728 Change-Id: Id7406e2af5100f25e76a8c0db5f30ca9d22c1aa4 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3344167 Reviewed-by: Ilya Sherman Reviewed-by: Lei Zhang Commit-Queue: Caitlin Fischer Cr-Commit-Position: refs/heads/main@{#952595} --- base/json/json_file_value_serializer.h | 20 ++++--- base/json/json_string_value_serializer.h | 14 +++-- base/values.h | 3 + components/metrics/clean_exit_beacon.cc | 49 ++++++++++------ components/metrics/clean_exit_beacon.h | 16 ++++++ .../metrics/clean_exit_beacon_unittest.cc | 56 ++++++++++++------- tools/metrics/histograms/enums.xml | 21 +++++++ .../metadata/variations/histograms.xml | 34 ++++++++++- 8 files changed, 162 insertions(+), 51 deletions(-) diff --git a/base/json/json_file_value_serializer.h b/base/json/json_file_value_serializer.h index e2479aa401e428..265feddfee5859 100644 --- a/base/json/json_file_value_serializer.h +++ b/base/json/json_file_value_serializer.h @@ -65,17 +65,23 @@ class BASE_EXPORT JSONFileValueDeserializer : public base::ValueDeserializer { ~JSONFileValueDeserializer() override; - // Attempt to deserialize the data structure encoded in the file passed - // in to the constructor into a structure of Value objects. If the return - // value is NULL, and if |error_code| is non-null, |error_code| will - // contain an integer error code (either JsonFileError or JsonParseError). - // If |error_message| is non-null, it will be filled in with a formatted - // error message including the location of the error if appropriate. + // Attempts to deserialize the data structure encoded in the file passed to + // the constructor into a structure of Value objects. If the return value is + // null, then + // (1) |error_code| will be filled with an integer error code (either a + // JsonFileError or base::ValueDeserializer::kErrorCodeInvalidFormat) if a + // non-null |error_code| was given. + // (2) |error_message| will be filled with a formatted error message, + // including the location of the error (if appropriate), if a non-null + // |error_message| was given. // The caller takes ownership of the returned value. std::unique_ptr Deserialize(int* error_code, std::string* error_message) override; - // This enum is designed to safely overlap with JSONReader::JsonParseError. + // This enum is designed to safely overlap with JSONParser::JsonParseError. + // + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. enum JsonFileError { JSON_NO_ERROR = 0, JSON_ACCESS_DENIED = kErrorCodeFirstMetadataError, diff --git a/base/json/json_string_value_serializer.h b/base/json/json_string_value_serializer.h index 27be85279c55a5..5255c1ac198337 100644 --- a/base/json/json_string_value_serializer.h +++ b/base/json/json_string_value_serializer.h @@ -62,12 +62,14 @@ class BASE_EXPORT JSONStringValueDeserializer : public base::ValueDeserializer { ~JSONStringValueDeserializer() override; - // Attempt to deserialize the data structure encoded in the string passed - // in to the constructor into a structure of Value objects. If the return - // value is null, and if |error_code| is non-null, |error_code| will - // contain an integer error code (a JsonParseError in this case). - // If |error_message| is non-null, it will be filled in with a formatted - // error message including the location of the error if appropriate. + // Attempts to deserialize |json_string_| into a structure of Value objects. + // If the return value is null, then + // (1) |error_code| will be filled with an integer error code + // (base::ValueDeserializer::kErrorCodeInvalidFormat) if a non-null + // |error_code| was given. + // (2) |error_message| will be filled with a formatted error message, + // including the location of the error (if appropriate), if a non-null + // |error_message| was given. // The caller takes ownership of the returned value. std::unique_ptr Deserialize(int* error_code, std::string* error_message) override; diff --git a/base/values.h b/base/values.h index 7a076c94b27346..6e8ecb8ced4d09 100644 --- a/base/values.h +++ b/base/values.h @@ -863,6 +863,9 @@ class BASE_EXPORT ValueDeserializer { // - Values 1000 and above mean an error in the metadata (i.e. context). The // file could not be read, the network is down, etc. // - Negative values are reserved. + // + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. enum ErrorCode { kErrorCodeNoError = 0, // kErrorCodeInvalidFormat is a generic error code for "the data is not in diff --git a/components/metrics/clean_exit_beacon.cc b/components/metrics/clean_exit_beacon.cc index 64820d74098336..c33394db361c44 100644 --- a/components/metrics/clean_exit_beacon.cc +++ b/components/metrics/clean_exit_beacon.cc @@ -122,6 +122,12 @@ void MaybeIncrementCrashStreak(bool did_previous_session_exit_cleanly, base::clamp(num_crashes, 0, 100)); } +// Records |file_state| in a histogram. +void RecordBeaconFileState(BeaconFileState file_state) { + base::UmaHistogramEnumeration( + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", file_state); +} + // Returns the contents of the file at |beacon_file_path| if the following // conditions are all true. Otherwise, returns nullptr. // @@ -143,23 +149,34 @@ std::unique_ptr MaybeGetFileContents( if (beacon_file_path.empty()) return nullptr; + int error_code; JSONFileValueDeserializer deserializer(beacon_file_path); - std::unique_ptr beacon_file_contents = deserializer.Deserialize( - /*error_code=*/nullptr, /*error_message=*/nullptr); - - bool got_beacon_file_contents = - beacon_file_contents && beacon_file_contents->is_dict() && - beacon_file_contents->FindKeyOfType(kVariationsCrashStreak, - base::Value::Type::INTEGER) && - beacon_file_contents->FindKeyOfType(prefs::kStabilityExitedCleanly, - base::Value::Type::BOOLEAN); - base::UmaHistogramBoolean( - "Variations.ExtendedSafeMode.GotVariationsFileContents", - got_beacon_file_contents); - - if (got_beacon_file_contents) - return beacon_file_contents; - return nullptr; + std::unique_ptr beacon_file_contents = + deserializer.Deserialize(&error_code, /*error_message=*/nullptr); + + if (!beacon_file_contents) { + RecordBeaconFileState(BeaconFileState::kNotDeserializable); + base::UmaHistogramSparse( + "Variations.ExtendedSafeMode.BeaconFileDeserializationError", + error_code); + return nullptr; + } + if (!beacon_file_contents->is_dict() || beacon_file_contents->DictEmpty()) { + RecordBeaconFileState(BeaconFileState::kMissingDictionary); + return nullptr; + } + if (!beacon_file_contents->FindKeyOfType(kVariationsCrashStreak, + base::Value::Type::INTEGER)) { + RecordBeaconFileState(BeaconFileState::kMissingCrashStreak); + return nullptr; + } + if (!beacon_file_contents->FindKeyOfType(prefs::kStabilityExitedCleanly, + base::Value::Type::BOOLEAN)) { + RecordBeaconFileState(BeaconFileState::kMissingBeacon); + return nullptr; + } + RecordBeaconFileState(BeaconFileState::kReadable); + return beacon_file_contents; } // Returns the channel to use for setting up the Extended Variations Safe Mode diff --git a/components/metrics/clean_exit_beacon.h b/components/metrics/clean_exit_beacon.h index b0a5776c04814a..2118c99756fc2c 100644 --- a/components/metrics/clean_exit_beacon.h +++ b/components/metrics/clean_exit_beacon.h @@ -22,6 +22,9 @@ namespace metrics { // Captures all possible beacon value permutations for two distinct beacons. // Exposed for testing. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum class CleanExitBeaconConsistency { kCleanClean = 0, kCleanDirty = 1, @@ -35,6 +38,19 @@ enum class CleanExitBeaconConsistency { kMaxValue = kMissingMissing, }; +// Denotes the state of the beacon file. Exposed for testing. +// +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class BeaconFileState { + kReadable = 0, + kNotDeserializable = 1, + kMissingDictionary = 2, + kMissingCrashStreak = 3, + kMissingBeacon = 4, + kMaxValue = kMissingBeacon, +}; + // Reads and updates a beacon used to detect whether the previous browser // process exited cleanly. class CleanExitBeacon { diff --git a/components/metrics/clean_exit_beacon_unittest.cc b/components/metrics/clean_exit_beacon_unittest.cc index c55dd30cdcb7c5..aa8068b92be71f 100644 --- a/components/metrics/clean_exit_beacon_unittest.cc +++ b/components/metrics/clean_exit_beacon_unittest.cc @@ -90,6 +90,7 @@ struct BadBeaconTestParams { const std::string test_name; bool beacon_file_exists; const std::string beacon_file_contents; + BeaconFileState beacon_file_state; }; // Used for testing beacon files that are not well-formed, do not exist, etc. @@ -182,7 +183,7 @@ TEST_F(CleanExitBeaconTest, InitWithoutUserDataDir) { EXPECT_FALSE( base::FieldTrialList::IsTrialActive(variations::kExtendedSafeModeTrial)); histogram_tester_.ExpectTotalCount( - "Variations.ExtendedSafeMode.GotVariationsFileContents", 0); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", 0); } // Verify that the beacon file is not read when the client is not in the @@ -217,41 +218,51 @@ TEST_F(CleanExitBeaconTest, FileIgnoredByControlGroup) { EXPECT_EQ(prefs_.GetInteger(variations::prefs::kVariationsCrashStreak), expected_crash_streak); histogram_tester_.ExpectTotalCount( - "Variations.ExtendedSafeMode.GotVariationsFileContents", 0); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", 0); } INSTANTIATE_TEST_SUITE_P( All, BadBeaconFileTest, ::testing::Values( - BadBeaconTestParams{.test_name = "NoVariationsFile", - .beacon_file_exists = false, - .beacon_file_contents = ""}, - BadBeaconTestParams{.test_name = "EmptyVariationsFile", - .beacon_file_exists = true, - .beacon_file_contents = ""}, - BadBeaconTestParams{.test_name = "NotDictionary", - .beacon_file_exists = true, - .beacon_file_contents = "{abc123"}, - BadBeaconTestParams{.test_name = "EmptyDictionary", - .beacon_file_exists = true, - .beacon_file_contents = "{}"}, + BadBeaconTestParams{ + .test_name = "NoVariationsFile", + .beacon_file_exists = false, + .beacon_file_contents = "", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "EmptyVariationsFile", + .beacon_file_exists = true, + .beacon_file_contents = "", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "NotDictionary", + .beacon_file_exists = true, + .beacon_file_contents = "{abc123", + .beacon_file_state = BeaconFileState::kNotDeserializable}, + BadBeaconTestParams{ + .test_name = "EmptyDictionary", + .beacon_file_exists = true, + .beacon_file_contents = "{}", + .beacon_file_state = BeaconFileState::kMissingDictionary}, BadBeaconTestParams{ .test_name = "MissingCrashStreak", .beacon_file_exists = true, .beacon_file_contents = - "{\"user_experience_metrics.stability.exited_cleanly\": true}"}, + "{\"user_experience_metrics.stability.exited_cleanly\": true}", + .beacon_file_state = BeaconFileState::kMissingCrashStreak}, BadBeaconTestParams{ .test_name = "MissingBeacon", .beacon_file_exists = true, - .beacon_file_contents = "{\"variations_crash_streak\": 1}"}), + .beacon_file_contents = "{\"variations_crash_streak\": 1}", + .beacon_file_state = BeaconFileState::kMissingBeacon}), [](const ::testing::TestParamInfo& params) { return params.param.test_name; }); // Verify that the inability to get the beacon file's contents for a plethora of -// reasons (a) doesn't crash and (b) correctly records the -// GotVariationsFileContents metric. +// reasons (a) doesn't crash and (b) correctly records the BeaconFileState +// metric. TEST_P(BadBeaconFileTest, InitWithUnusableBeaconFile) { SetUpExtendedSafeModeExperiment(variations::kSignalAndWriteViaFileUtilGroup); BadBeaconTestParams params = GetParam(); @@ -266,7 +277,8 @@ TEST_P(BadBeaconFileTest, InitWithUnusableBeaconFile) { TestCleanExitBeacon beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", false, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + params.beacon_file_state, 1); } // TODO(crbug/1248239): Enable these tests on Android when the Extended @@ -289,7 +301,8 @@ TEST_F(CleanExitBeaconTest, InitWithBeaconFile) { TestCleanExitBeacon clean_exit_beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", true, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + BeaconFileState::kReadable, 1); EXPECT_TRUE(clean_exit_beacon.exited_cleanly()); histogram_tester_.ExpectUniqueSample("Variations.SafeMode.Streak.Crashes", num_crashes, 1); @@ -313,7 +326,8 @@ TEST_F(CleanExitBeaconTest, InitWithCrashAndBeaconFile) { const int updated_num_crashes = last_session_num_crashes + 1; TestCleanExitBeacon clean_exit_beacon(&prefs_, user_data_dir_path); histogram_tester_.ExpectUniqueSample( - "Variations.ExtendedSafeMode.GotVariationsFileContents", true, 1); + "Variations.ExtendedSafeMode.BeaconFileStateAtStartup", + BeaconFileState::kReadable, 1); EXPECT_FALSE(clean_exit_beacon.exited_cleanly()); histogram_tester_.ExpectUniqueSample("Variations.SafeMode.Streak.Crashes", updated_num_crashes, 1); diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 6d973204f39bb0..a1cb340600e8cd 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -8458,6 +8458,14 @@ Called by update_bad_message_reasons.py.--> + + + + + + + + @@ -46657,6 +46665,19 @@ Called by update_gpu_driver_bug_workaround_entries.py.--> + + + Captures errors codes that can be given by + JSONFileValueDeserializer::Deserialize(). + + + + + + + + + diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml index b3ca4591c62097..844f3760bbf2b6 100644 --- a/tools/metrics/histograms/metadata/variations/histograms.xml +++ b/tools/metrics/histograms/metadata/variations/histograms.xml @@ -76,8 +76,40 @@ chromium-metrics-reviews@google.com. + + caitlinfischer@google.com + src/base/metrics/OWNERS + Internals>Metrics>Variations + + The error code given by JSONFileValueDeserializer::Deserialize(). Emitted + during CleanExitBeacon initialization when the beacon file cannot be + deserialized. In other words, it is emitted whenever the "Not + deserializable" bucket of the BeaconFileStateAtStartup histogram is + emitted. Note that this file is used by only one branch of the Extended + Variations Safe Mode experiment. + + + + + caitlinfischer@google.com + src/base/metrics/OWNERS + Internals>Metrics>Variations + + The state of the beacon file and its contents, e.g. readable or not + deserializable. See the BeaconFileDeserializationError histogram for more + details on why the file was not deserializable. Note that this file is used + by only one branch of the Extended Variations Safe Mode experiment. Recorded + when the CleanExitBeacon is initialized. + + + + + Replaced with Variations.ExtendedSafeMode.BeaconFileState in M99. + caitlinfischer@google.com src/base/metrics/OWNERS Internals>Metrics>Variations @@ -86,7 +118,7 @@ chromium-metrics-reviews@google.com. This is the case when the file exists, its contents are successfully read, and its contents are non-empty and in the expected format. Note that this file is used by only one branch of the Extended Variations Safe Mode - experiment. Recorded when the CleanExitBeacon is constructed. + experiment. Recorded when the CleanExitBeacon is initialized. From eadd2a0717a2d2b51f8efa6a35c9b63a6e191849 Mon Sep 17 00:00:00 2001 From: Hirokazu Honda Date: Fri, 17 Dec 2021 00:22:16 +0000 Subject: [PATCH 16/71] media/gpu/vaapi/H264VaapiVED: Fix confusion of max ref frames In H264, max_num_ref_frames is the maximum of sum of the l0 and l1 picture lists. Since we don't use picture list 1, max_num_ref_frames is max_ref_pic_list0_size. Therefore, kMaxNumReferenceFrames is unnecessary. This removes it and makes the code understand easily. Bug: b:194265793 Test: video.EncodeAccel.h264* Change-Id: Id30d308e2d9f7ec708b3066dd004b58bd1a134a5 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3288507 Reviewed-by: Miguel Casas-Sanchez Commit-Queue: Hirokazu Honda Cr-Commit-Position: refs/heads/main@{#952596} --- .../gpu/vaapi/h264_vaapi_video_encoder_delegate.cc | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc index f1ede3f6dc2638..f64b937ea052f0 100644 --- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc +++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate.cc @@ -45,8 +45,7 @@ constexpr uint32_t kCPBWindowSizeMs = 1500; // Subjectively chosen. // Generally use up to 2 reference frames. -constexpr size_t kMaxNumReferenceFrames = 2; -constexpr size_t kMaxRefIdxL0Size = kMaxNumReferenceFrames; +constexpr size_t kMaxRefIdxL0Size = 2; // HRD parameters (ch. E.2.2 in H264 spec). constexpr int kBitRateScale = 0; // bit_rate_scale for SPS HRD parameters. @@ -209,7 +208,7 @@ H264VaapiVideoEncoderDelegate::EncodeParams::EncodeParams() initial_qp(kDefaultQP), min_qp(kMinQP), max_qp(kMaxQP), - max_num_ref_frames(kMaxNumReferenceFrames), + max_num_ref_frames(kMaxRefIdxL0Size), max_ref_pic_list0_size(kMaxRefIdxL0Size) {} H264VaapiVideoEncoderDelegate::H264VaapiVideoEncoderDelegate( @@ -327,8 +326,7 @@ bool H264VaapiVideoEncoderDelegate::Initialize( num_temporal_layers_ > 1u ? num_temporal_layers_ - 1 : std::min(kMaxRefIdxL0Size, ave_config.max_num_ref_frames & 0xffff); - curr_params_.max_num_ref_frames = - std::min(kMaxNumReferenceFrames, curr_params_.max_ref_pic_list0_size); + curr_params_.max_num_ref_frames = curr_params_.max_ref_pic_list0_size; bool submit_packed_sps = false; bool submit_packed_pps = false; @@ -454,10 +452,8 @@ bool H264VaapiVideoEncoderDelegate::PrepareEncodeJob(EncodeJob& encode_job) { // below maximum size, dropping oldest references. if (pic->ref) { ref_pic_list0_.push_front(pic); - const size_t max_num_ref_frames = - base::checked_cast(current_sps_.max_num_ref_frames); - while (ref_pic_list0_.size() > max_num_ref_frames) - ref_pic_list0_.pop_back(); + ref_pic_list0_.resize( + std::min(curr_params_.max_ref_pic_list0_size, ref_pic_list0_.size())); } num_encoded_frames_++; From 866a08cc974b306f8aee72a017596a69ec256c40 Mon Sep 17 00:00:00 2001 From: Alison Maher Date: Fri, 17 Dec 2021 00:22:39 +0000 Subject: [PATCH 17/71] [LayoutNG] Additional allow_first_tier_oof_cache_ constraints Similar to CL:3331522, we were hitting a case where |allow_first_tier_oof_cache_| was true when handling fragmentation, because |has_block_fragmentation_| was false. To fix this, make sure that |allow_first_tier_oof_cache_| is always false when we handle fragmentation. Bug: 1280620 Change-Id: I86236f1bd21e184d19825a64c873448a90806e5e Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345485 Reviewed-by: Morten Stenshorne Commit-Queue: Alison Maher Cr-Commit-Position: refs/heads/main@{#952597} --- .../core/layout/ng/ng_out_of_flow_layout_part.cc | 3 +++ .../css/css-break/nested-oof-in-multicol-crash.html | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 3b8b4473d39ef4..1b595083369f26 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc @@ -326,6 +326,9 @@ void NGOutOfFlowLayoutPart::HandleFragmentation() { has_block_fragmentation_) return; + // Don't use the cache if we are handling fragmentation. + allow_first_tier_oof_cache_ = false; + while (container_builder_->HasOutOfFlowFragmentainerDescendants() || container_builder_->HasMulticolsWithPendingOOFs()) { HandleMulticolsWithPendingOOFs(container_builder_); diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html b/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html new file mode 100644 index 00000000000000..6b2f81005d3e41 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-break/nested-oof-in-multicol-crash.html @@ -0,0 +1,11 @@ + + +

PASS if no crash or DCHECK failure.

+
+
+
+
+
+
+
+
From 2101f04401b6bade2b74145a755b7c326acf7014 Mon Sep 17 00:00:00 2001 From: Morten Stenshorne Date: Fri, 17 Dec 2021 00:24:05 +0000 Subject: [PATCH 18/71] Handle unsuccessful layout result in UpdateShapeOutsideInfoIfNeeded(). We got a kOutOfFragmentainerSpace status, and then there'll be no fragment generated. Bug: 1278880 Change-Id: Iafaa6ec72b0adf19794acca3b4b05b837f3d11f0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3344660 Reviewed-by: Ian Kilpatrick Commit-Queue: Morten Stenshorne Cr-Commit-Position: refs/heads/main@{#952598} --- .../blink/renderer/core/layout/ng/ng_block_node.cc | 3 +++ ...ape-outside-multicol-with-monolithic-child-crash.html | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc index 8a40af1bf0e774..0dc7a42614326e 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc @@ -1917,6 +1917,9 @@ void NGBlockNode::UpdateShapeOutsideInfoIfNeeded( if (!box_->IsFloating() || !box_->GetShapeOutsideInfo()) return; + if (layout_result.Status() != NGLayoutResult::kSuccess) + return; + // The box_ may not have a valid size yet (due to an intermediate layout), // use the fragment's size instead. LayoutSize box_size = layout_result.PhysicalFragment().Size().ToLayoutSize(); diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html new file mode 100644 index 00000000000000..d6180352658a4f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/nested-floated-shape-outside-multicol-with-monolithic-child-crash.html @@ -0,0 +1,9 @@ + + + +
+
+
+
+
+
From e76c5e4245e0caf3569894b650263e068b2a46e2 Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Fri, 17 Dec 2021 00:24:55 +0000 Subject: [PATCH 19/71] Roll Fuchsia SDK from 7.20211215.3.1 to 7.20211216.2.1 If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/fuchsia-sdk-chromium-autoroll Please CC chrome-fuchsia-gardener@grotations.appspotmail.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:fuchsia-arm64-cast;luci.chromium.try:fuchsia-deterministic-dbg;luci.chromium.try:fuchsia-x64-cast Tbr: chrome-fuchsia-gardener@grotations.appspotmail.com Disable-Retries: true Change-Id: I1960c0ce65045e4a1133dddf07ded1cbf777ed1a Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345739 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952599} --- build/fuchsia/linux.sdk.sha1 | 2 +- build/fuchsia/mac.sdk.sha1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index d25fb92dc30896..982bf27f0f57d0 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1 @@ -1 +1 @@ -7.20211215.3.1 +7.20211216.2.1 diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index d25fb92dc30896..982bf27f0f57d0 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1 @@ -1 +1 @@ -7.20211215.3.1 +7.20211216.2.1 From 191216931340679545f9b6803ab979d8b7e30e0f Mon Sep 17 00:00:00 2001 From: Sonny Sasaka Date: Fri, 17 Dec 2021 00:28:36 +0000 Subject: [PATCH 20/71] [Floss] Disable device filtering With Floss, device list filtering is still unstable. We disable filtering it first so that Floss testing of other features can be unblocked. Bug: b:202335393 Change-Id: I741d910efe5059f55e7ae21cece0a2695eaf66f6 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3342921 Reviewed-by: Abhishek Pandit-Subedi Reviewed-by: Kyle Horimoto Commit-Queue: Sonny Sasaka Cr-Commit-Position: refs/heads/main@{#952600} --- device/bluetooth/chromeos/bluetooth_utils.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/device/bluetooth/chromeos/bluetooth_utils.cc b/device/bluetooth/chromeos/bluetooth_utils.cc index 02c5939c2d6b15..534430956fef32 100644 --- a/device/bluetooth/chromeos/bluetooth_utils.cc +++ b/device/bluetooth/chromeos/bluetooth_utils.cc @@ -15,6 +15,7 @@ #include "base/strings/string_util.h" #include "base/time/time.h" #include "chromeos/constants/chromeos_features.h" +#include "device/bluetooth/floss/floss_features.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "device/base/features.h" @@ -160,6 +161,12 @@ device::BluetoothAdapter::DeviceList FilterBluetoothDeviceList( } bool IsUnsupportedDevice(const device::BluetoothDevice* device) { + // With Floss, device list filtering is still unstable. We disable filtering + // first so that Floss testing of other features can be unblocked. + // TODO(b/202335393): Enable device filtering once it's stable with Floss. + if (base::FeatureList::IsEnabled(floss::features::kFlossEnabled)) + return false; + #if BUILDFLAG(IS_CHROMEOS_ASH) if (chromeos::switches::IsUnfilteredBluetoothDevicesEnabled()) return false; From ac284d3abb45c3500c5d7a2d29582e3accd2f167 Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Fri, 17 Dec 2021 00:29:26 +0000 Subject: [PATCH 21/71] Roll Catapult from d6ef4a8af654 to 22e558b5843a (1 revision) https://chromium.googlesource.com/catapult.git/+log/d6ef4a8af654..22e558b5843a 2021-12-16 fdegans@google.com [code-health] Migrate tracing to python3 If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/catapult-autoroll Please CC wenbinzhang@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:chromeos-kevin-rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel Bug: chromium:1262294 Tbr: wenbinzhang@google.com Change-Id: Ib0de4cd4e45740ee0daa634538b7a6cab24e68fb Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346044 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952601} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 9c9ec4b3d0ea18..bb0d50c95fe95c 100644 --- a/DEPS +++ b/DEPS @@ -312,7 +312,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'd6ef4a8af654ca24f8adca2a892f6f7857d57d2f', + 'catapult_revision': '22e558b5843a77389ca3883d0950f0f34e6f690c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. From 982f7ba3c641dbc6e7994c90d103570092270e69 Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Fri, 17 Dec 2021 00:30:34 +0000 Subject: [PATCH 22/71] Roll Skia from 44a839262076 to 0f244e5c73c7 (2 revisions) https://skia.googlesource.com/skia.git/+log/44a839262076..0f244e5c73c7 2021-12-16 erikrose@google.com [infra] Retire iPhone 6 phones. 2021-12-16 herb@google.com add max dimension to the glyphs digest If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/skia-autoroll Please CC bungeman@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Skia: https://bugs.chromium.org/p/skia/issues/entry To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux-blink-rel;luci.chromium.try:linux-chromeos-compile-dbg;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel Cq-Do-Not-Cancel-Tryjobs: true Bug: None Tbr: bungeman@google.com Change-Id: I2dc3ded0f0219d5cfb4200ede35af41a8e062684 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346080 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952602} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index bb0d50c95fe95c..83384161595d33 100644 --- a/DEPS +++ b/DEPS @@ -245,7 +245,7 @@ vars = { # 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': '44a83926207668ad8de5eae74d68a54812ca55ad', + 'skia_revision': '0f244e5c73c78c940cd7acac89a2c68bc73c457f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. From 1e26e9d697c95b9f285ec1fa8835595f998238e5 Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Fri, 17 Dec 2021 00:30:53 +0000 Subject: [PATCH 23/71] Speculatively fix TestCertDBChangedFlushesClientAuthCache I'm not sure yet what's going on with TestWSSClientCert, but this seems the likely cause for TestCertDBChangedFlushesClientAuthCache. The network service may not necessarily have picked up the CertDatabase signal without a flush. Speculative because I was unable to reproduce the flake locally. Bug: 1279930 Change-Id: Ic77ce69f55e6a7c6fbdd82c784f6124adf5a3b72 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3344776 Auto-Submit: David Benjamin Reviewed-by: Scott Violet Commit-Queue: Scott Violet Cr-Commit-Position: refs/heads/main@{#952603} --- chrome/browser/ssl/ssl_browsertest.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc index ea8b348302ead4..7f7d7023a304ec 100644 --- a/chrome/browser/ssl/ssl_browsertest.cc +++ b/chrome/browser/ssl/ssl_browsertest.cc @@ -2216,10 +2216,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, TestClientAuthContinueWithoutCert) { EXPECT_EQ("", tab->GetLastCommittedURL().ref()); } -// TODO(https://crbug.com/1279930): disabled because of race in when certs -// are incorporated. -IN_PROC_BROWSER_TEST_F(SSLUITest, - DISABLED_TestCertDBChangedFlushesClientAuthCache) { +IN_PROC_BROWSER_TEST_F(SSLUITest, TestCertDBChangedFlushesClientAuthCache) { // Make the browser use the ClientCertStoreStub instead of the regular one. ProfileNetworkContextServiceFactory::GetForContext(browser()->profile()) ->set_client_cert_store_factory_for_testing( @@ -2275,6 +2272,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, // Send a CertDBChanged notification. net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged(); + content::FlushNetworkServiceInstanceForTesting(); // Visiting the page which requires client certs should fail, as the socket // pool has been flushed and SSL client auth cache has been cleared due to From b945bfe1849afc7ad6b6ae62260122ef37db0b65 Mon Sep 17 00:00:00 2001 From: Justin DeWitt Date: Fri, 17 Dec 2021 00:33:57 +0000 Subject: [PATCH 24/71] Revert "[GMNext] Update ThemeColorProvider to use OmniboxTheme" This reverts commit 16fdb849a961bef58fb236a12ecb9ad7727c1a6d. Reason for revert: Speculative fix for android-pie-x86-rel failures org.chromium.chrome.browser.omnibox.status.StatusMediatorUnitTest#searchEngineLogo_onTextChanged_noGlobeReplacementWhenUrlBarTextIsEmpty org.chromium.chrome.browser.omnibox.status.StatusMediatorUnitTest#testTemplateUrlServiceChanged org.chromium.chrome.browser.omnibox.status.StatusMediatorUnitTest#searchEngineLogo_isGoogleLogo org.chromium.chrome.browser.omnibox.status.StatusMediatorUnitTest#searchEngineLogo_isGoogleLogo_whenScrolled ...3 more failure(s) (7 total)... Original change's description: > [GMNext] Update ThemeColorProvider to use OmniboxTheme > > This CL updates the icon tint in some classes to follow OmniboxTheme > instead of the simple light/dark tint. It also moves OmniboxTheme out > of chrome/browser/omnibox to be able to use it in classes outside > omnibox/. > > Bug: 1233725, 1114183 > Change-Id: I479854127613ca4bf3f28bf9ad6c79b8d127b877 > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3307187 > Reviewed-by: Filip Gorski > Reviewed-by: Sky Malice > Reviewed-by: Theresa Sullivan > Commit-Queue: Sinan Sahin > Cr-Commit-Position: refs/heads/main@{#952457} Bug: 1233725, 1114183, 1280789 Change-Id: I9ee6322d23794cbe961920fd2e2e7975aa316c14 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346112 Owners-Override: Justin DeWitt Auto-Submit: Justin DeWitt Reviewed-by: Sinan Sahin Commit-Queue: Sinan Sahin Cr-Commit-Position: refs/heads/main@{#952604} --- .../java/res/values-night/drawables.xml | 2 + chrome/android/java/res/values/drawables.xml | 2 + .../browser/omaha/UpdateMenuItemHelper.java | 2 - .../toolbar/AppThemeColorProvider.java | 9 ---- .../browser/toolbar/ToolbarManager.java | 4 +- .../customtabs/CustomTabActivityTest.java | 7 +-- .../browser/omnibox/LocationBarTest.java | 4 +- .../status/StatusMediatorUnitTest.java | 11 ++--- .../LaunchesWithColorSchemeTest.java | 8 +--- .../browser/omnibox/LocationBarMediator.java | 10 ++-- .../omnibox/LocationBarMediatorTest.java | 10 ++-- .../omnibox/SearchEngineLogoUtils.java | 23 +++++---- .../SearchEngineLogoUtilsUnitTest.java | 38 +++++++-------- .../omnibox/status/StatusCoordinator.java | 8 ++-- .../omnibox/status/StatusMediator.java | 32 ++++++------- .../suggestions/AutocompleteCoordinator.java | 4 +- chrome/browser/ui/android/theme/BUILD.gn | 1 + .../java/res/color/toolbar_icon_tint_dark.xml | 0 .../browser/theme/ThemeColorProvider.java | 48 +++++++++++-------- .../chrome/browser/theme/ThemeUtils.java | 36 +------------- .../theme/TopUiThemeColorProvider.java | 17 ------- chrome/browser/ui/android/toolbar/BUILD.gn | 2 - .../java/res/values-night/drawables.xml | 9 ---- .../toolbar/java/res/values/drawables.xml | 9 ---- .../toolbar/SettableThemeColorProvider.java | 9 ---- .../toolbar/TabSwitcherButtonCoordinator.java | 4 +- .../toolbar/menu_button/MenuButton.java | 33 ++++--------- .../menu_button/MenuButtonCoordinator.java | 2 +- .../menu_button/MenuButtonMediator.java | 7 +-- .../menu_button/MenuButtonMediatorTest.java | 2 +- .../menu_button/MenuButtonProperties.java | 8 ++-- .../toolbar/menu_button/MenuButtonState.java | 6 --- .../toolbar/menu_button/MenuButtonTest.java | 6 +-- .../menu_button/MenuButtonViewBinder.java | 2 +- .../browser/toolbar/top/ToolbarLayout.java | 10 +++- .../browser/toolbar/top/ToolbarPhone.java | 24 ++++------ .../browser/toolbar/top/ToolbarTablet.java | 7 +-- components/browser_ui/styles/android/BUILD.gn | 2 - .../default_icon_color_white_tint_list.xml | 10 ---- 39 files changed, 144 insertions(+), 284 deletions(-) rename components/browser_ui/styles/android/java/res/color/default_icon_color_dark_tint_list.xml => chrome/browser/ui/android/theme/java/res/color/toolbar_icon_tint_dark.xml (100%) delete mode 100644 chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml delete mode 100644 chrome/browser/ui/android/toolbar/java/res/values/drawables.xml delete mode 100644 components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml diff --git a/chrome/android/java/res/values-night/drawables.xml b/chrome/android/java/res/values-night/drawables.xml index fdc0eb2e27be5c..25bfe0563a55aa 100644 --- a/chrome/android/java/res/values-night/drawables.xml +++ b/chrome/android/java/res/values-night/drawables.xml @@ -3,5 +3,7 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> + @drawable/badge_update_light + @drawable/ic_error_white_24dp_filled @drawable/shared_clipboard_zero_state_dark diff --git a/chrome/android/java/res/values/drawables.xml b/chrome/android/java/res/values/drawables.xml index 1eb1c4abeb6b3e..8569b73d402aa6 100644 --- a/chrome/android/java/res/values/drawables.xml +++ b/chrome/android/java/res/values/drawables.xml @@ -6,5 +6,7 @@ @drawable/rounded_rectangle_surface_1 @drawable/modern_toolbar_text_box_background + @drawable/badge_update_dark + @drawable/ic_error_grey800_24dp_filled @drawable/shared_clipboard_zero_state_light diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java index 0a3da975789f28..3f4fb8a680cac6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java @@ -229,7 +229,6 @@ private void handleStateChanged() { R.string.accessibility_toolbar_btn_menu_update; mMenuUiState.buttonState.darkBadgeIcon = R.drawable.badge_update_dark; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.badge_update_light; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.badge_update; } mMenuUiState.itemState = new MenuItemState(); @@ -259,7 +258,6 @@ private void handleStateChanged() { mMenuUiState.buttonState.darkBadgeIcon = R.drawable.ic_error_grey800_24dp_filled; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.ic_error_white_24dp_filled; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.ic_error_24dp_filled; } mMenuUiState.itemState = new MenuItemState(); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java index f0d145cd37312b..56f14422d60041 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/AppThemeColorProvider.java @@ -5,15 +5,12 @@ package org.chromium.chrome.browser.toolbar; import android.content.Context; -import android.content.res.ColorStateList; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider.IncognitoStateObserver; import org.chromium.chrome.browser.theme.ThemeColorProvider; -import org.chromium.chrome.browser.theme.ThemeUtils; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; /** A ThemeColorProvider for the app theme (incognito or standard theming). */ @@ -94,12 +91,6 @@ private void updateTheme() { updatePrimaryColor( shouldUseIncognitoBackground ? mIncognitoPrimaryColor : mStandardPrimaryColor, false); - final @BrandedColorScheme int brandedColorScheme = shouldUseIncognitoBackground - ? BrandedColorScheme.INCOGNITO - : BrandedColorScheme.APP_DEFAULT; - final ColorStateList iconTint = - ThemeUtils.getThemedToolbarIconTint(mActivityContext, brandedColorScheme); - updateTint(iconTint, brandedColorScheme); } @Override 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 544e29ef05dee1..1be1aae254f4a1 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 @@ -138,7 +138,6 @@ import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.native_page.NativePage; import org.chromium.chrome.browser.ui.system.StatusBarColorController; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.user_education.UserEducationHelper; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.chrome.browser.vr.VrModuleProvider; @@ -1657,9 +1656,8 @@ public void onThemeColorChanged(int color, boolean shouldAnimate) { } @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { updateBookmarkButtonStatus(); - mCustomTabThemeColorProvider.setTint(tint, brandedColorScheme); } /** diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java index 3bd461e6c81f29..655f1d5a558d2d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java @@ -116,7 +116,6 @@ import org.chromium.chrome.browser.toolbar.menu_button.MenuButton; import org.chromium.chrome.browser.ui.appmenu.AppMenuCoordinator; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.ChromeTabUtils; @@ -419,10 +418,8 @@ public void testToolbarColor() { } MenuButton menuButtonView = toolbarView.findViewById(R.id.menu_button_wrapper); - assertEquals(ColorUtils.shouldUseLightForegroundOnBackground(expectedColor) - ? BrandedColorScheme.DARK_BRANDED_THEME - : BrandedColorScheme.LIGHT_BRANDED_THEME, - menuButtonView.getBrandedColorSchemeForTesting()); + assertEquals(menuButtonView.getUseLightDrawablesForTesting(), + ColorUtils.shouldUseLightForegroundOnBackground(expectedColor)); } /** diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java index f157a28dee3b83..26f5336c7e77b4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/LocationBarTest.java @@ -15,7 +15,7 @@ import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.Matchers.not; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -205,7 +205,7 @@ private void setupSearchEngineLogo(String url) { }; doAnswer(logoAnswer) .when(mSearchEngineLogoUtils) - .getSearchEngineLogo(any(), anyInt(), any(), any(), any()); + .getSearchEngineLogo(any(), anyBoolean(), any(), any(), any()); }); } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java index 36aafff6687b28..6052c7d7c9af6f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java @@ -48,7 +48,6 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconResource; import org.chromium.chrome.browser.omnibox.status.StatusView.IconTransitionType; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.components.embedder_support.util.UrlConstants; @@ -131,7 +130,7 @@ public void setUp() { doAnswer(logoAnswer) .when(mSearchEngineLogoUtils) .getSearchEngineLogo( - eq(mResources), eq(BrandedColorScheme.APP_DEFAULT), any(), any(), any()); + eq(mResources), /* inNightMode= */ eq(false), any(), any(), any()); mBitmap = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888); setupStatusMediator(/* isTablet= */ false); @@ -435,21 +434,21 @@ public void testStatusText() { Assert.assertEquals("Incorrect color for paint preview status text", R.color.locationbar_status_preview_color_light, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); - mMediator.setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + mMediator.setUseDarkColors(true); Assert.assertEquals("Incorrect color for paint preview status text", R.color.locationbar_status_preview_color, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); // When only offline is enabled, it should be shown. mMediator.setPageIsPaintPreview(false); - mMediator.setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + mMediator.setUseDarkColors(false); Assert.assertEquals("Incorrect text for offline page status text", R.string.location_bar_verbose_status_offline, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_STRING_RES)); Assert.assertEquals("Incorrect color for offline page status text", R.color.locationbar_status_offline_color_light, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); - mMediator.setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + mMediator.setUseDarkColors(true); Assert.assertEquals("Incorrect color for offline page status text", R.color.locationbar_status_offline_color, mModel.get(StatusProperties.VERBOSE_STATUS_TEXT_COLOR_RES)); @@ -468,7 +467,7 @@ public void testTemplateUrlServiceChanged() { mMediator.onTemplateURLServiceChanged(); verify(mSearchEngineLogoUtils, times(3)) .getSearchEngineLogo( - eq(mResources), eq(BrandedColorScheme.APP_DEFAULT), any(), any(), any()); + eq(mResources), /* inNightMode= */ eq(false), any(), any(), any()); } @Test diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java index f58067656168e3..adf71d2b17f091 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/LaunchesWithColorSchemeTest.java @@ -4,7 +4,6 @@ package org.chromium.chrome.browser.customtabs; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -29,7 +28,6 @@ import org.chromium.chrome.browser.app.tabmodel.TabWindowManagerSingleton; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.toolbar.menu_button.MenuButton; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.display.DisplayAndroidManager; /** @@ -72,8 +70,7 @@ public void testLaunchCustomTabWithColorSchemeDark() { assertTrue(activity.getNightModeStateProviderForTesting().isInNightMode()); MenuButton menuButtonView = activity.findViewById(R.id.menu_button_wrapper); - assertEquals(BrandedColorScheme.APP_DEFAULT, - menuButtonView.getBrandedColorSchemeForTesting()); + assertTrue(menuButtonView.getUseLightDrawablesForTesting()); }); } @@ -88,8 +85,7 @@ public void testLaunchCustomTabWithColorSchemeLight() { assertFalse(activity.getNightModeStateProviderForTesting().isInNightMode()); MenuButton menuButtonView = activity.findViewById(R.id.menu_button_wrapper); - assertEquals(BrandedColorScheme.APP_DEFAULT, - menuButtonView.getBrandedColorSchemeForTesting()); + assertFalse(menuButtonView.getUseLightDrawablesForTesting()); }); } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index 48806cfa383760..609ecb56d7bd67 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java @@ -55,7 +55,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.signin.services.IdentityServicesProvider; import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.native_page.NativePage; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; @@ -73,6 +72,7 @@ import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.interpolators.BakedBezierInterpolator; +import org.chromium.ui.util.ColorUtils; import java.util.ArrayList; import java.util.List; @@ -928,18 +928,22 @@ private void focusCurrentTab() { */ @VisibleForTesting /* package */ void updateBrandedColorScheme() { + // TODO(crbug.com/1114183): Unify light and dark color logic in chrome and make it clear + // whether the foreground or background color is dark. + final boolean useDarkForegroundColors = + !ColorUtils.shouldUseLightForegroundOnBackground(getPrimaryBackgroundColor()); final @BrandedColorScheme int brandedColorScheme = OmniboxResourceProvider.getBrandedColorScheme(mContext, mLocationBarDataProvider.isIncognito(), getPrimaryBackgroundColor()); mLocationBarLayout.setDeleteButtonTint( - ThemeUtils.getThemedToolbarIconTint(mContext, brandedColorScheme)); + ChromeColors.getPrimaryIconTint(mContext, !useDarkForegroundColors)); // If the URL changed colors and is not focused, update the URL to account for the new // color scheme. if (mUrlCoordinator.setBrandedColorScheme(brandedColorScheme) && !isUrlBarFocused()) { updateUrl(); } - mStatusCoordinator.setBrandedColorScheme(brandedColorScheme); + mStatusCoordinator.setUseDarkForegroundColors(useDarkForegroundColors); if (mAutocompleteCoordinator != null) { mAutocompleteCoordinator.updateVisualsForState(brandedColorScheme); } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index 0748d771bc6fb4..4635ff07a672ea 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java @@ -666,7 +666,7 @@ public void testUpdateColors_lightBrandedColor() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.LIGHT_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(true); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.LIGHT_BRANDED_THEME); } @@ -679,7 +679,7 @@ public void testUpdateColors_darkBrandedColor() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } @@ -693,7 +693,7 @@ public void testUpdateColors_incognito() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.INCOGNITO); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.INCOGNITO); } @@ -706,7 +706,7 @@ public void testUpdateColors_default() { mMediator.updateBrandedColorScheme(); verify(mLocationBarLayout).setDeleteButtonTint(any(ColorStateList.class)); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.APP_DEFAULT); + verify(mStatusCoordinator).setUseDarkForegroundColors(true); verify(mAutocompleteCoordinator).updateVisualsForState(BrandedColorScheme.APP_DEFAULT); } @@ -723,7 +723,7 @@ public void testUpdateColors_setColorScheme() { verify(mUrlCoordinator) .setUrlBarData( urlBarData, UrlBar.ScrollType.SCROLL_TO_TLD, SelectionState.SELECT_ALL); - verify(mStatusCoordinator).setBrandedColorScheme(BrandedColorScheme.DARK_BRANDED_THEME); + verify(mStatusCoordinator).setUseDarkForegroundColors(false); verify(mAutocompleteCoordinator) .updateVisualsForState(BrandedColorScheme.DARK_BRANDED_THEME); } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java index 5dc42d16ec0fd6..b7c95de9eecab6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java @@ -23,7 +23,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.search_engines.TemplateUrlService; @@ -146,15 +145,14 @@ public static int getSearchEngineLogoComposedSizePixels(@NonNull Resources resou * circumstances, such as: no logo url found, network/cache error, etc. * * @param resources Provides access to Android resources. - * @param brandedColorScheme The {@link BrandedColorScheme}, used to tint icons. + * @param inNightMode Whether the device is currently in night mode, used to tint icons. * @param profile The current profile. When null, falls back to locally-provided icons. * @param templateUrlService The current templateUrlService. When null, falls back to * locally-provided icons. * @param callback How the bitmap will be returned to the caller. */ - public void getSearchEngineLogo(@NonNull Resources resources, - @BrandedColorScheme int brandedColorScheme, @Nullable Profile profile, - @Nullable TemplateUrlService templateUrlService, + public void getSearchEngineLogo(@NonNull Resources resources, boolean inNightMode, + @Nullable Profile profile, @Nullable TemplateUrlService templateUrlService, @NonNull Callback callback) { // In the following cases, we fallback to the search loupe: // - Either of the nullable dependencies are null. @@ -164,7 +162,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, // then we serve the Google icon we have locally. // Otherwise, the search engine is non-Google and we go to the network to fetch it. if (profile == null || templateUrlService == null || needToCheckForSearchEnginePromo()) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); return; } else if (templateUrlService.isDefaultSearchEngineGoogle()) { callback.onResult(new StatusIconResource(R.drawable.ic_logo_googleg_20dp, 0)); @@ -178,7 +176,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, String logoUrl = getSearchLogoUrl(templateUrlService); if (logoUrl == null) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_NULL_URL); return; } @@ -194,7 +192,7 @@ public void getSearchEngineLogo(@NonNull Resources resources, boolean willCallbackBeCalled = mFaviconHelper.getLocalFaviconImageForURL( profile, logoUrl, logoSizePixels, (image, iconUrl) -> { if (image == null) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_RETURNED_BITMAP_NULL); return; } @@ -203,15 +201,16 @@ public void getSearchEngineLogo(@NonNull Resources resources, recordEvent(Events.FETCH_SUCCESS); }); if (!willCallbackBeCalled) { - callback.onResult(getSearchLoupeResource(brandedColorScheme)); + callback.onResult(getSearchLoupeResource(inNightMode)); recordEvent(Events.FETCH_FAILED_FAVICON_HELPER_ERROR); } } @VisibleForTesting - StatusIconResource getSearchLoupeResource(@BrandedColorScheme int brandedColorScheme) { - return new StatusIconResource( - R.drawable.ic_search, ThemeUtils.getThemedToolbarIconTintRes(brandedColorScheme)); + StatusIconResource getSearchLoupeResource(boolean inNightMode) { + return new StatusIconResource(R.drawable.ic_search, + inNightMode ? R.color.default_icon_color_secondary_tint_list + : ThemeUtils.getThemedToolbarIconTintRes(/* useLight= */ true)); } /** Returns whether the search engine promo is complete. */ diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java index 719b406b0e73f6..21d28d3f29b912 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java @@ -48,7 +48,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.search_engines.TemplateUrlService; @@ -136,7 +135,7 @@ public void getSearchEngineLogo() { StatusIconResource expected = new StatusIconResource(LOGO_URL, mBitmap, 0); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -156,12 +155,12 @@ public void getSearchEngineLogo() { @Test public void getSearchEngineLogo_nullProfileOrTemplateUrlService() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, null, mTemplateUrlService, mCallback); + /* inNightMode= */ false, null, mTemplateUrlService, mCallback); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), null, mCallback); + /* inNightMode= */ false, Mockito.mock(Profile.class), null, mCallback); verify(mCallback, times(2)).onResult(expected); } @@ -172,7 +171,7 @@ public void getSearchEngineLogo_searchEngineGoogle() { doReturn(true).when(mTemplateUrlService).isDefaultSearchEngineGoogle(); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(expected); } @@ -182,7 +181,7 @@ public void getSearchEngineLogo_faviconCached() { StatusIconResource expected = new StatusIconResource(LOGO_URL, mBitmap, 0); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -190,7 +189,7 @@ public void getSearchEngineLogo_faviconCached() { FaviconHelper.FaviconImageCallback faviconCallback = mCallbackCaptor.getValue(); faviconCallback.onFaviconAvailable(mBitmap, JUnitTestGURLs.getGURL(LOGO_URL)); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback, times(2)).onResult(expected); @@ -208,11 +207,11 @@ public void getSearchEngineLogo_faviconCached() { @Test public void getSearchEngineLogo_nullUrl() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); doReturn(null).when(mTemplateUrlService).getUrlForSearchQuery(any()); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(eq(expected)); @@ -227,14 +226,14 @@ public void getSearchEngineLogo_nullUrl() { @Test public void getSearchEngineLogo_faviconHelperError() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); when(mFaviconHelper.getLocalFaviconImageForURL( any(), anyString(), anyInt(), mCallbackCaptor.capture())) .thenReturn(false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mCallback).onResult(expected); @@ -249,10 +248,10 @@ public void getSearchEngineLogo_faviconHelperError() { @Test public void getSearchEngineLogo_returnedBitmapNull() { StatusIconResource expected = - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.APP_DEFAULT); + mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false); mSearchEngineLogoUtils.getSearchEngineLogo(Mockito.mock(Resources.class), - BrandedColorScheme.APP_DEFAULT, Mockito.mock(Profile.class), mTemplateUrlService, + /* inNightMode= */ false, Mockito.mock(Profile.class), mTemplateUrlService, mCallback); verify(mFaviconHelper) .getLocalFaviconImageForURL( @@ -272,15 +271,14 @@ public void getSearchEngineLogo_returnedBitmapNull() { @Test public void getSearchLoupeResource() { StatusIconResource expected = new StatusIconResource( - R.drawable.ic_search, R.color.default_icon_color_white_tint_list); - Assert.assertEquals(expected, - mSearchEngineLogoUtils.getSearchLoupeResource( - BrandedColorScheme.DARK_BRANDED_THEME)); + R.drawable.ic_search, R.color.default_icon_color_secondary_tint_list); + Assert.assertEquals( + expected, mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ true)); expected = new StatusIconResource( R.drawable.ic_search, ThemeUtils.getThemedToolbarIconTintRes(/* useLight */ true)); - Assert.assertEquals(expected, - mSearchEngineLogoUtils.getSearchLoupeResource(BrandedColorScheme.INCOGNITO)); + Assert.assertEquals( + expected, mSearchEngineLogoUtils.getSearchLoupeResource(/* inNightMode= */ false)); } @Test diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java index 9d807efeb62c5c..6e94f520262340 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java @@ -26,7 +26,6 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.user_education.IPHCommandBuilder; import org.chromium.chrome.browser.user_education.UserEducationHelper; import org.chromium.components.embedder_support.util.UrlConstants; @@ -171,10 +170,11 @@ public void setUrlFocusChangePercent(float percent) { } /** - * @param brandedColorScheme The {@link BrandedColorScheme} to use for the status icon and text. + * @param useDarkForegroundColors Whether dark foreground colors should be for the status icon + * and text. */ - public void setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { - mMediator.setBrandedColorScheme(brandedColorScheme); + public void setUseDarkForegroundColors(boolean useDarkForegroundColors) { + mMediator.setUseDarkColors(useDarkForegroundColors); // TODO(ender): remove this once icon selection has complete set of // corresponding properties (for tinting etc). diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java index b656a95f2c0d9f..bc9800fcf68d60 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java @@ -29,11 +29,9 @@ import org.chromium.chrome.browser.omnibox.status.StatusProperties.PermissionIconResource; import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconResource; import org.chromium.chrome.browser.omnibox.status.StatusView.IconTransitionType; -import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider; import org.chromium.chrome.browser.page_info.ChromePageInfoHighlight; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.theme.ThemeUtils; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.site_settings.ContentSettingsResources; import org.chromium.components.browser_ui.site_settings.SiteSettingsUtil; import org.chromium.components.content_settings.ContentSettingValues; @@ -63,6 +61,7 @@ public class StatusMediator implements PermissionDialogController.Observer, private final Supplier mProfileSupplier; private final Supplier mMerchantTrustSignalsCoordinatorSupplier; + private boolean mDarkTheme; private boolean mUrlHasFocus; private boolean mVerboseStatusSpaceAvailable; private boolean mPageIsPaintPreview; @@ -79,7 +78,6 @@ public class StatusMediator implements PermissionDialogController.Observer, private @ConnectionSecurityLevel int mPageSecurityLevel; - private @BrandedColorScheme int mBrandedColorScheme; private @DrawableRes int mSecurityIconRes; private @DrawableRes int mSecurityIconTintRes; private @StringRes int mSecurityIconDescriptionRes; @@ -391,11 +389,11 @@ void setUrlMinWidth(int width) { } /** - * Set the {@link BrandedColorScheme}. + * Toggle between dark and light UI color theme. */ - void setBrandedColorScheme(@BrandedColorScheme int brandedColorScheme) { - if (mBrandedColorScheme != brandedColorScheme) { - mBrandedColorScheme = brandedColorScheme; + void setUseDarkColors(boolean useDarkColors) { + if (mDarkTheme != useDarkColors) { + mDarkTheme = useDarkColors; updateColorTheme(); } } @@ -437,24 +435,22 @@ private void updateVerbaseStatusTextVisibility() { * Update color theme for all status components. */ private void updateColorTheme() { - // TODO(https://crbug.com/1275726): Update the colors here once we have the specs. - final boolean isDark = !OmniboxResourceProvider.isDarkMode(mBrandedColorScheme); @ColorRes - int separatorColor = - isDark ? R.color.divider_line_bg_color_dark : R.color.divider_line_bg_color_light; + int separatorColor = mDarkTheme ? R.color.divider_line_bg_color_dark + : R.color.divider_line_bg_color_light; @ColorRes int textColor = 0; if (mPageIsPaintPreview) { - textColor = isDark ? R.color.locationbar_status_preview_color - : R.color.locationbar_status_preview_color_light; + textColor = mDarkTheme ? R.color.locationbar_status_preview_color + : R.color.locationbar_status_preview_color_light; } else if (mPageIsOffline) { - textColor = isDark ? R.color.locationbar_status_offline_color - : R.color.locationbar_status_offline_color_light; + textColor = mDarkTheme ? R.color.locationbar_status_offline_color + : R.color.locationbar_status_offline_color_light; } @ColorRes - int tintColor = ThemeUtils.getThemedToolbarIconTintRes(mBrandedColorScheme); + int tintColor = ThemeUtils.getThemedToolbarIconTintRes(!mDarkTheme); mModel.set(StatusProperties.SEPARATOR_COLOR_RES, separatorColor); mNavigationIconTintRes = tintColor; @@ -581,9 +577,9 @@ private void getStatusIconResourceForSearchEngineIcon( // If the current url text is a valid url, then swap the dse icon for a globe. if (!mUrlBarTextIsSearch) { resourceCallback.onResult(new StatusIconResource(R.drawable.ic_globe_24dp, - ThemeUtils.getThemedToolbarIconTintRes(mBrandedColorScheme))); + ThemeUtils.getThemedToolbarIconTintRes(/* useLight= */ !mDarkTheme))); } else { - mSearchEngineLogoUtils.getSearchEngineLogo(mResources, mBrandedColorScheme, + mSearchEngineLogoUtils.getSearchEngineLogo(mResources, mDarkTheme, mProfileSupplier.get(), mTemplateUrlServiceSupplier.get(), resourceCallback); } } diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index bf2c89ee14fdde..d986081c734327 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java @@ -300,8 +300,8 @@ public void updateSuggestionListLayoutDirection() { * Update the visuals of the autocomplete UI. * @param brandedColorScheme The {@link @BrandedColorScheme}. */ - public void updateVisualsForState(@BrandedColorScheme int brandedColorScheme) { - mMediator.updateVisualsForState(brandedColorScheme); + public void updateVisualsForState(@BrandedColorScheme int colorScheme) { + mMediator.updateVisualsForState(colorScheme); } /** diff --git a/chrome/browser/ui/android/theme/BUILD.gn b/chrome/browser/ui/android/theme/BUILD.gn index 226babee32dab0..36e61e785c0f23 100644 --- a/chrome/browser/ui/android/theme/BUILD.gn +++ b/chrome/browser/ui/android/theme/BUILD.gn @@ -50,6 +50,7 @@ android_library("delegate_public_impl_java") { android_resources("java_resources") { sources = [ + "java/res/color/toolbar_icon_tint_dark.xml", "java/res/values/colors.xml", "java/res/values/values.xml", ] diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_dark_tint_list.xml b/chrome/browser/ui/android/theme/java/res/color/toolbar_icon_tint_dark.xml similarity index 100% rename from components/browser_ui/styles/android/java/res/color/default_icon_color_dark_tint_list.xml rename to chrome/browser/ui/android/theme/java/res/color/toolbar_icon_tint_dark.xml diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java index e799b13de9f6a1..1da27f15a04849 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java @@ -8,11 +8,10 @@ import android.content.res.ColorStateList; import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import org.chromium.base.ObserverList; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; +import org.chromium.ui.util.ColorUtils; /** * An abstract class that provides the current theme color. @@ -35,19 +34,25 @@ public interface ThemeColorObserver { public interface TintObserver { /** * @param tint The new tint the observer should use. - * @param brandedColorScheme The {@link BrandedColorScheme} the observer should use. + * @param useLight Whether the observer should use light mode. */ - void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme); + void onTintChanged(ColorStateList tint, boolean useLight); } + /** Light mode tint (used when color is dark). */ + private final ColorStateList mLightModeTint; + + /** Dark mode tint (used when color is light). */ + private final ColorStateList mDarkModeTint; + /** Current primary color. */ private int mPrimaryColor; - /** The current {@link BrandedColorScheme}. */ - private @Nullable @BrandedColorScheme Integer mBrandedColorScheme; - - /** The current tint. */ - private ColorStateList mTint; + /** + * Whether should use light tint (corresponds to dark color). If null, the state is not + * initialized. + */ + private @Nullable Boolean mUseLightTint; /** List of {@link ThemeColorObserver}s. These are used to broadcast events to listeners. */ private final ObserverList mThemeColorObservers; @@ -61,7 +66,8 @@ public interface TintObserver { public ThemeColorProvider(Context context) { mThemeColorObservers = new ObserverList(); mTintObservers = new ObserverList(); - mTint = ThemeUtils.getThemedToolbarIconTint(context, BrandedColorScheme.APP_DEFAULT); + mLightModeTint = ThemeUtils.getThemedToolbarIconTint(context, true); + mDarkModeTint = ThemeUtils.getThemedToolbarIconTint(context, false); } /** @@ -106,14 +112,14 @@ public int getThemeColor() { * @return The current tint of this provider. */ public ColorStateList getTint() { - return mTint; + return useLight() ? mLightModeTint : mDarkModeTint; } /** - * @return The current {@link BrandedColorScheme} of this provider. + * @return Whether or not this provider is using light tints. */ - public @BrandedColorScheme int getBrandedColorScheme() { - return mBrandedColorScheme != null ? mBrandedColorScheme : BrandedColorScheme.APP_DEFAULT; + public boolean useLight() { + return mUseLightTint != null ? mUseLightTint : false; } /** @@ -130,16 +136,16 @@ protected void updatePrimaryColor(int color, boolean shouldAnimate) { for (ThemeColorObserver observer : mThemeColorObservers) { observer.onThemeColorChanged(color, shouldAnimate); } + updateTint(); } - protected void updateTint( - @NonNull ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { - if (tint == mTint) return; - mTint = tint; - mBrandedColorScheme = brandedColorScheme; - + private void updateTint() { + final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(mPrimaryColor); + if (mUseLightTint != null && useLight == mUseLightTint) return; + mUseLightTint = useLight; + final ColorStateList tint = useLight ? mLightModeTint : mDarkModeTint; for (TintObserver observer : mTintObservers) { - observer.onTintChanged(tint, brandedColorScheme); + observer.onTintChanged(tint, useLight); } } } diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java index a2ba90a88cba02..8ef7b430200eed 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java @@ -22,7 +22,6 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.native_page.NativePage; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.content_public.browser.RenderWidgetHostView; import org.chromium.content_public.browser.WebContents; @@ -130,40 +129,7 @@ public static ColorStateList getThemedToolbarIconTint(Context context, boolean u // Light toolbar theme colors may be used in night mode, so use toolbar_icon_tint_dark which // is not overridden in night- resources. return useLight ? R.color.default_icon_color_light_tint_list - : R.color.default_icon_color_dark_tint_list; - } - - /** - * Returns the themed toolbar icon tint list. - * - * @param context The context to retrieve the resources from. - * @param brandedColorScheme The {@link BrandedColorScheme}. - * @return Primary icon tint list. - */ - public static ColorStateList getThemedToolbarIconTint( - Context context, @BrandedColorScheme int brandedColorScheme) { - return AppCompatResources.getColorStateList( - context, getThemedToolbarIconTintRes(brandedColorScheme)); - } - - /** - * Returns the themed toolbar icon tint resource. - * - * @param brandedColorScheme The {@link BrandedColorScheme}. - * @return Primary icon tint resource. - */ - public static @ColorRes int getThemedToolbarIconTintRes( - @BrandedColorScheme int brandedColorScheme) { - @ColorRes - int colorId = R.color.default_icon_color_tint_list; - if (brandedColorScheme == BrandedColorScheme.INCOGNITO) { - colorId = R.color.default_icon_color_light_tint_list; - } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { - colorId = R.color.default_icon_color_dark_tint_list; - } else if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME) { - colorId = R.color.default_icon_color_white_tint_list; - } - return colorId; + : R.color.toolbar_icon_tint_dark; } /** diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java index d6481ba93acf3e..60d506a6527635 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java @@ -5,7 +5,6 @@ package org.chromium.chrome.browser.theme; import android.content.Context; -import android.content.res.ColorStateList; import androidx.annotation.IntDef; import androidx.annotation.NonNull; @@ -18,7 +17,6 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.ui.native_page.NativePage; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.ui.util.ColorUtils; @@ -105,21 +103,6 @@ public int getThemeColorOrFallback(Tab tab, int fallbackColor) { private void updateColor(Tab tab, int themeColor, boolean shouldAnimate) { updatePrimaryColor(calculateColor(tab, themeColor), shouldAnimate); mIsDefaultColorUsed = isUsingDefaultColor(tab, themeColor); - final @BrandedColorScheme int brandedColorScheme = - calculateBrandedColorScheme(tab.isIncognito(), mIsDefaultColorUsed); - final ColorStateList iconTint = - ThemeUtils.getThemedToolbarIconTint(mContext, brandedColorScheme); - updateTint(iconTint, brandedColorScheme); - } - - private int calculateBrandedColorScheme(boolean isIncognito, boolean isDefaultColor) { - if (isIncognito) return BrandedColorScheme.INCOGNITO; - if (isDefaultColor) return BrandedColorScheme.APP_DEFAULT; - - final boolean isDarkTheme = - ColorUtils.shouldUseLightForegroundOnBackground(getThemeColor()); - return isDarkTheme ? BrandedColorScheme.DARK_BRANDED_THEME - : BrandedColorScheme.LIGHT_BRANDED_THEME; } /** diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn index 0231a777ef90b1..8d56518bb52c50 100644 --- a/chrome/browser/ui/android/toolbar/BUILD.gn +++ b/chrome/browser/ui/android/toolbar/BUILD.gn @@ -237,10 +237,8 @@ android_resources("java_resources") { "java/res/layout/tab_switcher_toolbar.xml", "java/res/layout/toolbar_phone.xml", "java/res/layout/toolbar_tablet.xml", - "java/res/values-night/drawables.xml", "java/res/values-sw600dp/dimens.xml", "java/res/values/dimens.xml", - "java/res/values/drawables.xml", "java/res/values/ids.xml", "java/res/values/styles.xml", "java/res/values/values.xml", diff --git a/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml b/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml deleted file mode 100644 index 5b4031d7e30fd4..00000000000000 --- a/chrome/browser/ui/android/toolbar/java/res/values-night/drawables.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - @drawable/badge_update_light - @drawable/ic_error_white_24dp_filled - diff --git a/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml b/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml deleted file mode 100644 index 4539df5d7ce274..00000000000000 --- a/chrome/browser/ui/android/toolbar/java/res/values/drawables.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - @drawable/badge_update_dark - @drawable/ic_error_grey800_24dp_filled - diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java index 4784bb4f9eaee5..d0cdbfc1d41970 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/SettableThemeColorProvider.java @@ -5,10 +5,8 @@ package org.chromium.chrome.browser.toolbar; import android.content.Context; -import android.content.res.ColorStateList; import org.chromium.chrome.browser.theme.ThemeColorProvider; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; /** * {@link ThemeColorProvider} that blindly tracks whatever primary color it's set to. @@ -30,11 +28,4 @@ public SettableThemeColorProvider(Context context) { public void setPrimaryColor(int color, boolean shouldAnimate) { updatePrimaryColor(color, shouldAnimate); } - - /** - * Sets the tint to the specified value. - */ - public void setTint(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { - updateTint(tint, brandedColorScheme); - } } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java index 2f3eb0f16d150b..2479bc7859975c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherButtonCoordinator.java @@ -10,7 +10,6 @@ import org.chromium.chrome.browser.theme.ThemeColorProvider; import org.chromium.chrome.browser.theme.ThemeColorProvider.TintObserver; import org.chromium.chrome.browser.toolbar.TabCountProvider.TabCountObserver; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -54,8 +53,7 @@ public void setThemeColorProvider(ThemeColorProvider themeColorProvider) { mThemeColorProvider = themeColorProvider; mTintObserver = new TintObserver() { @Override - public void onTintChanged( - ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { mTabSwitcherButtonModel.set(TabSwitcherButtonProperties.TINT, tint); } }; diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java index 0a74b3226f9500..1d43cc55bd7519 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButton.java @@ -31,7 +31,6 @@ import org.chromium.chrome.browser.theme.ThemeUtils; import org.chromium.chrome.browser.toolbar.R; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.components.browser_ui.widget.highlight.PulseDrawable; import org.chromium.ui.interpolators.BakedBezierInterpolator; @@ -45,7 +44,7 @@ public class MenuButton extends FrameLayout implements TintObserver { /** The view for the update badge. */ private ImageView mUpdateBadgeView; - private @BrandedColorScheme int mBrandedColorScheme; + private boolean mUseLightDrawables; private AppMenuButtonHelper mAppMenuButtonHelper; @@ -122,7 +121,7 @@ private void updateImageResources() { mMenuImageButton.getWidth() - mMenuImageButton.getPaddingRight(), mMenuImageButton.getHeight() - mMenuImageButton.getPaddingBottom()); mMenuImageButtonAnimationDrawable.setGravity(Gravity.CENTER); - int color = ThemeUtils.getThemedToolbarIconTint(getContext(), mBrandedColorScheme) + int color = ThemeUtils.getThemedToolbarIconTint(getContext(), mUseLightDrawables) .getDefaultColor(); mMenuImageButtonAnimationDrawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); @@ -131,7 +130,7 @@ private void updateImageResources() { MenuButtonState buttonState = mStateSupplier.get(); if (buttonState == null || mUpdateBadgeView == null) return; @DrawableRes - int drawable = getUpdateBadgeIcon(buttonState, mBrandedColorScheme); + int drawable = mUseLightDrawables ? buttonState.lightBadgeIcon : buttonState.darkBadgeIcon; mUpdateBadgeView.setImageDrawable( ApiCompatibilityUtils.getDrawable(getResources(), drawable)); mUpdateBadgeAnimationDrawable = (BitmapDrawable) mUpdateBadgeView.getDrawable() @@ -145,19 +144,6 @@ private void updateImageResources() { mUpdateBadgeAnimationDrawable.setGravity(Gravity.CENTER); } - private @DrawableRes int getUpdateBadgeIcon( - MenuButtonState buttonState, @BrandedColorScheme int brandedColorScheme) { - @DrawableRes - int drawable = buttonState.adaptiveBadgeIcon; - if (brandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME - || brandedColorScheme == BrandedColorScheme.INCOGNITO) { - drawable = buttonState.lightBadgeIcon; - } else if (brandedColorScheme == BrandedColorScheme.LIGHT_BRANDED_THEME) { - drawable = buttonState.darkBadgeIcon; - } - return drawable; - } - /** * Set the supplier of menu button state. * @param supplier Supplier of menu button state. @@ -275,10 +261,7 @@ private void updateMenuButtonHighlightDrawable() { ViewCompat.getPaddingEnd(mMenuImageButton), mMenuImageButton.getPaddingBottom()); } - // TODO(https://crbug.com/1233703) This doesn't work well with website themes. - boolean isLightPulseColor = mBrandedColorScheme == BrandedColorScheme.DARK_BRANDED_THEME - || mBrandedColorScheme == BrandedColorScheme.INCOGNITO; - mHighlightDrawable.setUseLightPulseColor(getContext(), isLightPulseColor); + mHighlightDrawable.setUseLightPulseColor(getContext(), mUseLightDrawables); setBackground(mHighlightDrawable); mHighlightDrawable.start(); } else { @@ -304,14 +287,14 @@ public void drawTabSwitcherAnimationOverlay(Canvas canvas, int alpha) { } @VisibleForTesting - public @BrandedColorScheme int getBrandedColorSchemeForTesting() { - return mBrandedColorScheme; + public boolean getUseLightDrawablesForTesting() { + return mUseLightDrawables; } @Override - public void onTintChanged(ColorStateList tintList, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tintList, boolean useLight) { ApiCompatibilityUtils.setImageTintList(mMenuImageButton, tintList); - mBrandedColorScheme = brandedColorScheme; + mUseLightDrawables = useLight; updateImageResources(); updateMenuButtonHighlightDrawable(); } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java index de7646d221a982..105fdd2985e4a1 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java @@ -77,7 +77,7 @@ public MenuButtonCoordinator(OneshotSupplier appMenuCoordina new ShowBadgeProperty(false, false)) .with(MenuButtonProperties.THEME, new ThemeProperty(themeColorProvider.getTint(), - themeColorProvider.getBrandedColorScheme())) + themeColorProvider.useLight())) .with(MenuButtonProperties.IS_VISIBLE, true) .with(MenuButtonProperties.STATE_SUPPLIER, menuButtonStateSupplier) .build(); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java index 46094d764d8548..4c13daafeb45ed 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java @@ -32,7 +32,6 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.appmenu.AppMenuObserver; import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.KeyboardVisibilityDelegate; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modelutil.PropertyModel; @@ -232,10 +231,8 @@ private void removeAppMenuUpdateBadge(boolean animate) { updateContentDescription(false, 0); } - private void onTintChanged( - ColorStateList tintList, @BrandedColorScheme int brandedColorScheme) { - mPropertyModel.set( - MenuButtonProperties.THEME, new ThemeProperty(tintList, brandedColorScheme)); + private void onTintChanged(ColorStateList tintList, boolean useLight) { + mPropertyModel.set(MenuButtonProperties.THEME, new ThemeProperty(tintList, useLight)); } /** diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java index 504a8c8194760a..f8f5d61553f177 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediatorTest.java @@ -88,7 +88,7 @@ public void setUp() { new ShowBadgeProperty(false, false)) .with(MenuButtonProperties.THEME, new ThemeProperty(mThemeColorProvider.getTint(), - mThemeColorProvider.getBrandedColorScheme())) + mThemeColorProvider.useLight())) .with(MenuButtonProperties.IS_VISIBLE, true) .build(); doReturn(mAppMenuHandler).when(mAppMenuCoordinator).getAppMenuHandler(); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java index de41381a6334f9..5c652127721c3c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonProperties.java @@ -10,7 +10,6 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableFloatPropertyKey; @@ -20,12 +19,11 @@ class MenuButtonProperties { static class ThemeProperty { @NonNull public ColorStateList mColorStateList; - public @BrandedColorScheme int mBrandedColorScheme; + public boolean mUseLightColors; - public ThemeProperty(@NonNull ColorStateList colorStateList, - @BrandedColorScheme int brandedColorScheme) { + public ThemeProperty(@NonNull ColorStateList colorStateList, boolean useLight) { mColorStateList = colorStateList; - mBrandedColorScheme = brandedColorScheme; + mUseLightColors = useLight; } } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java index e9d2803f3c7ef4..ca15f979eda1ab 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonState.java @@ -26,10 +26,4 @@ public class MenuButtonState { * this object is not {@code null}. */ public @DrawableRes int lightBadgeIcon; - - /** - * An icon resource for the badge for the menu button that adapts to light and dark modes. - * Always set (not {@code 0}) if this object is not {@code null}. - */ - public @DrawableRes int adaptiveBadgeIcon; } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java index 171746226d55e6..a336e62e5203d2 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonTest.java @@ -35,7 +35,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.toolbar.R; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; /** * Unit tests for MenuButton. @@ -65,7 +64,6 @@ R.layout.menu_button, new LinearLayout(mActivity))) R.string.accessibility_toolbar_btn_menu_update; mMenuUiState.buttonState.darkBadgeIcon = R.drawable.badge_update_dark; mMenuUiState.buttonState.lightBadgeIcon = R.drawable.badge_update_light; - mMenuUiState.buttonState.adaptiveBadgeIcon = R.drawable.badge_update; mMenuButton.setStateSupplier(() -> mMenuUiState.buttonState); } @@ -96,7 +94,7 @@ public void testDrawTabSwitcherAnimationOverlay_updateBadge() { assertEquals(drawnDrawable.getCreatedFromResId(), darkDrawable.getCreatedFromResId()); assertNotEquals(drawnDrawable.getCreatedFromResId(), lightDrawable.getCreatedFromResId()); - mMenuButton.onTintChanged(mColorStateList, BrandedColorScheme.DARK_BRANDED_THEME); + mMenuButton.onTintChanged(mColorStateList, true); drawnDrawable = shadowOf(mMenuButton.getTabSwitcherAnimationDrawable()); assertEquals(drawnDrawable.getCreatedFromResId(), lightDrawable.getCreatedFromResId()); assertNotEquals(drawnDrawable.getCreatedFromResId(), darkDrawable.getCreatedFromResId()); @@ -116,7 +114,7 @@ public void testDrawTabSwitcherAnimationOverlay_updateBadgeNotAvailable() { @Test public void testDrawTabSwitcherAnimationOverlay_correctBoundsAfterThemeChange() { mMenuButton.removeAppMenuUpdateBadge(false); - mMenuButton.onTintChanged(mColorStateList, BrandedColorScheme.DARK_BRANDED_THEME); + mMenuButton.onTintChanged(mColorStateList, true); // Run a manual layout pass so that mMenuButton's children get assigned sizes. mMenuButton.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java index 556e4ff669ab5c..000c4d96f49ad5 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonViewBinder.java @@ -47,7 +47,7 @@ public void bind(PropertyModel model, MenuButton view, PropertyKey propertyKey) } else if (propertyKey == MenuButtonProperties.THEME) { bind(model, view, MenuButtonProperties.STATE_SUPPLIER); ThemeProperty themeProperty = model.get(MenuButtonProperties.THEME); - view.onTintChanged(themeProperty.mColorStateList, themeProperty.mBrandedColorScheme); + view.onTintChanged(themeProperty.mColorStateList, themeProperty.mUseLightColors); } else if (propertyKey == MenuButtonProperties.TRANSLATION_X) { view.setTranslationX(model.get(MenuButtonProperties.TRANSLATION_X)); } diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index f62e56704b6a94..be5de17a932f1a 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java @@ -55,7 +55,6 @@ import org.chromium.chrome.browser.toolbar.top.ToolbarTablet.OfflineDownloader; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; import org.chromium.chrome.browser.ui.appmenu.AppMenuButtonHelper; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.UiUtils; import org.chromium.ui.base.ViewUtils; @@ -207,8 +206,15 @@ protected ColorStateList getTint() { return mThemeColorProvider == null ? mDefaultTint : mThemeColorProvider.getTint(); } + /** + * @return Whether to use light assets. + */ + protected boolean useLight() { + return mThemeColorProvider != null && mThemeColorProvider.useLight(); + } + @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) {} + public void onTintChanged(ColorStateList tint, boolean useLight) {} @Override public void onThemeColorChanged(int color, boolean shouldAnimate) {} diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 1e47554a0a067b..ef28d03fa628b8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java @@ -66,7 +66,6 @@ import org.chromium.chrome.browser.toolbar.TabSwitcherDrawable; import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator; import org.chromium.chrome.browser.toolbar.top.TopToolbarCoordinator.UrlExpansionObserver; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.browser_ui.widget.animation.CancelAwareAnimatorListener; import org.chromium.components.browser_ui.widget.animation.Interpolators; @@ -148,7 +147,7 @@ public class ToolbarPhone extends ToolbarLayout implements OnClickListener, TabC @ViewDebug.ExportedProperty(category = "chrome") protected boolean mTextureCaptureMode; private boolean mForceTextureCapture; - private int mTintUsedForLastTextureCapture; + private boolean mLightDrawablesUsedForLastTextureCapture; private int mTabCountForLastTextureCapture; @ViewDebug.ExportedProperty(category = "chrome") @@ -1327,7 +1326,7 @@ void drawTabSwitcherAnimationOverlay(Canvas canvas, float animationProgress) { mToolbarButtonsContainer, canvas, rgbAlpha); } - mTintUsedForLastTextureCapture = getTint().getDefaultColor(); + mLightDrawablesUsedForLastTextureCapture = useLight(); if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) { mTabCountForLastTextureCapture = mTabSwitcherAnimationTabStackDrawable.getTabCount(); @@ -1558,7 +1557,7 @@ public boolean setForceTextureCapture(boolean forceTextureCapture) { if (forceTextureCapture) { // Only force a texture capture if the tint for the toolbar drawables is changing or // if the tab count has changed since the last texture capture. - mForceTextureCapture = mTintUsedForLastTextureCapture != getTint().getDefaultColor(); + mForceTextureCapture = mLightDrawablesUsedForLastTextureCapture != useLight(); if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) { mForceTextureCapture = mForceTextureCapture @@ -1636,21 +1635,16 @@ public void updateButtonVisibility() { } @Override - public void onThemeColorChanged(int color, boolean shouldAnimate) { - if (mToggleTabStackButton != null) { - final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(color); - mToggleTabStackButton.setUseLightDrawables(useLight); - } - } - - @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { if (mHomeButton != null) { ApiCompatibilityUtils.setImageTintList(mHomeButton, tint); } - if (mToggleTabStackButton != null && mTabSwitcherAnimationTabStackDrawable != null) { - mTabSwitcherAnimationTabStackDrawable.setTint(tint); + if (mToggleTabStackButton != null) { + mToggleTabStackButton.setUseLightDrawables(useLight); + if (mTabSwitcherAnimationTabStackDrawable != null) { + mTabSwitcherAnimationTabStackDrawable.setTint(tint); + } } if (mOptionalButton != null && mOptionalButtonUsesTint) { diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java index 15395d2a028555..c8024bbb1a3c90 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java @@ -48,12 +48,10 @@ import org.chromium.chrome.browser.toolbar.ToolbarTabController; import org.chromium.chrome.browser.toolbar.menu_button.MenuButtonCoordinator; import org.chromium.chrome.browser.toolbar.top.NavigationPopup.HistoryDelegate; -import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.ui.UiUtils; import org.chromium.ui.base.DeviceFormFactor; -import org.chromium.ui.util.ColorUtils; import org.chromium.ui.widget.Toast; import java.util.ArrayList; @@ -380,12 +378,13 @@ void onTabOrModelChanged() { } @Override - public void onTintChanged(ColorStateList tint, @BrandedColorScheme int brandedColorScheme) { + public void onTintChanged(ColorStateList tint, boolean useLight) { ApiCompatibilityUtils.setImageTintList(mHomeButton, tint); ApiCompatibilityUtils.setImageTintList(mBackButton, tint); ApiCompatibilityUtils.setImageTintList(mForwardButton, tint); ApiCompatibilityUtils.setImageTintList(mSaveOfflineButton, tint); ApiCompatibilityUtils.setImageTintList(mReloadButton, tint); + mAccessibilitySwitcherButton.setUseLightDrawables(useLight); if (mOptionalButton != null && mOptionalButtonUsesTint) { ApiCompatibilityUtils.setImageTintList(mOptionalButton, tint); @@ -400,8 +399,6 @@ public void onThemeColorChanged(int color, boolean shouldAnimate) { mLocationBar.getTabletCoordinator().getBackground().setTint(textBoxColor); mLocationBar.updateVisualsForState(); setToolbarHairlineColor(color); - final boolean useLight = ColorUtils.shouldUseLightForegroundOnBackground(color); - mAccessibilitySwitcherButton.setUseLightDrawables(useLight); } /** diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index 08fb7695b1036a..b296042a2439b7 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn @@ -25,12 +25,10 @@ android_resources("java_resources") { sources = [ "java/res/color-v29/default_control_color_highlight.xml", "java/res/color/default_icon_color_accent1_tint_list.xml", - "java/res/color/default_icon_color_dark_tint_list.xml", "java/res/color/default_icon_color_light_tint_list.xml", "java/res/color/default_icon_color_secondary_light_tint_list.xml", "java/res/color/default_icon_color_secondary_tint_list.xml", "java/res/color/default_icon_color_tint_list.xml", - "java/res/color/default_icon_color_white_tint_list.xml", "java/res/color/default_text_color_accent1_tint_list.xml", "java/res/color/default_text_color_disabled_list.xml", "java/res/color/default_text_color_hint_list.xml", diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml deleted file mode 100644 index bcb69a24caa581..00000000000000 --- a/components/browser_ui/styles/android/java/res/color/default_icon_color_white_tint_list.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - From b5cd0b6656e348a4bb19b241075baa08e7fa3952 Mon Sep 17 00:00:00 2001 From: Muyao Xu Date: Fri, 17 Dec 2021 00:49:44 +0000 Subject: [PATCH 25/71] [Code Health] Remove ListValue::GetDictionary() in chrome/browser/ Bug: 1187091 Change-Id: Ifcd49791c1ceebb6430d8fb09cfae6d281c4327e Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3297469 Reviewed-by: Vasilii Sukhanov Commit-Queue: Muyao Xu Cr-Commit-Position: refs/heads/main@{#952605} --- .../profile_resetter_unittest.cc | 24 +++++++------- .../metadata_database_unittest.cc | 33 ++++++++++--------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/chrome/browser/profile_resetter/profile_resetter_unittest.cc b/chrome/browser/profile_resetter/profile_resetter_unittest.cc index 54d31af4ea041a..8570efae5d6a9c 100644 --- a/chrome/browser/profile_resetter/profile_resetter_unittest.cc +++ b/chrome/browser/profile_resetter/profile_resetter_unittest.cc @@ -988,19 +988,19 @@ TEST_F(ProfileResetterTest, GetReadableFeedback) { bool checked_extensions = false; bool checked_shortcuts = false; for (size_t i = 0; i < list->GetList().size(); ++i) { - base::DictionaryValue* dict = NULL; - ASSERT_TRUE(list->GetDictionary(i, &dict)); - std::string value; - ASSERT_TRUE(dict->GetString("key", &value)); - if (value == "Extensions") { - std::u16string extensions; - EXPECT_TRUE(dict->GetString("value", &extensions)); - EXPECT_EQ(u"Tiësto", extensions); + const base::Value& dict = list->GetList()[i]; + ASSERT_TRUE(dict.is_dict()); + const std::string* value = dict.FindStringKey("key"); + ASSERT_TRUE(value); + if (*value == "Extensions") { + const std::string* extensions = dict.FindStringKey("value"); + ASSERT_TRUE(extensions); + EXPECT_EQ(*extensions, "Tiësto"); checked_extensions = true; - } else if (value == "Shortcut targets") { - std::u16string targets; - EXPECT_TRUE(dict->GetString("value", &targets)); - EXPECT_NE(std::u16string::npos, targets.find(u"foo.com")) << targets; + } else if (*value == "Shortcut targets") { + const std::string* targets = dict.FindStringKey("value"); + ASSERT_TRUE(targets); + EXPECT_NE(std::string::npos, targets->find("foo.com")) << *targets; checked_shortcuts = true; } } diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc index 2865a95e2ed526..bdde0b323e66f5 100644 --- a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc @@ -1152,9 +1152,8 @@ TEST_P(MetadataDatabaseTest, DumpFiles) { TrackedFile folder_0(CreateTrackedFolder(app_root, "folder_0")); TrackedFile file_0(CreateTrackedFile(folder_0, "file_0")); - const TrackedFile* tracked_files[] = { - &sync_root, &app_root, &folder_0, &file_0 - }; + const TrackedFile* tracked_files[] = {&sync_root, &app_root, &folder_0, + &file_0}; SetUpDatabaseByTrackedFiles(tracked_files, base::size(tracked_files)); EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase()); @@ -1164,18 +1163,22 @@ TEST_P(MetadataDatabaseTest, DumpFiles) { metadata_database()->DumpFiles(app_root.tracker.app_id()); ASSERT_EQ(2u, files->GetList().size()); - base::DictionaryValue* file = nullptr; - std::string str; - - ASSERT_TRUE(files->GetDictionary(0, &file)); - EXPECT_TRUE(file->GetString("title", &str) && str == "folder_0"); - EXPECT_TRUE(file->GetString("type", &str) && str == "folder"); - EXPECT_TRUE(file->HasKey("details")); - - ASSERT_TRUE(files->GetDictionary(1, &file)); - EXPECT_TRUE(file->GetString("title", &str) && str == "file_0"); - EXPECT_TRUE(file->GetString("type", &str) && str == "file"); - EXPECT_TRUE(file->HasKey("details")); + const std::string* str; + const base::Value& folder = files->GetList()[0]; + ASSERT_TRUE(folder.is_dict()); + str = folder.FindStringKey("title"); + EXPECT_TRUE(str && *str == "folder_0"); + str = folder.FindStringKey("type"); + EXPECT_TRUE(str && *str == "folder"); + EXPECT_TRUE(folder.FindKey("details")); + + const base::Value& file = files->GetList()[1]; + ASSERT_TRUE(file.is_dict()); + str = file.FindStringKey("title"); + EXPECT_TRUE(str && *str == "file_0"); + str = file.FindStringKey("type"); + EXPECT_TRUE(str && *str == "file"); + EXPECT_TRUE(file.FindKey("details")); } TEST_P(MetadataDatabaseTest, ClearDatabase) { From 7dfffc21ad3ece3673d3a0bb177ec04b55043eaf Mon Sep 17 00:00:00 2001 From: Xiyuan Xia Date: Fri, 17 Dec 2021 00:50:45 +0000 Subject: [PATCH 26/71] Sheriff: Disable printer.ProxyAdd.epson_software_uncollated Bug: 1273485 Change-Id: I391e5c245c4cd98bc603297f287eb2aabb75eaf2 No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346006 Owners-Override: Xiyuan Xia Auto-Submit: Xiyuan Xia Commit-Queue: Rubber Stamper Bot-Commit: Rubber Stamper Cr-Commit-Position: refs/heads/main@{#952606} --- chromeos/tast_control.gni | 1 + 1 file changed, 1 insertion(+) diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 9125e21f44f1cd..0fc403084365bc 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni @@ -99,6 +99,7 @@ tast_disabled_tests_from_chrome_all = [ # https://crbug.com/1273485: Flaky. "printer.ProxyAdd.epson_software_collate", + "printer.ProxyAdd.epson_software_uncollated", # https://crbug.com/1279285: Flaky. "policy.AllowWakeLocks", From f1e05ee5b8d27ad7e04f8cd2dfc01af030cc9a80 Mon Sep 17 00:00:00 2001 From: Tom Anderson Date: Fri, 17 Dec 2021 00:54:05 +0000 Subject: [PATCH 27/71] [GTK] Remove log spam when calling g_type_class_unref(NULL) This occured on GTK4 with the following log spam: [1658612:1658612:1216/155521.116133:ERROR:browser_main_loop.cc(267)] GLib-GObject: g_type_class_unref: assertion 'g_class != NULL' failed R=sky Change-Id: Ifcafcee7fc39503b2ae09c6689e49341200de72e Bug: None Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346118 Commit-Queue: Thomas Anderson Auto-Submit: Thomas Anderson Reviewed-by: Scott Violet Commit-Queue: Scott Violet Cr-Commit-Position: refs/heads/main@{#952607} --- ui/base/glib/glib_cast.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/base/glib/glib_cast.h b/ui/base/glib/glib_cast.h index da550e017f5a10..1c226fa436b080 100644 --- a/ui/base/glib/glib_cast.h +++ b/ui/base/glib/glib_cast.h @@ -13,7 +13,8 @@ template T* GlibCast(U* instance, GType g_type) { // Ensure |g_type| is used so the compiler doesn't optimize it away // in release builds. - g_type_class_unref(g_type_class_ref(g_type)); + if (auto* type_class = g_type_class_ref(g_type)) + g_type_class_unref(type_class); DCHECK(G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type)); return reinterpret_cast(instance); } From eb19996218476c986de17fd0b9a85905c8466683 Mon Sep 17 00:00:00 2001 From: Carlos IL Date: Fri, 17 Dec 2021 00:59:54 +0000 Subject: [PATCH 28/71] Remove intersitial page related methods from RenderWidgetHostView These methods were related to overlay interstitials, which have been removed, so they were dead code at this point. Bug: 1077074 Change-Id: I7eb1a6c367552430cf80915b7682d78a81ca9a7d Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3342152 Auto-Submit: Carlos IL Reviewed-by: Nasko Oskov Commit-Queue: Nasko Oskov Cr-Commit-Position: refs/heads/main@{#952608} --- .../renderer_host/render_widget_host_view_android.cc | 9 --------- .../renderer_host/render_widget_host_view_android.h | 2 -- .../browser/renderer_host/render_widget_host_view_base.h | 9 --------- 3 files changed, 20 deletions(-) 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 3580332b7615fc..df1d44ed370126 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc @@ -1233,15 +1233,6 @@ uint32_t RenderWidgetHostViewAndroid::GetCaptureSequenceNumber() const { return latest_capture_sequence_number_; } -void RenderWidgetHostViewAndroid::OnInterstitialPageAttached() { - if (view_.parent()) - view_.parent()->MoveToFront(&view_); -} - -void RenderWidgetHostViewAndroid::OnInterstitialPageGoingAway() { - ResetSynchronousCompositor(); -} - bool RenderWidgetHostViewAndroid::CanSynchronizeVisualProperties() { // When a rotation begins, the new visual properties are not all notified to // RenderWidgetHostViewAndroid at the same time. The process begins when diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 85e96b85630d29..2954ba17d851ba 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h @@ -174,8 +174,6 @@ class CONTENT_EXPORT RenderWidgetHostViewAndroid bool IsInVR() const override; void DidOverscroll(const ui::DidOverscrollParams& params) override; void DidStopFlinging() override; - void OnInterstitialPageAttached() override; - void OnInterstitialPageGoingAway() override; bool CanSynchronizeVisualProperties() override; std::unique_ptr CreateSyntheticGestureTarget() override; diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h index e15b08a576e276..0c21c3b6e2a4b7 100644 --- a/content/browser/renderer_host/render_widget_host_view_base.h +++ b/content/browser/renderer_host/render_widget_host_view_base.h @@ -347,15 +347,6 @@ class CONTENT_EXPORT RenderWidgetHostViewBase : public RenderWidgetHostView { // Returns true if this view's size have been initialized. virtual bool HasSize() const; - // Informs the view that the assocaited InterstitialPage was attached. - virtual void OnInterstitialPageAttached() {} - - // Tells the view that the assocaited InterstitialPage will going away (but is - // not yet destroyed, as InterstitialPage destruction is asynchronous). The - // view may use this notification to clean up associated resources. This - // should be called before the WebContents is fully destroyed. - virtual void OnInterstitialPageGoingAway() {} - // Returns true if the visual properties should be sent to the renderer at // this time. This function is intended for subclasses to suppress // synchronization, the default implementation returns true. From 7c64b00ce8ba4f984b8a48cf2a62025a9bf2fa48 Mon Sep 17 00:00:00 2001 From: Matthew Denton Date: Fri, 17 Dec 2021 01:02:55 +0000 Subject: [PATCH 29/71] Linux: Send OSCrypt raw encryption key to the Network Service This enables NetworkService::SetEncryptionKey() for Linux. See the referenced bug for details on why this is necessary. This will call OSCrypt::GetRawEncryptionKey() in the browser process, send it to the network service via NetworkService::SetEncryptionKey() and finally call OSCrypt::SetRawEncryptionKey() in the network service. This way the network service doesn't require access to KeyStorage, implemented by third party libraries (libsecret, kwallet, etc.), which makes it more easily and reliably sandboxable. This means that starting the network service requires the encrypted key to be retrieved from the platform-specific KeyStorage. So, an os_crypt::Config must already have been set before ever starting the network service. This means modifying the BrowserMainParts of chrome and headless to initialize the config early enough. This also allows us to remove some extra code that initialized os_crypt in the network service with a config, which now is unnecessary. Bug: 1277463 Change-Id: I47c45a818fc579e094520ffbd1368af6a479b37b Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3320484 Reviewed-by: Peter Kvitek Reviewed-by: Colin Blundell Reviewed-by: Tom Sepez Commit-Queue: Matthew Denton Cr-Commit-Position: refs/heads/main@{#952609} --- chrome/browser/chrome_browser_main_linux.cc | 46 ++++++++++--------- chrome/browser/chrome_browser_main_linux.h | 4 +- .../net/system_network_context_manager.cc | 16 ------- .../headless_browser_main_parts_linux.cc | 33 +++++++++++++ .../headless_request_context_manager.cc | 22 ++------- services/network/network_context.cc | 5 -- services/network/network_service.cc | 23 ---------- services/network/network_service.h | 14 ------ services/network/public/mojom/BUILD.gn | 6 --- .../public/mojom/network_service.mojom | 33 ------------- .../browser/content_browser_client_impl.cc | 6 --- 11 files changed, 63 insertions(+), 145 deletions(-) diff --git a/chrome/browser/chrome_browser_main_linux.cc b/chrome/browser/chrome_browser_main_linux.cc index 0b7ef94ab0c99c..b7a5409b80438a 100644 --- a/chrome/browser/chrome_browser_main_linux.cc +++ b/chrome/browser/chrome_browser_main_linux.cc @@ -56,23 +56,23 @@ ChromeBrowserMainPartsLinux::ChromeBrowserMainPartsLinux( ChromeBrowserMainPartsLinux::~ChromeBrowserMainPartsLinux() { } -void ChromeBrowserMainPartsLinux::PreProfileInit() { -#if !BUILDFLAG(IS_CHROMEOS_ASH) - // Needs to be called after we have chrome::DIR_USER_DATA and - // g_browser_process. This happens in PreCreateThreads. - // base::GetLinuxDistro() will initialize its value if needed. - base::ThreadPool::PostTask( - FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, - base::BindOnce(base::IgnoreResult(&base::GetLinuxDistro))); -#endif +void ChromeBrowserMainPartsLinux::PostCreateMainMessageLoop() { +#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) + // No-op: Ash and Lacros Bluetooth DBusManager initialization depend on + // FeatureList, and is done elsewhere. +#else + bluez::BluezDBusManager::Initialize(nullptr /* system_bus */); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) #if !defined(OS_CHROMEOS) - // Set up crypt config. This should be kept in sync with the OSCrypt parts of - // SystemNetworkContextManager::OnNetworkServiceCreated. + // Set up crypt config. This needs to be done before anything starts the + // network service, as the raw encryption key needs to be shared with the + // network service for encrypted cookie storage. // Chrome OS does not need a crypt config as its user data directories are // already encrypted and none of the true encryption backends used by desktop // Linux are available on Chrome OS anyway. - std::unique_ptr config(new os_crypt::Config()); + std::unique_ptr config = + std::make_unique(); // Forward to os_crypt the flag to use a specific password store. config->store = parsed_command_line().GetSwitchValueASCII(switches::kPasswordStore); @@ -85,20 +85,22 @@ void ChromeBrowserMainPartsLinux::PreProfileInit() { parsed_command_line().HasSwitch(switches::kEnableEncryptionSelection); chrome::GetDefaultUserDataDirectory(&config->user_data_path); OSCrypt::SetConfig(std::move(config)); -#endif +#endif // !defined(OS_CHROMEOS) - ChromeBrowserMainPartsPosix::PreProfileInit(); + ChromeBrowserMainPartsPosix::PostCreateMainMessageLoop(); } -void ChromeBrowserMainPartsLinux::PostCreateMainMessageLoop() { -#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) - // No-op: Ash and Lacros Bluetooth DBusManager initialization depend on - // FeatureList, and is done elsewhere. -#else - bluez::BluezDBusManager::Initialize(nullptr /* system_bus */); -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS) +void ChromeBrowserMainPartsLinux::PreProfileInit() { +#if !BUILDFLAG(IS_CHROMEOS_ASH) + // Needs to be called after we have chrome::DIR_USER_DATA and + // g_browser_process. This happens in PreCreateThreads. + // base::GetLinuxDistro() will initialize its value if needed. + base::ThreadPool::PostTask( + FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, + base::BindOnce(base::IgnoreResult(&base::GetLinuxDistro))); +#endif - ChromeBrowserMainPartsPosix::PostCreateMainMessageLoop(); + ChromeBrowserMainPartsPosix::PreProfileInit(); } #if defined(USE_DBUS) && !defined(OS_CHROMEOS) diff --git a/chrome/browser/chrome_browser_main_linux.h b/chrome/browser/chrome_browser_main_linux.h index a8fcedf0cc2aea..c6d33b4a8964ba 100644 --- a/chrome/browser/chrome_browser_main_linux.h +++ b/chrome/browser/chrome_browser_main_linux.h @@ -20,9 +20,9 @@ class ChromeBrowserMainPartsLinux : public ChromeBrowserMainPartsPosix { ~ChromeBrowserMainPartsLinux() override; - // ChromeBrowserMainParts overrides. - void PreProfileInit() override; + // ChromeBrowserMainPartsPosix overrides. void PostCreateMainMessageLoop() override; + void PreProfileInit() override; #if defined(USE_DBUS) && !defined(OS_CHROMEOS) // Only needed for native Linux, to set up the low-memory-monitor-based memory // monitoring (which depends on D-Bus). diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc index 47d3ffa9328b5f..068164417df231 100644 --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc @@ -573,27 +573,11 @@ void SystemNetworkContextManager::OnNetworkServiceCreated( // NetworkContext is created, but before anything has the chance to use it. stub_resolver_config_reader_.UpdateNetworkService(true /* record_metrics */); -#if defined(OS_LINUX) - const base::CommandLine& command_line = - *base::CommandLine::ForCurrentProcess(); - - // Set up crypt config. This should be kept in sync with the OSCrypt parts of - // ChromeBrowserMainPartsLinux::PreProfileInit. - network::mojom::CryptConfigPtr config = network::mojom::CryptConfig::New(); - config->store = command_line.GetSwitchValueASCII(switches::kPasswordStore); - config->product_name = l10n_util::GetStringUTF8(IDS_PRODUCT_NAME); - config->should_use_preference = - command_line.HasSwitch(switches::kEnableEncryptionSelection); - chrome::GetDefaultUserDataDirectory(&config->user_data_path); - network_service->SetCryptConfig(std::move(config)); -#endif -#if defined(OS_WIN) || defined(OS_MAC) // The OSCrypt keys are process bound, so if network service is out of // process, send it the required key. if (content::IsOutOfProcessNetworkService()) { network_service->SetEncryptionKey(OSCrypt::GetRawEncryptionKey()); } -#endif // Asynchronously reapply the most recently received CRLSet (if any). component_updater::CRLSetPolicy::ReconfigureAfterNetworkRestart(); diff --git a/headless/lib/browser/headless_browser_main_parts_linux.cc b/headless/lib/browser/headless_browser_main_parts_linux.cc index eddb96ef148d79..46bd5262d17868 100644 --- a/headless/lib/browser/headless_browser_main_parts_linux.cc +++ b/headless/lib/browser/headless_browser_main_parts_linux.cc @@ -8,12 +8,45 @@ #include "build/chromeos_buildflags.h" #include "device/bluetooth/dbus/bluez_dbus_manager.h" +#if !defined(OS_CHROMEOS) +#include "base/command_line.h" +#include "components/os_crypt/key_storage_config_linux.h" +#include "components/os_crypt/os_crypt.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "headless/app/headless_shell_switches.h" +#endif + namespace headless { +#if !defined(OS_CHROMEOS) +constexpr char kProductName[] = "HeadlessChrome"; +#endif + void HeadlessBrowserMainParts::PostCreateMainMessageLoop() { #if defined(USE_DBUS) && !BUILDFLAG(IS_CHROMEOS_ASH) bluez::BluezDBusManager::Initialize(/*system_bus=*/nullptr); #endif + +#if !defined(OS_CHROMEOS) + // Set up crypt config. This needs to be done before anything starts the + // network service, as the raw encryption key needs to be shared with the + // network service for encrypted cookie storage. + std::unique_ptr config = + std::make_unique(); + // Forward to os_crypt the flag to use a specific password store. + config->store = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kPasswordStore); + // Use a default product name + config->product_name = kProductName; + // OSCrypt may target keyring, which requires calls from the main thread. + config->main_thread_runner = content::GetUIThreadTaskRunner({}); + // OSCrypt can be disabled in a special settings file, but headless doesn't + // need to support that. + config->should_use_preference = false; + config->user_data_path = base::FilePath(); + OSCrypt::SetConfig(std::move(config)); +#endif // !defined(OS_CHROMEOS) } } // namespace headless diff --git a/headless/lib/browser/headless_request_context_manager.cc b/headless/lib/browser/headless_request_context_manager.cc index 7cb79279784e59..7a3307be2b5135 100644 --- a/headless/lib/browser/headless_request_context_manager.cc +++ b/headless/lib/browser/headless_request_context_manager.cc @@ -33,10 +33,6 @@ namespace headless { namespace { -#if defined(OS_LINUX) -constexpr char kProductName[] = "HeadlessChrome"; -#endif - net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { static net::NetworkTrafficAnnotationTag traffic_annotation = net::DefineNetworkTrafficAnnotation("proxy_config_headless", R"( @@ -63,26 +59,16 @@ net::NetworkTrafficAnnotationTag GetProxyConfigTrafficAnnotationTag() { return traffic_annotation; } -void SetCryptConfigOnce(const base::FilePath& user_data_path) { +void SetCryptKeyOnce(const base::FilePath& user_data_path) { static bool done_once = false; if (done_once) return; done_once = true; -#if defined(OS_LINUX) - ::network::mojom::CryptConfigPtr config = - ::network::mojom::CryptConfig::New(); - config->store = base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kPasswordStore); - config->product_name = kProductName; - config->should_use_preference = false; - config->user_data_path = user_data_path; - content::GetNetworkService()->SetCryptConfig(std::move(config)); -#elif defined(OS_WIN) && defined(HEADLESS_USE_PREFS) +#if (defined(OS_WIN) || defined(OS_LINUX)) && defined(HEADLESS_USE_PREFS) // The OSCrypt keys are process bound, so if network service is out of // process, send it the required key if it is available. - if (content::IsOutOfProcessNetworkService() && - OSCrypt::IsEncryptionAvailable()) { + if (content::IsOutOfProcessNetworkService()) { content::GetNetworkService()->SetEncryptionKey( OSCrypt::GetRawEncryptionKey()); } @@ -239,7 +225,7 @@ HeadlessRequestContextManager::HeadlessRequestContextManager( } } - SetCryptConfigOnce(user_data_path_); + SetCryptKeyOnce(user_data_path_); } HeadlessRequestContextManager::~HeadlessRequestContextManager() { diff --git a/services/network/network_context.cc b/services/network/network_context.cc index f8e93f5926b60e..1840b5fd647a87 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc @@ -2544,11 +2544,6 @@ NetworkContext::MakeSessionCleanupCookieStore() const { net::CookieCryptoDelegate* crypto_delegate = nullptr; if (params_->enable_encrypted_cookies) { -#if defined(OS_LINUX) && !BUILDFLAG(IS_CHROMECAST) - DCHECK(network_service_->os_crypt_config_set()) - << "NetworkService::SetCryptConfig must be called before creating a " - "NetworkContext with encrypted cookies."; -#endif crypto_delegate = cookie_config::GetCookieCryptoDelegate(); } diff --git a/services/network/network_service.cc b/services/network/network_service.cc index e7dc472da7d77b..ee8ba841b5bcc9 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc @@ -381,10 +381,6 @@ NetworkService::~NetworkService() { trace_net_log_observer_.StopWatchForTraceStart(); } -void NetworkService::set_os_crypt_is_configured() { - os_crypt_config_set_ = true; -} - std::unique_ptr NetworkService::Create( mojo::PendingReceiver receiver) { return std::make_unique(nullptr, std::move(receiver)); @@ -617,28 +613,9 @@ void NetworkService::OnCertDBChanged() { net::CertDatabase::GetInstance()->NotifyObserversCertDBChanged(); } -#if defined(OS_LINUX) -void NetworkService::SetCryptConfig(mojom::CryptConfigPtr crypt_config) { -#if !BUILDFLAG(IS_CHROMECAST) - DCHECK(!os_crypt_config_set_); - auto config = std::make_unique(); - config->store = crypt_config->store; - config->product_name = crypt_config->product_name; - config->application_name = crypt_config->application_name; - config->main_thread_runner = base::ThreadTaskRunnerHandle::Get(); - config->should_use_preference = crypt_config->should_use_preference; - config->user_data_path = crypt_config->user_data_path; - OSCrypt::SetConfig(std::move(config)); - os_crypt_config_set_ = true; -#endif -} -#endif - -#if defined(OS_WIN) || defined(OS_MAC) void NetworkService::SetEncryptionKey(const std::string& encryption_key) { OSCrypt::SetRawEncryptionKey(encryption_key); } -#endif void NetworkService::AddAllowedRequestInitiatorForPlugin( int32_t process_id, diff --git a/services/network/network_service.h b/services/network/network_service.h index 3dcea20355d677..91fae509fc6eba 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h @@ -87,11 +87,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService ~NetworkService() override; - // Call to inform the NetworkService that OSCrypt::SetConfig() has already - // been invoked, so OSCrypt::SetConfig() does not need to be called before - // encrypted storage can be used. - void set_os_crypt_is_configured(); - // Allows late binding if the mojo receiver wasn't specified in the // constructor. void Bind(mojo::PendingReceiver receiver); @@ -164,12 +159,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService base::span crl_set, mojom::NetworkService::UpdateCRLSetCallback callback) override; void OnCertDBChanged() override; -#if defined(OS_LINUX) - void SetCryptConfig(mojom::CryptConfigPtr crypt_config) override; -#endif -#if defined(OS_WIN) || defined(OS_MAC) void SetEncryptionKey(const std::string& encryption_key) override; -#endif void AddAllowedRequestInitiatorForPlugin( int32_t process_id, const url::Origin& allowed_request_initiator) override; @@ -251,8 +241,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService FirstPartySets* first_party_sets() const { return first_party_sets_.get(); } - bool os_crypt_config_set() const { return os_crypt_config_set_; } - void set_host_resolver_factory_for_testing( std::unique_ptr host_resolver_factory) { host_resolver_factory_ = std::move(host_resolver_factory); @@ -369,8 +357,6 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkService bool quic_disabled_ = false; - bool os_crypt_config_set_ = false; - std::unique_ptr crl_set_distributor_; // Whether new NetworkContexts will be configured to partition their diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn index c62cabab99fceb..62893611492e44 100644 --- a/services/network/public/mojom/BUILD.gn +++ b/services/network/public/mojom/BUILD.gn @@ -954,12 +954,6 @@ mojom("mojom") { } } - # This is only needed on desktop linux, but the defines make this difficult - # because IS_CHROMECAST is not available in build/build_config.h. - if (is_linux) { - enabled_features += [ "needs_crypt_config" ] - } - # Typemaps which apply to both Blink and non-Blink bindings. shared_cpp_typemaps = [] diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index 5d44e018c290f0..032cf2cb19236f 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom @@ -96,29 +96,6 @@ struct HttpAuthDynamicParams { bool basic_over_http_enabled = true; }; -// Values for configuring OSCrypt. -[EnableIf=needs_crypt_config] -struct CryptConfig { - // Force OSCrypt to use a specific linux password store. - string store; - - // The product name to use for permission prompts. - string product_name; - - // The application name to store the crypto key against. For Chromium/Chrome - // builds leave this unset and it will default correctly. This config option - // is for embedders to provide their application name in place of "Chromium". - // Only used when the allow_runtime_configurable_key_storage feature is - // enabled - string application_name; - - // Controls whether preference on using or ignoring backends is used. - bool should_use_preference; - - // Preferences are stored in a separate file in the user data directory. - mojo_base.mojom.FilePath user_data_path; -}; - // Represents the value of a single environment variable. struct EnvironmentVariable { string name; @@ -286,17 +263,7 @@ interface NetworkService { // Notification that the certificate database has been modified. OnCertDBChanged(); - // Sets up OSCrypt for the network service process. Must be called before - // encrypted cookies can be read or set. - [EnableIf=needs_crypt_config] - SetCryptConfig(CryptConfig crypt_config); - - // Send the encryption key to the network service to use for AES encryption. - [EnableIf=is_mac] - SetEncryptionKey(mojo_base.mojom.ByteString encryption_key); - // Send the encryption key to the network service to use for AES encryption. - [EnableIf=is_win] SetEncryptionKey(mojo_base.mojom.ByteString encryption_key); // Notifies |request_initiator_origin_lock| enforcement code that |process_id| diff --git a/weblayer/browser/content_browser_client_impl.cc b/weblayer/browser/content_browser_client_impl.cc index 5ed1c10ec0aa73..60bcc26cb0532c 100644 --- a/weblayer/browser/content_browser_client_impl.cc +++ b/weblayer/browser/content_browser_client_impl.cc @@ -489,12 +489,6 @@ void ContentBrowserClientImpl::OnNetworkServiceCreated( if (!SystemNetworkContextManager::HasInstance()) SystemNetworkContextManager::CreateInstance( embedder_support::GetUserAgent()); -// TODO(crbug.com/1052397): Revisit once build flag switch of lacros-chrome is -// complete. -#if defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) - network::mojom::CryptConfigPtr config = network::mojom::CryptConfig::New(); - content::GetNetworkService()->SetCryptConfig(std::move(config)); -#endif SystemNetworkContextManager::GetInstance()->OnNetworkServiceCreated( network_service); } From be20d97fb289d7498ee542ca5242a7f03697b3f7 Mon Sep 17 00:00:00 2001 From: Theo Johnson-Kanu Date: Fri, 17 Dec 2021 01:03:13 +0000 Subject: [PATCH 30/71] [CrOS Bluetooth] Show error when connection fails Before this CL, if device details changes while PageState in device details subpage is CONNECTION_FAILED, it gets reset. This CL ensures the PageState is only reset when the new device connection state value is not kNotConnected Bug: b/210364495 Change-Id: I5548c2c06a64bb285e426bf503997581db30070f Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3342742 Reviewed-by: Gordon Seto Commit-Queue: Theo Johnson-kanu Cr-Commit-Position: refs/heads/main@{#952610} --- .../os_bluetooth_device_detail_subpage.js | 7 +++ ...s_bluetooth_device_detail_subpage_tests.js | 63 +++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js index 17e5ef5d7cb664..12a5adb4881b00 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js @@ -119,6 +119,7 @@ class SettingsBluetoothDeviceDetailSubpageElement extends currentRouteChanged(route) { if (route !== routes.BLUETOOTH_DEVICE_DETAIL) { this.deviceId_ = ''; + this.pageState_ = PageState.DISCONNECTED; return; } @@ -227,6 +228,12 @@ class SettingsBluetoothDeviceDetailSubpageElement extends } this.parentNode.pageTitle = getDeviceName(this.device_); + if (this.pageState_ === PageState.CONNECTION_FAILED && + this.device_.deviceProperties.connectionState === + mojom.DeviceConnectionState.kNotConnected) { + return; + } + switch (this.device_.deviceProperties.connectionState) { case mojom.DeviceConnectionState.kConnected: this.pageState_ = PageState.CONNECTED; diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js index 23f7ed7255fedd..7417e269098c91 100644 --- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js +++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js @@ -13,6 +13,7 @@ // #import {assertTrue, assertEquals, assertFalse} from '../../../chai_assert.js'; // #import {createDefaultBluetoothDevice, FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js'; // #import {setBluetoothConfigForTesting} from 'chrome://resources/cr_components/chromeos/bluetooth/cros_bluetooth_config.js'; +// #import {waitAfterNextRender} from 'chrome://test/test_util.js'; // clang-format on suite('OsBluetoothDeviceDetailPageTest', function() { @@ -67,6 +68,55 @@ suite('OsBluetoothDeviceDetailPageTest', function() { settings.Router.getInstance().resetRouteForTesting(); }); + + test( + 'Error text is not shown after navigating away from page', + async function() { + init(); + bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); + + const getBluetoothConnectDisconnectBtn = () => + bluetoothDeviceDetailPage.$$('#connectDisconnectBtn'); + const getConnectionFailedText = () => + bluetoothDeviceDetailPage.$$('#connectionFailed'); + + const id = '12345/6789&'; + const device1 = createDefaultBluetoothDevice( + id, + /*publicName=*/ 'BeatsX', + /*connectionState=*/ + chromeos.bluetoothConfig.mojom.DeviceConnectionState.kNotConnected, + /*opt_nickname=*/ 'device1', + /*opt_audioCapability=*/ + mojom.AudioOutputCapability.kCapableOfAudioOutput, + /*opt_deviceType=*/ mojom.DeviceType.kMouse); + + device1.deviceProperties.batteryInfo = { + defaultProperties: {batteryPercentage: 90} + }; + + bluetoothConfig.appendToPairedDeviceList([device1]); + await flushAsync(); + + const params = new URLSearchParams(); + params.append('id', id); + settings.Router.getInstance().navigateTo( + settings.routes.BLUETOOTH_DEVICE_DETAIL, params); + + await flushAsync(); + + // Try to connect. + getBluetoothConnectDisconnectBtn().click(); + await flushAsync(); + bluetoothConfig.completeConnect(/*success=*/ false); + await flushAsync(); + assertTrue(!!getConnectionFailedText()); + + settings.Router.getInstance().navigateToPreviousRoute(); + await test_util.waitAfterNextRender(bluetoothDeviceDetailPage); + assertFalse(!!getConnectionFailedText()); + }); + test('Managed by enterprise icon', async function() { init(); bluetoothConfig.setBluetoothEnabledState(/*enabled=*/ true); @@ -452,6 +502,19 @@ suite('OsBluetoothDeviceDetailPageTest', function() { // Connection fails. await flushAsync(); + // Disconnected with error. + assertUIState( + /*isShowingConnectionFailed=*/ true, + /*isConnectDisconnectBtnDisabled=*/ false, + /*bluetoothStateText=*/ + bluetoothDeviceDetailPage.i18n('bluetoothDeviceDetailDisconnected'), + /*connectDisconnectBtnText=*/ + bluetoothDeviceDetailPage.i18n('bluetoothConnect')); + + // Change device while connection failed text is shown. + bluetoothConfig.appendToPairedDeviceList([Object.assign({}, device1)]); + await flushAsync(); + // Disconnected with error. assertUIState( /*isShowingConnectionFailed=*/ true, From 1ce7af29dda3e55221b2b47a4e70135986e0c4dc Mon Sep 17 00:00:00 2001 From: chromium-autoroll Date: Fri, 17 Dec 2021 01:04:03 +0000 Subject: [PATCH 31/71] Roll aapt2 from GlCdqxHxl... to ZHiDoiurx... If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/aapt2-chromium Please CC clank-library-failures@google.com,mheikal@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Chromium: https://bugs.chromium.org/p/chromium/issues/entry To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chrome.try:android-internal-binary-size;luci.chrome.try:android-internal-rel Tbr: clank-library-failures@google.com,mheikal@google.com Change-Id: I3a60e2e2ad4ca400b0bae80cd80df95cb1d34490 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345613 Commit-Queue: chromium-autoroll Bot-Commit: chromium-autoroll Cr-Commit-Position: refs/heads/main@{#952611} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 83384161595d33..9ae9f0504721f8 100644 --- a/DEPS +++ b/DEPS @@ -838,7 +838,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_build_tools/aapt2', - 'version': 'GlCdqxHxlg-8YkDGgj5cie-6COsEAZga9jyq-LAYxY4C', + 'version': 'ZHiDoiurxMLwajQq_CwBH9zaDW5xwYWYGbedxIslTm8C', }, ], 'condition': 'checkout_android', From 5f4ab6310d2b3e26ff9033215d9e2273bdc3c314 Mon Sep 17 00:00:00 2001 From: Tyler Garrett Date: Fri, 17 Dec 2021 01:05:06 +0000 Subject: [PATCH 32/71] Reporting: add vPro wifi telemetry This change adds the sampling for vPro wifi telemetry. It probes the kNetworkInterface category from the health daemon using the healthd metrics sampler. Bug: b:201060765 Change-Id: I4ab80e3800b0dd6b8f45036bb747bc6e04c97d30 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3340096 Reviewed-by: Leonid Baraz Commit-Queue: Tyler Garrett Cr-Commit-Position: refs/heads/main@{#952612} --- .../cros_healthd_metric_sampler.cc | 89 ++++++++++++++++- .../cros_healthd_metric_sampler_unittest.cc | 98 +++++++++++++++++++ 2 files changed, 183 insertions(+), 4 deletions(-) diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc index 59033e63938b8f..077246194c2f48 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler.cc @@ -255,15 +255,91 @@ void HandleMemoryResult(MetricCallback callback, } } +void HandleNetworkResult(MetricCallback callback, + CrosHealthdMetricSampler::MetricType metric_type, + MetricData metric_data, + cros_healthd::TelemetryInfoPtr result) { + const auto& network_result = result->network_interface_result; + if (network_result.is_null()) { + std::move(callback).Run(metric_data); + return; + } + + switch (network_result->which()) { + case cros_healthd::NetworkInterfaceResult::Tag::ERROR: { + DVLOG(1) << "cros_healthd: Error getting network result: " + << network_result->get_error()->msg; + break; + } + + case cros_healthd::NetworkInterfaceResult::Tag::NETWORK_INTERFACE_INFO: { + for (const auto& network_info : + network_result->get_network_interface_info()) { + // Handle wireless interface telemetry + if (network_info->is_wireless_interface_info() && + metric_type == CrosHealthdMetricSampler::MetricType::kTelemetry) { + auto* network_telemetry_list = metric_data.mutable_telemetry_data() + ->mutable_networks_telemetry(); + ::reporting::NetworkTelemetry* network_telemetry_out; + + // Find if wireless telemetry already exists in metric data. + for (int i = 0; i < network_telemetry_list->network_telemetry_size(); + i++) { + if (network_telemetry_list->network_telemetry(i).type() == + ::reporting::NetworkType::WIFI) { + network_telemetry_out = + network_telemetry_list->mutable_network_telemetry(i); + } + } + if (!network_telemetry_out) { + network_telemetry_out = + network_telemetry_list->add_network_telemetry(); + } + + // Set data. + auto* const interface_telemetry_out = + network_telemetry_out->add_network_interface_telemetry(); + auto* const wireless_telemetry_out = + interface_telemetry_out->mutable_wireless_interface(); + const auto& wireless_info = + network_info->get_wireless_interface_info(); + + interface_telemetry_out->set_interface_name( + wireless_info->interface_name); + wireless_telemetry_out->set_power_management_enabled( + wireless_info->power_management_on); + + if (wireless_info->wireless_link_info) { + const auto& wireless_link_info = wireless_info->wireless_link_info; + wireless_telemetry_out->set_access_point_address( + wireless_link_info->access_point_address_str); + wireless_telemetry_out->set_tx_bit_rate_mbps( + wireless_link_info->tx_bit_rate_mbps); + wireless_telemetry_out->set_rx_bit_rate_mbps( + wireless_link_info->rx_bit_rate_mbps); + wireless_telemetry_out->set_tx_power_dbm( + wireless_link_info->tx_power_dBm); + wireless_telemetry_out->set_encryption_on( + wireless_link_info->encyption_on); + wireless_telemetry_out->set_link_quality( + wireless_link_info->link_quality); + wireless_telemetry_out->set_signal_level_dbm( + wireless_link_info->signal_level_dBm); + } + } + } + } + } + + std::move(callback).Run(std::move(metric_data)); +} + void OnHealthdInfoReceived(MetricCallback callback, cros_healthd::ProbeCategoryEnum probe_category, CrosHealthdMetricSampler::MetricType metric_type, MetricData metric_data, cros_healthd::TelemetryInfoPtr result) { - if (!result) { - DVLOG(1) << "cros_healthd: null telemetry result"; - return; - } + DCHECK(result); switch (probe_category) { case cros_healthd::ProbeCategoryEnum::kAudio: { @@ -286,6 +362,11 @@ void OnHealthdInfoReceived(MetricCallback callback, std::move(metric_data), std::move(result)); break; } + case cros_healthd::ProbeCategoryEnum::kNetworkInterface: { + HandleNetworkResult(std::move(callback), metric_type, + std::move(metric_data), std::move(result)); + break; + } default: { NOTREACHED(); return; diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc index 4cd6cd500e872d..e970c3510eb5fe 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_metric_sampler_unittest.cc @@ -35,9 +35,21 @@ struct MemoryEncryptionTestCase { namespace reporting { namespace test { +// Memory constants. constexpr uint32_t kTmeMaxKeys = 2; constexpr uint32_t kTmeKeysLength = 4; +// Wifi constants. +constexpr char kInterfaceName[] = "interface_name"; +constexpr char kAccessPointAddress[] = "access_point"; +constexpr bool kPowerManagementEnabled = true; +constexpr bool kEncryptionOn = true; +constexpr uint32_t kTxBitRateMbps = 8; +constexpr uint32_t kRxBitRateMbps = 4; +constexpr uint32_t kTxPowerDbm = 2; +constexpr uint32_t kLinkQuality = 1; +constexpr int kSignalLevelDbm = 10; + cros_healthd::KeylockerInfoPtr CreateKeylockerInfo(bool configured) { return cros_healthd::KeylockerInfo::New(configured); } @@ -75,6 +87,36 @@ cros_healthd::TelemetryInfoPtr CreateBusResult( return telemetry_info; } +cros_healthd::TelemetryInfoPtr CreateWifiResult( + const std::string& interface_name, + bool power_management_enabled, + const std::string& access_point_address, + uint32_t tx_bit_rate_mbps, + uint32_t rx_bit_rate_mbps, + uint32_t tx_power_dbm, + bool encryption_on, + uint32_t link_quality, + int signal_level_dbm) { + auto telemetry_info = cros_healthd::TelemetryInfo::New(); + std::vector network_interfaces; + + auto wireless_link_info = cros_healthd::WirelessLinkInfo::New( + access_point_address, tx_bit_rate_mbps, rx_bit_rate_mbps, tx_power_dbm, + encryption_on, link_quality, signal_level_dbm); + auto wireless_interface_info = cros_healthd::WirelessInterfaceInfo::New( + interface_name, power_management_enabled, std::move(wireless_link_info)); + network_interfaces.push_back( + cros_healthd::NetworkInterfaceInfo::NewWirelessInterfaceInfo( + std::move(wireless_interface_info))); + auto network_interface_result = + cros_healthd::NetworkInterfaceResult::NewNetworkInterfaceInfo( + std::move(network_interfaces)); + + telemetry_info->network_interface_result = + std::move(network_interface_result); + return telemetry_info; +} + cros_healthd::AudioInfoPtr CreateAudioInfo( bool output_mute, bool input_mute, @@ -229,6 +271,51 @@ TEST_F(CrosHealthdMetricSamplerTest, SetMetricData) { ::reporting::MEMORY_ENCRYPTION_STATE_DISABLED); } +TEST_F(CrosHealthdMetricSamplerTest, TestWirelessTelemetry) { + // Provide some partially set network telemetry to verify the sampler + // properly builds upon it. + MetricData metric_data; + auto* const network_telemetry_out = metric_data.mutable_telemetry_data() + ->mutable_networks_telemetry() + ->add_network_telemetry(); + network_telemetry_out->set_type(::reporting::NetworkType::WIFI); + network_telemetry_out->set_signal_strength(1); + MetricData result = CollectData( + CreateWifiResult(kInterfaceName, kPowerManagementEnabled, + kAccessPointAddress, kTxBitRateMbps, kRxBitRateMbps, + kTxPowerDbm, kEncryptionOn, kLinkQuality, + kSignalLevelDbm), + cros_healthd::ProbeCategoryEnum::kNetworkInterface, + CrosHealthdMetricSampler::MetricType::kTelemetry, std::move(metric_data)); + + ASSERT_TRUE(result.has_telemetry_data()); + ASSERT_TRUE(result.telemetry_data().has_networks_telemetry()); + ASSERT_EQ( + result.telemetry_data().networks_telemetry().network_telemetry_size(), 1); + + const auto& network_telemetry = + result.telemetry_data().networks_telemetry().network_telemetry(0); + EXPECT_EQ(network_telemetry.type(), ::reporting::NetworkType::WIFI); + EXPECT_EQ(network_telemetry.signal_strength(), 1); + ASSERT_EQ(network_telemetry.network_interface_telemetry_size(), 1); + + const auto& network_interface = + network_telemetry.network_interface_telemetry(0); + EXPECT_EQ(network_interface.interface_name(), kInterfaceName); + ASSERT_TRUE(network_interface.has_wireless_interface()); + + const auto& wireless_interface = network_interface.wireless_interface(); + EXPECT_EQ(wireless_interface.power_management_enabled(), + kPowerManagementEnabled); + EXPECT_EQ(wireless_interface.access_point_address(), kAccessPointAddress); + EXPECT_EQ(wireless_interface.tx_bit_rate_mbps(), kTxBitRateMbps); + EXPECT_EQ(wireless_interface.rx_bit_rate_mbps(), kRxBitRateMbps); + EXPECT_EQ(wireless_interface.tx_power_dbm(), kTxPowerDbm); + EXPECT_EQ(wireless_interface.encryption_on(), kEncryptionOn); + EXPECT_EQ(wireless_interface.link_quality(), kLinkQuality); + EXPECT_EQ(wireless_interface.signal_level_dbm(), kSignalLevelDbm); +} + TEST_F(CrosHealthdMetricSamplerTest, TestKeylockerConfigured) { MetricData result = CollectData(CreateCpuResult(CreateKeylockerInfo(true)), @@ -295,6 +382,17 @@ TEST_F(CrosHealthdMetricSamplerTest, TestMojomError) { std::move(telemetry_info), cros_healthd::ProbeCategoryEnum::kAudio, CrosHealthdMetricSampler::MetricType::kTelemetry); ASSERT_FALSE(audio_data.has_telemetry_data()); + + telemetry_info = cros_healthd::TelemetryInfo::New(); + telemetry_info->network_interface_result = + cros_healthd::NetworkInterfaceResult::NewError( + cros_healthd::ProbeError::New(cros_healthd::ErrorType::kFileReadError, + "")); + const auto& network_data = + CollectError(std::move(telemetry_info), + cros_healthd::ProbeCategoryEnum::kNetworkInterface, + CrosHealthdMetricSampler::MetricType::kTelemetry); + ASSERT_FALSE(network_data.has_telemetry_data()); } TEST_F(CrosHealthdMetricSamplerTest, TestAudioNormalTest) { From 66ff126e39334b72ec6f23b6d28a60e7efbbc019 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 17 Dec 2021 01:11:35 +0000 Subject: [PATCH 33/71] clang: Statically link against hermetic libxml2 on non-Windows too Advantages: - Win and non-Win binaries use the same version of libxml2, so behavior is more similar - lld-link depends on fewer system libraries Bug: 872740 Change-Id: I14d972ba26a4ad45514ee6415226a75ea325b0c9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3330960 Reviewed-by: Hans Wennborg Commit-Queue: Nico Weber Cr-Commit-Position: refs/heads/main@{#952613} --- tools/clang/scripts/build.py | 38 +++++++++++++++++++---------------- tools/clang/scripts/update.py | 2 +- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/tools/clang/scripts/build.py b/tools/clang/scripts/build.py index 3479e720ce1af2..a4cba919cc0315 100755 --- a/tools/clang/scripts/build.py +++ b/tools/clang/scripts/build.py @@ -289,14 +289,11 @@ def BuildLibXml2(): # $ gsutil cp -n -a public-read libxml2-$VER.tar.gz \ # gs://chromium-browser-clang/tools - # TODO(thakis): Use this locally built statically linked libxml2 on all - # platforms. fewer dynamic deps, and guaranteed(ish) to have same behavior - # across platforms. - - libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'libxml2-v2.9.12') + libxml2_version = 'libxml2-v2.9.12' + libxml2_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, libxml2_version) if os.path.exists(libxml2_dir): RmTree(libxml2_dir) - zip_name = 'libxml2-v2.9.12.tar.gz' + zip_name = libxml2_version + '.tar.gz' DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR) os.chdir(libxml2_dir) os.mkdir('build') @@ -306,12 +303,18 @@ def BuildLibXml2(): # Disable everything except WITH_TREE and WITH_OUTPUT, both needed by LLVM's # WindowsManifestMerger. + # Also enable WITH_THREADS, else libxml doesn't compile on Linux. RunCommand( [ 'cmake', '-GNinja', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_INSTALL_PREFIX=install', + # The mac_arm bot builds a clang arm binary, but currently on an intel + # host. If we ever move it to run on an arm mac, this can go. We + # could pass this only if args.build_mac_arm, but libxml is small, so + # might as well build it universal always for a few years. + '-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64', '-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded', # /MT to match LLVM. '-DBUILD_SHARED_LIBS=OFF', '-DLIBXML2_WITH_C14N=OFF', @@ -340,7 +343,7 @@ def BuildLibXml2(): '-DLIBXML2_WITH_SCHEMAS=OFF', '-DLIBXML2_WITH_SCHEMATRON=OFF', '-DLIBXML2_WITH_TESTS=OFF', - '-DLIBXML2_WITH_THREADS=OFF', + '-DLIBXML2_WITH_THREADS=ON', '-DLIBXML2_WITH_THREAD_ALLOC=OFF', '-DLIBXML2_WITH_TREE=ON', '-DLIBXML2_WITH_VALID=OFF', @@ -355,7 +358,10 @@ def BuildLibXml2(): RunCommand(['ninja', 'install'], msvc_arch='x64') libxml2_include_dir = os.path.join(libxml2_install_dir, 'include', 'libxml2') - libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2s.lib') + if sys.platform == 'win32': + libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2s.lib') + else: + libxml2_lib = os.path.join(libxml2_install_dir, 'lib', 'libxml2.a') extra_cmake_flags = [ '-DLLVM_ENABLE_LIBXML2=FORCE_ON', '-DLIBXML2_INCLUDE_DIR=' + libxml2_include_dir.replace('\\', '/'), @@ -704,19 +710,17 @@ def main(): cxxflags.append('-I' + zlib_dir) ldflags.append('-LIBPATH:' + zlib_dir) - # Statically link libxml2 to make lld-link not require mt.exe - libxml_cmake_args, libxml_cflags = BuildLibXml2() - base_cmake_args += libxml_cmake_args - cflags += libxml_cflags - cxxflags += libxml_cflags - # Use rpmalloc. For faster ThinLTO linking. rpmalloc_dir = DownloadRPMalloc() base_cmake_args.append('-DLLVM_INTEGRATED_CRT_ALLOC=' + rpmalloc_dir) - if sys.platform != 'win32': - # libxml2 is required by the Win manifest merging tool used in cross-builds. - base_cmake_args.append('-DLLVM_ENABLE_LIBXML2=FORCE_ON') + # Statically link libxml2 to make lld-link not require mt.exe on Windows, + # and to make sure lld-link output on other platforms is identical to + # lld-link on Windows (for cross-builds). + libxml_cmake_args, libxml_cflags = BuildLibXml2() + base_cmake_args += libxml_cmake_args + cflags += libxml_cflags + cxxflags += libxml_cflags if args.bootstrap: print('Building bootstrap compiler') diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py index afc5a5d337b93d..b49babbfd5888f 100755 --- a/tools/clang/scripts/update.py +++ b/tools/clang/scripts/update.py @@ -35,7 +35,7 @@ # Reverting problematic clang rolls is safe, though. # This is the output of `git describe` and is usable as a commit-ish. CLANG_REVISION = 'llvmorg-14-init-12246-g7787a8f1' -CLANG_SUB_REVISION = 1 +CLANG_SUB_REVISION = 2 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION) RELEASE_VERSION = '14.0.0' From 108dc3c727f612fb20a7466196c92dce17057394 Mon Sep 17 00:00:00 2001 From: Trevor Perrier Date: Fri, 17 Dec 2021 01:22:55 +0000 Subject: [PATCH 34/71] [LanguageSettings] Don't show SRP if Talkback enabled Bug: 1280375 Change-Id: Idd9f7a63673d233862fd66d091c814e208ecf4a4 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3345547 Reviewed-by: Megan Jablonski Reviewed-by: Max Curran Commit-Queue: Trevor Perrier Cr-Commit-Position: refs/heads/main@{#952614} --- chrome/browser/language/android/BUILD.gn | 1 + .../language/AppLanguagePromoDialog.java | 30 ++++++++++++------- .../metadata/language/histograms.xml | 15 ++++++++++ 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/chrome/browser/language/android/BUILD.gn b/chrome/browser/language/android/BUILD.gn index e9ced467e3e60f..6811ae51b78bd1 100644 --- a/chrome/browser/language/android/BUILD.gn +++ b/chrome/browser/language/android/BUILD.gn @@ -51,6 +51,7 @@ android_library("java") { "//chrome/browser/settings:java", "//chrome/browser/tab:java", "//chrome/browser/ui/messages/android:java", + "//chrome/browser/util:java", "//components/browser_ui/settings/android:java", "//components/browser_ui/styles/android:java", "//components/browser_ui/widget/android:java", diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java index cc4809c4eafdd3..b8da7e249b7183 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java @@ -27,6 +27,7 @@ import org.chromium.chrome.browser.language.settings.LanguageItem; import org.chromium.chrome.browser.language.settings.LanguagesManager; import org.chromium.chrome.browser.translate.TranslateBridge; +import org.chromium.chrome.browser.util.ChromeAccessibilityUtil; import org.chromium.components.language.AndroidLanguageMetricsBridge; import org.chromium.components.language.GeoLanguageProviderBridge; import org.chromium.net.NetworkChangeNotifier; @@ -504,21 +505,22 @@ public static boolean maybeShowPrompt(Activity activity, * @return Whether the app language prompt should be shown or not. */ private static boolean shouldShowPrompt() { - boolean isOnline = NetworkChangeNotifier.isOnline(); - // This switch is only used for testing so it is ok to override all other checks. - if (ChromeFeatureList.isEnabled(ChromeFeatureList.FORCE_APP_LANGUAGE_PROMPT)) { - // Even if feature is set don't show prompt if offline for testing. - recordOnlineStatus(isOnline); - return isOnline; + // Skip feature and preference checks if forced on for testing. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.FORCE_APP_LANGUAGE_PROMPT)) { + // Don't show the prompt if not enabled. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT)) return false; + // Don't show the prompt if it has already been shown. + if (TranslateBridge.getAppLanguagePromptShown()) return false; } - // Don't show the prompt if not enabled or already shown. - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT)) return false; - if (TranslateBridge.getAppLanguagePromptShown()) return false; + boolean isAccessibilityEnabled = ChromeAccessibilityUtil.get().isAccessibilityEnabled(); + recordIsAccessibilityEnabled(isAccessibilityEnabled); - // Don't show the prompt if offline since a language pack download will fail. + boolean isOnline = NetworkChangeNotifier.isOnline(); recordOnlineStatus(isOnline); - return isOnline; + + // Only show the prompt if online and accessibility features are not enabled. + return isOnline && !isAccessibilityEnabled; } /** @@ -552,6 +554,12 @@ private static void recordOnlineStatus(boolean isOnline) { "LanguageSettings.AppLanguagePrompt.IsOnline", isOnline); } + private static void recordIsAccessibilityEnabled(boolean isAccessibilityEnabled) { + RecordHistogram.recordBooleanHistogram( + "LanguageSettings.AppLanguagePrompt.IsAccessibilityEnabled", + isAccessibilityEnabled); + } + private static void recordOpenDuration(String type, long displayTime) { RecordHistogram.recordLongTimesHistogram100( "LanguageSettings.AppLanguagePrompt.OpenDuration." + type, displayTime); diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml index 4efd25cf297197..4a4a222e63881a 100644 --- a/tools/metrics/histograms/metadata/language/histograms.xml +++ b/tools/metrics/histograms/metadata/language/histograms.xml @@ -90,6 +90,21 @@ chromium-metrics-reviews@google.com. + + perrier@chromium.org + chrome-language@google.com + + Whether or not accessibility features are enabled when the App Language + Prompt should be shown. If accessibility features are enabled the prompt + will not be shown. This histogram will continue to log "Enabled" + for the user until Chrome is started with accessibility features disabled. + + Reported each time all other conditions for showing the App Language Prompt + have been met. + + + perrier@chromium.org From 11a8364059061be0674b3d93ddf6df3e0ebd70be Mon Sep 17 00:00:00 2001 From: Peng Huang Date: Fri, 17 Dec 2021 01:26:55 +0000 Subject: [PATCH 35/71] AngleVulkan: support create from GMB or create with pixel data Bug: 1264439,1280798 Change-Id: Iefbf177bb6038b8cbb394a8d3e1068c363c1b4a0 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346060 Reviewed-by: Vasiliy Telezhnikov Commit-Queue: Peng Huang Cr-Commit-Position: refs/heads/main@{#952615} --- ...ared_image_backing_factory_angle_vulkan.cc | 121 +++++++++++++++--- ...hared_image_backing_factory_angle_vulkan.h | 3 +- 2 files changed, 107 insertions(+), 17 deletions(-) diff --git a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc index ef042792c7cb60..76dab7f579c5c8 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.cc @@ -5,6 +5,7 @@ #include "gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h" #include "base/logging.h" +#include "build/build_config.h" #include "components/viz/common/gpu/vulkan_context_provider.h" #include "components/viz/common/resources/resource_sizes.h" #include "gpu/command_buffer/common/shared_image_usage.h" @@ -13,6 +14,7 @@ #include "gpu/command_buffer/service/shared_image_backing_gl_common.h" #include "gpu/command_buffer/service/shared_image_backing_gl_image.h" #include "gpu/command_buffer/service/shared_image_representation.h" +#include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/command_buffer/service/skia_utils.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_fence_helper.h" @@ -82,7 +84,7 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, bool Initialize( const SharedImageBackingFactoryAngleVulkan::FormatInfo& format_info, - const SharedImageBackingGLCommon::UnpackStateAttribs& attribs) { + const base::span& data) { auto* device_queue = context_state_->vk_context_provider()->GetDeviceQueue(); VkFormat vk_format = ToVkFormat(format()); @@ -120,6 +122,30 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, vulkan_image_ = std::move(vulkan_image); egl_image_ = std::move(egl_image); + + if (!data.empty()) { + size_t stride = BitsPerPixel(format()) / 8 * size().width(); + WritePixels(data, stride); + SetCleared(); + } + + return true; + } + + bool InitializeFromGMB( + const SharedImageBackingFactoryAngleVulkan::FormatInfo& format_info, + gfx::GpuMemoryBufferHandle handle) { + SharedMemoryRegionWrapper shared_memory_wrapper; + if (!shared_memory_wrapper.Initialize(handle, size(), format())) + return false; + + if (!Initialize(format_info, {})) + return false; + + shared_memory_wrapper_ = std::move(shared_memory_wrapper); + Update(nullptr); + SetCleared(); + return true; } @@ -131,7 +157,8 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, } void Update(std::unique_ptr in_fence) override { - NOTREACHED() << "Not supported."; + WritePixels(shared_memory_wrapper_.GetMemoryAsSpan(), + shared_memory_wrapper_.GetStride()); } void OnMemoryDump(const std::string& dump_name, @@ -250,6 +277,27 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, return true; } + bool WritePixels(const base::span& pixel_data, size_t stride) { + if (!BeginAccessSkia(/*readonly=*/false)) + return false; + + auto* gr_context = context_state_->gr_context(); + + auto info = SkImageInfo::Make(size().width(), size().height(), + ResourceFormatToClosestSkColorType( + /*gpu_compositing=*/true, format()), + kOpaque_SkAlphaType); + SkPixmap pixmap(info, pixel_data.data(), stride); + if (!gr_context->updateBackendTexture(backend_texture_, &pixmap, + /*numLevels=*/1, nullptr, nullptr)) { + DLOG(ERROR) << "updateBackendTexture() failed."; + } + + EndAccessSkia(); + + return true; + } + raw_ptr context_state_; std::unique_ptr vulkan_image_; scoped_refptr egl_image_; @@ -263,6 +311,7 @@ class AngleVulkanBacking : public ClearTrackingSharedImageBacking, kGLReadWrite, }; AccessMode access_mode_ = kNone; + SharedMemoryRegionWrapper shared_memory_wrapper_; }; // namespace class AngleVulkanBacking::SkiaRepresentation @@ -372,6 +421,7 @@ SharedImageBackingFactoryAngleVulkan::SharedImageBackingFactoryAngleVulkan( gpu_feature_info, context_state->progress_reporter()), context_state_(context_state) { + DCHECK(context_state_->GrContextIsVulkan()); DCHECK(gl::GLSurfaceEGL::IsANGLEVulkanImageSupported()); } @@ -399,7 +449,7 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( context_state_, mailbox, format, size, color_space, surface_origin, alpha_type, usage); - if (!result->Initialize(format_info, attribs_)) + if (!result->Initialize(format_info, {})) return nullptr; return result; } @@ -414,8 +464,19 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( SkAlphaType alpha_type, uint32_t usage, base::span data) { - NOTREACHED() << "Not supported"; - return nullptr; + const FormatInfo& format_info = format_info_[format]; + if (!CanCreateSharedImage(size, /*pixel_data=*/{}, format_info, + GL_TEXTURE_2D)) { + return nullptr; + } + + auto result = std::make_unique( + context_state_, mailbox, format, size, color_space, surface_origin, + alpha_type, usage); + + if (!result->Initialize(format_info, data)) + return nullptr; + return result; } std::unique_ptr @@ -431,17 +492,45 @@ SharedImageBackingFactoryAngleVulkan::CreateSharedImage( GrSurfaceOrigin surface_origin, SkAlphaType alpha_type, uint32_t usage) { - NOTREACHED() << "Not supported"; - return nullptr; + if (plane != gfx::BufferPlane::DEFAULT) { + LOG(DFATAL) << "Invalid plane"; + return nullptr; + } + + if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, buffer_format)) { + LOG(DFATAL) << "Invalid image size for format."; + return nullptr; + } + + auto format = viz::GetResourceFormat(buffer_format); + + const FormatInfo& format_info = format_info_[format]; + if (!CanCreateSharedImage(size, /*pixel_data=*/{}, format_info, + GL_TEXTURE_2D)) { + return nullptr; + } + + auto result = std::make_unique( + context_state_, mailbox, format, size, color_space, surface_origin, + alpha_type, usage); + + if (!result->InitializeFromGMB(format_info, std::move(handle))) + return nullptr; + + return result; } bool SharedImageBackingFactoryAngleVulkan::CanUseAngleVulkanBacking( - uint32_t usage, - GrContextType gr_context_type) const { + uint32_t usage) const { // Ignore for mipmap usage. usage &= ~SHARED_IMAGE_USAGE_MIPMAP; + // TODO(penghuang): verify the scanout is the right usage for video playback. + // crbug.com/1280798 constexpr auto kSupportedUsages = +#if defined(OS_LINUX) + SHARED_IMAGE_USAGE_SCANOUT | +#endif SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_DISPLAY | SHARED_IMAGE_USAGE_OOP_RASTERIZATION; @@ -463,16 +552,18 @@ bool SharedImageBackingFactoryAngleVulkan::IsSupported( bool* allow_legacy_mailbox, bool is_pixel_used) { DCHECK_EQ(gr_context_type, GrContextType::kVulkan); - if (!CanUseAngleVulkanBacking(usage, gr_context_type)) { + if (!CanUseAngleVulkanBacking(usage)) return false; - } - if (is_pixel_used) { + if (thread_safe) return false; - } - if (gmb_type != gfx::EMPTY_BUFFER) { - return false; + switch (gmb_type) { + case gfx::EMPTY_BUFFER: + case gfx::SHARED_MEMORY_BUFFER: + break; + default: + return false; } *allow_legacy_mailbox = false; diff --git a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h index e4f5f19b56b428..70cdac3a3b61a0 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h +++ b/gpu/command_buffer/service/shared_image_backing_factory_angle_vulkan.h @@ -65,8 +65,7 @@ class GPU_GLES2_EXPORT SharedImageBackingFactoryAngleVulkan bool is_pixel_used) override; private: - bool CanUseAngleVulkanBacking(uint32_t usage, - GrContextType gr_context_type) const; + bool CanUseAngleVulkanBacking(uint32_t usage) const; raw_ptr context_state_; }; From 1942020a82c80a477a238d57cff8f7ea0eddfcd0 Mon Sep 17 00:00:00 2001 From: Philip Rogers Date: Fri, 17 Dec 2021 01:35:47 +0000 Subject: [PATCH 36/71] Delete PaintLayerCompositor Bug: 1277748 Change-Id: I5eb78511ac3b0e38a0ba9d4c4e947edc8a10ac70 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346110 Reviewed-by: Xianzhu Wang Commit-Queue: Philip Rogers Cr-Commit-Position: refs/heads/main@{#952616} --- .../core/animation/scroll_timeline.cc | 1 - .../core/display_lock/display_lock_context.cc | 13 - .../core/display_lock/display_lock_context.h | 13 - .../display_lock/display_lock_context_test.cc | 1 - .../blink/renderer/core/dom/document.cc | 13 - .../renderer/core/exported/web_view_impl.cc | 1 - .../renderer/core/frame/frame_overlay_test.cc | 1 - .../blink/renderer/core/frame/local_frame.cc | 11 - .../renderer/core/frame/local_frame_view.cc | 102 +--- .../renderer/core/frame/local_frame_view.h | 11 - .../core/html/media/html_media_element.cc | 1 - .../core/html/media/html_video_element.cc | 18 - .../core/html/media/html_video_element.h | 1 - .../blink/renderer/core/layout/layout_box.cc | 1 - .../core/layout/layout_box_model_object.cc | 9 - .../core/layout/layout_embedded_content.cc | 10 - .../core/layout/layout_embedded_content.h | 2 - .../blink/renderer/core/layout/layout_view.cc | 17 - .../blink/renderer/core/layout/layout_view.h | 8 - third_party/blink/renderer/core/page/page.cc | 20 +- .../main_thread_scrolling_reasons_test.cc | 1 - .../scrolling/root_scroller_controller.cc | 1 - .../core/page/scrolling/root_scroller_test.cc | 1 - .../page/scrolling/scrolling_coordinator.cc | 1 - .../core/page/scrolling/scrolling_test.cc | 1 - .../top_document_root_scroller_controller.cc | 1 - .../blink/renderer/core/paint/build.gni | 5 - .../compositing/composited_layer_mapping.cc | 53 --- .../compositing/composited_layer_mapping.h | 5 - .../compositing/compositing_layer_assigner.cc | 291 ------------ .../compositing/compositing_layer_assigner.h | 123 ----- .../compositing/compositing_update_type.h | 39 -- .../graphics_layer_tree_builder.cc | 28 -- .../compositing/graphics_layer_updater.cc | 9 - .../compositing/paint_layer_compositor.cc | 435 ------------------ .../compositing/paint_layer_compositor.h | 182 -------- .../blink/renderer/core/paint/paint_layer.cc | 54 +-- .../blink/renderer/core/paint/paint_layer.h | 20 +- .../core/paint/paint_layer_scrollable_area.cc | 50 +- .../core/paint/paint_layer_scrollable_area.h | 2 - .../core/paint/paint_layer_stacking_node.cc | 19 - .../core/paint/paint_layer_stacking_node.h | 3 - .../core/paint/pre_paint_tree_walk.cc | 1 - .../frame_throttling_test.cc | 1 - .../renderer/core/svg/graphics/svg_image.cc | 5 - .../blink/renderer/core/testing/internals.cc | 1 - .../core/testing/sim/sim_compositor.cc | 1 - .../compositing/paint_artifact_compositor.h | 3 - 48 files changed, 35 insertions(+), 1555 deletions(-) delete mode 100644 third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc delete mode 100644 third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h delete mode 100644 third_party/blink/renderer/core/paint/compositing/compositing_update_type.h delete mode 100644 third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc delete mode 100644 third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h diff --git a/third_party/blink/renderer/core/animation/scroll_timeline.cc b/third_party/blink/renderer/core/animation/scroll_timeline.cc index cc2fbf9145d6bb..66b9db782136b7 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline.cc @@ -22,7 +22,6 @@ #include "third_party/blink/renderer/core/dom/node_computed_style.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 34ff5f6f83e6b8..5dd9647be34a38 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc @@ -707,19 +707,6 @@ bool DisplayLockContext::MarkForCompositingUpdatesIfNeeded() { layout_box->Layer()->SetNeedsCompositingInputsUpdate(); needs_compositing_dependent_flag_update_ = false; - if (needs_graphics_layer_rebuild_) - layout_box->Layer()->SetNeedsGraphicsLayerRebuild(); - needs_graphics_layer_rebuild_ = false; - - if (forced_graphics_layer_update_blocked_) { - // If we don't have a compositing layer mapping ancestor in this frame, - // then mark this layer as needing a graphics layer rebuild, since what - // we want is to clear any dangling trees in this subtree or composite - // the frame again if something in the subtree still needs compositing. - layout_box->Layer()->SetNeedsGraphicsLayerRebuild(); - } - forced_graphics_layer_update_blocked_ = false; - return true; } return false; diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index d7a734309c5aeb..fab56547e81626 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h @@ -151,15 +151,6 @@ class CORE_EXPORT DisplayLockContext final needs_compositing_dependent_flag_update_ = true; } - void NotifyGraphicsLayerRebuildBlocked() { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - needs_graphics_layer_rebuild_ = true; - } - - void NotifyForcedGraphicsLayerUpdateBlocked() { - forced_graphics_layer_update_blocked_ = true; - } - // Notify this element will be disconnected. void NotifyWillDisconnect(); @@ -444,10 +435,6 @@ class CORE_EXPORT DisplayLockContext final // again at the start of the lifecycle. bool keep_unlocked_until_lifecycle_ = false; - bool needs_graphics_layer_rebuild_ = false; - - bool forced_graphics_layer_update_blocked_ = false; - // This is set to true if we're in the 'auto' mode and had our first // intersection / non-intersection notification. This is reset to false if the // 'auto' mode is added again (after being removed). diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc index e8693cf4828e92..9f2001592e3a79 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc @@ -31,7 +31,6 @@ #include "third_party/blink/renderer/core/geometry/dom_rect.h" #include "third_party/blink/renderer/core/html/html_template_element.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 6974ba265dbe9d..9ed29f10e3e7fb 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc @@ -281,7 +281,6 @@ #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h" #include "third_party/blink/renderer/core/page/validation_message_client.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -2664,16 +2663,6 @@ void Document::SetIsXrOverlay(bool val, Element* overlay_element) { // The DOM overlay may change the effective root element. Need to update // compositing inputs to avoid a mismatch in CompositingRequirementsUpdater. GetLayoutView()->Layer()->SetNeedsCompositingInputsUpdate(); - - // Ensure that the graphics layer tree gets fully rebuilt on changes, - // similar to HTMLVideoElement::DidEnterFullscreen(). This may not be - // strictly necessary if the compositing changes are based on visibility - // settings, but helps ensure consistency in case it's changed to - // detaching layers or re-rooting the graphics layer tree. - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } } void Document::ScheduleUseShadowTreeUpdate(SVGUseElement& element) { @@ -2805,8 +2794,6 @@ void Document::Shutdown() { if (GetFrame()->IsLocalRoot()) GetPage()->GetChromeClient().AttachRootLayer(nullptr, GetFrame()); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - layout_view_->CleanUpCompositor(); MutationObserver::CleanSlotChangeList(*this); diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 6531f9b8d7720c..315e1d51e8141b 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -150,7 +150,6 @@ #include "third_party/blink/renderer/core/page/pointer_lock_controller.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/paint_timing.h" #include "third_party/blink/renderer/core/paint/paint_timing_detector.h" diff --git a/third_party/blink/renderer/core/frame/frame_overlay_test.cc b/third_party/blink/renderer/core/frame/frame_overlay_test.cc index 1dda2cc2f7a4fb..6036152a649564 100644 --- a/third_party/blink/renderer/core/frame/frame_overlay_test.cc +++ b/third_party/blink/renderer/core/frame/frame_overlay_test.cc @@ -15,7 +15,6 @@ #include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/platform/graphics/color.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index fc47c47cc197a6..8816d7170a6f46 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc @@ -165,7 +165,6 @@ #include "third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h" #include "third_party/blink/renderer/core/page/pointer_lock_controller.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_painter.h" #include "third_party/blink/renderer/core/paint/paint_auto_dark_mode.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -1418,16 +1417,6 @@ String LocalFrame::GetLayerTreeAsTextForTesting(unsigned flags) const { std::unique_ptr layers; if (!(flags & kOutputAsLayerTree)) { layers = View()->CompositedLayersAsJSON(static_cast(flags)); - } else { - if (const auto* root_layer = - ContentLayoutObject()->Compositor()->RootGraphicsLayer()) { - if (flags & kLayerTreeIncludesAllLayers && IsMainFrame()) { - while (root_layer->Parent()) - root_layer = root_layer->Parent(); - } - layers = GraphicsLayerTreeAsJSON(root_layer, - static_cast(flags)); - } } return layers ? layers->ToPrettyJSONString() : String(); } diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 43ca630bafeb63..2aa486d38a9d76 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc @@ -130,7 +130,6 @@ #include "third_party/blink/renderer/core/page/validation_message_client.h" #include "third_party/blink/renderer/core/paint/block_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/cull_rect_updater.h" #include "third_party/blink/renderer/core/paint/frame_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" @@ -277,7 +276,6 @@ LocalFrameView::LocalFrameView(LocalFrame& frame, gfx::Rect frame_rect) target_state_(DocumentLifecycle::kUninitialized), suppress_adjust_view_size_(false), intersection_observation_state_(kNotNeeded), - needs_forced_compositing_update_(false), needs_focus_on_fragment_(false), main_thread_scrolling_reasons_(0), forced_layout_stack_depth_(0), @@ -1379,24 +1377,6 @@ void LocalFrameView::SetLayoutSizeFixedToFrameSize(bool is_fixed) { SetLayoutSizeInternal(Size()); } -void LocalFrameView::SetNeedsCompositingUpdate( - CompositingUpdateType update_type) { - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return; - if (!frame_->GetDocument() || !frame_->GetDocument()->IsActive()) - return; - if (auto* layout_view = GetLayoutView()) { - auto* compositor = layout_view->Compositor(); - compositor->SetNeedsCompositingUpdate(update_type); - // Even if the frame is throttlable, we may still need to decomposite it - // in response to a visibility change. - if (compositor->StaleInCompositingMode()) { - layout_view->Layer()->SetNeedsCompositingInputsUpdate(); - needs_forced_compositing_update_ = true; - } - } -} - ChromeClient* LocalFrameView::GetChromeClient() const { Page* page = GetFrame().GetPage(); if (!page) @@ -2578,30 +2558,26 @@ bool LocalFrameView::RunCompositingInputsLifecyclePhase( SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(), LocalFrameUkmAggregator::kCompositingInputs); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - layout_view->Compositor()->UpdateInputsIfNeededRecursive(target_state); - } else { - // TODO(pdr): This descendant dependent treewalk should be integrated into - // the prepaint tree walk. - { -#if DCHECK_IS_ON() - SetIsUpdatingDescendantDependentFlags(true); -#endif - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.GetLayoutView()->Layer()->UpdateDescendantDependentFlags(); - frame_view.GetLayoutView()->CommitPendingSelection(); - }); + // TODO(pdr): This descendant dependent treewalk should be integrated into + // the prepaint tree walk. + { #if DCHECK_IS_ON() - SetIsUpdatingDescendantDependentFlags(false); + SetIsUpdatingDescendantDependentFlags(true); #endif - } - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.Lifecycle().AdvanceTo( - DocumentLifecycle::kCompositingInputsClean); + frame_view.GetLayoutView()->Layer()->UpdateDescendantDependentFlags(); + frame_view.GetLayoutView()->CommitPendingSelection(); }); +#if DCHECK_IS_ON() + SetIsUpdatingDescendantDependentFlags(false); +#endif } + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { + frame_view.Lifecycle().AdvanceTo( + DocumentLifecycle::kCompositingInputsClean); + }); + return target_state > DocumentLifecycle::kCompositingInputsClean; } @@ -2612,16 +2588,10 @@ bool LocalFrameView::RunCompositingAssignmentsLifecyclePhase( auto* layout_view = GetLayoutView(); DCHECK(layout_view); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - SCOPED_UMA_AND_UKM_TIMER(EnsureUkmAggregator(), - LocalFrameUkmAggregator::kCompositingAssignments); - layout_view->Compositor()->UpdateAssignmentsIfNeededRecursive(target_state); - } else { - ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { - frame_view.Lifecycle().AdvanceTo( - DocumentLifecycle::kCompositingAssignmentsClean); - }); - } + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { + frame_view.Lifecycle().AdvanceTo( + DocumentLifecycle::kCompositingAssignmentsClean); + }); frame_->GetPage()->GetValidationMessageClient().UpdatePrePaint(); ForAllNonThrottledLocalFrameViews([](LocalFrameView& view) { @@ -3595,9 +3565,6 @@ void LocalFrameView::SetTracksRasterInvalidations( track_raster_invalidations); } - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() && GetLayoutView()) - GetLayoutView()->Compositor()->UpdateTrackingRasterInvalidations(); - TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("blink.invalidation"), "LocalFrameView::setTracksPaintInvalidations", TRACE_EVENT_SCOPE_GLOBAL, "enabled", @@ -4023,18 +3990,7 @@ static bool PaintOutsideOfLifecycleIsAllowed(GraphicsContext& context, // explicitly skip cache. if (context.GetPaintController().IsSkippingCache()) return true; - // For CompositeAfterPaint, they always conflict because we always paint into - // paint_controller_ during lifecycle update. - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) - return false; - // For pre-CompositeAfterPaint, they conflict if the local frame root has a - // a root graphics layer. - return !frame_view.GetFrame() - .LocalFrameRoot() - .View() - ->GetLayoutView() - ->Compositor() - ->PaintRootGraphicsLayer(); + return false; } void LocalFrameView::PaintOutsideOfLifecycle( @@ -4191,10 +4147,6 @@ gfx::PointF LocalFrameView::ConvertFromRootFrame( } void LocalFrameView::ParentVisibleChanged() { - // As parent visibility changes, we may need to recomposite this frame view - // and potentially child frame views. - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - if (!IsSelfVisible()) return; @@ -4215,7 +4167,6 @@ void LocalFrameView::SelfVisibleChanged() { void LocalFrameView::Show() { if (!IsSelfVisible()) { SetSelfVisible(true); - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); if (IsParentVisible()) { ForAllChildViewsAndPlugins( [](EmbeddedContentView& embedded_content_view) { @@ -4234,7 +4185,6 @@ void LocalFrameView::Hide() { }); } SetSelfVisible(false); - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } } @@ -4428,12 +4378,6 @@ void LocalFrameView::RenderThrottlingStatusChanged() { #endif } -void LocalFrameView::SetNeedsForcedCompositingUpdate() { - needs_forced_compositing_update_ = true; - if (LocalFrameView* parent = ParentFrameView()) - parent->SetNeedsForcedCompositingUpdate(); -} - void LocalFrameView::SetIntersectionObservationState( IntersectionObservationState state) { if (intersection_observation_state_ >= state) @@ -4514,7 +4458,7 @@ bool LocalFrameView::ShouldThrottleRendering() const { bool throttled_for_global_reasons = LocalFrameTreeAllowsThrottling() && CanThrottleRendering() && frame_->GetDocument(); - if (!throttled_for_global_reasons || needs_forced_compositing_update_) + if (!throttled_for_global_reasons) return false; // If we're currently running a lifecycle update, and we are required to run @@ -4981,12 +4925,6 @@ void LocalFrameView::RunPaintBenchmark(int repeat_count, result.painter_memory_usage += paint_artifact_compositor_->ApproximateUnsharedMemoryUsage(); } - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (auto* root = GetLayoutView()->Compositor()->PaintRootGraphicsLayer()) { - result.painter_memory_usage += - root->ApproximateUnsharedMemoryUsageRecursive(); - } - } } DarkModeFilter& LocalFrameView::EnsureDarkModeFilter() { diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index b1ec7c73b7ced7..85bbefe18b935d 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h @@ -44,7 +44,6 @@ #include "third_party/blink/renderer/core/frame/sticky_ad_detector.h" #include "third_party/blink/renderer/core/layout/depth_ordered_layout_object_list.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_update_type.h" #include "third_party/blink/renderer/core/paint/layout_object_counter.h" #include "third_party/blink/renderer/platform/geometry/layout_size.h" #include "third_party/blink/renderer/platform/graphics/color.h" @@ -239,13 +238,6 @@ class CORE_EXPORT LocalFrameView final void SetPaintArtifactCompositorNeedsUpdate(); - // Marks this frame, and ancestor frames, as needing a mandatory compositing - // update. This overrides throttling for one frame, up to kCompositingClean. - void SetNeedsForcedCompositingUpdate(); - void ResetNeedsForcedCompositingUpdate() { - needs_forced_compositing_update_ = false; - } - // Methods for getting/setting the size Blink should use to layout the // contents. gfx::Size GetLayoutSize() const { return layout_size_; } @@ -930,8 +922,6 @@ class CORE_EXPORT LocalFrameView final void UpdatePluginsTimerFired(TimerBase*); bool UpdatePlugins(); - void SetNeedsCompositingUpdate(CompositingUpdateType); - AXObjectCache* ExistingAXObjectCache() const; void SetLayoutSizeInternal(const gfx::Size&); @@ -1119,7 +1109,6 @@ class CORE_EXPORT LocalFrameView final bool allows_layout_invalidation_after_layout_clean_ = true; #endif IntersectionObservationState intersection_observation_state_; - bool needs_forced_compositing_update_; bool needs_focus_on_fragment_; diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 8a9a66f0c3c27c..f8933bf390b556 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc @@ -108,7 +108,6 @@ #include "third_party/blink/renderer/core/loader/mixed_content_checker.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/peerconnection/execution_context_metronome_provider.h" #include "third_party/blink/renderer/platform/audio/audio_bus.h" #include "third_party/blink/renderer/platform/audio/audio_source_provider_client.h" diff --git a/third_party/blink/renderer/core/html/media/html_video_element.cc b/third_party/blink/renderer/core/html/media/html_video_element.cc index 3d687aeb357474..e28e76ccc19be6 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.cc +++ b/third_party/blink/renderer/core/html/media/html_video_element.cc @@ -86,7 +86,6 @@ HTMLVideoElement::HTMLVideoElement(Document& document) picture_in_picture_interstitial_(nullptr), is_persistent_(false), is_auto_picture_in_picture_(false), - in_overlay_fullscreen_video_(false), is_effectively_fullscreen_(false), is_default_overridden_intrinsic_size_( !document.IsMediaDocument() && GetExecutionContext() && @@ -448,15 +447,6 @@ void HTMLVideoElement::DidEnterFullscreen() { GetWebMediaPlayer()->EnteredFullscreen(); GetWebMediaPlayer()->OnDisplayTypeChanged(GetDisplayType()); } - - // Cache this in case the player is destroyed before leaving fullscreen. - in_overlay_fullscreen_video_ = UsesOverlayFullscreenVideo(); - if (in_overlay_fullscreen_video_) { - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetDocument().GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } } void HTMLVideoElement::DidExitFullscreen() { @@ -467,14 +457,6 @@ void HTMLVideoElement::DidExitFullscreen() { GetWebMediaPlayer()->OnDisplayTypeChanged(GetDisplayType()); } - if (in_overlay_fullscreen_video_) { - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - auto* compositor = GetDocument().GetLayoutView()->Compositor(); - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } - in_overlay_fullscreen_video_ = false; - if (RuntimeEnabledFeatures::VideoAutoFullscreenEnabled() && !FastHasAttribute(html_names::kPlaysinlineAttr)) { pause(); diff --git a/third_party/blink/renderer/core/html/media/html_video_element.h b/third_party/blink/renderer/core/html/media/html_video_element.h index 35889bf0c99e40..efc71aaba36f9c 100644 --- a/third_party/blink/renderer/core/html/media/html_video_element.h +++ b/third_party/blink/renderer/core/html/media/html_video_element.h @@ -32,7 +32,6 @@ #include "third_party/blink/renderer/core/html/html_image_loader.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" #include "third_party/blink/renderer/core/imagebitmap/image_bitmap_source.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" namespace blink { diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 57578004fa1fee..4288b8648648b6 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc @@ -100,7 +100,6 @@ #include "third_party/blink/renderer/core/paint/background_image_geometry.h" #include "third_party/blink/renderer/core/paint/box_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/box_painter.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/outline_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc index b62764547016f2..bce26b78bdd8fc 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc +++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc @@ -42,7 +42,6 @@ #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h" #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -143,14 +142,6 @@ void LayoutBoxModelObject::WillBeDestroyed() { void LayoutBoxModelObject::StyleWillChange(StyleDifference diff, const ComputedStyle& new_style) { NOT_DESTROYED(); - // SPv1: - // This object's layer may begin or cease to be stacked or stacking context, - // in which case the paint invalidation container of this object and - // descendants may change. Thus we need to invalidate paint eagerly for all - // such children. PaintLayerCompositor::paintInvalidationOnCompositingChange() - // doesn't work for the case because we can only see the new - // paintInvalidationContainer during compositing update. - // SPv1 and v2: // Change of stacked/stacking context status may cause change of this or // descendant PaintLayer's CompositingContainer, so we need to eagerly // invalidate the current compositing container chain which may have painted diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc index 3b1bbf64b34932..8bf7c1e8d8aae6 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc @@ -36,7 +36,6 @@ #include "third_party/blink/renderer/core/html/html_plugin_element.h" #include "third_party/blink/renderer/core/layout/hit_test_result.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/embedded_content_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "ui/gfx/geometry/point_conversions.h" @@ -112,15 +111,6 @@ PaintLayerType LayoutEmbeddedContent::LayerTypeRequired() const { return kForcedPaintLayer; } -bool LayoutEmbeddedContent::ContentDocumentContainsGraphicsLayer() const { - NOT_DESTROYED(); - if (PaintLayerCompositor* inner_compositor = - PaintLayerCompositor::FrameContentsCompositor(*this)) { - return inner_compositor->StaleInCompositingMode(); - } - return false; -} - bool LayoutEmbeddedContent::NodeAtPointOverEmbeddedContentView( HitTestResult& result, const HitTestLocation& hit_test_location, diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.h b/third_party/blink/renderer/core/layout/layout_embedded_content.h index 25d12d889f2027..5a00bbabd78b16 100644 --- a/third_party/blink/renderer/core/layout/layout_embedded_content.h +++ b/third_party/blink/renderer/core/layout/layout_embedded_content.h @@ -43,8 +43,6 @@ class CORE_EXPORT LayoutEmbeddedContent : public LayoutReplaced { public: explicit LayoutEmbeddedContent(HTMLFrameOwnerElement*); - bool ContentDocumentContainsGraphicsLayer() const; - bool NodeAtPoint(HitTestResult&, const HitTestLocation&, const PhysicalOffset& accumulated_offset, diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc index 845fa0d39a09cc..28baecb831d691 100644 --- a/third_party/blink/renderer/core/layout/layout_view.cc +++ b/third_party/blink/renderer/core/layout/layout_view.cc @@ -51,7 +51,6 @@ #include "third_party/blink/renderer/core/page/named_pages_mapper.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/paint/view_painter.h" @@ -102,9 +101,6 @@ LayoutView::LayoutView(ContainerNode* document) : LayoutBlockFlow(document), frame_view_(To(document)->View()), layout_state_(nullptr), - compositor_(RuntimeEnabledFeatures::CompositeAfterPaintEnabled() - ? nullptr - : MakeGarbageCollected(*this)), layout_quote_head_(nullptr), layout_counter_count_(0), hit_test_count_(0), @@ -132,7 +128,6 @@ LayoutView::~LayoutView() = default; void LayoutView::Trace(Visitor* visitor) const { visitor->Trace(frame_view_); visitor->Trace(fragmentation_context_); - visitor->Trace(compositor_); visitor->Trace(layout_quote_head_); visitor->Trace(hit_test_cache_); LayoutBlockFlow::Trace(visitor); @@ -846,17 +841,6 @@ void LayoutView::UpdateHitTestResult(HitTestResult& result, } } -PaintLayerCompositor* LayoutView::Compositor() { - NOT_DESTROYED(); - return compositor_; -} - -void LayoutView::CleanUpCompositor() { - NOT_DESTROYED(); - DCHECK(compositor_); - compositor_->CleanUp(); -} - IntervalArena* LayoutView::GetIntervalArena() { NOT_DESTROYED(); if (!interval_arena_) @@ -884,7 +868,6 @@ void LayoutView::WillBeDestroyed() { if (PaintLayer* layer = Layer()) layer->SetNeedsRepaint(); LayoutBlockFlow::WillBeDestroyed(); - compositor_.Clear(); } void LayoutView::UpdateFromStyle() { diff --git a/third_party/blink/renderer/core/layout/layout_view.h b/third_party/blink/renderer/core/layout/layout_view.h index 325fb9e03ca1b0..b6101303145e82 100644 --- a/third_party/blink/renderer/core/layout/layout_view.h +++ b/third_party/blink/renderer/core/layout/layout_view.h @@ -42,7 +42,6 @@ namespace blink { class LayoutQuote; class LocalFrameView; class NamedPagesMapper; -class PaintLayerCompositor; class ViewFragmentationContext; // LayoutView is the root of the layout tree and the Document's LayoutObject. @@ -69,10 +68,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { void WillBeDestroyed() override; - // Called when the Document is shutdown, to have the compositor clean up - // during frame detach, while pointers remain valid. - void CleanUpCompositor(); - // hitTest() will update layout, style and compositing first while // hitTestNoLifecycleUpdate() does not. bool HitTest(const HitTestLocation& location, HitTestResult&); @@ -229,8 +224,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { return named_pages_mapper_.get(); } - PaintLayerCompositor* Compositor(); - PhysicalRect DocumentRect() const; IntervalArena* GetIntervalArena(); @@ -398,7 +391,6 @@ class CORE_EXPORT LayoutView : public LayoutBlockFlow { Member fragmentation_context_; std::unique_ptr named_pages_mapper_; - Member compositor_; scoped_refptr interval_arena_; Member layout_quote_head_; diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc index 88d056956fc0ee..5dd99926e8d8fb 100644 --- a/third_party/blink/renderer/core/page/page.cc +++ b/third_party/blink/renderer/core/page/page.cc @@ -77,7 +77,6 @@ #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/page/spatial_navigation_controller.h" #include "third_party/blink/renderer/core/page/validation_message_client_impl.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h" @@ -856,18 +855,13 @@ void Page::UpdateAcceleratedCompositingSettings() { auto* local_frame = DynamicTo(frame); if (!local_frame) continue; - LayoutView* layout_view = local_frame->ContentLayoutObject(); - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - layout_view->Compositor()->UpdateAcceleratedCompositingSettings(); - } else { - // Mark all scrollable areas as needing a paint property update because - // the compositing reasons may have changed. - if (const auto* areas = local_frame->View()->ScrollableAreas()) { - for (const auto& scrollable_area : *areas) { - if (scrollable_area->ScrollsOverflow()) { - if (auto* layout_box = scrollable_area->GetLayoutBox()) - layout_box->SetNeedsPaintPropertyUpdate(); - } + // Mark all scrollable areas as needing a paint property update because the + // compositing reasons may have changed. + if (const auto* areas = local_frame->View()->ScrollableAreas()) { + for (const auto& scrollable_area : *areas) { + if (scrollable_area->ScrollsOverflow()) { + if (auto* layout_box = scrollable_area->GetLayoutBox()) + layout_box->SetNeedsPaintPropertyUpdate(); } } } diff --git a/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc b/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc index c4ae15eebe4e8f..34e68dc539357a 100644 --- a/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/main_thread_scrolling_reasons_test.cc @@ -17,7 +17,6 @@ #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc index 70efa2d63a341e..0759879a67f350 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_controller.cc @@ -19,7 +19,6 @@ #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc index 89a788fde5e85d..6a4581c2e4369d 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc @@ -32,7 +32,6 @@ #include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc index fcc1bba64adec9..5e7b2802472b0f 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc @@ -45,7 +45,6 @@ #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scroll_animator_base.h" diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc index 6d569944fcf095..78ea22116f9767 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc @@ -57,7 +57,6 @@ #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator_context.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/sim/sim_request.h" #include "third_party/blink/renderer/core/testing/sim/sim_test.h" diff --git a/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc b/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc index 0f53761a3e6e33..9601d61673897d 100644 --- a/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc +++ b/third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.cc @@ -17,7 +17,6 @@ #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/overscroll_controller.h" #include "third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" diff --git a/third_party/blink/renderer/core/paint/build.gni b/third_party/blink/renderer/core/paint/build.gni index 85026b6aa89e74..4de7fd1abfb865 100644 --- a/third_party/blink/renderer/core/paint/build.gni +++ b/third_party/blink/renderer/core/paint/build.gni @@ -38,20 +38,15 @@ blink_core_sources_paint = [ "compositing/composited_layer_mapping.h", "compositing/compositing_inputs_root.cc", "compositing/compositing_inputs_root.h", - "compositing/compositing_layer_assigner.cc", - "compositing/compositing_layer_assigner.h", "compositing/compositing_layer_property_updater.cc", "compositing/compositing_layer_property_updater.h", "compositing/compositing_reason_finder.cc", "compositing/compositing_reason_finder.h", "compositing/compositing_state.h", - "compositing/compositing_update_type.h", "compositing/graphics_layer_tree_builder.cc", "compositing/graphics_layer_tree_builder.h", "compositing/graphics_layer_updater.cc", "compositing/graphics_layer_updater.h", - "compositing/paint_layer_compositor.cc", - "compositing/paint_layer_compositor.h", "css_mask_painter.cc", "css_mask_painter.h", "cull_rect_updater.cc", diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 982fb666ad4ab5..3a6ae7b51e82eb 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc @@ -59,7 +59,6 @@ #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/sticky_position_scrolling_constraints.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/css_mask_painter.h" #include "third_party/blink/renderer/core/paint/frame_paint_timing.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" @@ -218,8 +217,6 @@ void CompositedLayerMapping::CreatePrimaryGraphicsLayer() { } void CompositedLayerMapping::UpdateCompositedBounds() { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); // FIXME: if this is really needed for performance, it would be better to // store it on Layer. composited_bounds_ = owning_layer_->BoundingBoxForCompositing(); @@ -227,24 +224,16 @@ void CompositedLayerMapping::UpdateCompositedBounds() { bool CompositedLayerMapping::UpdateGraphicsLayerConfiguration( const PaintLayer* compositing_container) { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); - // Note carefully: here we assume that the compositing state of all // descendants have been updated already, so it is legitimate to compute and // cache the composited bounds for this layer. UpdateCompositedBounds(); - PaintLayerCompositor* compositor = Compositor(); LayoutObject& layout_object = GetLayoutObject(); const ComputedStyle& style = layout_object.StyleRef(); bool layer_config_changed = false; - if (UpdateForegroundLayer( - compositor->NeedsContentsCompositingLayer(owning_layer_))) - layer_config_changed = true; - // If the outline needs to draw over the composited scrolling contents layer // or scrollbar layers (or video or webgl) it needs to be drawn into a // separate layer. @@ -552,9 +541,6 @@ void CompositedLayerMapping::UpdateSquashingLayerGeometry( void CompositedLayerMapping::UpdateGraphicsLayerGeometry( const PaintLayer* compositing_container, HeapVector>& layers_needing_paint_invalidation) { - DCHECK_EQ(owning_layer_->Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingAssignmentsUpdate); - gfx::Rect local_compositing_bounds; gfx::Point snapped_offset_from_composited_ancestor; ComputeBoundsOfOwningLayer(compositing_container, local_compositing_bounds, @@ -1196,9 +1182,6 @@ GraphicsLayerUpdater::UpdateType CompositedLayerMapping::UpdateTypeForChildren( GraphicsLayer* CompositedLayerMapping::SquashingLayer( const PaintLayer& squashed_layer) const { -#if DCHECK_IS_ON() - AssertInSquashedLayersVector(squashed_layer); -#endif DCHECK(NonScrollingSquashingLayer()); return NonScrollingSquashingLayer(); } @@ -1609,8 +1592,6 @@ bool CompositedLayerMapping::UpdateSquashingLayerAssignmentInternal( } else { squashed_layers.push_back(paint_info); } - // Must invalidate before adding the squashed layer to the mapping. - Compositor()->PaintInvalidationOnCompositingChange(&squashed_layer); return true; } @@ -1645,26 +1626,6 @@ void CompositedLayerMapping::RemoveLayerFromSquashingGraphicsLayer( NOTREACHED(); } -static bool LayerInSquashedLayersVector( - const HeapVector>& squashed_layers, - const PaintLayer& layer) { - for (auto& squashed_layer : squashed_layers) { - if (squashed_layer->paint_layer == &layer) - return true; - } - return false; -} - -#if DCHECK_IS_ON() -void CompositedLayerMapping::AssertInSquashedLayersVector( - const PaintLayer& squashed_layer) const { - auto* in = &non_scrolling_squashed_layers_; - auto* out = &squashed_layers_in_scrolling_contents_; - DCHECK(LayerInSquashedLayersVector(*in, squashed_layer)); - DCHECK(!LayerInSquashedLayersVector(*out, squashed_layer)); -} -#endif - static void RemoveExtraSquashedLayers( HeapVector>& squashed_layers, wtf_size_t new_count, @@ -1683,26 +1644,12 @@ void CompositedLayerMapping::FinishAccumulatingSquashingLayers( wtf_size_t new_non_scrolling_squashed_layer_count, wtf_size_t new_squashed_layer_in_scrolling_contents_count, HeapVector>& layers_needing_paint_invalidation) { - wtf_size_t first_removed_layer = layers_needing_paint_invalidation.size(); RemoveExtraSquashedLayers(non_scrolling_squashed_layers_, new_non_scrolling_squashed_layer_count, layers_needing_paint_invalidation); RemoveExtraSquashedLayers(squashed_layers_in_scrolling_contents_, new_squashed_layer_in_scrolling_contents_count, layers_needing_paint_invalidation); - for (auto i = first_removed_layer; - i < layers_needing_paint_invalidation.size(); i++) { - PaintLayer* layer = layers_needing_paint_invalidation[i]; - // Deal with layers that are no longer squashed. Need to check both - // vectors to exclude the layers that are still squashed. A layer may - // change from scrolling to non-scrolling or vice versa and still be - // squashed. - if (!LayerInSquashedLayersVector(non_scrolling_squashed_layers_, *layer) && - !LayerInSquashedLayersVector(squashed_layers_in_scrolling_contents_, - *layer)) { - Compositor()->PaintInvalidationOnCompositingChange(layer); - } - } } String CompositedLayerMapping::DebugName( diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index c4c47db3df14b1..9b3192524ddaa6 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h @@ -40,8 +40,6 @@ namespace blink { -class PaintLayerCompositor; - // A GraphicsLayerPaintInfo contains all the info needed to paint a partial // subtree of Layers into a GraphicsLayer. struct GraphicsLayerPaintInfo @@ -298,9 +296,6 @@ class CORE_EXPORT CompositedLayerMapping final LayoutBoxModelObject& GetLayoutObject() const { return owning_layer_->GetLayoutObject(); } - PaintLayerCompositor* Compositor() const { - return owning_layer_->Compositor(); - } void UpdateInternalHierarchy(); void UpdatePaintingPhases(); diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc b/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc deleted file mode 100644 index 67e785e18220ac..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.cc +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2014 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h" - -#include "third_party/blink/renderer/core/animation/scroll_timeline.h" -#include "third_party/blink/renderer/core/animation/worklet_animation_controller.h" -#include "third_party/blink/renderer/core/layout/layout_embedded_content.h" -#include "third_party/blink/renderer/core/layout/layout_video.h" -#include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" -#include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/paint_layer_paint_order_iterator.h" -#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" - -namespace blink { - -// We will only allow squashing if the bbox-area:squashed-area doesn't exceed -// the ratio |kSquashingSparsityTolerance|:1. -constexpr uint64_t kSquashingSparsityTolerance = 6; - -CompositingLayerAssigner::CompositingLayerAssigner( - PaintLayerCompositor* compositor) - : compositor_(compositor), layers_changed_(false) {} - -void CompositingLayerAssigner::Assign( - PaintLayer* update_root, - HeapVector>& layers_needing_paint_invalidation) { - TRACE_EVENT0("blink", "CompositingLayerAssigner::assign"); - - // TODO(pdr): Remove this. -} - -void CompositingLayerAssigner::SquashingState:: - UpdateSquashingStateForNewMapping( - CompositedLayerMapping* new_composited_layer_mapping, - HeapVector>& layers_needing_paint_invalidation) { - // The most recent backing is done accumulating any more squashing layers. - if (most_recent_mapping) { - most_recent_mapping->FinishAccumulatingSquashingLayers( - next_non_scrolling_squashed_layer_index, - next_squashed_layer_in_scrolling_contents_index, - layers_needing_paint_invalidation); - } - - next_non_scrolling_squashed_layer_index = 0; - next_squashed_layer_in_scrolling_contents_index = 0; - bounding_rect = gfx::Rect(); - most_recent_mapping = new_composited_layer_mapping; - have_assigned_backings_to_entire_squashing_layer_subtree = false; - // We may squash layers with CompositingReason::kOverflowScrollingParent into - // scrolling contents. These layers are stacked, and scrolled by a - // non-stacking-context scroller. See CompositingReasonFinder. - next_layer_may_squash_into_scrolling_contents = - most_recent_mapping && - most_recent_mapping->OwningLayer().NeedsCompositedScrolling() && - !most_recent_mapping->OwningLayer() - .GetLayoutObject() - .IsStackingContext(); -} - -bool CompositingLayerAssigner::SquashingWouldExceedSparsityTolerance( - const PaintLayer* candidate, - const CompositingLayerAssigner::SquashingState& squashing_state) { - gfx::Rect bounds = candidate->ClippedAbsoluteBoundingBox(); - gfx::Rect new_bounding_rect = squashing_state.bounding_rect; - new_bounding_rect.Union(bounds); - const uint64_t new_bounding_rect_area = new_bounding_rect.size().Area64(); - const uint64_t new_squashed_area = - squashing_state.total_area_of_squashed_rects + bounds.size().Area64(); - return new_bounding_rect_area > - kSquashingSparsityTolerance * new_squashed_area; -} - -bool CompositingLayerAssigner::NeedsOwnBacking(const PaintLayer* layer) const { - if (!layer->CanBeComposited()) - return false; - - return RequiresCompositing(layer->GetCompositingReasons()) || - (compositor_->StaleInCompositingMode() && layer->IsRootLayer()); -} - -CompositingStateTransitionType -CompositingLayerAssigner::ComputeCompositedLayerUpdate(PaintLayer* layer) { - CompositingStateTransitionType update = kNoCompositingStateChange; - if (NeedsOwnBacking(layer)) { - if (!layer->HasCompositedLayerMapping()) { - update = kAllocateOwnCompositedLayerMapping; - } - } else { - if (layer->HasCompositedLayerMapping()) - update = kRemoveOwnCompositedLayerMapping; - - if (!layer->SubtreeIsInvisible() && layer->CanBeComposited() && - RequiresSquashing(layer->GetCompositingReasons())) { - // We can't compute at this time whether the squashing layer update is a - // no-op, since that requires walking the paint layer tree. - update = kPutInSquashingLayer; - } - } - return update; -} - -static unsigned GetRenderingContextId(const PaintLayer* layer) { - const auto& fragment = layer->GetLayoutObject().PrimaryStitchingFragment(); - DCHECK(fragment.HasLocalBorderBoxProperties()); - return fragment.LocalBorderBoxProperties() - .Transform() - .Unalias() - .RenderingContextId(); -} - -SquashingDisallowedReasons -CompositingLayerAssigner::GetReasonsPreventingSquashing( - const PaintLayer* layer, - const CompositingLayerAssigner::SquashingState& squashing_state) { - if (RuntimeEnabledFeatures::DisableLayerSquashingEnabled()) - return SquashingDisallowedReason::kDisabled; - - if (!squashing_state.have_assigned_backings_to_entire_squashing_layer_subtree) - return SquashingDisallowedReason::kWouldBreakPaintOrder; - - DCHECK(squashing_state.most_recent_mapping); - const PaintLayer& squashing_layer = - squashing_state.most_recent_mapping->OwningLayer(); - - if (IsA(layer->GetLayoutObject()) || - IsA(squashing_layer.GetLayoutObject())) - return SquashingDisallowedReason::kSquashingVideoIsDisallowed; - - // Don't squash iframes, frames or plugins. - // FIXME: this is only necessary because there is frame code that assumes that - // composited frames are not squashed. - if (layer->GetLayoutObject().IsLayoutEmbeddedContent() || - squashing_layer.GetLayoutObject().IsLayoutEmbeddedContent()) { - return SquashingDisallowedReason:: - kSquashingLayoutEmbeddedContentIsDisallowed; - } - - // The layer may squash into scrolling contents if the squashing layer allows, - // and it's scrolled and clipped by the squashing layer. - bool may_squash_into_scrolling_contents = - squashing_state.next_layer_may_squash_into_scrolling_contents && - layer->AncestorScrollingLayer() == &squashing_layer && - layer->ClippingContainer() == &squashing_layer.GetLayoutObject(); - if (!may_squash_into_scrolling_contents) { - if (SquashingWouldExceedSparsityTolerance(layer, squashing_state)) - return SquashingDisallowedReason::kSquashingSparsityExceeded; - - if (layer->ClippingContainer() != squashing_layer.ClippingContainer() && - !squashing_layer.GetCompositedLayerMapping() - ->ContainingSquashedLayerInSquashingLayer( - layer->ClippingContainer(), - squashing_state.next_non_scrolling_squashed_layer_index)) - return SquashingDisallowedReason::kClippingContainerMismatch; - - if (layer->ScrollsWithRespectTo(&squashing_layer)) - return SquashingDisallowedReason::kScrollsWithRespectToSquashingLayer; - } - - if (layer->GetLayoutObject().StyleRef().HasBlendMode() || - squashing_layer.GetLayoutObject().StyleRef().HasBlendMode()) - return SquashingDisallowedReason::kSquashingBlendingIsDisallowed; - - if (layer->OpacityAncestor() != squashing_layer.OpacityAncestor()) - return SquashingDisallowedReason::kOpacityAncestorMismatch; - - if (layer->TransformAncestor() != squashing_layer.TransformAncestor()) - return SquashingDisallowedReason::kTransformAncestorMismatch; - - // A PaintLayer can generate multiple compositor layers that have - // *different* sorting contexts (because they point to different - // TransformTree nodes). We are only checking one here, which will not be - // accurate in all cases. - if (GetRenderingContextId(layer) != GetRenderingContextId(&squashing_layer)) - return SquashingDisallowedReason::kPreserve3DSortingContextMismatch; - - if (layer->HasFilterInducingProperty() || - layer->FilterAncestor() != squashing_layer.FilterAncestor()) - return SquashingDisallowedReason::kFilterMismatch; - - if (layer->NearestFixedPositionLayer() != - squashing_layer.NearestFixedPositionLayer()) - return SquashingDisallowedReason::kNearestFixedPositionMismatch; - DCHECK_NE(layer->GetLayoutObject().StyleRef().GetPosition(), - EPosition::kFixed); - - if ((squashing_layer.GetLayoutObject() - .StyleRef() - .SubtreeWillChangeContents() && - squashing_layer.GetLayoutObject() - .StyleRef() - .RequiresPropertyNodeForAnimation()) || - squashing_layer.GetLayoutObject() - .StyleRef() - .ShouldCompositeForCurrentAnimations()) - return SquashingDisallowedReason::kSquashingLayerIsAnimating; - - if (layer->EnclosingPaginationLayer()) - return SquashingDisallowedReason::kFragmentedContent; - - if (layer->GetLayoutObject().HasClipPath() || - layer->ClipPathAncestor() != squashing_layer.ClipPathAncestor()) - return SquashingDisallowedReason::kClipPathMismatch; - - if (layer->GetLayoutObject().HasMask() || - layer->MaskAncestor() != squashing_layer.MaskAncestor()) - return SquashingDisallowedReason::kMaskMismatch; - - if (layer->NearestContainedLayoutLayer() != - squashing_layer.NearestContainedLayoutLayer()) - return SquashingDisallowedReason::kCrossesLayoutContainmentBoundary; - - return SquashingDisallowedReason::kNone; -} - -void CompositingLayerAssigner::UpdateSquashingAssignment( - PaintLayer* layer, - SquashingState& squashing_state, - const CompositingStateTransitionType composited_layer_update, - HeapVector>& layers_needing_paint_invalidation) { - // NOTE: In the future as we generalize this, the background of this layer may - // need to be assigned to a different backing than the squashed PaintLayer's - // own primary contents. This would happen when we have a composited negative - // z-index element that needs to paint on top of the background, but below the - // layer's main contents. For now, because we always composite layers when - // they have a composited negative z-index child, such layers will never need - // squashing so it is not yet an issue. - if (composited_layer_update == kPutInSquashingLayer) { - // A layer that is squashed with other layers cannot have its own - // CompositedLayerMapping. - DCHECK(!layer->HasCompositedLayerMapping()); - DCHECK(squashing_state.most_recent_mapping); - - bool changed_squashing_layer = - squashing_state.most_recent_mapping->UpdateSquashingLayerAssignment( - *layer, squashing_state.next_non_scrolling_squashed_layer_index, - squashing_state.next_squashed_layer_in_scrolling_contents_index); - if (!changed_squashing_layer) - return; - - // If we've modified the collection of squashed layers, we must update - // the graphics layer geometry. - squashing_state.most_recent_mapping->SetNeedsGraphicsLayerUpdate( - kGraphicsLayerUpdateSubtree); - - // Issue a paint invalidation, since |layer| may have been added to an - // already-existing squashing layer. - layers_needing_paint_invalidation.push_back(layer); - layers_changed_ = true; - } else if (composited_layer_update == kRemoveFromSquashingLayer) { - if (layer->GroupedMapping()) { - // Before removing |layer| from an already-existing squashing layer that - // may have other content, issue a paint invalidation. - compositor_->PaintInvalidationOnCompositingChange(layer); - layer->GroupedMapping()->SetNeedsGraphicsLayerUpdate( - kGraphicsLayerUpdateSubtree); - } - - // If we need to issue paint invalidations, do so now that we've removed it - // from a squashed layer. - layers_needing_paint_invalidation.push_back(layer); - layers_changed_ = true; - } -} - -} // namespace blink diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h b/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h deleted file mode 100644 index ed5d82d4e4bd88..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * Copyright (C) 2014 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ - -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" -#include "third_party/blink/renderer/platform/geometry/layout_point.h" -#include "third_party/blink/renderer/platform/graphics/squashing_disallowed_reasons.h" -#include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "ui/gfx/geometry/rect.h" - -namespace blink { - -class CompositedLayerMapping; -class PaintLayer; - -class CompositingLayerAssigner { - STACK_ALLOCATED(); - - public: - explicit CompositingLayerAssigner(PaintLayerCompositor*); - - void Assign( - PaintLayer* update_root, - HeapVector>& layers_needing_paint_invalidation); - - bool LayersChanged() const { return layers_changed_; } - - // FIXME: This function should be private. We should remove the one caller - // once we've fixed the compositing chicken/egg issues. - CompositingStateTransitionType ComputeCompositedLayerUpdate(PaintLayer*); - - private: - struct SquashingState { - STACK_ALLOCATED(); - - public: - void UpdateSquashingStateForNewMapping( - CompositedLayerMapping*, - HeapVector>& layers_needing_paint_invalidation); - - // The most recent composited backing that the layer should squash onto if - // needed. - CompositedLayerMapping* most_recent_mapping = nullptr; - - // Whether all Layers in the stacking subtree rooted at the most recent - // mapping's owning layer have had CompositedLayerMappings assigned. Layers - // cannot squash into a CompositedLayerMapping owned by a stacking - // ancestor, since this changes paint order. - bool have_assigned_backings_to_entire_squashing_layer_subtree = false; - - // This is set to true when most_recent_mapping supports composited - // scrolling, and reset to false whenever any layer is not squashed into - // scrolling contents, to ensure all layers squashed into scrolling - // contents are continuous with the scroller in stacking order, without any - // other layer interlacing among them. - bool next_layer_may_squash_into_scrolling_contents = false; - - // Counter that tracks what index the next Layer would be if it gets - // squashed to the current non scrolling squashing layer. - wtf_size_t next_non_scrolling_squashed_layer_index = 0; - // Same as above but for layers squashed into scrolling contents layer. - wtf_size_t next_squashed_layer_in_scrolling_contents_index = 0; - - // The absolute bounding rect of all the squashed layers (not including - // those squashed into scrolling contents). - gfx::Rect bounding_rect; - - // This is simply the sum of the areas of the squashed rects. This can be - // very skewed if the rects overlap, but should be close enough to drive a - // heuristic (not including those squashed into scrolling contents). - uint64_t total_area_of_squashed_rects = 0; - }; - - void AssignLayersToBackingsInternal( - PaintLayer* layer, - PaintLayer* paint_invalidation_container, - SquashingState&, - HeapVector>& layers_needing_paint_invalidation); - SquashingDisallowedReasons GetReasonsPreventingSquashing( - const PaintLayer*, - const SquashingState&); - bool SquashingWouldExceedSparsityTolerance(const PaintLayer* candidate, - const SquashingState&); - void UpdateSquashingAssignment( - PaintLayer*, - SquashingState&, - CompositingStateTransitionType, - HeapVector>& layers_needing_paint_invalidation); - bool NeedsOwnBacking(const PaintLayer*) const; - - PaintLayerCompositor* compositor_; - bool layers_changed_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_LAYER_ASSIGNER_H_ diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h b/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h deleted file mode 100644 index 2ac368bfb89d08..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/compositing_update_type.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2009 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ - -namespace blink { - -enum CompositingUpdateType { - kCompositingUpdateNone, - kCompositingUpdateAfterGeometryChange, - kCompositingUpdateAfterCompositingInputChange, - kCompositingUpdateRebuildTree, -}; - -} // namespace blink -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_COMPOSITING_UPDATE_TYPE_H_ diff --git a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc index 71cf70ac3da366..e3e797ae82a7d4 100644 --- a/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.cc @@ -30,7 +30,6 @@ #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_paint_order_iterator.h" #include "third_party/blink/renderer/platform/heap/collection_support/clear_collection_scope.h" @@ -92,16 +91,6 @@ void GraphicsLayerTreeBuilder::RebuildRecursive( bool recursion_blocked_by_display_lock = layer.GetLayoutObject().ChildPrePaintBlockedByDisplayLock(); - // If the recursion is blocked meaningfully (i.e. we would have recursed, - // since the layer has children), then we should inform the display-lock - // context that we blocked a graphics layer recursion, so that we can ensure - // to rebuild the tree once we're unlocked. - if (recursion_blocked_by_display_lock && layer.FirstChild()) { - auto* context = layer.GetLayoutObject().GetDisplayLockContext(); - DCHECK(context); - context->NotifyGraphicsLayerRebuildBlocked(); - } - if (layer.IsStackingContextWithNegativeZOrderChildren()) { if (!recursion_blocked_by_display_lock) { PaintLayerPaintOrderIterator iterator(&layer, kNegativeZOrderChildren); @@ -127,23 +116,6 @@ void GraphicsLayerTreeBuilder::RebuildRecursive( RebuildRecursive(*child_layer, *layer_vector_for_children, *pending_reparents_for_children); } - - if (auto* embedded = - DynamicTo(layer.GetLayoutObject())) { - DCHECK(this_layer_children.IsEmpty()); - PaintLayerCompositor* inner_compositor = - PaintLayerCompositor::FrameContentsCompositor(*embedded); - if (inner_compositor) { - if (GraphicsLayer* inner_root_graphics_layer = - inner_compositor->RootGraphicsLayer()) { - // TODO(szager); Remove this after diagnosing crash - CHECK_EQ(inner_compositor->InCompositingMode(), - (bool)inner_root_graphics_layer); - layer_vector_for_children->push_back(inner_root_graphics_layer); - } - inner_compositor->ClearRootLayerAttachmentDirty(); - } - } } if (has_composited_layer_mapping) { diff --git a/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc b/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc index 1c8485e1284653..09bb3119511308 100644 --- a/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc +++ b/third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.cc @@ -31,7 +31,6 @@ #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" #include "third_party/blink/renderer/core/paint/compositing/compositing_layer_property_updater.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" @@ -152,14 +151,6 @@ void GraphicsLayerUpdater::UpdateRecursive( if (first_child && layer.GetLayoutObject().ChildPrePaintBlockedByDisplayLock()) { first_child = nullptr; - - // If we have a forced update, we notify the display lock to ensure that the - // forced update resumes after the lock has been removed. - if (update_type == kForceUpdate) { - auto* child_context = layer.GetLayoutObject().GetDisplayLockContext(); - DCHECK(child_context); - child_context->NotifyForcedGraphicsLayerUpdateBlocked(); - } } UpdateContext child_context(context, layer); diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc deleted file mode 100644 index fcd49e79a35b4d..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.cc +++ /dev/null @@ -1,435 +0,0 @@ -/* - * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" - -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/platform/platform.h" -#include "third_party/blink/renderer/core/animation/document_animations.h" -#include "third_party/blink/renderer/core/animation/document_timeline.h" -#include "third_party/blink/renderer/core/animation/element_animations.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" -#include "third_party/blink/renderer/core/dom/dom_node_ids.h" -#include "third_party/blink/renderer/core/editing/frame_selection.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/local_frame_client.h" -#include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/frame/settings.h" -#include "third_party/blink/renderer/core/fullscreen/fullscreen.h" -#include "third_party/blink/renderer/core/html/html_iframe_element.h" -#include "third_party/blink/renderer/core/layout/layout_embedded_content.h" -#include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/page/chrome_client.h" -#include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_layer_assigner.h" -#include "third_party/blink/renderer/core/paint/compositing/graphics_layer_tree_builder.h" -#include "third_party/blink/renderer/core/paint/compositing/graphics_layer_updater.h" -#include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" -#include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" -#include "third_party/blink/renderer/core/probe/core_probes.h" -#include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h" -#include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h" -#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" -#include "ui/gfx/geometry/rect_f.h" - -namespace blink { - -PaintLayerCompositor::PaintLayerCompositor(LayoutView& layout_view) - : layout_view_(&layout_view) { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); -} - -PaintLayerCompositor::~PaintLayerCompositor() = default; - -void PaintLayerCompositor::CleanUp() { - if (InCompositingMode()) - SetOwnerNeedsCompositingInputsUpdate(); -} - -bool PaintLayerCompositor::InCompositingMode() const { - // FIXME: This should assert that lifecycle is >= CompositingClean since - // the last step of updateIfNeeded can set this bit to false. - return compositing_; -} - -bool PaintLayerCompositor::StaleInCompositingMode() const { - return compositing_; -} - -void PaintLayerCompositor::SetCompositingModeEnabled(bool enable) { - if (enable == compositing_) - return; - compositing_ = enable; -} - -void PaintLayerCompositor::UpdateAcceleratedCompositingSettings() { - if (auto* root_layer = RootLayer()) - root_layer->SetNeedsCompositingInputsUpdate(); -} - -void PaintLayerCompositor::UpdateInputsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state) { - DCHECK_GE(target_state, DocumentLifecycle::kCompositingInputsClean); - TRACE_EVENT0("blink,benchmark", - "PaintLayerCompositor::UpdateInputsIfNeededRecursive"); - UpdateInputsIfNeededRecursiveInternal(target_state); -} - -void PaintLayerCompositor::UpdateInputsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state) { - if (layout_view_->GetFrameView()->ShouldThrottleRendering()) { - return; - } - - Lifecycle().AdvanceTo(DocumentLifecycle::kInCompositingInputsUpdate); - - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - // It's possible for trusted Pepper plugins to force hit testing in - // situations where the frame tree is in an inconsistent state, such as in - // the middle of frame detach. - // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (local_frame->GetDocument()->IsActive() && - local_frame->ContentLayoutObject()) { - local_frame->ContentLayoutObject() - ->Compositor() - ->UpdateInputsIfNeededRecursiveInternal(target_state); - } - } - - ScriptForbiddenScope forbid_script; - -#if DCHECK_IS_ON() - LocalFrameView* view = layout_view_->GetFrameView(); - view->SetIsUpdatingDescendantDependentFlags(true); -#endif - { - TRACE_EVENT0("blink", "PaintLayer::UpdateDescendantDependentFlags"); - RootLayer()->UpdateDescendantDependentFlags(); - } -#if DCHECK_IS_ON() - view->SetIsUpdatingDescendantDependentFlags(false); -#endif - - layout_view_->CommitPendingSelection(); - - Lifecycle().AdvanceTo(DocumentLifecycle::kCompositingInputsClean); -} - -void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state) { - DCHECK_GE(target_state, DocumentLifecycle::kCompositingAssignmentsClean); - UpdateAssignmentsIfNeededRecursiveInternal(target_state); -} - -void PaintLayerCompositor::UpdateAssignmentsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state) { - if (target_state == DocumentLifecycle::kCompositingInputsClean) - return; - - if (layout_view_->GetFrameView()->ShouldThrottleRendering()) - return; - - if (DisplayLockUtilities::PrePaintBlockedInParentFrame(layout_view_)) - return; - - Lifecycle().AdvanceTo(DocumentLifecycle::kInCompositingAssignmentsUpdate); - - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - // It's possible for trusted Pepper plugins to force hit testing in - // situations where the frame tree is in an inconsistent state, such as in - // the middle of frame detach. - // TODO(bbudge) Remove this check when trusted Pepper plugins are gone. - if (local_frame->GetDocument()->IsActive() && - local_frame->ContentLayoutObject()) { - auto* child_compositor = local_frame->ContentLayoutObject()->Compositor(); - child_compositor->UpdateAssignmentsIfNeededRecursiveInternal( - target_state); - if (child_compositor->root_layer_attachment_dirty_) - SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - } - - TRACE_EVENT0("blink,benchmark", - "PaintLayerCompositor::UpdateAssignmentsIfNeededRecursive"); - - DCHECK(!layout_view_->NeedsLayout()); - - ScriptForbiddenScope forbid_script; - - UpdateAssignmentsIfNeeded(target_state); - - Lifecycle().AdvanceTo(DocumentLifecycle::kCompositingAssignmentsClean); - -#if DCHECK_IS_ON() - DCHECK_EQ(Lifecycle().GetState(), - DocumentLifecycle::kCompositingAssignmentsClean); - if (!DisplayLockUtilities::PrePaintBlockedInParentFrame(layout_view_)) - AssertNoUnresolvedDirtyBits(); - for (Frame* child = - layout_view_->GetFrameView()->GetFrame().Tree().FirstChild(); - child; child = child->Tree().NextSibling()) { - auto* local_frame = DynamicTo(child); - if (!local_frame) - continue; - if (local_frame->ShouldThrottleRendering() || - !local_frame->ContentLayoutObject() || - DisplayLockUtilities::PrePaintBlockedInParentFrame( - local_frame->ContentLayoutObject())) - continue; - local_frame->ContentLayoutObject() - ->Compositor() - ->AssertNoUnresolvedDirtyBits(); - } -#endif - - layout_view_->GetFrameView()->ResetNeedsForcedCompositingUpdate(); -} - -#if DCHECK_IS_ON() -void PaintLayerCompositor::AssertNoUnresolvedDirtyBits() { - DCHECK_EQ(pending_update_type_, kCompositingUpdateNone); -} -#endif - -void PaintLayerCompositor::SetNeedsCompositingUpdate( - CompositingUpdateType update_type) { - DCHECK_NE(update_type, kCompositingUpdateNone); - pending_update_type_ = std::max(pending_update_type_, update_type); - if (Page* page = GetPage()) - page->Animator().ScheduleVisualUpdate(layout_view_->GetFrame()); - - if (layout_view_->DocumentBeingDestroyed()) - return; -} - -#if DCHECK_IS_ON() -static void AssertWholeTreeNotComposited(const PaintLayer& paint_layer) { - DCHECK(paint_layer.GetCompositingState() == kNotComposited); - for (PaintLayer* child = paint_layer.FirstChild(); child; - child = child->NextSibling()) { - AssertWholeTreeNotComposited(*child); - } -} -#endif - -void PaintLayerCompositor::UpdateAssignmentsIfNeeded( - DocumentLifecycle::LifecycleState target_state) { - DCHECK(target_state >= DocumentLifecycle::kCompositingAssignmentsClean); - - CompositingUpdateType update_type = pending_update_type_; - pending_update_type_ = kCompositingUpdateNone; - - if (update_type == kCompositingUpdateNone) - return; - - PaintLayer* update_root = RootLayer(); - - HeapVector> layers_needing_paint_invalidation; - ClearCollectionScope>> scope( - &layers_needing_paint_invalidation); - - if (update_type >= kCompositingUpdateAfterCompositingInputChange) { - CompositingLayerAssigner layer_assigner(this); - layer_assigner.Assign(update_root, layers_needing_paint_invalidation); - // TODO(szager): Remove this after diagnosing crash. - CHECK_EQ(compositing_, (bool)RootGraphicsLayer()); - - if (layer_assigner.LayersChanged()) - update_type = std::max(update_type, kCompositingUpdateRebuildTree); - } - -#if DCHECK_IS_ON() - if (update_root->GetCompositingState() != kPaintsIntoOwnBacking) { - AssertWholeTreeNotComposited(*update_root); - } -#endif - - GraphicsLayerUpdater updater; - updater.Update(*update_root, layers_needing_paint_invalidation); - - if (updater.NeedsRebuildTree()) - update_type = std::max(update_type, kCompositingUpdateRebuildTree); - -#if DCHECK_IS_ON() - // FIXME: Move this check to the end of the compositing update. - GraphicsLayerUpdater::AssertNeedsToUpdateGraphicsLayerBitsCleared( - *update_root); -#endif - - if (update_type >= kCompositingUpdateRebuildTree) { - GraphicsLayerVector child_list; - { - TRACE_EVENT0("blink", "GraphicsLayerTreeBuilder::rebuild"); - GraphicsLayerTreeBuilder().Rebuild(*update_root, child_list); - } - - if (!child_list.IsEmpty()) { - CHECK(compositing_); - DCHECK_EQ(1u, child_list.size()); - root_layer_attachment_dirty_ = true; - } - } - - for (auto& layer : layers_needing_paint_invalidation) { - PaintInvalidationOnCompositingChange(layer); - } -} - -void PaintLayerCompositor::PaintInvalidationOnCompositingChange( - PaintLayer* layer) { - // If the layoutObject is not attached yet, no need to issue paint - // invalidations. - if (!layer->GetLayoutObject().IsLayoutView() && - !layer->GetLayoutObject().Parent()) - return; - - layer->SetNeedsRepaint(); - // We need to check for raster invalidations due to content changing - // composited layer backings. - switch (layer->GetCompositingState()) { - case kPaintsIntoOwnBacking: - layer->GetCompositedLayerMapping()->SetNeedsCheckRasterInvalidation(); - break; - case kPaintsIntoGroupedBacking: - layer->GroupedMapping()->SetNeedsCheckRasterInvalidation(); - break; - case kNotComposited: - break; - } -} - -PaintLayerCompositor* PaintLayerCompositor::FrameContentsCompositor( - const LayoutEmbeddedContent& layout_object) { - const auto* element = - DynamicTo(layout_object.GetNode()); - if (!element) - return nullptr; - - if (Document* content_document = element->contentDocument()) { - if (auto* view = content_document->GetLayoutView()) - return view->Compositor(); - } - return nullptr; -} - -PaintLayer* PaintLayerCompositor::RootLayer() const { - return layout_view_->Layer(); -} - -GraphicsLayer* PaintLayerCompositor::RootGraphicsLayer() const { - if (CompositedLayerMapping* clm = RootLayer()->GetCompositedLayerMapping()) - return clm->MainGraphicsLayer(); - return nullptr; -} - -GraphicsLayer* PaintLayerCompositor::PaintRootGraphicsLayer() const { - // Shortcut: skip the fullscreen checks for popups. - Document& doc = layout_view_->GetDocument(); - if (doc.GetPage()->GetChromeClient().IsPopup()) - return RootGraphicsLayer(); - - // Start from the full screen overlay layer if exists. Other layers will be - // skipped during painting. - if (PaintLayer* layer = - layout_view_->GetFrameView()->GetFullScreenOverlayLayer()) { - if (layer->HasCompositedLayerMapping()) - return layer->GetCompositedLayerMapping()->MainGraphicsLayer(); - } - - return RootGraphicsLayer(); -} - -// If an element has composited negative z-index children, those children paint -// in front of the layer background, so we need an extra 'contents' layer for -// the foreground of the layer object. -bool PaintLayerCompositor::NeedsContentsCompositingLayer( - const PaintLayer* layer) const { - return layer->IsStackingContextWithNegativeZOrderChildren(); -} - -static void UpdateTrackingRasterInvalidationsRecursive( - GraphicsLayer* graphics_layer) { - if (!graphics_layer) - return; - - graphics_layer->UpdateTrackingRasterInvalidations(); - - for (wtf_size_t i = 0; i < graphics_layer->Children().size(); ++i) - UpdateTrackingRasterInvalidationsRecursive(graphics_layer->Children()[i]); -} - -void PaintLayerCompositor::UpdateTrackingRasterInvalidations() { -#if DCHECK_IS_ON() - DCHECK(Lifecycle().GetState() == DocumentLifecycle::kPaintClean || - layout_view_->GetFrameView()->ShouldThrottleRendering()); -#endif - - if (GraphicsLayer* root_layer = PaintRootGraphicsLayer()) - UpdateTrackingRasterInvalidationsRecursive(root_layer); -} - -void PaintLayerCompositor::SetOwnerNeedsCompositingInputsUpdate() { - if (HTMLFrameOwnerElement* owner_element = - layout_view_->GetDocument().LocalOwner()) { - LayoutBoxModelObject* layout_object = - owner_element->GetLayoutBoxModelObject(); - if (!layout_object || !layout_object->HasLayer()) - return; - layout_object->Layer()->SetNeedsCompositingInputsUpdate(); - } -} - -Page* PaintLayerCompositor::GetPage() const { - return layout_view_->GetFrameView()->GetFrame().GetPage(); -} - -DocumentLifecycle& PaintLayerCompositor::Lifecycle() const { - return layout_view_->GetDocument().Lifecycle(); -} - -bool PaintLayerCompositor::IsMainFrame() const { - return layout_view_->GetFrame()->IsMainFrame(); -} - -void PaintLayerCompositor::Trace(Visitor* visitor) const { - visitor->Trace(layout_view_); - visitor->Trace(compositing_inputs_root_); -} - -} // namespace blink diff --git a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h b/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h deleted file mode 100644 index 2a19ab8b080974..00000000000000 --- a/third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2009 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ - -#include "base/dcheck_is_on.h" -#include "base/gtest_prod_util.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/dom/document_lifecycle.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_inputs_root.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" -#include "third_party/blink/renderer/core/paint/compositing/compositing_update_type.h" -#include "third_party/blink/renderer/platform/heap/handle.h" - -namespace blink { - -class PaintLayer; -class GraphicsLayer; -class LayoutEmbeddedContent; -class LayoutView; -class Page; -class Scrollbar; - -enum CompositingStateTransitionType { - kNoCompositingStateChange, - kAllocateOwnCompositedLayerMapping, - kRemoveOwnCompositedLayerMapping, - kPutInSquashingLayer, - kRemoveFromSquashingLayer -}; - -// PaintLayerCompositor maintains document-level compositing state and is the -// entry point of the "compositing update" lifecycle stage. There is one PLC -// per LayoutView. -// -// The compositing update, implemented by PaintLayerCompositor and friends, -// decides for each PaintLayer whether it should get a CompositedLayerMapping, -// and asks each CLM to set up its GraphicsLayers. -// -// With CompositeAfterPaint, PaintLayerCompositor will be eventually replaced by -// PaintArtifactCompositor. - -class CORE_EXPORT PaintLayerCompositor final - : public GarbageCollected { - public: - explicit PaintLayerCompositor(LayoutView&); - ~PaintLayerCompositor(); - - // Called while the LocalFrame behind the LayoutView is being detached. - // Pointers in other objects should be cleaned up at this point, before - // pointers out of this object become invalid. - void CleanUp(); - - void UpdateInputsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state); - void UpdateAssignmentsIfNeededRecursive( - DocumentLifecycle::LifecycleState target_state); - - // Return true if this LayoutView is in "compositing mode" (i.e. has one or - // more composited Layers) - bool InCompositingMode() const; - // FIXME: Replace all callers with inCompositingMode and remove this function. - bool StaleInCompositingMode() const; - // This will make a compositing layer at the root automatically, and hook up - // to the native view/window system. - void SetCompositingModeEnabled(bool); - - // Notifies about changes to PreferCompositingToLCDText or - // AcceleratedCompositing. - void UpdateAcceleratedCompositingSettings(); - - // Used to indicate that a compositing update will be needed for the next - // frame that gets drawn. If called from before the compositing inputs - // step has run, and the type is > kCompositingUpdateNone, compositing - // inputs will be re-computed. If called during pre-paint (which is after - // compositing inputs and before the rest of compositing), it will cause - // the rest of compositing to run, but not compositing inputs. - void SetNeedsCompositingUpdate(CompositingUpdateType); - - // Whether the given layer needs an extra 'contents' layer. - bool NeedsContentsCompositingLayer(const PaintLayer*) const; - - // Issue paint invalidations of the appropriate layers when the given Layer - // starts or stops being composited. - static void PaintInvalidationOnCompositingChange(PaintLayer*); - - PaintLayer* RootLayer() const; - - // The LayoutView's main GraphicsLayer. - GraphicsLayer* RootGraphicsLayer() const; - - // Returns the GraphicsLayer we should start painting from. This can differ - // from above in some cases, e.g. when the RootGraphicsLayer is detached and - // swapped out for an overlay video or immersive-ar DOM overlay layer. - GraphicsLayer* PaintRootGraphicsLayer() const; - - static PaintLayerCompositor* FrameContentsCompositor( - const LayoutEmbeddedContent&); - - void UpdateTrackingRasterInvalidations(); - - DocumentLifecycle& Lifecycle() const; - - void ClearRootLayerAttachmentDirty() { root_layer_attachment_dirty_ = false; } - - PaintLayer* GetCompositingInputsRoot() { - return compositing_inputs_root_.Get(); - } - - void ClearCompositingInputsRoot() { compositing_inputs_root_.Clear(); } - - void UpdateCompositingInputsRoot(PaintLayer* layer) { - compositing_inputs_root_.Update(layer); - } - - void Trace(Visitor*) const; - - private: -#if DCHECK_IS_ON() - void AssertNoUnresolvedDirtyBits(); -#endif - - void UpdateAssignmentsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state); - void UpdateInputsIfNeededRecursiveInternal( - DocumentLifecycle::LifecycleState target_state); - - void UpdateAssignmentsIfNeeded( - DocumentLifecycle::LifecycleState target_state); - - void SetOwnerNeedsCompositingInputsUpdate(); - - Page* GetPage() const; - - // Checks the given graphics layer against the compositor's horizontal and - // vertical scrollbar graphics layers, returning the associated Scrollbar - // instance if any, else nullptr. - Scrollbar* GraphicsLayerToScrollbar(const GraphicsLayer*) const; - - bool IsMainFrame() const; - - Member layout_view_; - - bool compositing_ = false; - bool root_layer_attachment_dirty_ = false; - - // After initialization, compositing updates must be done, so start dirty. - CompositingUpdateType pending_update_type_ = - kCompositingUpdateAfterCompositingInputChange; - - CompositingInputsRoot compositing_inputs_root_; - - FRIEND_TEST_ALL_PREFIXES(FrameThrottlingTest, - IntersectionObservationOverridesThrottling); -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_COMPOSITING_PAINT_LAYER_COMPOSITOR_H_ diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index f95846392e519a..28f7ddfae07a88 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc @@ -76,7 +76,7 @@ #include "third_party/blink/renderer/core/paint/box_reflection_utils.h" #include "third_party/blink/renderer/core/paint/clip_path_clipper.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" #include "third_party/blink/renderer/core/paint/filter_effect_builder.h" #include "third_party/blink/renderer/core/paint/hit_testing_transform_state.h" #include "third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h" @@ -262,12 +262,6 @@ DOMNodeId PaintLayer::OwnerNodeId() const { return static_cast(GetLayoutObject()).OwnerNodeId(); } -PaintLayerCompositor* PaintLayer::Compositor() const { - if (!GetLayoutObject().View()) - return nullptr; - return GetLayoutObject().View()->Compositor(); -} - bool PaintLayer::PaintsWithFilters() const { if (!GetLayoutObject().HasFilterInducingProperty()) return false; @@ -995,11 +989,6 @@ void PaintLayer::SetNeedsCompositingInputsUpdate(bool mark_ancestor_flags) { MarkAncestorChainForFlagsUpdate(kNeedsDescendantDependentUpdate); } -void PaintLayer::SetNeedsGraphicsLayerRebuild() { - if (Compositor()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); -} - void PaintLayer::SetNeedsVisualOverflowRecalc() { DCHECK(IsSelfPaintingLayer()); #if DCHECK_IS_ON() @@ -1071,12 +1060,6 @@ void PaintLayer::AddChild(PaintLayer* child, PaintLayer* before_child) { SetNeedsCompositingInputsUpdate(); - if (Compositor()) { - if (!child->GetLayoutObject().IsStacked() && - !GetLayoutObject().DocumentBeingDestroyed()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - } - if (child->GetLayoutObject().IsStacked() || child->FirstChild()) { // Dirty the z-order list in which we are contained. The // ancestorStackingContextNode() can be null in the case where we're @@ -1120,13 +1103,6 @@ void PaintLayer::RemoveChild(PaintLayer* old_child) { last_ = old_child->PreviousSibling(); if (!GetLayoutObject().DocumentBeingDestroyed()) { - if (Compositor()) { - if (!old_child->GetLayoutObject().IsStacked()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); - - if (Compositor()->GetCompositingInputsRoot() == old_child) - Compositor()->ClearCompositingInputsRoot(); - } // Dirty the z-order list in which we are contained. old_child->DirtyStackingContextZOrderLists(); SetNeedsCompositingInputsUpdate(); @@ -1171,27 +1147,7 @@ void PaintLayer::RemoveOnlyThisLayerAfterStyleChange( } } - bool did_set_paint_invalidation = false; - if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - // Destructing PaintLayer would cause CompositedLayerMapping and composited - // layers to be destructed and detach from layer tree immediately. Layers - // could have dangling scroll/clip parent if compositing update were - // omitted. - if (LocalFrameView* frame_view = layout_object_->GetDocument().View()) - frame_view->SetNeedsForcedCompositingUpdate(); - - if (IsPaintInvalidationContainer()) { - // Our children will be reparented and contained by a new paint - // invalidation container, so need paint invalidation. CompositingUpdate - // can't see this layer (which has been removed) so won't do this for us. - ObjectPaintInvalidator(GetLayoutObject()) - .InvalidatePaintIncludingNonCompositingDescendants(); - GetLayoutObject().SetSubtreeShouldDoFullPaintInvalidation(); - did_set_paint_invalidation = true; - } - } - - if (!did_set_paint_invalidation && IsSelfPaintingLayer()) { + if (IsSelfPaintingLayer()) { if (PaintLayer* enclosing_self_painting_layer = parent_->EnclosingSelfPaintingLayer()) enclosing_self_painting_layer->MergeNeedsPaintPhaseFlagsFrom(*this); @@ -1401,8 +1357,6 @@ void PaintLayer::UpdateScrollableArea() { // To clear z-ordering information of overlay overflow controls. if (NeedsReorderOverlayOverflowControls()) DirtyStackingContextZOrderLists(); - if (auto* compositor = Compositor()) - compositor->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } bool PaintLayer::HasOverflowControls() const { @@ -2776,10 +2730,6 @@ ScrollingCoordinator* PaintLayer::GetScrollingCoordinator() { return (!page) ? nullptr : page->GetScrollingCoordinator(); } -bool PaintLayer::CompositesWithTransform() const { - return TransformAncestor() || Transform(); -} - bool PaintLayer::ShouldBeSelfPaintingLayer() const { return GetLayoutObject().LayerTypeRequired() == kNormalPaintLayer || (scrollable_area_ && scrollable_area_->HasOverlayOverflowControls()) || diff --git a/third_party/blink/renderer/core/paint/paint_layer.h b/third_party/blink/renderer/core/paint/paint_layer.h index 4501490463a987..2ac2d73865328b 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.h +++ b/third_party/blink/renderer/core/paint/paint_layer.h @@ -73,7 +73,6 @@ class FilterEffect; class FilterOperations; class HitTestResult; class HitTestingTransformState; -class PaintLayerCompositor; class PaintLayerScrollableArea; class ScrollingCoordinator; class TransformationMatrix; @@ -287,8 +286,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, bool IsRootLayer() const { return is_root_layer_; } - PaintLayerCompositor* Compositor() const; - bool UpdateSize(); void UpdateSizeAndScrollingAfterLayout(); @@ -536,9 +533,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, // any. Otherwise nullptr. ScrollingCoordinator* GetScrollingCoordinator(); - // Returns true if the element or any ancestor is transformed. - bool CompositesWithTransform() const; - bool PaintsWithTransform(GlobalPaintFlags) const; bool PaintsIntoOwnBacking(GlobalPaintFlags) const; bool PaintsIntoOwnOrGroupedBacking(GlobalPaintFlags) const; @@ -646,10 +640,6 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, void SetNeedsVisualOverflowRecalc(); void SetNeedsCompositingInputsUpdate(bool mark_ancestor_flags = true); - // Notifies the Compositor if one exists that it should rebuild the graphics - // layer tree. - void SetNeedsGraphicsLayerRebuild(); - void UpdateAncestorScrollContainerLayer( const PaintLayer* ancestor_scroll_container_layer) { ancestor_scroll_container_layer_ = ancestor_scroll_container_layer; @@ -660,20 +650,14 @@ class CORE_EXPORT PaintLayer : public GarbageCollected, const gfx::Rect ClippedAbsoluteBoundingBox() const; const gfx::Rect UnclippedAbsoluteBoundingBox() const; - const PaintLayer* OpacityAncestor() const { return nullptr; } - const PaintLayer* TransformAncestor() const { return nullptr; } - const PaintLayer* FilterAncestor() const { return nullptr; } + // TODO(pdr): Remove this. const LayoutBoxModelObject* ClippingContainer() const { return nullptr; } const PaintLayer* AncestorScrollContainerLayer() const { return ancestor_scroll_container_layer_; } + // TODO(pdr): Remove this. const PaintLayer* AncestorScrollingLayer() const { return nullptr; } - const PaintLayer* NearestFixedPositionLayer() const { return nullptr; } const PaintLayer* ScrollParent() const { return nullptr; } - const PaintLayer* ClipParent() const { return nullptr; } - const PaintLayer* NearestContainedLayoutLayer() const { return nullptr; } - const PaintLayer* ClipPathAncestor() const { return nullptr; } - const PaintLayer* MaskAncestor() const { return nullptr; } bool HasFixedPositionDescendant() const { DCHECK(!needs_descendant_dependent_flags_update_); diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc index 9a9a6355117deb..c8ab00bc8881cd 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc @@ -94,7 +94,7 @@ #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.h" #include "third_party/blink/renderer/core/page/scrolling/top_document_root_scroller_controller.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" +#include "third_party/blink/renderer/core/paint/compositing/compositing_reason_finder.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer_fragment.h" @@ -523,13 +523,9 @@ void PaintLayerScrollableArea::UpdateScrollOffset( frame_view->SetNeedsUpdateGeometries(); } - if (RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) { - if (auto* scrolling_coordinator = GetScrollingCoordinator()) { - if (!scrolling_coordinator->UpdateCompositorScrollOffset(*frame, *this)) - GetLayoutBox()->GetFrameView()->SetPaintArtifactCompositorNeedsUpdate(); - } - } else { - UpdateCompositingLayersAfterScroll(); + if (auto* scrolling_coordinator = GetScrollingCoordinator()) { + if (!scrolling_coordinator->UpdateCompositorScrollOffset(*frame, *this)) + GetLayoutBox()->GetFrameView()->SetPaintArtifactCompositorNeedsUpdate(); } // The ScrollOffsetTranslation paint property depends on the scroll offset. @@ -2445,44 +2441,6 @@ void PaintLayerScrollableArea::UpdateScrollableAreaSet() { layer_->DidUpdateScrollsOverflow(); } -void PaintLayerScrollableArea::UpdateCompositingLayersAfterScroll() { - DCHECK(!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()); - - PaintLayerCompositor* compositor = GetLayoutBox()->View()->Compositor(); - if (!compositor || !compositor->InCompositingMode()) - return; - - if (UsesCompositedScrolling()) { - DCHECK(Layer()->HasCompositedLayerMapping()); - ScrollingCoordinator* scrolling_coordinator = GetScrollingCoordinator(); - bool handled_scroll = scrolling_coordinator && - scrolling_coordinator->UpdateCompositorScrollOffset( - *GetLayoutBox()->GetFrame(), *this); - - if (!handled_scroll) { - compositor->SetNeedsCompositingUpdate( - kCompositingUpdateAfterGeometryChange); - } - - // If we have fixed elements and we scroll the root layer we might - // change compositing since the fixed elements might now overlap a - // composited layer. - if (Layer()->IsRootLayer()) { - LocalFrame* frame = GetLayoutBox()->GetFrame(); - if (frame && frame->View()) { - LocalFrameView* view = frame->View(); - // The maximum possible overlap (for all possible scroll offsets) of the - // fixed content has been included in the overlap test, so we can skip - // the compositing update on scroll changes for fixed content. - // Sticky-pos content still needs a compositing inputs update for - // overlap testing. - if (view->HasStickyViewportConstrainedObject()) - Layer()->SetNeedsCompositingInputsUpdate(); - } - } - } -} - ScrollingCoordinator* PaintLayerScrollableArea::GetScrollingCoordinator() const { LocalFrame* frame = GetLayoutBox()->GetFrame(); diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h index a08299c3f08ed2..3a8b14bbe86875 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h +++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h @@ -700,8 +700,6 @@ class CORE_EXPORT PaintLayerScrollableArea final void UpdateScrollableAreaSet(); - void UpdateCompositingLayersAfterScroll(); - ScrollingCoordinator* GetScrollingCoordinator() const; PaintLayerScrollableAreaRareData* RareData() { return rare_data_; } diff --git a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc index fdf79375b7c799..c066b2b4683e34 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.cc @@ -52,7 +52,6 @@ #include "third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -66,13 +65,6 @@ PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer* layer) DCHECK(layer->GetLayoutObject().IsStackingContext()); } -PaintLayerCompositor* PaintLayerStackingNode::Compositor() const { - DCHECK(layer_->GetLayoutObject().View()); - if (!layer_->GetLayoutObject().View()) - return nullptr; - return layer_->GetLayoutObject().View()->Compositor(); -} - void PaintLayerStackingNode::DirtyZOrderLists() { #if DCHECK_IS_ON() DCHECK(layer_->LayerListMutationAllowed()); @@ -90,9 +82,6 @@ void PaintLayerStackingNode::DirtyZOrderLists() { overlay_overflow_controls_reordered_list_.clear(); z_order_lists_dirty_ = true; - - if (!layer_->GetLayoutObject().DocumentBeingDestroyed() && Compositor()) - Compositor()->SetNeedsCompositingUpdate(kCompositingUpdateRebuildTree); } static bool ZIndexLessThan(const PaintLayer* first, const PaintLayer* second) { @@ -318,14 +307,6 @@ bool PaintLayerStackingNode::StyleDidChange(PaintLayer& paint_layer, if (paint_layer.StackingNode()) paint_layer.StackingNode()->DirtyZOrderLists(); - - if (was_stacked != should_be_stacked) { - if (!paint_layer.GetLayoutObject().DocumentBeingDestroyed() && - !paint_layer.IsRootLayer() && paint_layer.Compositor()) { - paint_layer.Compositor()->SetNeedsCompositingUpdate( - kCompositingUpdateRebuildTree); - } - } return true; } diff --git a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h index 041d8e2c28c199..fe72eae6be0bb8 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h +++ b/third_party/blink/renderer/core/paint/paint_layer_stacking_node.h @@ -54,7 +54,6 @@ namespace blink { class PaintLayer; -class PaintLayerCompositor; class ComputedStyle; // This class is only for PaintLayer, PaintLayerPaintOrderIterator and @@ -138,8 +137,6 @@ class CORE_EXPORT PaintLayerStackingNode struct HighestLayers; void CollectLayers(PaintLayer&, HighestLayers*); - PaintLayerCompositor* Compositor() const; - Member layer_; // Holds a sorted list of all the descendant nodes within that have z-indices diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 215f4183bc39b5..658df0bd5ea39b 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc @@ -27,7 +27,6 @@ #include "third_party/blink/renderer/core/page/link_highlight.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/cull_rect_updater.h" #include "third_party/blink/renderer/core/paint/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc index 807a61f3c70bdd..f004a76fa76738 100644 --- a/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc +++ b/third_party/blink/renderer/core/scheduler_integration_tests/frame_throttling_test.cc @@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/page/focus_controller.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/resize_observer/resize_observer.h" diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.cc b/third_party/blink/renderer/core/svg/graphics/svg_image.cc index 0bd3c0828159c9..59bd246a963916 100644 --- a/third_party/blink/renderer/core/svg/graphics/svg_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/svg_image.cc @@ -564,11 +564,6 @@ sk_sp SVGImage::PaintRecordForCurrentFrame( return view->GetPaintRecord(); } - // TODO(crbug.com/1203406): This works around the bug. We may want to find - // and fix the root cause, or do nothing until pre-CAP code is removed. - if (!view->GetLayoutView() || !view->GetLayoutView()->Compositor()) - return nullptr; - view->UpdateAllLifecyclePhasesExceptPaint(DocumentUpdateReason::kSVGImage); PaintController::CycleScope cycle_scope(*paint_controller_, view->PaintDebugInfoEnabled()); diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc index d3b3efb4cd3272..acac2f052d47c1 100644 --- a/third_party/blink/renderer/core/testing/internals.cc +++ b/third_party/blink/renderer/core/testing/internals.cc @@ -133,7 +133,6 @@ #include "third_party/blink/renderer/core/page/validation_message_client.h" #include "third_party/blink/renderer/core/page/viewport_description.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/probe/core_probes.h" diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc index 28dc568c1640b0..7dcaab9dcb4b5a 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc @@ -12,7 +12,6 @@ #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h" -#include "third_party/blink/renderer/core/paint/compositing/paint_layer_compositor.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h" diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h index 4cabef1e0a568b..6d4eb4755c689e 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h @@ -111,9 +111,6 @@ class SynthesizedClip : private cc::ContentLayerClient { // // Owns a subtree of the compositor layer tree, and updates it in response to // changes in the paint artifact. -// -// PaintArtifactCompositor is the successor to PaintLayerCompositor, reflecting -// the new home of compositing decisions after paint with CompositeAfterPaint. class PLATFORM_EXPORT PaintArtifactCompositor final : private PropertyTreeManagerClient { USING_FAST_MALLOC(PaintArtifactCompositor); From 55a00ece73c158047e54a2d108c9020a702e9a7f Mon Sep 17 00:00:00 2001 From: chromium-internal-autoroll Date: Fri, 17 Dec 2021 01:36:09 +0000 Subject: [PATCH 37/71] Roll src-internal from 6b2cb689b53f to c2192b8adaae (2 revisions) https://chrome-internal.googlesource.com/chrome/src-internal.git/+log/6b2cb689b53f..c2192b8adaae If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://skia-autoroll.corp.goog/r/src-internal-chromium-autoroll Please CC yoichio@google.com,kelvinjiang@google.com on the revert to ensure that a human is aware of the problem. To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md Cq-Include-Trybots: luci.chrome.try:linux-chromeos-chrome Bug: None Tbr: yoichio@google.com,kelvinjiang@google.com Change-Id: If15c8158a56aa8fb0fc190e84b75254ab594d963 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346003 Commit-Queue: chromium-internal-autoroll Bot-Commit: chromium-internal-autoroll Cr-Commit-Position: refs/heads/main@{#952617} --- DEPS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEPS b/DEPS index 9ae9f0504721f8..7fd35c709ba4e4 100644 --- a/DEPS +++ b/DEPS @@ -1730,7 +1730,7 @@ deps = { Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@6b2cb689b53fd43f282594b87295a1ebcf675b0b', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c2192b8adaaef9fc4e1e51809e9b10599e0cf78d', 'condition': 'checkout_src_internal', }, From 94725217d2a6ed00c3189cf6640f2448fad96b20 Mon Sep 17 00:00:00 2001 From: Sonny Sasaka Date: Fri, 17 Dec 2021 01:37:30 +0000 Subject: [PATCH 38/71] [Floss] Add Floss experiment feature flag To prepare Floss for dogfood, an experiment flag for Floss is added so that regular users can try it out. Floss refers to the ongoing work to enable running the Android bluetooth stack on Chrome OS and Linux Bug: 189497491 Change-Id: I9d1b2603969f5a3c9fb8ea64f6ba8e0373b97b47 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3322030 Reviewed-by: Abhishek Pandit-Subedi Commit-Queue: Sonny Sasaka Cr-Commit-Position: refs/heads/main@{#952618} --- chrome/browser/about_flags.cc | 4 ++++ chrome/browser/flag-metadata.json | 5 +++++ chrome/browser/flag_descriptions.cc | 6 ++++++ chrome/browser/flag_descriptions.h | 3 +++ tools/metrics/histograms/enums.xml | 2 ++ 5 files changed, 20 insertions(+) diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 8fb19e911de86f..7164b37e7ad2d6 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -155,6 +155,7 @@ #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" #include "device/base/features.h" +#include "device/bluetooth/floss/floss_features.h" #include "device/fido/features.h" #include "device/gamepad/public/cpp/gamepad_features.h" #include "device/vr/buildflags/buildflags.h" @@ -3071,6 +3072,9 @@ const FeatureEntry kFeatureEntries[] = { {"bluetooth-wbs-dogfood", flag_descriptions::kBluetoothWbsDogfoodName, flag_descriptions::kBluetoothWbsDogfoodDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kBluetoothWbsDogfood)}, + {"bluetooth-use-floss", flag_descriptions::kBluetoothUseFlossName, + flag_descriptions::kBluetoothUseFlossDescription, kOsCrOS, + FEATURE_VALUE_TYPE(floss::features::kFlossEnabled)}, {"button-arc-network-diagnostics", flag_descriptions::kButtonARCNetworkDiagnosticsName, flag_descriptions::kButtonARCNetworkDiagnosticsDescription, kOsCrOS, diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 8a925641696f47..8c58a15bd07af2 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json @@ -567,6 +567,11 @@ "owners": [ "yudiliu", "chromeos-bluetooth@google.com" ], "expiry_milestone": 100 }, + { + "name": "bluetooth-use-floss", + "owners": ["sonnysasaka", "abhishekpandit", "chromeos-bluetooth@google.com"], + "expiry_milestone": 111 + }, { "name": "bluetooth-wbs-dogfood", "owners": [ "hychao" ], diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 64fbb67f8f0878..434579189e03bc 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc @@ -4151,6 +4151,12 @@ const char kBluetoothWbsDogfoodDescription[] = "or fully launched. Only on the few models that Bluetooth WBS is " "still stablizing this flag will take effect."; +const char kBluetoothUseFlossName[] = "Use Floss instead of BlueZ"; +const char kBluetoothUseFlossDescription[] = + "Enables using Floss (also known as Fluoride, Android's Bluetooth stack) " + "instead of Bluez. This is meant to be used by developers and is not " + "guaranteed to be stable"; + const char kButtonARCNetworkDiagnosticsName[] = "ARC Network Tests Button"; const char kButtonARCNetworkDiagnosticsDescription[] = "Enables the display of a button on the ARC Provisioning failure dialog " diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 0c8f014254cd84..2388d0a4a90a79 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h @@ -2392,6 +2392,9 @@ extern const char kBluetoothRevampDescription[]; extern const char kBluetoothWbsDogfoodName[]; extern const char kBluetoothWbsDogfoodDescription[]; +extern const char kBluetoothUseFlossName[]; +extern const char kBluetoothUseFlossDescription[]; + extern const char kButtonARCNetworkDiagnosticsName[]; extern const char kButtonARCNetworkDiagnosticsDescription[]; diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index a1cb340600e8cd..fecce9cbb5120e 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -50646,6 +50646,7 @@ from previous Chrome versions. + @@ -50784,6 +50785,7 @@ from previous Chrome versions. label="VmCameraMicIndicatorsAndNotifications:enabled"/> + From f4e2eb1f12e8ad086d3c8fd343de560558300a6c Mon Sep 17 00:00:00 2001 From: Sinan Sahin Date: Fri, 17 Dec 2021 01:38:47 +0000 Subject: [PATCH 39/71] [GMNext] Override android:textColorHint after applying dynamic colors The dynamic color overlay includes android:text* attributes, so once applied, it overrides our text colors defined in the theme. This makes the hint text color (e.g. text fields) too faint for a11y. So, this CL overrides android:textColorHint once again with the intended color. Bug: 1241971 Change-Id: I5261aa970cd23d6c91c695f5bdeab8d6547bf7cc Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3331191 Reviewed-by: Sky Malice Reviewed-by: Theresa Sullivan Commit-Queue: Sinan Sahin Cr-Commit-Position: refs/heads/main@{#952619} --- .../browser_ui/styles/android/java/res/values/themes.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/browser_ui/styles/android/java/res/values/themes.xml b/components/browser_ui/styles/android/java/res/values/themes.xml index 32bd90ffd34875..ce7e80ba6d7293 100644 --- a/components/browser_ui/styles/android/java/res/values/themes.xml +++ b/components/browser_ui/styles/android/java/res/values/themes.xml @@ -233,6 +233,11 @@ From 9929d96aea422527526e807b0e7a16d071c3acd0 Mon Sep 17 00:00:00 2001 From: Sinan Sahin Date: Fri, 17 Dec 2021 01:49:15 +0000 Subject: [PATCH 40/71] Revert "[GMNext] Make control_highlight_color dynamic" This reverts commit 185447e2f455b240cdcbf3d4b63fc75e4d04dfe3. Reason for revert: Potential culprit of crash Original change's description: > [GMNext] Make control_highlight_color dynamic > > Bug: 1228454 > Change-Id: Ibc5bdec72843ffa122c5687e4819a09a0742801b > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3327572 > Reviewed-by: Sky Malice > Reviewed-by: Theresa Sullivan > Commit-Queue: Sinan Sahin > Cr-Commit-Position: refs/heads/main@{#952223} Bug: 1228454 Change-Id: I025dfa951ffce584d066811925bbe40b15a1e747 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3346404 Bot-Commit: Rubber Stamper Reviewed-by: Ted Choc Commit-Queue: Sinan Sahin Cr-Commit-Position: refs/heads/main@{#952620} --- chrome/android/java/res/values/styles.xml | 2 +- .../browser/bookmarks/BookmarkSaveFlowMediator.java | 7 ++++--- components/browser_ui/styles/android/BUILD.gn | 1 - .../res/color-v29/default_control_color_highlight.xml | 9 --------- .../styles/android/java/res/values-night/colors.xml | 4 +--- .../browser_ui/styles/android/java/res/values/colors.xml | 7 +------ .../browser_ui/styles/android/java/res/values/dimens.xml | 1 - .../android/java/res/values/semantic_colors_dynamic.xml | 2 -- .../browser_ui/styles/android/java/res/values/styles.xml | 4 ++-- .../browser_ui/styles/android/java/res/values/themes.xml | 6 +++--- 10 files changed, 12 insertions(+), 31 deletions(-) delete mode 100644 components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml diff --git a/chrome/android/java/res/values/styles.xml b/chrome/android/java/res/values/styles.xml index f044866415a6d0..e5e65088243db2 100644 --- a/chrome/android/java/res/values/styles.xml +++ b/chrome/android/java/res/values/styles.xml @@ -125,7 +125,7 @@ @macro/default_text_color_link @android:color/black @macro/default_control_color_active - @macro/default_control_color_highlight + @color/control_highlight_color @style/SpinnerStyle @style/Widget.BrowserUI.TextInputLayout diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java index 7d0ce4d15df069..26a2606beabed5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediator.java @@ -8,7 +8,7 @@ import android.widget.CompoundButton; import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.content.res.ResourcesCompat; import org.chromium.base.Callback; import org.chromium.base.CallbackController; @@ -171,9 +171,10 @@ void setPriceTrackingNotificationUiEnabled(boolean enabled) { void setPriceTrackingIconForEnabledState(boolean enabled) { mPropertyModel.set(BookmarkSaveFlowProperties.NOTIFICATION_SWITCH_START_ICON, - AppCompatResources.getDrawable(mContext, + ResourcesCompat.getDrawable(mContext.getResources(), enabled ? R.drawable.price_tracking_enabled_filled - : R.drawable.price_tracking_disabled)); + : R.drawable.price_tracking_disabled, + /*theme=*/null)); } void destroy() { diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index b296042a2439b7..a8dcf9e4063068 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn @@ -23,7 +23,6 @@ android_library("java") { android_resources("java_resources") { sources = [ - "java/res/color-v29/default_control_color_highlight.xml", "java/res/color/default_icon_color_accent1_tint_list.xml", "java/res/color/default_icon_color_light_tint_list.xml", "java/res/color/default_icon_color_secondary_light_tint_list.xml", diff --git a/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml b/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml deleted file mode 100644 index 83d9240370b2b0..00000000000000 --- a/components/browser_ui/styles/android/java/res/color-v29/default_control_color_highlight.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/components/browser_ui/styles/android/java/res/values-night/colors.xml b/components/browser_ui/styles/android/java/res/values-night/colors.xml index b6b7e151fd56f1..5c5c4bbd2722c8 100644 --- a/components/browser_ui/styles/android/java/res/values-night/colors.xml +++ b/components/browser_ui/styles/android/java/res/values-night/colors.xml @@ -6,7 +6,5 @@ - - @color/default_control_color_highlight_dark - + @color/default_control_color_highlight_dark diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml index 059e4132092a49..312a0b11d534bf 100644 --- a/components/browser_ui/styles/android/java/res/values/colors.xml +++ b/components/browser_ui/styles/android/java/res/values/colors.xml @@ -19,14 +19,9 @@ - + @color/default_control_color_highlight_light - - - @color/default_control_color_highlight_baseline - @color/default_control_color_normal_light diff --git a/components/browser_ui/styles/android/java/res/values/dimens.xml b/components/browser_ui/styles/android/java/res/values/dimens.xml index f78a9414a5ad4c..680676022f58f4 100644 --- a/components/browser_ui/styles/android/java/res/values/dimens.xml +++ b/components/browser_ui/styles/android/java/res/values/dimens.xml @@ -20,5 +20,4 @@ 0.2 0.2 - 0.1 diff --git a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml index 656460013030d2..b7f3f27904f23b 100644 --- a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml +++ b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml @@ -8,7 +8,6 @@ ?attr/colorSurface ?attr/colorSurface ?attr/colorPrimary - @color/default_control_color_highlight ?attr/colorOnSurfaceVariant ?attr/colorOnSurface ?attr/colorPrimary @@ -23,7 +22,6 @@ @color/default_bg_color_baseline @color/default_bg_color_elev_0_baseline @color/default_control_color_active_baseline - @color/default_control_color_highlight_baseline @color/default_control_color_normal_baseline @color/default_icon_color_baseline @color/default_icon_color_accent1_baseline diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml index 1af4b85d230831..ab4e2a5b300019 100644 --- a/components/browser_ui/styles/android/java/res/values/styles.xml +++ b/components/browser_ui/styles/android/java/res/values/styles.xml @@ -102,7 +102,7 @@ @null 48dp @style/TextAppearance.TextLarge.Primary - @macro/default_control_color_highlight + @color/control_highlight_color