1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "content/public/common/content_switches.h"
7 #include "content/public/test/render_view_test.h"
8 #include "content/renderer/render_view_impl.h"
9 #include "gin/handle.h"
10 #include "gin/per_isolate_data.h"
11 #include "gin/wrappable.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "third_party/WebKit/public/web/WebFrame.h"
14 #include "third_party/WebKit/public/web/WebKit.h"
15 #include "third_party/WebKit/public/web/WebView.h"
21 class TestGinObject
: public gin::Wrappable
<TestGinObject
> {
23 static gin::WrapperInfo kWrapperInfo
;
25 static gin::Handle
<TestGinObject
> Create(v8::Isolate
* isolate
, bool* alive
) {
26 return gin::CreateHandle(isolate
, new TestGinObject(alive
));
30 TestGinObject(bool* alive
) : alive_(alive
) { *alive_
= true; }
31 ~TestGinObject() override
{ *alive_
= false; }
35 DISALLOW_COPY_AND_ASSIGN(TestGinObject
);
38 gin::WrapperInfo
TestGinObject::kWrapperInfo
= { gin::kEmbedderNativeGin
};
40 class GinBrowserTest
: public RenderViewTest
{
43 ~GinBrowserTest() override
{}
45 void SetUp() override
{
46 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
47 switches::kJavaScriptFlags
, "--expose_gc");
49 RenderViewTest::SetUp();
54 DISALLOW_COPY_AND_ASSIGN(GinBrowserTest
);
57 // Test that garbage collection doesn't crash if a gin-wrapped object is
59 TEST_F(GinBrowserTest
, GinAndGarbageCollection
) {
60 LoadHTML("<!doctype html>");
65 v8::Isolate
* isolate
= blink::mainThreadIsolate();
66 v8::HandleScope
handle_scope(isolate
);
67 v8::Context::Scope
context_scope(
68 view_
->GetWebView()->mainFrame()->mainWorldScriptContext());
70 // We create the object inside a scope so it's not kept alive by a handle
72 TestGinObject::Create(isolate
, &alive
);
78 blink::mainThreadIsolate()->LowMemoryNotification();
85 } // namespace content