blob: 883d1b7a48b9dcc0bd402eb32c2219826863d150 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/thumbnails/thumbnail_capture_driver.h"
#include "base/test/task_environment.h"
#include "chrome/browser/ui/thumbnails/thumbnail_scheduler.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class MockClient : public ThumbnailCaptureDriver::Client {
public:
MockClient() = default;
MOCK_METHOD(void, RequestCapture, (), (override));
MOCK_METHOD(void, StartCapture, (), (override));
MOCK_METHOD(void, StopCapture, (), (override));
};
class StubScheduler : public ThumbnailScheduler {
public:
StubScheduler() = default;
~StubScheduler() override = default;
TabCapturePriority priority() const { return priority_; }
// ThumbnailScheduler:
void AddTab(TabCapturer* tab) override {}
void RemoveTab(TabCapturer* tab) override {}
void SetTabCapturePriority(TabCapturer* tab,
TabCapturePriority priority) override {
priority_ = priority;
}
private:
TabCapturePriority priority_ = TabCapturePriority::kNone;
};
class ThumbnailCaptureDriverTest : public ::testing::Test {
public:
ThumbnailCaptureDriverTest() = default;
~ThumbnailCaptureDriverTest() override = default;
protected:
base::test::SingleThreadTaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
StubScheduler scheduler_;
// We strictly specify the interactions between ThumbnailCaptureDriver
// and its client.
::testing::StrictMock<MockClient> mock_client_;
ThumbnailCaptureDriver capture_driver_{&mock_client_, &scheduler_};
};
} // namespace
using ::testing::AnyNumber;
using ::testing::AtLeast;
using ::testing::Expectation;
using ::testing::InSequence;
TEST_F(ThumbnailCaptureDriverTest,
NoCaptureWhenPageIsVisibleAndThumbnailIsNot) {
EXPECT_CALL(mock_client_, RequestCapture()).Times(0);
EXPECT_CALL(mock_client_, StartCapture()).Times(0);
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
capture_driver_.UpdateThumbnailVisibility(false);
capture_driver_.UpdatePageVisibility(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
// Simulate a page loading from start to finish
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.SetCanCapture(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
}
TEST_F(ThumbnailCaptureDriverTest,
CaptureWhenPageIsVisibleAndThumbnailIsRequested) {
// StopCapture() can be called unnecessarily at first.
Expectation stop_capture =
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
// Capture shouldn't start, just requested.
EXPECT_CALL(mock_client_, StartCapture()).Times(0);
// Simulate the current page having its thumbnail requested.
capture_driver_.UpdatePageVisibility(true);
capture_driver_.UpdateThumbnailVisibility(true);
// Page becomes sufficiently loaded for capture, but no further, and
// the client never reports it's ready to capture. This should trigger
// a RequestCapture() call but nothing more.
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
// Capture should only be requested when the scheduler allows it.
// Additionally ensure the RequestCapture() call is ordered before any
// StopCapture() calls.
EXPECT_CALL(mock_client_, RequestCapture()).Times(1).After(stop_capture);
capture_driver_.SetCapturePermittedByScheduler(true);
}
TEST_F(ThumbnailCaptureDriverTest, NoCaptureWhenPageAndThumbnailAreNotVisible) {
EXPECT_CALL(mock_client_, RequestCapture()).Times(0);
EXPECT_CALL(mock_client_, StartCapture()).Times(0);
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
capture_driver_.UpdateThumbnailVisibility(false);
capture_driver_.UpdatePageVisibility(false);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
// Simulate a page loading from start to finish
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.SetCanCapture(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
}
TEST_F(ThumbnailCaptureDriverTest,
CaptureRequestedWhenPageReadyAndSchedulerAllows) {
// StopCapture() can be called unnecessarily at first.
Expectation stop_capture =
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
// Capture shouldn't start, just requested.
EXPECT_CALL(mock_client_, StartCapture()).Times(0);
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
// Page becomes sufficiently loaded for capture, but no further, and
// the client never reports it's ready to capture. This should trigger
// a RequestCapture() call but nothing more.
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
// Capture should only be requested when the scheduler allows it.
// Additionally ensure the RequestCapture() call is ordered before any
// StopCapture() calls.
EXPECT_CALL(mock_client_, RequestCapture()).Times(1).After(stop_capture);
capture_driver_.SetCapturePermittedByScheduler(true);
}
TEST_F(ThumbnailCaptureDriverTest, CapturesPageWhenPossible) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
}
TEST_F(ThumbnailCaptureDriverTest,
AlwaysWaitsForSchedulerAndCallsRequestCapture) {
Expectation stop_capture =
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.SetCanCapture(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
Expectation request_capture =
EXPECT_CALL(mock_client_, RequestCapture()).After(stop_capture);
EXPECT_CALL(mock_client_, StartCapture()).After(request_capture);
capture_driver_.SetCapturePermittedByScheduler(true);
}
TEST_F(ThumbnailCaptureDriverTest, FinalCaptureWaitsForScheduler) {
Expectation stop_capture =
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
Expectation request_capture =
EXPECT_CALL(mock_client_, RequestCapture()).After(stop_capture);
capture_driver_.SetCapturePermittedByScheduler(true);
EXPECT_CALL(mock_client_, StartCapture()).After(request_capture);
capture_driver_.SetCanCapture(true);
}
TEST_F(ThumbnailCaptureDriverTest, StopsCaptureThenResumesFromScheduler) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture()).Times(AtLeast(1));
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
}
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
// Simulate getting descheduled then scheduled again. This should
// cause capture to stop and restart.
capture_driver_.SetCapturePermittedByScheduler(false);
capture_driver_.SetCapturePermittedByScheduler(true);
}
TEST_F(ThumbnailCaptureDriverTest, RestartsCaptureWhenPossible) {
Expectation stop_capture =
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
// Start capture, but then temporarily report we can't capture. When
// we're able again, we should get another StartCapture() call.
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
Expectation request_capture =
EXPECT_CALL(mock_client_, RequestCapture()).Times(1).After(stop_capture);
capture_driver_.SetCapturePermittedByScheduler(true);
Expectation start_capture =
EXPECT_CALL(mock_client_, StartCapture()).Times(1).After(request_capture);
capture_driver_.SetCanCapture(true);
capture_driver_.SetCanCapture(false);
EXPECT_CALL(mock_client_, StartCapture()).Times(1).After(start_capture);
capture_driver_.SetCanCapture(true);
}
TEST_F(ThumbnailCaptureDriverTest, StopsOngoingCaptureWhenPageNoLongerReady) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture());
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.SetCapturePermittedByScheduler(false);
}
TEST_F(ThumbnailCaptureDriverTest, CanContinueCaptureIfPageBecomesVisible) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture()).Times(0);
}
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageVisibility(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
}
TEST_F(ThumbnailCaptureDriverTest, ContinuesCaptureWhenPageBecomesFinal) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
}
TEST_F(ThumbnailCaptureDriverTest, StopsCaptureOnFinalFrame) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture()).Times(AtLeast(1));
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
capture_driver_.GotFrame();
task_environment_.FastForwardBy(ThumbnailCaptureDriver::kCooldownDelay);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.SetCapturePermittedByScheduler(false);
}
TEST_F(ThumbnailCaptureDriverTest, RetriesWithinLimits) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
task_environment_.FastForwardBy(ThumbnailCaptureDriver::kMaxCooldownRetries *
ThumbnailCaptureDriver::kCooldownDelay);
}
TEST_F(ThumbnailCaptureDriverTest, StopsCaptureAtRetryLimit) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture());
}
// The common use case is capturing a thumbnail for a background tab.
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
task_environment_.FastForwardBy(
(1 + ThumbnailCaptureDriver::kMaxCooldownRetries) *
ThumbnailCaptureDriver::kCooldownDelay);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
}
TEST_F(ThumbnailCaptureDriverTest, DoesNotReCaptureAfterFinalThumbnail) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
}
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.GotFrame();
task_environment_.FastForwardBy(ThumbnailCaptureDriver::kCooldownDelay);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.SetCapturePermittedByScheduler(false);
capture_driver_.UpdateThumbnailVisibility(false);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdateThumbnailVisibility(true);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
}
// Going from kReadyForFinalCapture to a lower readiness should always
// invalidate the current thumbnail. Capture should restart from
// scratch. Regression test for https://crbug.com/1137330
TEST_F(ThumbnailCaptureDriverTest, InvalidatesThumbnailOnReadinessDecrease) {
{
InSequence s;
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
EXPECT_CALL(mock_client_, StopCapture()).Times(AnyNumber());
EXPECT_CALL(mock_client_, RequestCapture());
EXPECT_CALL(mock_client_, StartCapture());
}
capture_driver_.UpdateThumbnailVisibility(true);
capture_driver_.UpdatePageVisibility(false);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.GotFrame();
task_environment_.FastForwardBy(ThumbnailCaptureDriver::kCooldownDelay);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
// This should result in the thumbnail being invalidated. Subsequent
// loading should trigger capture again.
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kNotReady);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kNone);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForInitialCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kLow);
capture_driver_.SetCapturePermittedByScheduler(true);
capture_driver_.SetCanCapture(true);
capture_driver_.UpdatePageReadiness(
ThumbnailReadinessTracker::Readiness::kReadyForFinalCapture);
EXPECT_EQ(scheduler_.priority(),
ThumbnailScheduler::TabCapturePriority::kHigh);
}