Add svg fingerprinting mitigation (#2215)

Co-authored-by: Carmelo Messina <uazo@users.noreply.github.com>
This commit is contained in:
uazo
2022-08-13 21:37:51 -07:00
committed by GitHub
co-authored by Carmelo Messina
parent 7dcdc98732
commit a3605523e5
@@ -38,6 +38,8 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
third_party/blink/renderer/core/dom/range.cc | 12 +-
.../renderer/core/html/canvas/text_metrics.cc | 18 ++
.../renderer/core/html/canvas/text_metrics.h | 2 +
.../renderer/core/svg/svg_graphics_element.cc | 1 +
.../core/svg/svg_text_content_element.cc | 23 ++-
.../canvas2d/base_rendering_context_2d.cc | 5 +
.../canvas2d/canvas_rendering_context_2d.cc | 8 +-
third_party/blink/renderer/platform/BUILD.gn | 5 +-
@@ -49,7 +51,7 @@ License: GPL-3.0-only - https://spdx.org/licenses/GPL-3.0-only.html
third_party/ungoogled/BUILD.gn | 10 ++
third_party/ungoogled/ungoogled_switches.cc | 18 ++
third_party/ungoogled/ungoogled_switches.h | 18 ++
24 files changed, 346 insertions(+), 3 deletions(-)
26 files changed, 364 insertions(+), 9 deletions(-)
create mode 100644 third_party/ungoogled/BUILD.gn
create mode 100644 third_party/ungoogled/ungoogled_switches.cc
create mode 100644 third_party/ungoogled/ungoogled_switches.h
@@ -340,6 +342,93 @@ diff --git a/third_party/blink/renderer/core/html/canvas/text_metrics.h b/third_
private:
void Update(const Font&,
const TextDirection&,
diff --git a/third_party/blink/renderer/core/svg/svg_graphics_element.cc b/third_party/blink/renderer/core/svg/svg_graphics_element.cc
--- a/third_party/blink/renderer/core/svg/svg_graphics_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_graphics_element.cc
@@ -193,6 +193,7 @@ SVGRectTearOff* SVGGraphicsElement::getBBoxFromJavascript() {
if (layout_object->IsSVGText() || layout_object->IsSVGInline())
UseCounter::Count(GetDocument(), WebFeature::kGetBBoxForText);
+ bounding_box.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
}
return SVGRectTearOff::CreateDetached(bounding_box);
}
diff --git a/third_party/blink/renderer/core/svg/svg_text_content_element.cc b/third_party/blink/renderer/core/svg/svg_text_content_element.cc
--- a/third_party/blink/renderer/core/svg/svg_text_content_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_text_content_element.cc
@@ -117,11 +117,14 @@ float SVGTextContentElement::getComputedTextLength() {
GetDocument().UpdateStyleAndLayoutForNode(this,
DocumentUpdateReason::kJavaScript);
auto* layout_object = GetLayoutObject();
+ float value = 0;
if (IsNGTextOrInline(layout_object)) {
NGSvgTextQuery query(*layout_object);
- return query.SubStringLength(0, query.NumberOfCharacters());
+ value = query.SubStringLength(0, query.NumberOfCharacters());
+ } else {
+ value = SVGTextQuery(layout_object).TextLength();
}
- return SVGTextQuery(layout_object).TextLength();
+ return value * GetDocument().GetNoiseFactorX();
}
float SVGTextContentElement::getSubStringLength(
@@ -144,9 +147,12 @@ float SVGTextContentElement::getSubStringLength(
nchars = number_of_chars - charnum;
auto* layout_object = GetLayoutObject();
+ float value = 0;
if (IsNGTextOrInline(layout_object))
- return NGSvgTextQuery(*layout_object).SubStringLength(charnum, nchars);
- return SVGTextQuery(layout_object).SubStringLength(charnum, nchars);
+ value = NGSvgTextQuery(*layout_object).SubStringLength(charnum, nchars);
+ else
+ value = SVGTextQuery(layout_object).SubStringLength(charnum, nchars);
+ return value * GetDocument().GetNoiseFactorX();
}
SVGPointTearOff* SVGTextContentElement::getStartPositionOfChar(
@@ -170,6 +176,7 @@ SVGPointTearOff* SVGTextContentElement::getStartPositionOfChar(
} else {
point = SVGTextQuery(layout_object).StartPositionOfCharacter(charnum);
}
+ point.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
return SVGPointTearOff::CreateDetached(point);
}
@@ -194,6 +201,7 @@ SVGPointTearOff* SVGTextContentElement::getEndPositionOfChar(
} else {
point = SVGTextQuery(layout_object).EndPositionOfCharacter(charnum);
}
+ point.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
return SVGPointTearOff::CreateDetached(point);
}
@@ -218,6 +226,7 @@ SVGRectTearOff* SVGTextContentElement::getExtentOfChar(
} else {
rect = SVGTextQuery(layout_object).ExtentOfCharacter(charnum);
}
+ rect.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
return SVGRectTearOff::CreateDetached(rect);
}
@@ -247,12 +256,14 @@ int SVGTextContentElement::getCharNumAtPosition(
GetDocument().UpdateStyleAndLayoutForNode(this,
DocumentUpdateReason::kJavaScript);
auto* layout_object = GetLayoutObject();
+ gfx::PointF target = gfx::PointF(point->Target()->Value());
+ target.Scale(GetDocument().GetNoiseFactorX(), GetDocument().GetNoiseFactorY());
if (IsNGTextOrInline(layout_object)) {
return NGSvgTextQuery(*layout_object)
- .CharacterNumberAtPosition(point->Target()->Value());
+ .CharacterNumberAtPosition(target);
}
return SVGTextQuery(layout_object)
- .CharacterNumberAtPosition(point->Target()->Value());
+ .CharacterNumberAtPosition(target);
}
void SVGTextContentElement::selectSubString(unsigned charnum,
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc