summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/layout/jank_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/layout/jank_tracker.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/layout/jank_tracker.cc49
1 files changed, 42 insertions, 7 deletions
diff --git a/chromium/third_party/blink/renderer/core/layout/jank_tracker.cc b/chromium/third_party/blink/renderer/core/layout/jank_tracker.cc
index bbbf56be7d8..cbd97b744fe 100644
--- a/chromium/third_party/blink/renderer/core/layout/jank_tracker.cc
+++ b/chromium/third_party/blink/renderer/core/layout/jank_tracker.cc
@@ -6,6 +6,7 @@
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#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/location.h"
#include "third_party/blink/renderer/core/layout/layout_object.h"
#include "third_party/blink/renderer/core/layout/layout_view.h"
@@ -80,6 +81,15 @@ static void RegionToTracedValue(const Region& region,
value.EndArray();
}
+static void RegionToTracedValue(const JankRegion& region,
+ double granularity_scale,
+ TracedValue& value) {
+ Region old_region;
+ for (IntRect rect : region.GetRects())
+ old_region.Unite(Region(rect));
+ RegionToTracedValue(old_region, granularity_scale, value);
+}
+
JankTracker::JankTracker(LocalFrameView* frame_view)
: frame_view_(frame_view),
score_(0.0),
@@ -130,8 +140,13 @@ void JankTracker::AccumulateJank(const LayoutObject& source,
visible_old_rect.Scale(scale);
visible_new_rect.Scale(scale);
- region_.Unite(Region(visible_old_rect));
- region_.Unite(Region(visible_new_rect));
+ if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled()) {
+ region_experimental_.AddRect(visible_old_rect);
+ region_experimental_.AddRect(visible_new_rect);
+ } else {
+ region_.Unite(Region(visible_old_rect));
+ region_.Unite(Region(visible_new_rect));
+ }
}
void JankTracker::NotifyObjectPrePaint(const LayoutObject& object,
@@ -165,15 +180,27 @@ void JankTracker::NotifyCompositedLayerMoved(const PaintLayer& paint_layer,
}
void JankTracker::NotifyPrePaintFinished() {
- if (!IsActive() || region_.IsEmpty())
+ if (!IsActive())
+ return;
+ bool use_sweep_line = RuntimeEnabledFeatures::JankTrackingSweepLineEnabled();
+ bool region_is_empty =
+ use_sweep_line ? region_experimental_.IsEmpty() : region_.IsEmpty();
+ if (region_is_empty)
return;
IntRect viewport = frame_view_->GetScrollableArea()->VisibleContentRect();
double granularity_scale = RegionGranularityScale(viewport);
viewport.Scale(granularity_scale);
+
+ if (viewport.IsEmpty())
+ return;
+
double viewport_area = double(viewport.Width()) * double(viewport.Height());
+ uint64_t region_area =
+ use_sweep_line ? region_experimental_.Area() : region_.Area();
+ double jank_fraction = region_area / viewport_area;
+ DCHECK_GT(jank_fraction, 0);
- double jank_fraction = region_.Area() / viewport_area;
score_ += jank_fraction;
DVLOG(1) << "viewport " << (jank_fraction * 100)
@@ -184,7 +211,9 @@ void JankTracker::NotifyPrePaintFinished() {
PerFrameTraceData(jank_fraction, granularity_scale),
"frame", ToTraceValue(&frame_view_->GetFrame()));
- if (RuntimeEnabledFeatures::LayoutJankAPIEnabled() && jank_fraction > 0 &&
+ frame_view_->GetFrame().Client()->DidObserveLayoutJank(jank_fraction);
+
+ if (RuntimeEnabledFeatures::LayoutJankAPIEnabled() &&
frame_view_->GetFrame().DomWindow()) {
WindowPerformance* performance =
DOMWindowPerformance::performance(*frame_view_->GetFrame().DomWindow());
@@ -194,7 +223,10 @@ void JankTracker::NotifyPrePaintFinished() {
}
}
- region_ = Region();
+ if (use_sweep_line)
+ region_experimental_.Reset();
+ else
+ region_ = Region();
}
void JankTracker::NotifyInput(const WebInputEvent& event) {
@@ -234,7 +266,10 @@ std::unique_ptr<TracedValue> JankTracker::PerFrameTraceData(
value->SetDouble("jank_fraction", jank_fraction);
value->SetDouble("cumulative_score", score_);
value->SetDouble("max_distance", max_distance_);
- RegionToTracedValue(region_, granularity_scale, *value);
+ if (RuntimeEnabledFeatures::JankTrackingSweepLineEnabled())
+ RegionToTracedValue(region_experimental_, granularity_scale, *value);
+ else
+ RegionToTracedValue(region_, granularity_scale, *value);
value->SetBoolean("is_main_frame", frame_view_->GetFrame().IsMainFrame());
return value;
}