// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/scheduler/webview_scheduler_state_machine.h"

namespace cc {

WebviewSchedulerStateMachine::WebviewSchedulerStateMachine(
    const SchedulerSettings& settings)
    : SchedulerStateMachine(settings) {
  DCHECK(settings.using_synchronous_renderer_compositor);
}

WebviewSchedulerStateMachine::~WebviewSchedulerStateMachine() = default;

bool WebviewSchedulerStateMachine::ShouldActivateSyncTreeBeforeDraw() const {
  // We should not activate a second tree before drawing the first one.
  // Relax this requirement for synchronous compositor where scheduler does not
  // control draw, and blocking commit may lead to bad scheduling.
  return false;
}

bool WebviewSchedulerStateMachine::ShouldBlockBeginMainFrameWhenIdle() const {
  // It's okay to send BeginMainFrame for the synchronous compositor
  // because the main thread is always high latency in that case.
  return false;
}

// TODO(crbug.com/485930107): Move invalidation-related bools
// to Webview-only scheduler.
bool WebviewSchedulerStateMachine::ShouldInvalidateLayerTreeFrameSink() const {
  // Do not invalidate more than once per begin frame.
  if (did_invalidate_layer_tree_frame_sink_) {
    return false;
  }

  // Only the synchronous compositor requires invalidations.
  // Invalidations are only performed inside a BeginFrame.
  if (begin_impl_frame_state_ != BeginImplFrameState::INSIDE_BEGIN_FRAME) {
    return false;
  }

  // Don't invalidate for draw if we cannot draw.
  // TODO(sunnyps): needs_prepare_tiles_ is needed here because PrepareTiles is
  // called only inside the deadline / draw phase. We could remove this if we
  // allowed PrepareTiles to happen in OnBeginImplFrame.
  return (needs_redraw_ && !PendingDrawsShouldBeAborted()) ||
         needs_prepare_tiles_;
}

SchedulerStateMachine::BeginImplFrameDeadlineMode
WebviewSchedulerStateMachine::CurrentBeginImplFrameDeadlineMode() const {
  // No deadline for synchronous compositor, or when outside the begin frame.
  return BeginImplFrameDeadlineMode::NONE;
}

}  // namespace cc
