chromium/tools/perf/contrib/cluster_telemetry/screenshot_ct.py

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

from core import perf_benchmark

from contrib.cluster_telemetry import ct_benchmarks_util
from contrib.cluster_telemetry import page_set
from contrib.cluster_telemetry import repaint_helpers
from contrib.cluster_telemetry import screenshot

class ScreenshotCT(perf_benchmark.PerfBenchmark):
  """Captures PNG screenshots of web pages for Cluster Telemetry. Screenshots
     written to local file with path-safe urls of pages as filenames. Cluster
     Telemetry is then used for aggregation and analysis."""

  @classmethod
  def Name(cls):
    return 'screenshot_ct'

  @classmethod
  def AddBenchmarkCommandLineArgs(cls, parser):
    ct_benchmarks_util.AddBenchmarkCommandLineArgs(parser)
    parser.add_argument('--png-outdir',
                        help='Output directory for the PNG files')
    parser.add_argument('--wait-time',
                        type=float,
                        default=0,
                        help='Wait time before the benchmark is started')
    parser.add_argument('--dc-detect',
                        action='store_true',
                        default=False,
                        help=('Detects dynamic content by marking'
                              'pixels that were not consistent across multiple '
                              'screenshots with cyan'))
    parser.add_argument(
        '--dc-wait-time',
        type=float,
        default=1,
        help=('Wait time in between screenshots. Only applicable '
              'if dc_detect flag is true.'))
    parser.add_argument(
        '--dc-extra-screenshots',
        type=int,
        default=1,
        help=('Number of extra screenshots taken to detect '
              'dynamic content. Only applicable if dc_detect flag is '
              'true.'))
    parser.add_argument(
        '--dc-threshold',
        type=float,
        default=0.5,
        help=('Maximum tolerable percentage of dynamic content '
              'pixels. Raises an exception if percentage of dynamic '
              'content is beyond this threshold. Only applicable if '
              'dc_detect flag is true.'))

  @classmethod
  def ProcessCommandLineArgs(cls, parser, args):
    ct_benchmarks_util.ValidateCommandLineArgs(parser, args)
    if not args.png_outdir:
      parser.error('Please specify --png-outdir')

  def CreatePageTest(self, options):
    return screenshot.Screenshot(options.png_outdir, options.wait_time,
      options.dc_detect, options.dc_wait_time, options.dc_extra_screenshots,
      options.dc_threshold)

  def CreateStorySet(self, options):
    return page_set.CTPageSet(
        options.urls_list, options.user_agent, options.archive_data_file,
        run_page_interaction_callback=repaint_helpers.WaitThenRepaint)