// Copyright 2016 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 "modules/canvas/HTMLCanvasElementModule.h"

#include "core/dom/DOMNodeIds.h"
#include "core/dom/Document.h"
#include "core/frame/FrameView.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/loader/EmptyClients.h"
#include "core/offscreencanvas/OffscreenCanvas.h"
#include "core/testing/DummyPageHolder.h"
#include "testing/gtest/include/gtest/gtest.h"
#include <memory>

namespace blink {

class HTMLCanvasElementModuleTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
    Page::PageClients page_clients;
    FillWithEmptyClients(page_clients);
    std::unique_ptr<DummyPageHolder> dummy_page_holder =
        DummyPageHolder::Create(IntSize(800, 600), &page_clients);
    Persistent<Document> document = &dummy_page_holder->GetDocument();
    document->documentElement()->setInnerHTML(
        "<body><canvas id='c'></canvas></body>");
    document->View()->UpdateAllLifecyclePhases();
    canvas_element_ = toHTMLCanvasElement(document->GetElementById("c"));
  }

  HTMLCanvasElement& CanvasElement() const { return *canvas_element_; }
  OffscreenCanvas* TransferControlToOffscreen(ExceptionState&);

 private:
  Persistent<HTMLCanvasElement> canvas_element_;
};

OffscreenCanvas* HTMLCanvasElementModuleTest::TransferControlToOffscreen(
    ExceptionState& exception_state) {
  // This unit test only tests if the Canvas Id is associated correctly, so we
  // exclude the part that creates surface layer bridge because a mojo message
  // pipe cannot be tested using webkit unit tests.
  return HTMLCanvasElementModule::TransferControlToOffscreenInternal(
      CanvasElement(), exception_state);
}

TEST_F(HTMLCanvasElementModuleTest, TransferControlToOffscreen) {
  NonThrowableExceptionState exception_state;
  OffscreenCanvas* offscreen_canvas =
      TransferControlToOffscreen(exception_state);
  int canvas_id = offscreen_canvas->PlaceholderCanvasId();
  EXPECT_EQ(canvas_id, DOMNodeIds::IdForNode(&(CanvasElement())));
}

}  // namespace blink
