Commit be2eb947 authored by Maks Orlovich's avatar Maks Orlovich Committed by Commit Bot

Instrument Keyboard.getLayoutMap for identifiability study.

This API is suspected to leak cross-site entropy about users.
This instrumentation reports digests of the values read using this API
to UKM to determine the available entropy of the API for identifying
users across sites.

Bug: 973801
Change-Id: I56a4002ae5ad4f1b0d56633a3ac74674b9f089be
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2434100Reviewed-by: default avatarGary Kacmarcik <garykac@chromium.org>
Reviewed-by: default avatarAsanka Herath <asanka@chromium.org>
Commit-Queue: Maksim Orlovich <morlovich@chromium.org>
Cr-Commit-Position: refs/heads/master@{#811818}
parent e83383e0
......@@ -5,6 +5,10 @@
#include "third_party/blink/renderer/modules/keyboard/keyboard_layout.h"
#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h"
#include "third_party/blink/public/common/privacy_budget/identifiability_study_settings.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_surface.h"
#include "third_party/blink/public/common/privacy_budget/identifiable_token_builder.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
......@@ -14,6 +18,7 @@
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/privacy_budget/identifiability_digest_helpers.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
......@@ -29,6 +34,31 @@ constexpr char kKeyboardMapChildFrameErrorMsg[] =
constexpr char kKeyboardMapRequestFailedErrorMsg[] =
"getLayoutMap() request could not be completed.";
constexpr IdentifiableSurface kGetKeyboardLayoutMapSurface =
IdentifiableSurface::FromTypeAndToken(
IdentifiableSurface::Type::kWebFeature,
WebFeature::kKeyboardApiGetLayoutMap);
IdentifiableToken ComputeLayoutValue(
const WTF::HashMap<WTF::String, WTF::String>& layout_map) {
IdentifiableTokenBuilder builder;
for (const auto& kv : layout_map) {
builder.AddToken(IdentifiabilityBenignStringToken(kv.key));
builder.AddToken(IdentifiabilityBenignStringToken(kv.value));
}
return builder.GetToken();
}
void RecordGetLayoutMapResult(ExecutionContext* context,
IdentifiableToken value) {
if (!context)
return;
IdentifiabilityMetricBuilder(context->UkmSourceID())
.Set(kGetKeyboardLayoutMapSurface, value)
.Record(context->UkmRecorder());
}
} // namespace
KeyboardLayout::KeyboardLayout(ExecutionContext* context)
......@@ -56,6 +86,12 @@ ScriptPromise KeyboardLayout::GetKeyboardLayoutMap(
}
if (!EnsureServiceConnected()) {
if (IdentifiabilityStudySettings::Get()->IsSurfaceAllowed(
kGetKeyboardLayoutMapSurface)) {
RecordGetLayoutMapResult(ExecutionContext::From(script_state),
IdentifiableToken());
}
exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
kKeyboardMapRequestFailedErrorMsg);
return ScriptPromise();
......@@ -101,12 +137,23 @@ void KeyboardLayout::GotKeyboardLayoutMap(
mojom::blink::GetKeyboardLayoutMapResultPtr result) {
DCHECK(script_promise_resolver_);
bool instrumentation_on =
IdentifiabilityStudySettings::Get()->IsSurfaceAllowed(
kGetKeyboardLayoutMapSurface);
switch (result->status) {
case mojom::blink::GetKeyboardLayoutMapStatus::kSuccess:
if (instrumentation_on) {
RecordGetLayoutMapResult(GetExecutionContext(),
ComputeLayoutValue(result->layout_map));
}
script_promise_resolver_->Resolve(
MakeGarbageCollected<KeyboardLayoutMap>(result->layout_map));
break;
case mojom::blink::GetKeyboardLayoutMapStatus::kFail:
if (instrumentation_on)
RecordGetLayoutMapResult(GetExecutionContext(), IdentifiableToken());
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kInvalidStateError,
kKeyboardMapRequestFailedErrorMsg));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment