summaryrefslogtreecommitdiff
path: root/chromium/services/viz/public/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/services/viz/public/cpp')
-rw-r--r--chromium/services/viz/public/cpp/BUILD.gn15
-rw-r--r--chromium/services/viz/public/cpp/DEPS3
-rw-r--r--chromium/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc6
-rw-r--r--chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc35
-rw-r--r--chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h6
-rw-r--r--chromium/services/viz/public/cpp/compositing/compositor_frame_mojom_traits.cc31
-rw-r--r--chromium/services/viz/public/cpp/compositing/copy_output_request_mojom_traits.cc60
-rw-r--r--chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc33
-rw-r--r--chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h58
-rw-r--r--chromium/services/viz/public/cpp/compositing/quads_mojom_traits.cc20
-rw-r--r--chromium/services/viz/public/cpp/compositing/quads_mojom_traits.h5
-rw-r--r--chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.cc13
-rw-r--r--chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.h3
-rw-r--r--chromium/services/viz/public/cpp/crash_keys.cc16
-rw-r--r--chromium/services/viz/public/cpp/crash_keys.h18
-rw-r--r--chromium/services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.cc26
16 files changed, 300 insertions, 48 deletions
diff --git a/chromium/services/viz/public/cpp/BUILD.gn b/chromium/services/viz/public/cpp/BUILD.gn
new file mode 100644
index 00000000000..f58553703c2
--- /dev/null
+++ b/chromium/services/viz/public/cpp/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("crash_keys") {
+ sources = [
+ "crash_keys.cc",
+ "crash_keys.h",
+ ]
+
+ deps = [
+ "//base",
+ "//components/crash/core//common:crash_key",
+ ]
+}
diff --git a/chromium/services/viz/public/cpp/DEPS b/chromium/services/viz/public/cpp/DEPS
new file mode 100644
index 00000000000..90e574cf755
--- /dev/null
+++ b/chromium/services/viz/public/cpp/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+components/crash/core/common/crash_key.h",
+]
diff --git a/chromium/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc
index 84a31fba2b8..b36230af3f6 100644
--- a/chromium/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc
@@ -5,6 +5,7 @@
#include "services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
namespace mojo {
@@ -64,8 +65,11 @@ bool StructTraits<viz::mojom::BeginFrameArgsDataView, viz::BeginFrameArgs>::
bool StructTraits<viz::mojom::BeginFrameAckDataView, viz::BeginFrameAck>::Read(
viz::mojom::BeginFrameAckDataView data,
viz::BeginFrameAck* out) {
- if (data.sequence_number() < viz::BeginFrameArgs::kStartingFrameNumber)
+ if (data.sequence_number() < viz::BeginFrameArgs::kStartingFrameNumber) {
+ viz::SetDeserializationCrashKeyString(
+ "Invalid begin frame ack sequence number");
return false;
+ }
out->frame_id.source_id = data.source_id();
out->frame_id.sequence_number = data.sequence_number();
out->trace_id = data.trace_id();
diff --git a/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
index 51a7f00f143..cb57ef4394f 100644
--- a/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
@@ -8,6 +8,7 @@
#include "services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h"
#include "services/viz/public/cpp/compositing/selection_mojom_traits.h"
#include "services/viz/public/cpp/compositing/surface_id_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
#include "ui/gfx/mojom/display_color_spaces_mojom_traits.h"
#include "ui/gfx/mojom/selection_bound_mojom_traits.h"
#include "ui/latency/mojom/latency_info_mojom_traits.h"
@@ -19,11 +20,14 @@ bool StructTraits<viz::mojom::CompositorFrameMetadataDataView,
viz::CompositorFrameMetadata>::
Read(viz::mojom::CompositorFrameMetadataDataView data,
viz::CompositorFrameMetadata* out) {
- if (data.device_scale_factor() <= 0)
+ if (data.device_scale_factor() <= 0) {
+ viz::SetDeserializationCrashKeyString("Invalid device scale factor");
return false;
+ }
out->device_scale_factor = data.device_scale_factor();
- if (!data.ReadRootScrollOffset(&out->root_scroll_offset))
+ if (!data.ReadRootScrollOffset(&out->root_scroll_offset)) {
return false;
+ }
out->page_scale_factor = data.page_scale_factor();
if (!data.ReadScrollableViewportSize(&out->scrollable_viewport_size))
@@ -46,16 +50,23 @@ bool StructTraits<viz::mojom::CompositorFrameMetadataDataView,
data.top_controls_visible_height());
}
- return data.ReadLatencyInfo(&out->latency_info) &&
- data.ReadReferencedSurfaces(&out->referenced_surfaces) &&
- data.ReadDeadline(&out->deadline) &&
- data.ReadActivationDependencies(&out->activation_dependencies) &&
- data.ReadBeginFrameAck(&out->begin_frame_ack) &&
- data.ReadLocalSurfaceIdAllocationTime(
- &out->local_surface_id_allocation_time) &&
- !out->local_surface_id_allocation_time.is_null() &&
- data.ReadPreferredFrameInterval(&out->preferred_frame_interval) &&
- data.ReadDisplayTransformHint(&out->display_transform_hint);
+ if (!data.ReadLatencyInfo(&out->latency_info) ||
+ !data.ReadReferencedSurfaces(&out->referenced_surfaces) ||
+ !data.ReadDeadline(&out->deadline) ||
+ !data.ReadActivationDependencies(&out->activation_dependencies) ||
+ !data.ReadBeginFrameAck(&out->begin_frame_ack) ||
+ !data.ReadLocalSurfaceIdAllocationTime(
+ &out->local_surface_id_allocation_time)) {
+ return false;
+ }
+ if (out->local_surface_id_allocation_time.is_null()) {
+ viz::SetDeserializationCrashKeyString(
+ "Null local surface ID allocation time");
+ return false;
+ }
+ return data.ReadPreferredFrameInterval(&out->preferred_frame_interval) &&
+ data.ReadDisplayTransformHint(&out->display_transform_hint) &&
+ data.ReadDelegatedInkMetadata(&out->delegated_ink_metadata);
}
} // namespace mojo
diff --git a/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h b/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
index aa5464d8931..84f65fdb54e 100644
--- a/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
+++ b/chromium/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
@@ -10,6 +10,7 @@
#include "build/build_config.h"
#include "components/viz/common/quads/compositor_frame_metadata.h"
#include "services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h"
+#include "services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h"
#include "services/viz/public/cpp/compositing/frame_deadline_mojom_traits.h"
#include "services/viz/public/cpp/compositing/surface_range_mojom_traits.h"
#include "services/viz/public/mojom/compositing/compositor_frame_metadata.mojom-shared.h"
@@ -126,6 +127,11 @@ struct StructTraits<viz::mojom::CompositorFrameMetadataDataView,
return metadata.display_transform_hint;
}
+ static const std::unique_ptr<viz::DelegatedInkMetadata>&
+ delegated_ink_metadata(const viz::CompositorFrameMetadata& metadata) {
+ return metadata.delegated_ink_metadata;
+ }
+
static bool Read(viz::mojom::CompositorFrameMetadataDataView data,
viz::CompositorFrameMetadata* out);
};
diff --git a/chromium/services/viz/public/cpp/compositing/compositor_frame_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/compositor_frame_mojom_traits.cc
index f3dc02f553f..20b9ad3d904 100644
--- a/chromium/services/viz/public/cpp/compositing/compositor_frame_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/compositor_frame_mojom_traits.cc
@@ -4,16 +4,37 @@
#include "services/viz/public/cpp/compositing/compositor_frame_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
+
namespace mojo {
// static
bool StructTraits<viz::mojom::CompositorFrameDataView, viz::CompositorFrame>::
Read(viz::mojom::CompositorFrameDataView data, viz::CompositorFrame* out) {
- return data.ReadPasses(&out->render_pass_list) &&
- !out->render_pass_list.empty() &&
- !out->render_pass_list.back()->output_rect.size().IsEmpty() &&
- data.ReadMetadata(&out->metadata) &&
- data.ReadResources(&out->resource_list);
+ if (!data.ReadPasses(&out->render_pass_list))
+ return false;
+
+ if (out->render_pass_list.empty()) {
+ viz::SetDeserializationCrashKeyString(
+ "CompositorFrame::render_pass_list empty");
+ return false;
+ }
+
+ if (out->render_pass_list.back()->output_rect.size().IsEmpty()) {
+ viz::SetDeserializationCrashKeyString("CompositorFrame empty");
+ return false;
+ }
+
+ if (!data.ReadMetadata(&out->metadata))
+ return false;
+
+ if (!data.ReadResources(&out->resource_list)) {
+ viz::SetDeserializationCrashKeyString(
+ "Failed read CompositorFrame::resource_list");
+ return false;
+ }
+
+ return true;
}
} // namespace mojo
diff --git a/chromium/services/viz/public/cpp/compositing/copy_output_request_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/copy_output_request_mojom_traits.cc
index 34c5039e218..af1dd74b8b3 100644
--- a/chromium/services/viz/public/cpp/compositing/copy_output_request_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/copy_output_request_mojom_traits.cc
@@ -7,10 +7,13 @@
#include <utility>
#include "base/bind.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
#include "base/trace_event/trace_event.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/viz/public/cpp/compositing/copy_output_result_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
namespace {
@@ -22,17 +25,21 @@ class CopyOutputResultSenderImpl : public viz::mojom::CopyOutputResultSender {
public:
CopyOutputResultSenderImpl(
viz::CopyOutputRequest::ResultFormat result_format,
- viz::CopyOutputRequest::CopyOutputRequestCallback result_callback)
+ viz::CopyOutputRequest::CopyOutputRequestCallback result_callback,
+ scoped_refptr<base::SequencedTaskRunner> callback_task_runner)
: result_format_(result_format),
- result_callback_(std::move(result_callback)) {
+ result_callback_(std::move(result_callback)),
+ result_callback_task_runner_(std::move(callback_task_runner)) {
DCHECK(result_callback_);
+ DCHECK(result_callback_task_runner_);
}
~CopyOutputResultSenderImpl() override {
if (result_callback_) {
- std::move(result_callback_)
- .Run(std::make_unique<viz::CopyOutputResult>(result_format_,
- gfx::Rect()));
+ result_callback_task_runner_->PostTask(
+ FROM_HERE, base::BindOnce(std::move(result_callback_),
+ std::make_unique<viz::CopyOutputResult>(
+ result_format_, gfx::Rect())));
}
}
@@ -41,12 +48,15 @@ class CopyOutputResultSenderImpl : public viz::mojom::CopyOutputResultSender {
TRACE_EVENT0("viz", "CopyOutputResultSenderImpl::SendResult");
if (!result_callback_)
return;
- std::move(result_callback_).Run(std::move(result));
+ result_callback_task_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(std::move(result_callback_), std::move(result)));
}
private:
const viz::CopyOutputRequest::ResultFormat result_format_;
viz::CopyOutputRequest::CopyOutputRequestCallback result_callback_;
+ scoped_refptr<base::SequencedTaskRunner> result_callback_task_runner_;
};
void SendResult(
@@ -68,10 +78,23 @@ StructTraits<viz::mojom::CopyOutputRequestDataView,
std::unique_ptr<viz::CopyOutputRequest>>::
result_sender(const std::unique_ptr<viz::CopyOutputRequest>& request) {
mojo::PendingRemote<viz::mojom::CopyOutputResultSender> result_sender;
+ auto pending_receiver = result_sender.InitWithNewPipeAndPassReceiver();
+ // Receiving the result requires an expensive deserialize operation, so by
+ // default we want the pipe to operate on the ThreadPool, and then it will
+ // PostTask back to the current sequence.
auto impl = std::make_unique<CopyOutputResultSenderImpl>(
- request->result_format(), std::move(request->result_callback_));
- MakeSelfOwnedReceiver(std::move(impl),
- result_sender.InitWithNewPipeAndPassReceiver());
+ request->result_format(), std::move(request->result_callback_),
+ base::SequencedTaskRunnerHandle::Get());
+ auto runner = base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()});
+ runner->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ [](std::unique_ptr<CopyOutputResultSenderImpl> impl,
+ mojo::PendingReceiver<viz::mojom::CopyOutputResultSender>
+ receiver) {
+ MakeSelfOwnedReceiver(std::move(impl), std::move(receiver));
+ },
+ std::move(impl), std::move(pending_receiver)));
return result_sender;
}
@@ -91,12 +114,25 @@ bool StructTraits<viz::mojom::CopyOutputRequestDataView,
result_format, base::BindOnce(SendResult, std::move(result_sender)));
gfx::Vector2d scale_from;
- if (!data.ReadScaleFrom(&scale_from) || scale_from.x() <= 0 ||
- scale_from.y() <= 0) {
+ if (!data.ReadScaleFrom(&scale_from))
+ return false;
+ if (scale_from.x() <= 0) {
+ viz::SetDeserializationCrashKeyString("Invalid readback scale from x");
+ return false;
+ }
+ if (scale_from.y() <= 0) {
+ viz::SetDeserializationCrashKeyString("Invalid readback scale from y");
return false;
}
gfx::Vector2d scale_to;
- if (!data.ReadScaleTo(&scale_to) || scale_to.x() <= 0 || scale_to.y() <= 0) {
+ if (!data.ReadScaleTo(&scale_to))
+ return false;
+ if (scale_to.x() <= 0) {
+ viz::SetDeserializationCrashKeyString("Invalid readback scale to x");
+ return false;
+ }
+ if (scale_to.y() <= 0) {
+ viz::SetDeserializationCrashKeyString("Invalid readback scale to y");
return false;
}
request->SetScaleRatio(scale_from, scale_to);
diff --git a/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc
new file mode 100644
index 00000000000..61657009295
--- /dev/null
+++ b/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.cc
@@ -0,0 +1,33 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h"
+
+namespace mojo {
+
+// static
+bool StructTraits<viz::mojom::DelegatedInkMetadataDataView,
+ std::unique_ptr<viz::DelegatedInkMetadata>>::
+ Read(viz::mojom::DelegatedInkMetadataDataView data,
+ std::unique_ptr<viz::DelegatedInkMetadata>* out) {
+ // Diameter isn't expected to ever be below 0, so stop here if it is in order
+ // to avoid unexpected calculations in viz.
+ if (data.diameter() < 0)
+ return false;
+
+ gfx::PointF point;
+ base::TimeTicks timestamp;
+ gfx::RectF presentation_area;
+ SkColor color;
+ if (!data.ReadPoint(&point) || !data.ReadTimestamp(&timestamp) ||
+ !data.ReadPresentationArea(&presentation_area) ||
+ !data.ReadColor(&color)) {
+ return false;
+ }
+ *out = std::make_unique<viz::DelegatedInkMetadata>(
+ point, data.diameter(), color, timestamp, presentation_area);
+ return true;
+}
+
+} // namespace mojo
diff --git a/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h b/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h
new file mode 100644
index 00000000000..bb452750ee3
--- /dev/null
+++ b/chromium/services/viz/public/cpp/compositing/delegated_ink_metadata_mojom_traits.h
@@ -0,0 +1,58 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_
+#define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_
+
+#include "components/viz/common/delegated_ink_metadata.h"
+#include "mojo/public/cpp/base/time_mojom_traits.h"
+#include "services/viz/public/mojom/compositing/delegated_ink_metadata.mojom-shared.h"
+#include "skia/public/mojom/skcolor_mojom_traits.h"
+#include "ui/gfx/mojom/rrect_f_mojom_traits.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<viz::mojom::DelegatedInkMetadataDataView,
+ std::unique_ptr<viz::DelegatedInkMetadata>> {
+ static bool IsNull(const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return !input;
+ }
+
+ static void SetToNull(std::unique_ptr<viz::DelegatedInkMetadata>* input) {
+ input->reset();
+ }
+
+ static gfx::PointF point(
+ const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return input->point();
+ }
+
+ static double diameter(
+ const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return input->diameter();
+ }
+
+ static SkColor color(
+ const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return input->color();
+ }
+
+ static base::TimeTicks timestamp(
+ const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return input->timestamp();
+ }
+
+ static gfx::RectF presentation_area(
+ const std::unique_ptr<viz::DelegatedInkMetadata>& input) {
+ return input->presentation_area();
+ }
+
+ static bool Read(viz::mojom::DelegatedInkMetadataDataView data,
+ std::unique_ptr<viz::DelegatedInkMetadata>* out);
+};
+
+} // namespace mojo
+
+#endif // SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_DELEGATED_INK_METADATA_MOJOM_TRAITS_H_
diff --git a/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.cc
index 80f7b3cc82c..c99d11f218a 100644
--- a/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.cc
@@ -4,6 +4,7 @@
#include "services/viz/public/cpp/compositing/quads_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
#include "ui/gfx/mojom/color_space_mojom_traits.h"
#include "ui/gfx/mojom/transform_mojom_traits.h"
@@ -74,8 +75,10 @@ bool StructTraits<viz::mojom::RenderPassQuadStateDataView, viz::DrawQuad>::Read(
quad->resources.count = data.mask_resource_id() ? 1 : 0;
quad->render_pass_id = data.render_pass_id();
// RenderPass ids are never zero.
- if (!quad->render_pass_id)
+ if (!quad->render_pass_id) {
+ viz::SetDeserializationCrashKeyString("Draw quad invalid render pass ID");
return false;
+ }
if (!data.ReadMaskUvRect(&quad->mask_uv_rect) ||
!data.ReadMaskTextureSize(&quad->mask_texture_size) ||
!data.ReadFiltersScale(&quad->filters_scale) ||
@@ -213,8 +216,12 @@ bool StructTraits<viz::mojom::YUVVideoQuadStateDataView, viz::DrawQuad>::Read(
quad->resource_offset = data.resource_offset();
quad->resource_multiplier = data.resource_multiplier();
quad->bits_per_channel = data.bits_per_channel();
- if (quad->bits_per_channel < viz::YUVVideoDrawQuad::kMinBitsPerChannel ||
- quad->bits_per_channel > viz::YUVVideoDrawQuad::kMaxBitsPerChannel) {
+ if (quad->bits_per_channel < viz::YUVVideoDrawQuad::kMinBitsPerChannel) {
+ viz::SetDeserializationCrashKeyString("Bits per channel too small");
+ return false;
+ }
+ if (quad->bits_per_channel > viz::YUVVideoDrawQuad::kMaxBitsPerChannel) {
+ viz::SetDeserializationCrashKeyString("Bits per channel too big");
return false;
}
return true;
@@ -227,11 +234,10 @@ bool StructTraits<viz::mojom::DrawQuadDataView, viz::DrawQuad>::Read(
if (!data.ReadRect(&out->rect) || !data.ReadVisibleRect(&out->visible_rect)) {
return false;
}
- // Reject quads with areas larger than int32.
- if (!out->rect.size().GetCheckedArea().IsValid())
- return false;
- if (!out->rect.Contains(out->visible_rect))
+ if (!out->rect.Contains(out->visible_rect)) {
+ viz::SetDeserializationCrashKeyString("Rect does not contain visible rect");
return false;
+ }
out->needs_blending = data.needs_blending();
return data.ReadDrawQuadState(out);
diff --git a/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.h b/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.h
index ea4d147a266..a690016318a 100644
--- a/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.h
+++ b/chromium/services/viz/public/cpp/compositing/quads_mojom_traits.h
@@ -5,8 +5,9 @@
#ifndef SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_QUADS_MOJOM_TRAITS_H_
#define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_QUADS_MOJOM_TRAITS_H_
+#include "base/check.h"
#include "base/containers/span.h"
-#include "base/logging.h"
+#include "base/notreached.h"
#include "base/unguessable_token.h"
#include "components/viz/common/quads/debug_border_draw_quad.h"
#include "components/viz/common/quads/picture_draw_quad.h"
@@ -197,7 +198,7 @@ struct StructTraits<viz::mojom::DebugBorderQuadStateDataView, viz::DrawQuad> {
template <>
struct StructTraits<viz::mojom::RenderPassQuadStateDataView, viz::DrawQuad> {
- static int32_t render_pass_id(const viz::DrawQuad& input) {
+ static uint64_t render_pass_id(const viz::DrawQuad& input) {
const viz::RenderPassDrawQuad* quad =
viz::RenderPassDrawQuad::MaterialCast(&input);
DCHECK(quad->render_pass_id);
diff --git a/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.cc b/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.cc
index dc84c9b20fa..e704ba1005d 100644
--- a/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.cc
@@ -5,6 +5,7 @@
#include "services/viz/public/cpp/compositing/render_pass_mojom_traits.h"
#include "base/numerics/safe_conversions.h"
+#include "services/viz/public/cpp/crash_keys.h"
#include "ui/gfx/mojom/display_color_spaces_mojom_traits.h"
namespace mojo {
@@ -27,8 +28,10 @@ bool StructTraits<viz::mojom::RenderPassDataView,
}
(*out)->id = data.id();
// RenderPass ids are never zero.
- if (!(*out)->id)
+ if (!(*out)->id) {
+ viz::SetDeserializationCrashKeyString("Invalid render pass ID");
return false;
+ }
(*out)->has_transparent_background = data.has_transparent_background();
(*out)->cache_render_pass = data.cache_render_pass();
(*out)->has_damage_from_contributing_content =
@@ -46,8 +49,10 @@ bool StructTraits<viz::mojom::RenderPassDataView,
viz::DrawQuad* quad =
AllocateAndConstruct(quad_state_data_view.tag(), &(*out)->quad_list);
- if (!quad)
+ if (!quad) {
+ viz::SetDeserializationCrashKeyString("AllocateAndConstruct quad failed");
return false;
+ }
if (!quads.Read(i, quad))
return false;
@@ -62,8 +67,10 @@ bool StructTraits<viz::mojom::RenderPassDataView,
return false;
}
quad->shared_quad_state = last_sqs;
- if (!quad->shared_quad_state)
+ if (!quad->shared_quad_state) {
+ viz::SetDeserializationCrashKeyString("No shared quad state");
return false;
+ }
}
return true;
}
diff --git a/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.h b/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.h
index bd707618ccf..5284cff3816 100644
--- a/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.h
+++ b/chromium/services/viz/public/cpp/compositing/render_pass_mojom_traits.h
@@ -6,8 +6,9 @@
#define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_RENDER_PASS_MOJOM_TRAITS_H_
#include <memory>
+#include <vector>
-#include "base/logging.h"
+#include "base/check.h"
#include "components/viz/common/quads/render_pass.h"
#include "services/viz/public/cpp/compositing/copy_output_request_mojom_traits.h"
#include "services/viz/public/cpp/compositing/quads_mojom_traits.h"
diff --git a/chromium/services/viz/public/cpp/crash_keys.cc b/chromium/services/viz/public/cpp/crash_keys.cc
new file mode 100644
index 00000000000..ab79ea1928c
--- /dev/null
+++ b/chromium/services/viz/public/cpp/crash_keys.cc
@@ -0,0 +1,16 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/viz/public/cpp/crash_keys.h"
+
+#include "components/crash/core/common/crash_key.h"
+
+namespace viz {
+
+void SetDeserializationCrashKeyString(base::StringPiece str) {
+ static crash_reporter::CrashKeyString<128> key("viz_deserialization");
+ key.Set(str);
+}
+
+} // namespace viz
diff --git a/chromium/services/viz/public/cpp/crash_keys.h b/chromium/services/viz/public/cpp/crash_keys.h
new file mode 100644
index 00000000000..55288103303
--- /dev/null
+++ b/chromium/services/viz/public/cpp/crash_keys.h
@@ -0,0 +1,18 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_VIZ_PUBLIC_CPP_CRASH_KEYS_H_
+#define SERVICES_VIZ_PUBLIC_CPP_CRASH_KEYS_H_
+
+#include "base/strings/string_piece.h"
+
+namespace viz {
+
+// Sets a crash key to indicate what structure triggered a deserialization error
+// in viz mojom code.
+void SetDeserializationCrashKeyString(base::StringPiece str);
+
+} // namespace viz
+
+#endif // SERVICES_VIZ_PUBLIC_CPP_CRASH_KEYS_H_
diff --git a/chromium/services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.cc b/chromium/services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.cc
index a15ba4b4490..74a0fe44ebf 100644
--- a/chromium/services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.cc
+++ b/chromium/services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.cc
@@ -4,18 +4,28 @@
#include "services/viz/public/cpp/hit_test/hit_test_region_list_mojom_traits.h"
+#include "services/viz/public/cpp/crash_keys.h"
+
namespace mojo {
// static
bool StructTraits<viz::mojom::HitTestRegionDataView, viz::HitTestRegion>::Read(
viz::mojom::HitTestRegionDataView data,
viz::HitTestRegion* out) {
- if (!data.ReadFrameSinkId(&out->frame_sink_id))
+ if (!data.ReadFrameSinkId(&out->frame_sink_id)) {
+ viz::SetDeserializationCrashKeyString(
+ "Failed read HitTestRegion::frame_sink_id");
return false;
- if (!data.ReadRect(&out->rect))
+ }
+ if (!data.ReadRect(&out->rect)) {
+ viz::SetDeserializationCrashKeyString("Failed read HitTestRegion::rect");
return false;
- if (!data.ReadTransform(&out->transform))
+ }
+ if (!data.ReadTransform(&out->transform)) {
+ viz::SetDeserializationCrashKeyString(
+ "Failed read HitTestRegion::transform");
return false;
+ }
out->flags = data.flags();
out->async_hit_test_reasons = data.async_hit_test_reasons();
return true;
@@ -28,10 +38,16 @@ bool StructTraits<
viz::HitTestRegionList* out) {
if (!data.ReadRegions(&out->regions))
return false;
- if (!data.ReadBounds(&out->bounds))
+ if (!data.ReadBounds(&out->bounds)) {
+ viz::SetDeserializationCrashKeyString(
+ "Failed read HitTestRegionList::bounds");
return false;
- if (!data.ReadTransform(&out->transform))
+ }
+ if (!data.ReadTransform(&out->transform)) {
+ viz::SetDeserializationCrashKeyString(
+ "Failed read HitTestRegionList::transform");
return false;
+ }
out->flags = data.flags();
out->async_hit_test_reasons = data.async_hit_test_reasons();
return true;