1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)import os
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_test
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)from telemetry.page import page_test
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import scalar
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class Screenshot(page_test.PageTest):
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def __init__(self):
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    super(Screenshot, self).__init__(
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        action_name_to_run = 'RunPrepareForScreenshot',
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        is_action_name_to_run_optional=True)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  @classmethod
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def AddCommandLineArgs(cls, parser):
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    parser.add_option('--png-outdir',
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      help='Output directory for the PNG files')
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  @classmethod
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def ProcessCommandLineArgs(cls, parser, args):
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if not args.png_outdir:
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      parser.error('Please specify --png-outdir')
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    cls._png_outdir = args.png_outdir
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if not tab.screenshot_supported:
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      raise page_test.TestNotSupportedOnPlatformFailure(
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          'Browser does not support screenshotting')
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    tab.WaitForDocumentReadyStateToBeComplete()
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    screenshot = tab.Screenshot(60)
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    outpath = os.path.abspath(
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        os.path.join(self._png_outdir, page.file_safe_name)) + '.png'
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if os.path.exists(outpath):
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      previous_mtime = os.path.getmtime(outpath)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    else:
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      previous_mtime = -1
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    screenshot.WritePngFile(outpath)
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    saved_picture_count = 0
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if os.path.exists(outpath) and os.path.getmtime(outpath) > previous_mtime:
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      saved_picture_count = 1
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'saved_picture_count', 'count',
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        saved_picture_count))
52