Commit 279b7512 authored by Caleb Raitto's avatar Caleb Raitto Committed by Commit Bot

Update the digest when encountering DrawTextBlobOps.

Text operations are tracked via the 2D canvas context digest, not the
PaintOp digest. Because these digests are maintained separately, without
this change, drawing a rectangle and then text wouldn't be distinguised
from drawing text than then a rectangle in the final, combined digest.

Bug: 973801
Change-Id: If237733320d0a2e3ce95dcbd3bc2f97c69d888bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2327132
Commit-Queue: Caleb Raitto <caraitto@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#795729}
parent ad22d8ad
......@@ -90,9 +90,15 @@ void IdentifiabilityPaintOpDigest::MaybeUpdateDigest(
break;
// To capture font fallback identifiability, we capture text draw operations
// at the 2D context layer.
if (op->GetType() == cc::PaintOpType::DrawTextBlob)
// at the 2D context layer. We still need to modify the token builder digest
// since we want to track the relative ordering of text operations and other
// operations.
if (op->GetType() == cc::PaintOpType::DrawTextBlob) {
constexpr uint64_t kDrawTextBlobValue =
UINT64_C(0x8c1587a34065ea3b); // Picked form a hat.
builder_.AddValue(kDrawTextBlobValue);
continue;
}
// DrawRecord PaintOps contain nested PaintOps.
if (op->GetType() == cc::PaintOpType::DrawRecord) {
......
......@@ -103,21 +103,64 @@ TEST(IdentifiabilityPaintOpDigestTest, DigestIsInitialIfNotInStudy) {
identifiability_paintop_digest.encountered_partially_digested_image());
}
TEST(IdentifiabilityPaintOpDigestTest, SkipsTextOps) {
TEST(IdentifiabilityPaintOpDigestTest, IgnoresTextOpsContents) {
StudyParticipationRaii study_participation_raii;
IdentifiabilityPaintOpDigest identifiability_paintop_digest(kSize);
auto paint_record = sk_make_sp<cc::PaintRecord>();
paint_record->push<cc::DrawTextBlobOp>(
IdentifiabilityPaintOpDigest identifiability_paintop_digest1(kSize);
IdentifiabilityPaintOpDigest identifiability_paintop_digest2(kSize);
auto paint_record1 = sk_make_sp<cc::PaintRecord>();
auto paint_record2 = sk_make_sp<cc::PaintRecord>();
paint_record1->push<cc::DrawTextBlobOp>(
SkTextBlob::MakeFromString("abc", SkFont(SkTypeface::MakeDefault())),
1.0f, 1.0f, cc::PaintFlags());
identifiability_paintop_digest.MaybeUpdateDigest(paint_record,
/*num_ops_to_visit=*/1);
EXPECT_EQ(kTokenBuilderInitialDigest,
identifiability_paintop_digest.GetToken().ToUkmMetricValue());
paint_record2->push<cc::DrawTextBlobOp>(
SkTextBlob::MakeFromString("def", SkFont(SkTypeface::MakeDefault())),
2.0f, 2.0f, cc::PaintFlags());
identifiability_paintop_digest1.MaybeUpdateDigest(paint_record1,
/*num_ops_to_visit=*/1);
identifiability_paintop_digest2.MaybeUpdateDigest(paint_record2,
/*num_ops_to_visit=*/1);
EXPECT_EQ(identifiability_paintop_digest1.GetToken().ToUkmMetricValue(),
identifiability_paintop_digest2.GetToken().ToUkmMetricValue());
EXPECT_NE(kTokenBuilderInitialDigest,
identifiability_paintop_digest1.GetToken().ToUkmMetricValue());
EXPECT_EQ(INT64_C(5364951310489041526),
identifiability_paintop_digest1.GetToken().ToUkmMetricValue());
EXPECT_FALSE(identifiability_paintop_digest.encountered_skipped_ops());
EXPECT_FALSE(identifiability_paintop_digest1.encountered_skipped_ops());
EXPECT_FALSE(
identifiability_paintop_digest.encountered_partially_digested_image());
identifiability_paintop_digest1.encountered_partially_digested_image());
EXPECT_FALSE(identifiability_paintop_digest2.encountered_skipped_ops());
EXPECT_FALSE(
identifiability_paintop_digest2.encountered_partially_digested_image());
}
TEST(IdentifiabilityPaintOpDigestTest, RelativeOrderingTextOpsAndOtherOps) {
StudyParticipationRaii study_participation_raii;
IdentifiabilityPaintOpDigest identifiability_paintop_digest1(kSize);
IdentifiabilityPaintOpDigest identifiability_paintop_digest2(kSize);
auto paint_record1 = sk_make_sp<cc::PaintRecord>();
auto paint_record2 = sk_make_sp<cc::PaintRecord>();
paint_record1->push<cc::DrawTextBlobOp>(
SkTextBlob::MakeFromString("abc", SkFont(SkTypeface::MakeDefault())),
1.0f, 1.0f, cc::PaintFlags());
paint_record1->push<cc::ScaleOp>(kScaleX, kScaleY);
paint_record2->push<cc::ScaleOp>(kScaleX, kScaleY);
paint_record2->push<cc::DrawTextBlobOp>(
SkTextBlob::MakeFromString("abc", SkFont(SkTypeface::MakeDefault())),
1.0f, 1.0f, cc::PaintFlags());
identifiability_paintop_digest1.MaybeUpdateDigest(paint_record1,
/*num_ops_to_visit=*/1);
identifiability_paintop_digest2.MaybeUpdateDigest(paint_record2,
/*num_ops_to_visit=*/1);
EXPECT_NE(identifiability_paintop_digest1.GetToken().ToUkmMetricValue(),
identifiability_paintop_digest2.GetToken().ToUkmMetricValue());
EXPECT_FALSE(identifiability_paintop_digest1.encountered_skipped_ops());
EXPECT_FALSE(
identifiability_paintop_digest1.encountered_partially_digested_image());
EXPECT_FALSE(identifiability_paintop_digest2.encountered_skipped_ops());
EXPECT_FALSE(
identifiability_paintop_digest2.encountered_partially_digested_image());
}
TEST(IdentifiabilityPaintOpDigestTest, SkPathDigestStability) {
......
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