chromium/headless/test/data/protocol/emulation/compositor-image-animation-test.js

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

(async function(testRunner) {
  const {page, session, dp} = await testRunner.startWithFrameControl(
      'Tests compositor animated image handling.');

  // Loads an animated GIF into a a newly created tab with BeginFrame control
  // and verifies that:
  // - animate_only BeginFrames don't produce CompositorFrames,
  // - first screenshot starts the GIF animation,
  // - animation is advanced according to virtual time.
  // - the animation is not resynced after the first iteration.

  const VirtualTimeController =
      await testRunner.loadScript('../helpers/virtual-time-controller.js');
  const virtual_time_controller =
      new VirtualTimeController(testRunner, dp, 100);
  await virtual_time_controller.initialize(1000);

  dp.Runtime.enable();
  dp.Runtime.onConsoleAPICalled(data => {
    const text = data.params.args[0].value;
    testRunner.log(text);
  });

  await dp.Page.navigate(
    {url: testRunner.url('/resources/compositor-image-animation.html')});

  // Color must be blue -- we start with blue, and this is entire cycle after.
  await virtual_time_controller.grantTime(3500);
  await dumpPixelColor();
  // Color must be yellow here.
  await virtual_time_controller.grantTime(2000);
  await dumpPixelColor();
  // Full cycle later, we still expect yellow.
  await virtual_time_controller.grantTime(3000);
  await dumpPixelColor();

  testRunner.completeTest();

  async function dumpPixelColor() {
    testRunner.log(`Current time: ${virtual_time_controller.elapsedTime()}`);
    const ctx = await virtual_time_controller.captureScreenshot();
    const rgba = ctx.getImageData(0, 0, 1, 1).data;
    testRunner.log(`Screenshot rgba: ${rgba}`);
  }
})