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

#include "content/renderer/child_frame_compositing_helper.h"

#include "cc/layers/layer.h"
#include "content/renderer/child_frame_compositor.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

namespace {

class MockChildFrameCompositor : public ChildFrameCompositor {
 public:
  MockChildFrameCompositor() {
    constexpr int width = 32;
    constexpr int height = 32;
    sad_page_bitmap_.allocN32Pixels(width, height);
  }

  cc::Layer* GetLayer() override { return layer_.get(); }

  void SetLayer(scoped_refptr<cc::Layer> layer,
                bool prevent_contents_opaque_changes,
                bool is_surface_layer) override {
    layer_ = std::move(layer);
  }

  SkBitmap* GetSadPageBitmap() override { return &sad_page_bitmap_; }

 private:
  scoped_refptr<cc::Layer> layer_;
  SkBitmap sad_page_bitmap_;

  DISALLOW_COPY_AND_ASSIGN(MockChildFrameCompositor);
};

viz::SurfaceId MakeSurfaceId(const viz::FrameSinkId& frame_sink_id,
                             uint32_t parent_sequence_number,
                             uint32_t child_sequence_number = 1u) {
  return viz::SurfaceId(
      frame_sink_id,
      viz::LocalSurfaceId(parent_sequence_number, child_sequence_number,
                          base::UnguessableToken::Deserialize(0, 1u)));
}

}  // namespace

class ChildFrameCompositingHelperTest : public testing::Test {
 public:
  ChildFrameCompositingHelperTest() : compositing_helper_(&compositor_) {}

  ~ChildFrameCompositingHelperTest() override {}

  ChildFrameCompositingHelper* compositing_helper() {
    return &compositing_helper_;
  }

 private:
  MockChildFrameCompositor compositor_;
  ChildFrameCompositingHelper compositing_helper_;
  DISALLOW_COPY_AND_ASSIGN(ChildFrameCompositingHelperTest);
};

// This test verifies that the fallback surfaceId is cleared when the child
// frame is reported as being gone and a sad page is displayed.
TEST_F(ChildFrameCompositingHelperTest, ChildFrameGoneClearsFallback) {
  // The primary and fallback surface IDs should start out as invalid.
  EXPECT_FALSE(compositing_helper()->surface_id().is_valid());

  const viz::SurfaceId surface_id = MakeSurfaceId(viz::FrameSinkId(1, 1), 1);
  const gfx::Size frame_size_in_dip(100, 100);
  compositing_helper()->SetSurfaceId(surface_id, frame_size_in_dip,
                                     cc::DeadlinePolicy::UseDefaultDeadline());
  EXPECT_EQ(surface_id, compositing_helper()->surface_id());

  // Reporting that the child frame is gone should clear the surface id.
  compositing_helper()->ChildFrameGone(frame_size_in_dip, 1.f);
  EXPECT_FALSE(compositing_helper()->surface_id().is_valid());
}

}  // namespace content
