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. 4 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" 16 17 namespace content { 18 19 namespace { 20 21 class TestGinObject : public gin::Wrappable<TestGinObject> { 22 public: 23 static gin::WrapperInfo kWrapperInfo; 24 Create(v8::Isolate * isolate,bool * alive)25 static gin::Handle<TestGinObject> Create(v8::Isolate* isolate, bool* alive) { 26 return gin::CreateHandle(isolate, new TestGinObject(alive)); 27 } 28 29 private: TestGinObject(bool * alive)30 TestGinObject(bool* alive) : alive_(alive) { *alive_ = true; } ~TestGinObject()31 virtual ~TestGinObject() { *alive_ = false; } 32 33 bool* alive_; 34 35 DISALLOW_COPY_AND_ASSIGN(TestGinObject); 36 }; 37 38 gin::WrapperInfo TestGinObject::kWrapperInfo = { gin::kEmbedderNativeGin }; 39 40 class GinBrowserTest : public RenderViewTest { 41 public: GinBrowserTest()42 GinBrowserTest() {} ~GinBrowserTest()43 virtual ~GinBrowserTest() {} 44 SetUp()45 virtual void SetUp() OVERRIDE { 46 CommandLine::ForCurrentProcess()->AppendSwitchASCII( 47 switches::kJavaScriptFlags, "--expose_gc"); 48 49 RenderViewTest::SetUp(); 50 } 51 52 private: 53 54 DISALLOW_COPY_AND_ASSIGN(GinBrowserTest); 55 }; 56 57 // Test that garbage collection doesn't crash if a gin-wrapped object is 58 // present. TEST_F(GinBrowserTest,GinAndGarbageCollection)59TEST_F(GinBrowserTest, GinAndGarbageCollection) { 60 LoadHTML("<!doctype html>"); 61 62 bool alive = false; 63 64 { 65 v8::Isolate* isolate = blink::mainThreadIsolate(); 66 v8::HandleScope handle_scope(isolate); 67 v8::Context::Scope context_scope( 68 view_->GetWebView()->mainFrame()->mainWorldScriptContext()); 69 70 // We create the object inside a scope so it's not kept alive by a handle 71 // on the stack. 72 TestGinObject::Create(isolate, &alive); 73 } 74 75 CHECK(alive); 76 77 // Should not crash. 78 blink::mainThreadIsolate()->LowMemoryNotification(); 79 80 CHECK(!alive); 81 } 82 83 } // namespace 84 85 } // namespace content 86