910e62b5创建于 1月15日历史提交
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_TEST_INTERACTION_INTERACTION_TEST_UTIL_BROWSER_H_
#define CHROME_TEST_INTERACTION_INTERACTION_TEST_UTIL_BROWSER_H_

#include <string>

#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/test/test_browser_ui.h"
#include "ui/base/interaction/interaction_test_util.h"

namespace ui {
class TrackedElement;
}  // namespace ui

class InteractionTestUtilBrowser {
 public:
  // Static class only.
  InteractionTestUtilBrowser() = delete;

  // Populates the appropriate simulators for a browser.
  static void PopulateSimulators(ui::test::InteractionTestUtil& test_util);

  // Returns the browser that matches the given context, or nullptr if none
  // can be found.
  static BrowserWindowInterface* GetBrowserFromContext(
      ui::ElementContext context);

  // Takes a screenshot based on the contents of `element` and compares with
  // Skia Gold. May return ActionResult::kKnownIncompatible on platforms and
  // builds where screenshots are not supported or not reliable. This is not
  // necessarily an error; the remainder of the test may still be valid.
  //
  // The name of the screenshot will be composed as follows:
  //   TestFixture_TestName[_screenshot_name]_baseline_cl
  // If you are taking more than one screenshot per test, then `screenshot_name`
  // must be specified and unique within the test; otherwise you may leave it
  // empty.
  //
  // IMPORTANT USAGE NOTES:
  //
  // Element must be on a surface that is visible and not occluded (for example,
  // a widget, or the active tab in a browser).
  //
  // Be sure that everything is completely loaded before attempting a
  // screenshot!
  //
  // In order to actually take screenshots:
  // - Your test must be in browser_tests or interactive_ui_tests
  // - Your test must be included in pixel_tests.filter
  //
  // Note that test in browser_tests may run at the same time as other tests,
  // which can result in flakiness (especially if mouse position, window
  // activation, or occlusion could change the behavior of a test). So if you
  // need to both test complex interaction and take screenshots, prefer putting
  // your test in interactive_ui_tests.
  static ui::test::ActionResult CompareScreenshot(
      ui::TrackedElement* element,
      const std::string& screenshot_name,
      const std::string& baseline_cl,
      const ScreenshotOptions& options = {});

  // As `CompareScreenshot()` but takes a screenshot of the entire surface
  // containing `element_in_surface`, not just the element itself. Be careful
  // when taking screenshots of e.g. a browser window that can be resized, as
  // different-sized windows may result in different-sized images.
  static ui::test::ActionResult CompareSurfaceScreenshot(
      ui::TrackedElement* element_in_surface,
      const std::string& screenshot_name,
      const std::string& baseline_cl);
};

#endif  // CHROME_TEST_INTERACTION_INTERACTION_TEST_UTIL_BROWSER_H_