820 lines
38 KiB
Diff
820 lines
38 KiB
Diff
|
From: uazo <uazo@users.noreply.github.com>
|
||
|
Date: Mon, 15 Nov 2021 09:43:29 +0000
|
||
|
Subject: Disable conversion measurement api
|
||
|
|
||
|
Disable Conversion Measurement API by disabling the flag and removing
|
||
|
support for the AttributionReporting provider. it also removes
|
||
|
the handling of attributions via intents between apps.
|
||
|
This patch enforces the deactivation by preventing the report from
|
||
|
being sent and being saved to disk, although it is currently in uncalled code.
|
||
|
|
||
|
Original License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
||
|
License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
|
||
|
---
|
||
|
chrome/android/java/AndroidManifest.xml | 1 -
|
||
|
components/attribution_reporting/features.cc | 4 +-
|
||
|
.../origin_trials/features.cc | 8 +-
|
||
|
.../render_view_context_menu_base.cc | 3 -
|
||
|
.../aggregatable_report_sender.cc | 15 +-
|
||
|
.../aggregation_service_features.cc | 4 +-
|
||
|
.../attribution_data_host_manager_impl.cc | 5 +
|
||
|
.../attribution_reporting/attribution_host.cc | 1 +
|
||
|
.../attribution_os_level_manager.cc | 1 +
|
||
|
.../attribution_report_network_sender.cc | 9 +
|
||
|
.../attribution_storage_sql.cc | 8 +-
|
||
|
content/browser/storage_partition_impl.cc | 9 -
|
||
|
content/public/android/BUILD.gn | 2 -
|
||
|
.../browser/AttributionOsLevelManager.java | 218 +-----------------
|
||
|
.../public/browser/content_browser_client.cc | 6 +-
|
||
|
.../public/browser/navigation_controller.cc | 1 -
|
||
|
content/public/common/content_features.cc | 4 +-
|
||
|
content/renderer/render_thread_impl.cc | 5 +-
|
||
|
.../attribution/request_headers_internal.cc | 1 +
|
||
|
.../network/public/cpp/attribution_utils.cc | 2 +
|
||
|
services/network/public/cpp/features.cc | 6 +-
|
||
|
third_party/blink/common/features.cc | 38 +--
|
||
|
.../platform/runtime_enabled_features.json5 | 7 +
|
||
|
ui/base/ui_base_features.cc | 2 +-
|
||
|
ui/events/android/motion_event_android.cc | 6 +-
|
||
|
25 files changed, 92 insertions(+), 274 deletions(-)
|
||
|
|
||
|
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
|
||
|
--- a/chrome/android/java/AndroidManifest.xml
|
||
|
+++ b/chrome/android/java/AndroidManifest.xml
|
||
|
@@ -39,7 +39,6 @@ by a child template that "extends" this file.
|
||
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
|
||
|
{% endif %}
|
||
|
|
||
|
- <uses-permission-sdk-23 android:name="android.permission.ACCESS_ADSERVICES_ATTRIBUTION" />
|
||
|
<uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
|
||
|
<uses-permission-sdk-23 android:name="android.permission.BLUETOOTH_CONNECT"/>
|
||
|
<!--
|
||
|
diff --git a/components/attribution_reporting/features.cc b/components/attribution_reporting/features.cc
|
||
|
--- a/components/attribution_reporting/features.cc
|
||
|
+++ b/components/attribution_reporting/features.cc
|
||
|
@@ -10,8 +10,8 @@ namespace attribution_reporting::features {
|
||
|
|
||
|
// Controls whether the Conversion Measurement API infrastructure is enabled.
|
||
|
BASE_FEATURE(kConversionMeasurement,
|
||
|
- "ConversionMeasurement",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "ConversionMeasurement", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
|
||
|
BASE_FEATURE(kAttributionReportingNullAggregatableReports,
|
||
|
"AttributionReportingNullAggregatableReports",
|
||
|
diff --git a/components/embedder_support/origin_trials/features.cc b/components/embedder_support/origin_trials/features.cc
|
||
|
--- a/components/embedder_support/origin_trials/features.cc
|
||
|
+++ b/components/embedder_support/origin_trials/features.cc
|
||
|
@@ -14,11 +14,11 @@ namespace embedder_support {
|
||
|
// Users from control group will have the feature disabled, excluding them
|
||
|
// from the origin trial.
|
||
|
BASE_FEATURE(kOriginTrialsSampleAPIThirdPartyAlternativeUsage,
|
||
|
- "OriginTrialsSampleAPIThirdPartyAlternativeUsage",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "OriginTrialsSampleAPIThirdPartyAlternativeUsage", // must be disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in Bromite
|
||
|
|
||
|
BASE_FEATURE(kConversionMeasurementAPIAlternativeUsage,
|
||
|
- "ConversionMeasurementAPIAlternativeUsage",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "ConversionMeasurementAPIAlternativeUsage", // must be disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in Bromite
|
||
|
|
||
|
} // namespace embedder_support
|
||
|
diff --git a/components/renderer_context_menu/render_view_context_menu_base.cc b/components/renderer_context_menu/render_view_context_menu_base.cc
|
||
|
--- a/components/renderer_context_menu/render_view_context_menu_base.cc
|
||
|
+++ b/components/renderer_context_menu/render_view_context_menu_base.cc
|
||
|
@@ -507,9 +507,6 @@ RenderViewContextMenuBase::GetOpenURLParamsWithExtraHeaders(
|
||
|
|
||
|
open_url_params.source_site_instance = site_instance_;
|
||
|
|
||
|
- if (disposition != WindowOpenDisposition::OFF_THE_RECORD)
|
||
|
- open_url_params.impression = params_.impression;
|
||
|
-
|
||
|
return open_url_params;
|
||
|
}
|
||
|
|
||
|
diff --git a/content/browser/aggregation_service/aggregatable_report_sender.cc b/content/browser/aggregation_service/aggregatable_report_sender.cc
|
||
|
--- a/content/browser/aggregation_service/aggregatable_report_sender.cc
|
||
|
+++ b/content/browser/aggregation_service/aggregatable_report_sender.cc
|
||
|
@@ -136,19 +136,18 @@ void AggregatableReportSender::SendReport(const GURL& url,
|
||
|
// Allow bodies of non-2xx responses to be returned.
|
||
|
simple_url_loader_ptr->SetAllowHttpErrorResults(true);
|
||
|
|
||
|
- // Unretained is safe because the URLLoader is owned by `this` and will be
|
||
|
- // deleted before `this`.
|
||
|
- simple_url_loader_ptr->DownloadHeadersOnly(
|
||
|
- url_loader_factory_.get(),
|
||
|
- base::BindOnce(&AggregatableReportSender::OnReportSent,
|
||
|
- base::Unretained(this), std::move(it),
|
||
|
- std::move(callback)));
|
||
|
+ // this is never called on Bromite but nothing would be sent if it were
|
||
|
+ OnReportSent(std::move(it), std::move(callback), nullptr);
|
||
|
}
|
||
|
|
||
|
void AggregatableReportSender::OnReportSent(
|
||
|
UrlLoaderList::iterator it,
|
||
|
ReportSentCallback callback,
|
||
|
- scoped_refptr<net::HttpResponseHeaders> headers) {
|
||
|
+ scoped_refptr<net::HttpResponseHeaders> headers) { // disable in Bromite
|
||
|
+ if ((true)) {
|
||
|
+ std::move(callback).Run(RequestStatus::kOk);
|
||
|
+ return;
|
||
|
+ }
|
||
|
RequestStatus status;
|
||
|
|
||
|
absl::optional<int> http_response_code;
|
||
|
diff --git a/content/browser/aggregation_service/aggregation_service_features.cc b/content/browser/aggregation_service/aggregation_service_features.cc
|
||
|
--- a/content/browser/aggregation_service/aggregation_service_features.cc
|
||
|
+++ b/content/browser/aggregation_service/aggregation_service_features.cc
|
||
|
@@ -7,8 +7,8 @@
|
||
|
namespace content {
|
||
|
|
||
|
BASE_FEATURE(kPrivacySandboxAggregationService,
|
||
|
- "PrivacySandboxAggregationService",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "PrivacySandboxAggregationService", // disabled by default
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in bromite
|
||
|
|
||
|
const base::FeatureParam<std::string>
|
||
|
kPrivacySandboxAggregationServiceTrustedServerUrlAwsParam{
|
||
|
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
|
||
|
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
|
||
|
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
|
||
|
@@ -500,6 +500,11 @@ void AttributionDataHostManagerImpl::ParseSource(
|
||
|
Registrar registrar) {
|
||
|
DCHECK(it != registrations_.end());
|
||
|
|
||
|
+ if ((true)) {
|
||
|
+ MaybeOnRegistrationsFinished(it);
|
||
|
+ return;
|
||
|
+ }
|
||
|
+
|
||
|
switch (registrar) {
|
||
|
case Registrar::kWeb:
|
||
|
if (!network::HasAttributionWebSupport(
|
||
|
diff --git a/content/browser/attribution_reporting/attribution_host.cc b/content/browser/attribution_reporting/attribution_host.cc
|
||
|
--- a/content/browser/attribution_reporting/attribution_host.cc
|
||
|
+++ b/content/browser/attribution_reporting/attribution_host.cc
|
||
|
@@ -360,6 +360,7 @@ void AttributionHost::RegisterNavigationDataHost(
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
+ if ((true)) return;
|
||
|
AttributionManager* attribution_manager =
|
||
|
AttributionManager::FromWebContents(web_contents());
|
||
|
DCHECK(attribution_manager);
|
||
|
diff --git a/content/browser/attribution_reporting/attribution_os_level_manager.cc b/content/browser/attribution_reporting/attribution_os_level_manager.cc
|
||
|
--- a/content/browser/attribution_reporting/attribution_os_level_manager.cc
|
||
|
+++ b/content/browser/attribution_reporting/attribution_os_level_manager.cc
|
||
|
@@ -51,6 +51,7 @@ ApiState GetApiState() {
|
||
|
|
||
|
// static
|
||
|
network::mojom::AttributionSupport AttributionOsLevelManager::GetSupport() {
|
||
|
+ if ((true)) return network::mojom::AttributionSupport::kNone;
|
||
|
bool is_web_allowed =
|
||
|
GetContentClient()->browser()->IsWebAttributionReportingAllowed();
|
||
|
switch (GetApiState()) {
|
||
|
diff --git a/content/browser/attribution_reporting/attribution_report_network_sender.cc b/content/browser/attribution_reporting/attribution_report_network_sender.cc
|
||
|
--- a/content/browser/attribution_reporting/attribution_report_network_sender.cc
|
||
|
+++ b/content/browser/attribution_reporting/attribution_report_network_sender.cc
|
||
|
@@ -89,6 +89,9 @@ void AttributionReportNetworkSender::SendReport(GURL url,
|
||
|
const std::string& body,
|
||
|
net::HttpRequestHeaders headers,
|
||
|
UrlLoaderCallback callback) {
|
||
|
+ // this is never called on Bromite but nothing would be sent if it were
|
||
|
+ if ((true)) return;
|
||
|
+
|
||
|
auto resource_request = std::make_unique<network::ResourceRequest>();
|
||
|
resource_request->url = std::move(url);
|
||
|
resource_request->headers = std::move(headers);
|
||
|
@@ -164,6 +167,12 @@ void AttributionReportNetworkSender::OnReportSent(
|
||
|
ReportSentCallback sent_callback,
|
||
|
UrlLoaderList::iterator it,
|
||
|
scoped_refptr<net::HttpResponseHeaders> headers) {
|
||
|
+ if ((true)) {
|
||
|
+ std::move(sent_callback)
|
||
|
+ .Run(std::move(report),
|
||
|
+ SendResult(SendResult::Status::kSent, headers ? headers->response_code() : 200));
|
||
|
+ return;
|
||
|
+ }
|
||
|
network::SimpleURLLoader* loader = it->get();
|
||
|
|
||
|
// Consider a non-200 HTTP code as a non-internal error.
|
||
|
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
|
||
|
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
|
||
|
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
|
||
|
@@ -692,14 +692,16 @@ StorableSource::Result DestinationRateLimitResultToStorableSourceResult(
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+bool g_run_in_memory = true;
|
||
|
+
|
||
|
} // namespace
|
||
|
|
||
|
AttributionStorageSql::AttributionStorageSql(
|
||
|
const base::FilePath& user_data_directory,
|
||
|
std::unique_ptr<AttributionStorageDelegate> delegate)
|
||
|
- : path_to_database_(user_data_directory.empty()
|
||
|
- ? base::FilePath()
|
||
|
- : DatabasePath(user_data_directory)),
|
||
|
+ : path_to_database_(user_data_directory.empty() || g_run_in_memory
|
||
|
+ ? base::FilePath()
|
||
|
+ : DatabasePath(user_data_directory)),
|
||
|
db_(sql::DatabaseOptions{.exclusive_locking = true,
|
||
|
.page_size = 4096,
|
||
|
.cache_size = 32}),
|
||
|
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
|
||
|
--- a/content/browser/storage_partition_impl.cc
|
||
|
+++ b/content/browser/storage_partition_impl.cc
|
||
|
@@ -1500,15 +1500,6 @@ void StoragePartitionImpl::Initialize(
|
||
|
|
||
|
bucket_manager_ = std::make_unique<BucketManager>(this);
|
||
|
|
||
|
- if (base::FeatureList::IsEnabled(
|
||
|
- attribution_reporting::features::kConversionMeasurement)) {
|
||
|
- // The Conversion Measurement API is not available in Incognito mode, but
|
||
|
- // this is enforced by the `AttributionManagerImpl` itself for better error
|
||
|
- // reporting and metrics.
|
||
|
- attribution_manager_ = std::make_unique<AttributionManagerImpl>(
|
||
|
- this, path, special_storage_policy_);
|
||
|
- }
|
||
|
-
|
||
|
if (base::FeatureList::IsEnabled(blink::features::kInterestGroupStorage)) {
|
||
|
// Auction worklets on non-Android use dedicated processes; on Android due
|
||
|
// to high cost of process launch they try to reuse renderers.
|
||
|
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
|
||
|
--- a/content/public/android/BUILD.gn
|
||
|
+++ b/content/public/android/BUILD.gn
|
||
|
@@ -180,8 +180,6 @@ android_library("content_full_java") {
|
||
|
"//third_party/androidx:androidx_appcompat_appcompat_resources_java",
|
||
|
"//third_party/androidx:androidx_collection_collection_java",
|
||
|
"//third_party/androidx:androidx_core_core_java",
|
||
|
- "//third_party/androidx:androidx_privacysandbox_ads_ads_adservices_java",
|
||
|
- "//third_party/androidx:androidx_privacysandbox_ads_ads_adservices_java_java",
|
||
|
"//third_party/blink/public:blink_headers_java",
|
||
|
"//third_party/blink/public/common:common_java",
|
||
|
"//third_party/blink/public/mojom:android_mojo_bindings_java",
|
||
|
diff --git a/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java b/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java
|
||
|
--- a/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java
|
||
|
+++ b/content/public/android/java/src/org/chromium/content/browser/AttributionOsLevelManager.java
|
||
|
@@ -12,17 +12,6 @@ import android.os.Process;
|
||
|
import android.view.MotionEvent;
|
||
|
|
||
|
import androidx.annotation.IntDef;
|
||
|
-import androidx.privacysandbox.ads.adservices.java.measurement.MeasurementManagerFutures;
|
||
|
-import androidx.privacysandbox.ads.adservices.measurement.DeletionRequest;
|
||
|
-import androidx.privacysandbox.ads.adservices.measurement.WebSourceParams;
|
||
|
-import androidx.privacysandbox.ads.adservices.measurement.WebSourceRegistrationRequest;
|
||
|
-import androidx.privacysandbox.ads.adservices.measurement.WebTriggerParams;
|
||
|
-import androidx.privacysandbox.ads.adservices.measurement.WebTriggerRegistrationRequest;
|
||
|
-
|
||
|
-import com.google.common.collect.ImmutableList;
|
||
|
-import com.google.common.util.concurrent.FutureCallback;
|
||
|
-import com.google.common.util.concurrent.Futures;
|
||
|
-import com.google.common.util.concurrent.ListenableFuture;
|
||
|
|
||
|
import org.chromium.base.ContextUtils;
|
||
|
import org.chromium.base.Log;
|
||
|
@@ -51,6 +40,8 @@ import java.util.concurrent.TimeoutException;
|
||
|
*/
|
||
|
@JNINamespace("content")
|
||
|
public class AttributionOsLevelManager {
|
||
|
+ private class MeasurementManagerFutures {}
|
||
|
+
|
||
|
private static final String TAG = "AttributionManager";
|
||
|
// TODO: replace with constant in android.Manifest.permission once it becomes available in U.
|
||
|
private static final String PERMISSION_ACCESS_ADSERVICES_ATTRIBUTION =
|
||
|
@@ -98,21 +89,11 @@ public class AttributionOsLevelManager {
|
||
|
}
|
||
|
|
||
|
private static boolean supportsAttribution() {
|
||
|
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R;
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
private MeasurementManagerFutures getManager() {
|
||
|
- if (sManagerForTesting != null) {
|
||
|
- return sManagerForTesting;
|
||
|
- }
|
||
|
- if (mManager != null) {
|
||
|
- return mManager;
|
||
|
- }
|
||
|
- if (!supportsAttribution()) {
|
||
|
- return null;
|
||
|
- }
|
||
|
- mManager = MeasurementManagerFutures.from(ContextUtils.getApplicationContext());
|
||
|
- return mManager;
|
||
|
+ return null;
|
||
|
}
|
||
|
|
||
|
private void onRegistrationCompleted(
|
||
|
@@ -137,46 +118,6 @@ public class AttributionOsLevelManager {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- private void addRegistrationFutureCallback(
|
||
|
- int requestId, @RegistrationType int type, ListenableFuture<?> future) {
|
||
|
- if (!supportsAttribution()) {
|
||
|
- return;
|
||
|
- }
|
||
|
- Futures.addCallback(future, new FutureCallback<Object>() {
|
||
|
- @Override
|
||
|
- public void onSuccess(Object result) {
|
||
|
- onRegistrationCompleted(requestId, type, RegistrationResult.SUCCESS);
|
||
|
- }
|
||
|
- @Override
|
||
|
- public void onFailure(Throwable thrown) {
|
||
|
- Log.w(TAG, "Failed to register", thrown);
|
||
|
- @RegistrationResult
|
||
|
- int result = RegistrationResult.ERROR_UNKNOWN;
|
||
|
- if (thrown instanceof IllegalArgumentException) {
|
||
|
- result = RegistrationResult.ERROR_ILLEGAL_ARGUMENT;
|
||
|
- } else if (thrown instanceof IOException) {
|
||
|
- result = RegistrationResult.ERROR_IO;
|
||
|
- } else if (thrown instanceof IllegalStateException) {
|
||
|
- // The Android API doesn't break out this error as a separate exception so we
|
||
|
- // are forced to inspect the message for now.
|
||
|
- if (thrown.getMessage().toLowerCase(Locale.US).contains("background")) {
|
||
|
- result = RegistrationResult.ERROR_BACKGROUND_CALLER;
|
||
|
- } else {
|
||
|
- result = RegistrationResult.ERROR_ILLEGAL_STATE;
|
||
|
- }
|
||
|
- } else if (thrown instanceof SecurityException) {
|
||
|
- result = RegistrationResult.ERROR_SECURITY;
|
||
|
- } else if (thrown instanceof TimeoutException) {
|
||
|
- result = RegistrationResult.ERROR_TIMEOUT;
|
||
|
- } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R
|
||
|
- && thrown instanceof LimitExceededException) {
|
||
|
- result = RegistrationResult.ERROR_LIMIT_EXCEEDED;
|
||
|
- }
|
||
|
- onRegistrationCompleted(requestId, type, result);
|
||
|
- }
|
||
|
- }, ContextUtils.getApplicationContext().getMainExecutor());
|
||
|
- }
|
||
|
-
|
||
|
/**
|
||
|
* Registers a web attribution source with native, see `registerWebSourceAsync()`:
|
||
|
* https://developer.android.com/reference/androidx/privacysandbox/ads/adservices/java/measurement/MeasurementManagerFutures.
|
||
|
@@ -189,19 +130,6 @@ public class AttributionOsLevelManager {
|
||
|
requestId, RegistrationType.SOURCE, RegistrationResult.ERROR_INTERNAL);
|
||
|
return;
|
||
|
}
|
||
|
- MeasurementManagerFutures mm = getManager();
|
||
|
- if (mm == null) {
|
||
|
- onRegistrationCompleted(
|
||
|
- requestId, RegistrationType.SOURCE, RegistrationResult.ERROR_INTERNAL);
|
||
|
- return;
|
||
|
- }
|
||
|
- ListenableFuture<?> future = mm.registerWebSourceAsync(new WebSourceRegistrationRequest(
|
||
|
- Arrays.asList(new WebSourceParams(
|
||
|
- Uri.parse(registrationUrl.getSpec()), isDebugKeyAllowed)),
|
||
|
- Uri.parse(topLevelOrigin.getSpec()), /*inputEvent=*/event,
|
||
|
- /*appDestination=*/null, /*webDestination=*/null,
|
||
|
- /*verifiedDestination=*/null));
|
||
|
- addRegistrationFutureCallback(requestId, RegistrationType.SOURCE, future);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -215,15 +143,6 @@ public class AttributionOsLevelManager {
|
||
|
requestId, RegistrationType.SOURCE, RegistrationResult.ERROR_INTERNAL);
|
||
|
return;
|
||
|
}
|
||
|
- MeasurementManagerFutures mm = getManager();
|
||
|
- if (mm == null) {
|
||
|
- onRegistrationCompleted(
|
||
|
- requestId, RegistrationType.SOURCE, RegistrationResult.ERROR_INTERNAL);
|
||
|
- return;
|
||
|
- }
|
||
|
- ListenableFuture<?> future =
|
||
|
- mm.registerSourceAsync(Uri.parse(registrationUrl.getSpec()), event);
|
||
|
- addRegistrationFutureCallback(requestId, RegistrationType.SOURCE, future);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -238,18 +157,6 @@ public class AttributionOsLevelManager {
|
||
|
requestId, RegistrationType.TRIGGER, RegistrationResult.ERROR_INTERNAL);
|
||
|
return;
|
||
|
}
|
||
|
-
|
||
|
- MeasurementManagerFutures mm = getManager();
|
||
|
- if (mm == null) {
|
||
|
- onRegistrationCompleted(
|
||
|
- requestId, RegistrationType.TRIGGER, RegistrationResult.ERROR_INTERNAL);
|
||
|
- return;
|
||
|
- }
|
||
|
- ListenableFuture<?> future = mm.registerWebTriggerAsync(new WebTriggerRegistrationRequest(
|
||
|
- Arrays.asList(new WebTriggerParams(
|
||
|
- Uri.parse(registrationUrl.getSpec()), isDebugKeyAllowed)),
|
||
|
- Uri.parse(topLevelOrigin.getSpec())));
|
||
|
- addRegistrationFutureCallback(requestId, RegistrationType.TRIGGER, future);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -263,15 +170,6 @@ public class AttributionOsLevelManager {
|
||
|
requestId, RegistrationType.TRIGGER, RegistrationResult.ERROR_INTERNAL);
|
||
|
return;
|
||
|
}
|
||
|
-
|
||
|
- MeasurementManagerFutures mm = getManager();
|
||
|
- if (mm == null) {
|
||
|
- onRegistrationCompleted(
|
||
|
- requestId, RegistrationType.TRIGGER, RegistrationResult.ERROR_INTERNAL);
|
||
|
- return;
|
||
|
- }
|
||
|
- ListenableFuture<?> future = mm.registerTriggerAsync(Uri.parse(registrationUrl.getSpec()));
|
||
|
- addRegistrationFutureCallback(requestId, RegistrationType.TRIGGER, future);
|
||
|
}
|
||
|
|
||
|
private void onDataDeletionCompleted(int requestId) {
|
||
|
@@ -296,77 +194,7 @@ public class AttributionOsLevelManager {
|
||
|
onDataDeletionCompleted(requestId);
|
||
|
return;
|
||
|
}
|
||
|
-
|
||
|
- // Currently Android and Chromium have different matching behaviors when both
|
||
|
- // `origins` and `domains` are empty.
|
||
|
- // Chromium: Delete -> Delete nothing; Preserve -> Delete all.
|
||
|
- // Android: Delete -> Delete all; Preserve -> Delete nothing.
|
||
|
- // Android may fix the behavior in the future. As a workaround, Chromium will
|
||
|
- // not call Android if it's to delete nothing (no-op), and call Android with
|
||
|
- // both Delete and Preserve modes if it's to delete all. These two modes will
|
||
|
- // be one no-op and one delete all in Android releases with and without the
|
||
|
- // fix. See crbug.com/1442967.
|
||
|
-
|
||
|
- ImmutableList<Integer> matchBehaviors = null;
|
||
|
-
|
||
|
- if (origins.length == 0 && domains.length == 0) {
|
||
|
- switch (matchBehavior) {
|
||
|
- case DeletionRequest.MATCH_BEHAVIOR_DELETE:
|
||
|
- onDataDeletionCompleted(requestId);
|
||
|
- return;
|
||
|
- case DeletionRequest.MATCH_BEHAVIOR_PRESERVE:
|
||
|
- matchBehaviors = ImmutableList.of(DeletionRequest.MATCH_BEHAVIOR_DELETE,
|
||
|
- DeletionRequest.MATCH_BEHAVIOR_PRESERVE);
|
||
|
- break;
|
||
|
- default:
|
||
|
- Log.e(TAG, "Received invalid match behavior: ", matchBehavior);
|
||
|
- onDataDeletionCompleted(requestId);
|
||
|
- return;
|
||
|
- }
|
||
|
- } else {
|
||
|
- matchBehaviors = ImmutableList.of(matchBehavior);
|
||
|
- }
|
||
|
-
|
||
|
- ArrayList<Uri> originUris = new ArrayList<Uri>(origins.length);
|
||
|
- for (GURL origin : origins) {
|
||
|
- originUris.add(Uri.parse(origin.getSpec()));
|
||
|
- }
|
||
|
-
|
||
|
- ArrayList<Uri> domainUris = new ArrayList<Uri>(domains.length);
|
||
|
- for (String domain : domains) {
|
||
|
- domainUris.add(Uri.parse(domain));
|
||
|
- }
|
||
|
-
|
||
|
- int numCalls = matchBehaviors.size();
|
||
|
-
|
||
|
- FutureCallback<Object> callback = new FutureCallback<Object>() {
|
||
|
- private int mNumPendingCalls = numCalls;
|
||
|
-
|
||
|
- private void onCall() {
|
||
|
- if (--mNumPendingCalls == 0) {
|
||
|
- onDataDeletionCompleted(requestId);
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
- @Override
|
||
|
- public void onSuccess(Object result) {
|
||
|
- onCall();
|
||
|
- }
|
||
|
- @Override
|
||
|
- public void onFailure(Throwable thrown) {
|
||
|
- Log.w(TAG, "Failed to delete measurement API data", thrown);
|
||
|
- onCall();
|
||
|
- }
|
||
|
- };
|
||
|
-
|
||
|
- for (int currMatchBehavior : matchBehaviors) {
|
||
|
- ListenableFuture<?> future = mm.deleteRegistrationsAsync(new DeletionRequest(
|
||
|
- deletionMode, currMatchBehavior, Instant.ofEpochMilli(startMs),
|
||
|
- Instant.ofEpochMilli(endMs), originUris, domainUris));
|
||
|
-
|
||
|
- Futures.addCallback(
|
||
|
- future, callback, ContextUtils.getApplicationContext().getMainExecutor());
|
||
|
- }
|
||
|
+ onDataDeletionCompleted(requestId);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
@@ -377,6 +205,10 @@ public class AttributionOsLevelManager {
|
||
|
private static void getMeasurementApiStatus() {
|
||
|
ThreadUtils.assertOnBackgroundThread();
|
||
|
|
||
|
+ if ((true)) {
|
||
|
+ AttributionOsLevelManagerJni.get().onMeasurementStateReturned(0);
|
||
|
+ return;
|
||
|
+ }
|
||
|
if (sManagerForTesting != null) {
|
||
|
AttributionOsLevelManagerJni.get().onMeasurementStateReturned(1);
|
||
|
return;
|
||
|
@@ -393,38 +225,6 @@ public class AttributionOsLevelManager {
|
||
|
AttributionOsLevelManagerJni.get().onMeasurementStateReturned(0);
|
||
|
return;
|
||
|
}
|
||
|
- MeasurementManagerFutures mm =
|
||
|
- MeasurementManagerFutures.from(ContextUtils.getApplicationContext());
|
||
|
- if (mm == null) {
|
||
|
- AttributionOsLevelManagerJni.get().onMeasurementStateReturned(0);
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
- ListenableFuture<Integer> future = null;
|
||
|
- try {
|
||
|
- future = mm.getMeasurementApiStatusAsync();
|
||
|
- } catch (IllegalStateException ex) {
|
||
|
- // An illegal state exception may be thrown for some versions of the underlying
|
||
|
- // Privacy Sandbox SDK.
|
||
|
- Log.i(TAG, "Failed to get measurement API status", ex);
|
||
|
- }
|
||
|
-
|
||
|
- if (future == null) {
|
||
|
- AttributionOsLevelManagerJni.get().onMeasurementStateReturned(0);
|
||
|
- return;
|
||
|
- }
|
||
|
-
|
||
|
- Futures.addCallback(future, new FutureCallback<Integer>() {
|
||
|
- @Override
|
||
|
- public void onSuccess(Integer status) {
|
||
|
- AttributionOsLevelManagerJni.get().onMeasurementStateReturned(status);
|
||
|
- }
|
||
|
- @Override
|
||
|
- public void onFailure(Throwable thrown) {
|
||
|
- Log.w(TAG, "Failed to get measurement API status", thrown);
|
||
|
- AttributionOsLevelManagerJni.get().onMeasurementStateReturned(0);
|
||
|
- }
|
||
|
- }, ContextUtils.getApplicationContext().getMainExecutor());
|
||
|
}
|
||
|
|
||
|
@CalledByNative
|
||
|
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
|
||
|
--- a/content/public/browser/content_browser_client.cc
|
||
|
+++ b/content/public/browser/content_browser_client.cc
|
||
|
@@ -560,17 +560,17 @@ bool ContentBrowserClient::IsAttributionReportingOperationAllowed(
|
||
|
}
|
||
|
|
||
|
bool ContentBrowserClient::IsWebAttributionReportingAllowed() {
|
||
|
- return true;
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
bool ContentBrowserClient::ShouldUseOsWebSourceAttributionReporting(
|
||
|
content::RenderFrameHost* rfh) {
|
||
|
- return true;
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
bool ContentBrowserClient::ShouldUseOsWebTriggerAttributionReporting(
|
||
|
content::RenderFrameHost* rfh) {
|
||
|
- return true;
|
||
|
+ return false;
|
||
|
}
|
||
|
|
||
|
bool ContentBrowserClient::IsSharedStorageAllowed(
|
||
|
diff --git a/content/public/browser/navigation_controller.cc b/content/public/browser/navigation_controller.cc
|
||
|
--- a/content/public/browser/navigation_controller.cc
|
||
|
+++ b/content/public/browser/navigation_controller.cc
|
||
|
@@ -40,7 +40,6 @@ NavigationController::LoadURLParams::LoadURLParams(const OpenURLParams& input)
|
||
|
blob_url_loader_factory(input.blob_url_loader_factory),
|
||
|
href_translate(input.href_translate),
|
||
|
reload_type(input.reload_type),
|
||
|
- impression(input.impression),
|
||
|
is_pdf(input.is_pdf) {
|
||
|
#if DCHECK_IS_ON()
|
||
|
DCHECK(input.Valid());
|
||
|
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
|
||
|
--- a/content/public/common/content_features.cc
|
||
|
+++ b/content/public/common/content_features.cc
|
||
|
@@ -648,8 +648,8 @@ BASE_FEATURE(kPrefetchNewLimits,
|
||
|
// FLEDGE, Topics, along with a number of other features actively in development
|
||
|
// within these APIs.
|
||
|
BASE_FEATURE(kPrivacySandboxAdsAPIsOverride,
|
||
|
- "PrivacySandboxAdsAPIsOverride",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+ "PrivacySandboxAdsAPIsOverride", // must be disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in bromite
|
||
|
|
||
|
// Enables Private Network Access checks for all types of web workers.
|
||
|
//
|
||
|
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
|
||
|
--- a/content/renderer/render_thread_impl.cc
|
||
|
+++ b/content/renderer/render_thread_impl.cc
|
||
|
@@ -885,6 +885,9 @@ void RenderThreadImpl::InitializeRenderer(
|
||
|
GetContentClient()->renderer()->DidSetUserAgent(user_agent);
|
||
|
user_agent_metadata_ = user_agent_metadata;
|
||
|
cors_exempt_header_list_ = cors_exempt_header_list;
|
||
|
+#if BUILDFLAG(IS_ANDROID)
|
||
|
+ attribution_support = network::mojom::AttributionSupport::kNone;
|
||
|
+#endif
|
||
|
attribution_support_ = attribution_support;
|
||
|
|
||
|
blink::WebVector<blink::WebString> web_cors_exempt_header_list(
|
||
|
@@ -1789,7 +1792,7 @@ RenderThreadImpl::GetAttributionReportingSupport() {
|
||
|
|
||
|
void RenderThreadImpl::SetAttributionReportingSupport(
|
||
|
network::mojom::AttributionSupport attribution_support) {
|
||
|
- attribution_support_ = attribution_support;
|
||
|
+ attribution_support_ = network::mojom::AttributionSupport::kNone;
|
||
|
}
|
||
|
|
||
|
std::unique_ptr<CodecFactory> RenderThreadImpl::CreateMediaCodecFactory(
|
||
|
diff --git a/services/network/attribution/request_headers_internal.cc b/services/network/attribution/request_headers_internal.cc
|
||
|
--- a/services/network/attribution/request_headers_internal.cc
|
||
|
+++ b/services/network/attribution/request_headers_internal.cc
|
||
|
@@ -189,6 +189,7 @@ std::string SerializeAttributionReportingEligibleHeader(
|
||
|
std::string GetAttributionSupportHeader(
|
||
|
mojom::AttributionSupport attribution_support,
|
||
|
const AttributionReportingHeaderGreaseOptions& options) {
|
||
|
+ if ((true)) return "";
|
||
|
std::vector<net::structured_headers::DictionaryMember> registrars;
|
||
|
|
||
|
const char* grease1;
|
||
|
diff --git a/services/network/public/cpp/attribution_utils.cc b/services/network/public/cpp/attribution_utils.cc
|
||
|
--- a/services/network/public/cpp/attribution_utils.cc
|
||
|
+++ b/services/network/public/cpp/attribution_utils.cc
|
||
|
@@ -9,6 +9,7 @@
|
||
|
namespace network {
|
||
|
|
||
|
bool HasAttributionOsSupport(mojom::AttributionSupport attribution_support) {
|
||
|
+ if ((true)) return false;
|
||
|
switch (attribution_support) {
|
||
|
case mojom::AttributionSupport::kOs:
|
||
|
case mojom::AttributionSupport::kWebAndOs:
|
||
|
@@ -20,6 +21,7 @@ bool HasAttributionOsSupport(mojom::AttributionSupport attribution_support) {
|
||
|
}
|
||
|
|
||
|
bool HasAttributionWebSupport(mojom::AttributionSupport attribution_support) {
|
||
|
+ if ((true)) return false;
|
||
|
switch (attribution_support) {
|
||
|
case mojom::AttributionSupport::kWeb:
|
||
|
case mojom::AttributionSupport::kWebAndOs:
|
||
|
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
|
||
|
--- a/services/network/public/cpp/features.cc
|
||
|
+++ b/services/network/public/cpp/features.cc
|
||
|
@@ -155,9 +155,9 @@ BASE_FEATURE(kAttributionReportingReportVerification,
|
||
|
|
||
|
// Gate access to Attribution Reporting cross app and web APIs that allow
|
||
|
// registering with a native attribution API.
|
||
|
-BASE_FEATURE(kAttributionReportingCrossAppWeb,
|
||
|
- "AttributionReportingCrossAppWeb",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+BASE_FEATURE(kAttributionReportingCrossAppWeb, // in bromite
|
||
|
+ "AttributionReportingCrossAppWeb", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
|
||
|
// Enables preprocessing requests with the Private State Tokens API Fetch flags
|
||
|
// set, and handling their responses, according to the protocol.
|
||
|
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
|
||
|
--- a/third_party/blink/common/features.cc
|
||
|
+++ b/third_party/blink/common/features.cc
|
||
|
@@ -36,14 +36,14 @@ BASE_FEATURE(kAcceleratedStaticBitmapImageSerialization,
|
||
|
|
||
|
// Enable the Protected Audience's reporting with ad macro API.
|
||
|
BASE_FEATURE(kAdAuctionReportingWithMacroApi,
|
||
|
- "AdAuctionReportingWithMacroApi",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "AdAuctionReportingWithMacroApi", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
|
||
|
// Controls the capturing of the Ad-Auction-Signals header, and the maximum
|
||
|
// allowed Ad-Auction-Signals header value.
|
||
|
BASE_FEATURE(kAdAuctionSignals,
|
||
|
- "AdAuctionSignals",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "AdAuctionSignals", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
const base::FeatureParam<int> kAdAuctionSignalsMaxSizeBytes{
|
||
|
&kAdAuctionSignals, "ad-auction-signals-max-size-bytes", 10000};
|
||
|
|
||
|
@@ -308,8 +308,8 @@ const base::FeatureParam<int> kBoostImagePriorityTightMediumLimit{
|
||
|
// https://github.com/patcg-individual-drafts/topics
|
||
|
// Kill switch for the Topics API.
|
||
|
BASE_FEATURE(kBrowsingTopics,
|
||
|
- "BrowsingTopics",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+ "BrowsingTopics", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
|
||
|
// If enabled, the check for whether the IP address is publicly routable will be
|
||
|
// bypassed when determining the eligibility for a page to be included in topics
|
||
|
@@ -324,14 +324,14 @@ BASE_FEATURE(kBrowsingTopicsBypassIPIsPubliclyRoutableCheck,
|
||
|
// either a valid Origin Trial token exists or `kPrivacySandboxAdsAPIsOverride`
|
||
|
// is enabled.)
|
||
|
BASE_FEATURE(kBrowsingTopicsDocumentAPI,
|
||
|
- "BrowsingTopicsDocumentAPI",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "BrowsingTopicsDocumentAPI", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
|
||
|
// Decoupled with the main `kBrowsingTopics` feature, so it allows us to
|
||
|
// decouple the server side configs.
|
||
|
BASE_FEATURE(kBrowsingTopicsParameters,
|
||
|
- "BrowsingTopicsParameters",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ "BrowsingTopicsParameters", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
// The number of epochs from where to calculate the topics to give to a
|
||
|
// requesting contexts.
|
||
|
const base::FeatureParam<int> kBrowsingTopicsNumberOfEpochsToExpose{
|
||
|
@@ -807,8 +807,8 @@ BASE_FEATURE(kFledge, "Fledge", base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
// See
|
||
|
// https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md
|
||
|
BASE_FEATURE(kFledgeBiddingAndAuctionServer,
|
||
|
- "FledgeBiddingAndAuctionServer",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+ "FledgeBiddingAndAuctionServer", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
const base::FeatureParam<std::string> kFledgeBiddingAndAuctionKeyURL{
|
||
|
&kFledgeBiddingAndAuctionServer, "FledgeBiddingAndAuctionKeyURL", ""};
|
||
|
|
||
|
@@ -973,8 +973,8 @@ const char kIntensiveWakeUpThrottling_GracePeriodSeconds_Name[] =
|
||
|
// Kill switch for the Interest Group API, i.e. if disabled, the
|
||
|
// API exposure will be disabled regardless of the OT config.
|
||
|
BASE_FEATURE(kInterestGroupStorage,
|
||
|
- "InterestGroupStorage",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+ "InterestGroupStorage", // disabled
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // by default
|
||
|
// TODO(crbug.com/1197209): Adjust these limits in response to usage.
|
||
|
const base::FeatureParam<int> kInterestGroupStorageMaxOwners{
|
||
|
&kInterestGroupStorage, "max_owners", 1000};
|
||
|
@@ -1403,16 +1403,16 @@ const base::FeatureParam<bool> kPrewarmFantasy = {&kPrewarmDefaultFontFamilies,
|
||
|
"prewarm_fantasy", false};
|
||
|
#endif
|
||
|
|
||
|
-BASE_FEATURE(kPrivacySandboxAdsAPIs,
|
||
|
- "PrivacySandboxAdsAPIs",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+BASE_FEATURE(kPrivacySandboxAdsAPIs, // disabled
|
||
|
+ "PrivacySandboxAdsAPIs", // by default
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in bromite
|
||
|
|
||
|
// Enables the Private Aggregation API. Note that this API also requires the
|
||
|
// `kPrivacySandboxAggregationService` to be enabled to successfully send
|
||
|
// reports.
|
||
|
BASE_FEATURE(kPrivateAggregationApi,
|
||
|
- "PrivateAggregationApi",
|
||
|
- base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
+ "PrivateAggregationApi", // disabled by default
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT); // in bromite
|
||
|
|
||
|
// Selectively allows the JavaScript API to be disabled in just one of the
|
||
|
// contexts. The Protected Audience param's name has not been updated (from
|
||
|
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
||
|
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
||
|
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
|
||
|
@@ -198,6 +198,13 @@
|
||
|
},
|
||
|
|
||
|
data: [
|
||
|
+ {
|
||
|
+ // disable by default features by marking as
|
||
|
+ // depends_on: ["DisabledForBromite"]
|
||
|
+ // to work is needed to remove "origin_trial_feature_name"
|
||
|
+ // and "origin_trial_allows_third_party"
|
||
|
+ name: "DisabledForBromite",
|
||
|
+ },
|
||
|
{
|
||
|
name: "AbortSignalAny",
|
||
|
status: "stable",
|
||
|
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc
|
||
|
--- a/ui/base/ui_base_features.cc
|
||
|
+++ b/ui/base/ui_base_features.cc
|
||
|
@@ -626,7 +626,7 @@ BASE_FEATURE(kMacClipboardWriteImageWithPng,
|
||
|
// We want to experiment with disabling it to align with CR2023 designs.
|
||
|
BASE_FEATURE(kCr2023MacFontSmoothing,
|
||
|
"Cr2023MacFontSmoothing",
|
||
|
- base::FEATURE_ENABLED_BY_DEFAULT);
|
||
|
+ base::FEATURE_DISABLED_BY_DEFAULT);
|
||
|
#endif
|
||
|
|
||
|
} // namespace features
|
||
|
diff --git a/ui/events/android/motion_event_android.cc b/ui/events/android/motion_event_android.cc
|
||
|
--- a/ui/events/android/motion_event_android.cc
|
||
|
+++ b/ui/events/android/motion_event_android.cc
|
||
|
@@ -162,7 +162,11 @@ int ToEventFlags(int meta_state, int button_state) {
|
||
|
}
|
||
|
|
||
|
base::TimeTicks FromAndroidTime(base::TimeTicks time) {
|
||
|
- ValidateEventTimeClock(&time);
|
||
|
+ base::TimeTicks timestamp;
|
||
|
+ // Rounding down to milliseconds (from nanoseconds)
|
||
|
+ // see https://bugs.chromium.org/p/chromium/issues/detail?id=1378615
|
||
|
+ timestamp = base::TimeTicks::FromUptimeMillis(time.ToUptimeMillis());
|
||
|
+ ValidateEventTimeClock(×tamp);
|
||
|
return time;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.25.1
|