summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc69
1 files changed, 59 insertions, 10 deletions
diff --git a/chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index 487efcdd8ba..a5b05b93340 100644
--- a/chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/chromium/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -38,7 +38,10 @@
#include "base/metrics/histogram_macros.h"
#include "base/numerics/checked_math.h"
#include "build/build_config.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/privacy_budget/identifiability_metric_builder.h"
+#include "third_party/blink/public/common/privacy_budget/identifiability_metrics.h"
#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/public/resources/grit/blink_image_resources.h"
#include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
@@ -55,6 +58,7 @@
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.h"
#include "third_party/blink/renderer/core/html/canvas/canvas_context_creation_attributes_core.h"
#include "third_party/blink/renderer/core/html/canvas/canvas_draw_listener.h"
@@ -249,6 +253,15 @@ void HTMLCanvasElement::RegisterRenderingContextFactory(
RenderingContextFactories()[type] = std::move(rendering_context_factory);
}
+void HTMLCanvasElement::RecordIdentifiabilityMetric(
+ const blink::IdentifiableSurface& surface,
+ int64_t value) const {
+ blink::IdentifiabilityMetricBuilder(
+ base::UkmSourceId::FromInt64(GetDocument().UkmSourceID()))
+ .Set(surface, value)
+ .Record(GetDocument().UkmRecorder());
+}
+
CanvasRenderingContext* HTMLCanvasElement::GetCanvasRenderingContext(
const String& type,
const CanvasContextCreationAttributesCore& attributes) {
@@ -271,8 +284,14 @@ CanvasRenderingContext* HTMLCanvasElement::GetCanvasRenderingContextInternal(
}
// Log the aliased context type used.
- if (!context_)
+ if (!context_) {
+ RecordIdentifiabilityMetric(
+ blink::IdentifiableSurface::FromTypeAndInput(
+ blink::IdentifiableSurface::Type::kWebFeature,
+ static_cast<uint64_t>(blink::WebFeature::kCanvasRenderingContext)),
+ blink::IdentifiabilityDigestHelper(context_type));
UMA_HISTOGRAM_ENUMERATION("Blink.Canvas.ContextType", context_type);
+ }
context_type =
CanvasRenderingContext::ResolveContextTypeAliases(context_type);
@@ -354,6 +373,20 @@ CanvasRenderingContext* HTMLCanvasElement::GetCanvasRenderingContextInternal(
return context_.Get();
}
+ScriptPromise HTMLCanvasElement::convertToBlob(
+ ScriptState* script_state,
+ const ImageEncodeOptions* options,
+ ExceptionState& exception_state) {
+ RecordIdentifiabilityMetric(
+ blink::IdentifiableSurface::FromTypeAndInput(
+ blink::IdentifiableSurface::Type::kCanvasReadback,
+ context_ ? context_->GetContextType()
+ : CanvasRenderingContext::kContextTypeUnknown),
+ 0);
+ return CanvasRenderingContextHost::convertToBlob(script_state, options,
+ exception_state);
+}
+
bool HTMLCanvasElement::ShouldBeDirectComposited() const {
return (context_ && context_->IsComposited()) || (!!surface_layer_bridge_);
}
@@ -694,6 +727,16 @@ bool HTMLCanvasElement::LowLatencyEnabled() const {
return !!frame_dispatcher_;
}
+void HTMLCanvasElement::UpdateFilterQuality() {
+ if (IsOffscreenCanvasRegistered())
+ UpdateOffscreenCanvasFilterQuality(FilterQuality());
+
+ if (context_ && Is3d())
+ context_->SetFilterQuality(FilterQuality());
+ else if (canvas2d_bridge_)
+ canvas2d_bridge_->UpdateFilterQuality();
+}
+
// In some instances we don't actually want to paint to the parent layer
// We still might want to set filter quality and MarkFirstContentfulPaint though
void HTMLCanvasElement::Paint(GraphicsContext& context,
@@ -724,11 +767,6 @@ void HTMLCanvasElement::Paint(GraphicsContext& context,
if (!context_ && !OffscreenCanvasFrame())
return;
- if (Is3d())
- context_->SetFilterQuality(FilterQuality());
- else if (canvas2d_bridge_)
- canvas2d_bridge_->UpdateFilterQuality();
-
if (HasResourceProvider() && !canvas_is_clear_)
PaintTiming::From(GetDocument()).MarkFirstContentfulPaint();
@@ -920,6 +958,12 @@ String HTMLCanvasElement::ToDataURLInternal(
// Currently we only support three encoding types.
NOTREACHED();
}
+ RecordIdentifiabilityMetric(
+ blink::IdentifiableSurface::FromTypeAndInput(
+ blink::IdentifiableSurface::Type::kCanvasReadback,
+ context_ ? context_->GetContextType()
+ : CanvasRenderingContext::kContextTypeUnknown),
+ 0);
return data_url;
}
@@ -986,6 +1030,13 @@ void HTMLCanvasElement::toBlob(V8BlobCallback* callback,
GetExecutionContext());
}
+ RecordIdentifiabilityMetric(
+ blink::IdentifiableSurface::FromTypeAndInput(
+ blink::IdentifiableSurface::Type::kCanvasReadback,
+ context_ ? context_->GetContextType()
+ : CanvasRenderingContext::kContextTypeUnknown),
+ 0);
+
if (async_creator) {
async_creator->ScheduleAsyncBlobCreation(quality);
} else {
@@ -1317,12 +1368,9 @@ IntSize HTMLCanvasElement::BitmapSourceSize() const {
ScriptPromise HTMLCanvasElement::CreateImageBitmap(
ScriptState* script_state,
- EventTarget& event_target,
base::Optional<IntRect> crop_rect,
const ImageBitmapOptions* options,
ExceptionState& exception_state) {
- DCHECK(event_target.ToLocalDOMWindow());
-
return ImageBitmapSource::FulfillImageBitmap(
script_state, MakeGarbageCollected<ImageBitmap>(this, crop_rect, options),
exception_state);
@@ -1427,7 +1475,8 @@ void HTMLCanvasElement::CreateLayer() {
// We do not design transferControlToOffscreen() for frame-less HTML canvas.
if (frame) {
surface_layer_bridge_ = std::make_unique<::blink::SurfaceLayerBridge>(
- frame->GetPage()->GetChromeClient().GetFrameSinkId(frame), this,
+ frame->GetPage()->GetChromeClient().GetFrameSinkId(frame),
+ ::blink::SurfaceLayerBridge::ContainsVideo::kNo, this,
base::DoNothing());
// Creates a placeholder layer first before Surface is created.
surface_layer_bridge_->CreateSolidColorLayer();