summaryrefslogtreecommitdiff
path: root/chromium/weblayer/browser/android/metrics
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/weblayer/browser/android/metrics
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/weblayer/browser/android/metrics/DEPS1
-rw-r--r--chromium/weblayer/browser/android/metrics/weblayer_metrics_service_accessor.h28
-rw-r--r--chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.cc126
-rw-r--r--chromium/weblayer/browser/android/metrics/weblayer_metrics_service_client.h20
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);