Disallow timestamp query creation if disallow_unsafe_apis

Bug: chromium:1226078
Change-Id: I567522c5562d8cba616ef4315c91a0420d5146d6
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/59044
Reviewed-by: Hao Li <hao.x.li@intel.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/QuerySet.cpp b/src/dawn_native/QuerySet.cpp
index e8e3c90..598bac2 100644
--- a/src/dawn_native/QuerySet.cpp
+++ b/src/dawn_native/QuerySet.cpp
@@ -94,6 +94,12 @@
                     return DAWN_VALIDATION_ERROR("The timestamp query feature is not supported");
                 }
 
+                if (device->IsToggleEnabled(Toggle::DisallowUnsafeAPIs)) {
+                    return DAWN_VALIDATION_ERROR(
+                        "The timestamp query is disallowed because it may expose precise timing "
+                        "information");
+                }
+
                 if (descriptor->pipelineStatisticsCount != 0) {
                     return DAWN_VALIDATION_ERROR(
                         "The pipeline statistics should not be set if query type is Timestamp");
diff --git a/src/tests/unittests/validation/QueryValidationTests.cpp b/src/tests/unittests/validation/QueryValidationTests.cpp
index 53a650f..f7f8ce6 100644
--- a/src/tests/unittests/validation/QueryValidationTests.cpp
+++ b/src/tests/unittests/validation/QueryValidationTests.cpp
@@ -227,6 +227,7 @@
     WGPUDevice CreateTestDevice() override {
         dawn_native::DeviceDescriptor descriptor;
         descriptor.requiredExtensions.push_back("timestamp_query");
+        descriptor.forceDisabledToggles.push_back("disallow_unsafe_apis");
         return adapter.CreateDevice(&descriptor);
     }
 };
diff --git a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
index c5cab0f..7504bc9 100644
--- a/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
+++ b/src/tests/unittests/validation/UnsafeAPIValidationTests.cpp
@@ -191,6 +191,7 @@
     WGPUDevice CreateTestDevice() override {
         dawn_native::DeviceDescriptor descriptor;
         descriptor.requiredExtensions.push_back("pipeline_statistics_query");
+        descriptor.requiredExtensions.push_back("timestamp_query");
         descriptor.forceEnabledToggles.push_back("disallow_unsafe_apis");
         return adapter.CreateDevice(&descriptor);
     }
@@ -217,3 +218,21 @@
         ASSERT_DEVICE_ERROR(device.CreateQuerySet(&descriptor));
     }
 }
+
+// Check timestamp queries are disallowed.
+TEST_F(UnsafeQueryAPIValidationTest, TimestampQueryDisallowed) {
+    wgpu::QuerySetDescriptor descriptor;
+    descriptor.count = 1;
+
+    // Control case: occlusion query creation is allowed.
+    {
+        descriptor.type = wgpu::QueryType::Occlusion;
+        device.CreateQuerySet(&descriptor);
+    }
+
+    // Error case: timestamp query creation is disallowed.
+    {
+        descriptor.type = wgpu::QueryType::Timestamp;
+        ASSERT_DEVICE_ERROR(device.CreateQuerySet(&descriptor));
+    }
+}