diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/weblayer/browser/android/metrics | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/weblayer/browser/android/metrics')
4 files changed, 113 insertions, 62 deletions
diff --git a/chromium/weblayer/browser/android/metrics/DEPS b/chromium/weblayer/browser/android/metrics/DEPS index d9ef433896d..44a37a03920 100644 --- a/chromium/weblayer/browser/android/metrics/DEPS +++ b/chromium/weblayer/browser/android/metrics/DEPS @@ -1,3 +1,4 @@ include_rules = [ "+components/metrics", + "+google_apis/google_api_keys.h", ] diff --git a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_accessor.h b/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_accessor.h deleted file mode 100644 index 173e5d51d13..00000000000 --- a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_accessor.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WEBLAYER_BROWSER_ANDROID_METRICS_WEBLAYER_METRICS_SERVICE_ACCESSOR_H_ -#define WEBLAYER_BROWSER_ANDROID_METRICS_WEBLAYER_METRICS_SERVICE_ACCESSOR_H_ - -#include <stdint.h> -#include <vector> - -#include "components/metrics/metrics_service_accessor.h" - -namespace weblayer { - -// This class limits and documents access to metrics service helper methods. -// Since these methods are private, each user has to be explicitly declared -// as a 'friend' below. -class WebLayerMetricsServiceAccessor : public metrics::MetricsServiceAccessor { - private: - // For RegisterSyntheticMultiGroupFieldTrial. - friend class WebLayerMetricsServiceClient; - - DISALLOW_IMPLICIT_CONSTRUCTORS(WebLayerMetricsServiceAccessor); -}; - -} // namespace weblayer - -#endif // WEBLAYER_BROWSER_ANDROID_METRICS_WEBLAYER_METRICS_SERVICE_ACCESSOR_H_
\ No newline at end of file diff --git a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.cc b/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.cc index 4c879a069be..569fe1d44e2 100644 --- a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.cc +++ b/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.cc @@ -8,14 +8,18 @@ #include <cstdint> #include <memory> +#include "base/base64.h" #include "base/no_destructor.h" -#include "base/strings/string_number_conversions.h" +#include "components/metrics/metrics_provider.h" #include "components/metrics/metrics_service.h" -#include "components/variations/hashing.h" -#include "components/variations/variations_associated_data.h" +#include "components/page_load_metrics/browser/metrics_web_contents_observer.h" #include "components/version_info/android/channel_getter.h" -#include "weblayer/browser/android/metrics/weblayer_metrics_service_accessor.h" +#include "content/public/browser/browser_context.h" +#include "google_apis/google_api_keys.h" +#include "weblayer/browser/browser_context_impl.h" #include "weblayer/browser/java/jni/MetricsServiceClient_jni.h" +#include "weblayer/browser/system_network_context_manager.h" +#include "weblayer/browser/tab_impl.h" namespace weblayer { @@ -40,6 +44,28 @@ const int kBetaDevCanarySampledInRatePerMille = 990; // consulting with the privacy team. const int kPackageNameLimitRatePerMille = 100; +// MetricsProvider that interfaces with page_load_metrics. +class PageLoadMetricsProvider : public metrics::MetricsProvider { + public: + PageLoadMetricsProvider() = default; + ~PageLoadMetricsProvider() override = default; + + // metrics:MetricsProvider implementation: + void OnAppEnterBackground() override { + auto tabs = TabImpl::GetAllTabImpl(); + for (auto* tab : tabs) { + page_load_metrics::MetricsWebContentsObserver* observer = + page_load_metrics::MetricsWebContentsObserver::FromWebContents( + tab->web_contents()); + if (observer) + observer->FlushMetricsOnAppEnterBackground(); + } + } + + private: + DISALLOW_COPY_AND_ASSIGN(PageLoadMetricsProvider); +}; + } // namespace // static @@ -49,47 +75,55 @@ WebLayerMetricsServiceClient* WebLayerMetricsServiceClient::GetInstance() { return client.get(); } -WebLayerMetricsServiceClient::WebLayerMetricsServiceClient() = default; -WebLayerMetricsServiceClient::~WebLayerMetricsServiceClient() = default; +WebLayerMetricsServiceClient::WebLayerMetricsServiceClient() { + ProfileImpl::AddProfileObserver(this); +} + +WebLayerMetricsServiceClient::~WebLayerMetricsServiceClient() { + ProfileImpl::RemoveProfileObserver(this); +} -void WebLayerMetricsServiceClient::RegisterSyntheticMultiGroupFieldTrial( - base::StringPiece trial_name, +void WebLayerMetricsServiceClient::RegisterExternalExperiments( const std::vector<int>& experiment_ids) { if (!GetMetricsService()) { if (!IsConsentDetermined()) { post_start_tasks_.push_back(base::BindOnce( - &WebLayerMetricsServiceClient::RegisterSyntheticMultiGroupFieldTrial, - base::Unretained(this), trial_name, experiment_ids)); + &WebLayerMetricsServiceClient::RegisterExternalExperiments, + base::Unretained(this), experiment_ids)); } return; } - std::vector<uint32_t> group_name_hashes; - group_name_hashes.reserve(experiment_ids.size()); - - variations::ActiveGroupId active_group; - active_group.name = variations::HashName(trial_name); - for (int experiment_id : experiment_ids) { - active_group.group = - variations::HashName(base::NumberToString(experiment_id)); - - // Since external experiments are not based on Chrome's low entropy source, - // they are only sent to Google web properties for signed in users to make - // sure that this couldn't be used to identify a user that's not signed in. - variations::AssociateGoogleVariationIDForceHashes( - variations::GOOGLE_WEB_PROPERTIES_SIGNED_IN, active_group, - static_cast<variations::VariationID>(experiment_id)); - group_name_hashes.push_back(active_group.group); - } - - WebLayerMetricsServiceAccessor::RegisterSyntheticMultiGroupFieldTrial( - GetMetricsService(), trial_name, group_name_hashes); + GetMetricsService()->synthetic_trial_registry()->RegisterExternalExperiments( + "WebLayerExperiments", experiment_ids, + variations::SyntheticTrialRegistry::kOverrideExistingIds); } int32_t WebLayerMetricsServiceClient::GetProduct() { return metrics::ChromeUserMetricsExtension::ANDROID_WEBLAYER; } +bool WebLayerMetricsServiceClient::IsExternalExperimentAllowlistEnabled() { + // RegisterExternalExperiments() is actually used to register experiment ids + // coming from the app embedding WebLayer itself, rather than externally. So + // the allowlist shouldn't be applied. + return false; +} + +bool WebLayerMetricsServiceClient::IsUkmAllowedForAllProfiles() { + for (auto* profile : ProfileImpl::GetAllProfiles()) { + if (!profile->GetBooleanSetting(SettingType::UKM_ENABLED)) + return false; + } + return true; +} + +std::string WebLayerMetricsServiceClient::GetUploadSigningKey() { + std::string decoded_key; + base::Base64Decode(google_apis::GetMetricsKey(), &decoded_key); + return decoded_key; +} + int WebLayerMetricsServiceClient::GetSampleRatePerMille() { version_info::Channel channel = version_info::android::GetChannel(); if (channel == version_info::Channel::STABLE || @@ -114,6 +148,38 @@ int WebLayerMetricsServiceClient::GetPackageNameLimitRatePerMille() { return kPackageNameLimitRatePerMille; } +void WebLayerMetricsServiceClient::RegisterAdditionalMetricsProviders( + metrics::MetricsService* service) { + service->RegisterMetricsProvider(std::make_unique<PageLoadMetricsProvider>()); +} + +bool WebLayerMetricsServiceClient::EnablePersistentHistograms() { + return true; +} + +bool WebLayerMetricsServiceClient::IsOffTheRecordSessionActive() { + for (auto* profile : ProfileImpl::GetAllProfiles()) { + if (profile->GetBrowserContext()->IsOffTheRecord()) + return true; + } + + return false; +} + +scoped_refptr<network::SharedURLLoaderFactory> +WebLayerMetricsServiceClient::GetURLLoaderFactory() { + return SystemNetworkContextManager::GetInstance() + ->GetSharedURLLoaderFactory(); +} + +void WebLayerMetricsServiceClient::ProfileCreated(ProfileImpl* profile) { + UpdateUkmService(); +} + +void WebLayerMetricsServiceClient::ProfileDestroyed(ProfileImpl* profile) { + UpdateUkmService(); +} + // static void JNI_MetricsServiceClient_SetHaveMetricsConsent(JNIEnv* env, jboolean user_consent, diff --git a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.h b/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.h index cc07ae5a02c..a25c0516ceb 100644 --- a/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.h +++ b/chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.h @@ -18,11 +18,13 @@ #include "components/metrics/metrics_service_client.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" +#include "weblayer/browser/profile_impl.h" namespace weblayer { class WebLayerMetricsServiceClient - : public ::metrics::AndroidMetricsServiceClient { + : public ::metrics::AndroidMetricsServiceClient, + public ProfileImpl::ProfileObserver { friend class base::NoDestructor<WebLayerMetricsServiceClient>; public: @@ -31,20 +33,30 @@ class WebLayerMetricsServiceClient WebLayerMetricsServiceClient(); ~WebLayerMetricsServiceClient() override; - void RegisterSyntheticMultiGroupFieldTrial( - base::StringPiece trial_name, - const std::vector<int>& experiment_ids); + void RegisterExternalExperiments(const std::vector<int>& experiment_ids); // metrics::MetricsServiceClient int32_t GetProduct() override; + bool IsExternalExperimentAllowlistEnabled() override; + bool IsUkmAllowedForAllProfiles() override; + std::string GetUploadSigningKey() override; // metrics::AndroidMetricsServiceClient: int GetSampleRatePerMille() override; void OnMetricsStart() override; void OnMetricsNotStarted() override; int GetPackageNameLimitRatePerMille() override; + void RegisterAdditionalMetricsProviders( + metrics::MetricsService* service) override; + bool EnablePersistentHistograms() override; + bool IsOffTheRecordSessionActive() override; + scoped_refptr<network::SharedURLLoaderFactory> GetURLLoaderFactory() override; private: + // ProfileImpl::ProfileObserver: + void ProfileCreated(ProfileImpl* profile) override; + void ProfileDestroyed(ProfileImpl* profile) override; + std::vector<base::OnceClosure> post_start_tasks_; DISALLOW_COPY_AND_ASSIGN(WebLayerMetricsServiceClient); |