diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/paint/paint_timing_visualizer.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/core/paint/paint_timing_visualizer.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/paint/paint_timing_visualizer.cc b/chromium/third_party/blink/renderer/core/paint/paint_timing_visualizer.cc new file mode 100644 index 00000000000..a9bb39c9396 --- /dev/null +++ b/chromium/third_party/blink/renderer/core/paint/paint_timing_visualizer.cc @@ -0,0 +1,111 @@ +// Copyright 2019 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 "third_party/blink/renderer/core/paint/paint_timing_visualizer.h" + +#include "third_party/blink/public/platform/web_float_rect.h" +#include "third_party/blink/renderer/core/dom/dom_node_ids.h" +#include "third_party/blink/renderer/core/frame/local_frame_view.h" +#include "third_party/blink/renderer/core/layout/layout_object.h" +#include "third_party/blink/renderer/core/loader/resource/image_resource_content.h" +#include "third_party/blink/renderer/core/paint/paint_timing_detector.h" +#include "third_party/blink/renderer/core/scroll/scrollable_area.h" +#include "third_party/blink/renderer/platform/geometry/int_rect.h" +#include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h" + +namespace blink { + +namespace { +static void CreateQuad(TracedValue* value, + const char* name, + const FloatQuad& quad) { + value->BeginArray(name); + value->PushDouble(quad.P1().X()); + value->PushDouble(quad.P1().Y()); + value->PushDouble(quad.P2().X()); + value->PushDouble(quad.P2().Y()); + value->PushDouble(quad.P3().X()); + value->PushDouble(quad.P3().Y()); + value->PushDouble(quad.P4().X()); + value->PushDouble(quad.P4().Y()); + value->EndArray(); +} + +} // namespace + +void PaintTimingVisualizer::RecordRects(const IntRect& rect, + std::unique_ptr<TracedValue>& value) { + CreateQuad(value.get(), "rect", FloatRect(rect)); +} +void PaintTimingVisualizer::RecordObject(const LayoutObject& object, + std::unique_ptr<TracedValue>& value) { + value->SetString("object_name", object.GetName()); + DCHECK(object.GetFrame()); + value->SetString("frame", String::FromUTF8(ToTraceValue(object.GetFrame()))); + value->SetBoolean("is_in_main_frame", object.GetFrame()->IsMainFrame()); + if (object.GetNode()) + value->SetInteger("dom_node_id", DOMNodeIds::IdForNode(object.GetNode())); +} + +void PaintTimingVisualizer::DumpTextDebuggingRect(const LayoutObject& object, + const FloatRect& rect) { + std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>(); + RecordObject(object, value); + RecordRects(RoundedIntRect(rect), value); + value->SetBoolean("is_aggregation_text", true); + value->SetBoolean("is_svg", object.IsSVG()); + DumpTrace(std::move(value)); +} + +void PaintTimingVisualizer::DumpImageDebuggingRect( + const LayoutObject& object, + const FloatRect& rect, + const ImageResourceContent& cached_image) { + std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>(); + RecordObject(object, value); + RecordRects(RoundedIntRect(rect), value); + value->SetBoolean("is_image", true); + value->SetBoolean("is_svg", object.IsSVG()); + value->SetBoolean("is_image_loaded", cached_image.IsLoaded()); + value->SetString("image_url", + String(cached_image.Url().StrippedForUseAsReferrer())); + DumpTrace(std::move(value)); +} + +void PaintTimingVisualizer::DumpTrace(std::unique_ptr<TracedValue> value) { + TRACE_EVENT_INSTANT1("loading", "PaintTimingVisualizer::LayoutObjectPainted", + TRACE_EVENT_SCOPE_THREAD, "data", std::move(value)); +} + +void PaintTimingVisualizer::RecordMainFrameViewport( + LocalFrameView& frame_view) { + if (!need_recording_viewport) + return; + if (!frame_view.GetFrame().IsMainFrame()) + return; + ScrollableArea* scrollable_area = frame_view.GetScrollableArea(); + DCHECK(scrollable_area); + IntRect viewport_rect = scrollable_area->VisibleContentRect(); + + FloatClipRect float_clip_visual_rect = + FloatClipRect(FloatRect(viewport_rect)); + WebFloatRect float_visual_rect = float_clip_visual_rect.Rect(); + frame_view.GetPaintTimingDetector().ConvertViewportToWindow( + &float_visual_rect); + + std::unique_ptr<TracedValue> value = std::make_unique<TracedValue>(); + CreateQuad(value.get(), "viewport_rect", FloatQuad(float_visual_rect)); + TRACE_EVENT_INSTANT1("loading", "PaintTimingVisualizer::Viewport", + TRACE_EVENT_SCOPE_THREAD, "data", std::move(value)); + need_recording_viewport = false; +} + +// static +bool PaintTimingVisualizer::IsTracingEnabled() { + bool enabled; + TRACE_EVENT_CATEGORY_GROUP_ENABLED("loading", &enabled); + return enabled; +} + +} // namespace blink |