// Copyright (c) 2013 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 "base/command_line.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/render_view_test.h"
#include "content/renderer/render_view_impl.h"
#include "gin/handle.h"
#include "gin/per_isolate_data.h"
#include "gin/wrappable.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebKit.h"
#include "third_party/WebKit/public/web/WebView.h"

namespace content {

namespace {

class TestGinObject : public gin::Wrappable<TestGinObject> {
 public:
  static gin::WrapperInfo kWrapperInfo;

  static gin::Handle<TestGinObject> Create(v8::Isolate* isolate, bool* alive) {
    return gin::CreateHandle(isolate, new TestGinObject(alive));
  }

 private:
  TestGinObject(bool* alive) : alive_(alive) { *alive_ = true; }
  ~TestGinObject() override { *alive_ = false; }

  bool* alive_;

  DISALLOW_COPY_AND_ASSIGN(TestGinObject);
};

gin::WrapperInfo TestGinObject::kWrapperInfo = { gin::kEmbedderNativeGin };

class GinBrowserTest : public RenderViewTest {
 public:
  GinBrowserTest() {}
  ~GinBrowserTest() override {}

  void SetUp() override {
    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
        switches::kJavaScriptFlags, "--expose_gc");

    RenderViewTest::SetUp();
  }

 private:

  DISALLOW_COPY_AND_ASSIGN(GinBrowserTest);
};

// Test that garbage collection doesn't crash if a gin-wrapped object is
// present.
TEST_F(GinBrowserTest, GinAndGarbageCollection) {
  LoadHTML("<!doctype html>");

  bool alive = false;

  {
    v8::Isolate* isolate = blink::mainThreadIsolate();
    v8::HandleScope handle_scope(isolate);
    v8::Context::Scope context_scope(
        view_->GetWebView()->mainFrame()->mainWorldScriptContext());

    // We create the object inside a scope so it's not kept alive by a handle
    // on the stack.
    TestGinObject::Create(isolate, &alive);
  }

  CHECK(alive);

  // Should not crash.
  blink::mainThreadIsolate()->LowMemoryNotification();

  CHECK(!alive);
}

} // namespace

}  // namespace content
