diff options
-rw-r--r-- | content/content_shell.gypi | 5 | ||||
-rw-r--r-- | content/shell/renderer/DEPS | 3 | ||||
-rw-r--r-- | content/shell/renderer/gc_controller.cc | 55 | ||||
-rw-r--r-- | content/shell/renderer/gc_controller.h | 42 | ||||
-rw-r--r-- | content/shell/renderer/gc_extension.cc | 29 | ||||
-rw-r--r-- | content/shell/renderer/gc_extension.h | 23 | ||||
-rw-r--r-- | content/shell/renderer/shell_render_process_observer.cc | 2 | ||||
-rw-r--r-- | content/shell/renderer/webkit_test_runner.cc | 3 |
8 files changed, 106 insertions, 56 deletions
diff --git a/content/content_shell.gypi b/content/content_shell.gypi index 403e15d..9edeacc 100644 --- a/content/content_shell.gypi +++ b/content/content_shell.gypi @@ -41,6 +41,7 @@ '../base/base.gyp:base', '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', '../components/components.gyp:breakpad_component', + '../gin/gin.gyp:gin', '../ipc/ipc.gyp:ipc', '../media/media.gyp:media', '../net/net.gyp:net', @@ -159,8 +160,8 @@ 'shell/common/webkit_test_helpers.h', 'shell/geolocation/shell_access_token_store.cc', 'shell/geolocation/shell_access_token_store.h', - 'shell/renderer/gc_extension.cc', - 'shell/renderer/gc_extension.h', + 'shell/renderer/gc_controller.cc', + 'shell/renderer/gc_controller.h', 'shell/renderer/shell_content_renderer_client.cc', 'shell/renderer/shell_content_renderer_client.h', 'shell/renderer/shell_render_frame_observer.cc', diff --git a/content/shell/renderer/DEPS b/content/shell/renderer/DEPS new file mode 100644 index 0000000..b462077 --- /dev/null +++ b/content/shell/renderer/DEPS @@ -0,0 +1,3 @@ +include_rules = [ + "+gin", +] diff --git a/content/shell/renderer/gc_controller.cc b/content/shell/renderer/gc_controller.cc new file mode 100644 index 0000000..ad4fa04 --- /dev/null +++ b/content/shell/renderer/gc_controller.cc @@ -0,0 +1,55 @@ +// Copyright 2014 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/shell/renderer/gc_controller.h" + +#include "gin/arguments.h" +#include "gin/handle.h" +#include "gin/object_template_builder.h" +#include "third_party/WebKit/public/web/WebFrame.h" +#include "third_party/WebKit/public/web/WebKit.h" +#include "v8/include/v8.h" + +namespace content { + +gin::WrapperInfo GCController::kWrapperInfo = {gin::kEmbedderNativeGin}; + +// static +void GCController::Install(blink::WebFrame* frame) { + v8::Isolate* isolate = blink::mainThreadIsolate(); + v8::HandleScope handle_scope(isolate); + v8::Handle<v8::Context> context = frame->mainWorldScriptContext(); + if (context.IsEmpty()) + return; + + v8::Context::Scope context_scope(context); + + gin::Handle<GCController> controller = + gin::CreateHandle(isolate, new GCController()); + v8::Handle<v8::Object> global = context->Global(); + global->Set(gin::StringToV8(isolate, "GCController"), controller.ToV8()); +} + +GCController::GCController() {} + +GCController::~GCController() {} + +gin::ObjectTemplateBuilder GCController::GetObjectTemplateBuilder( + v8::Isolate* isolate) { + return gin::Wrappable<GCController>::GetObjectTemplateBuilder(isolate) + .SetMethod("collect", &GCController::Collect) + .SetMethod("minorCollect", &GCController::MinorCollect); +} + +void GCController::Collect(const gin::Arguments& args) { + args.isolate()->RequestGarbageCollectionForTesting( + v8::Isolate::kFullGarbageCollection); +} + +void GCController::MinorCollect(const gin::Arguments& args) { + args.isolate()->RequestGarbageCollectionForTesting( + v8::Isolate::kMinorGarbageCollection); +} + +} // namespace content diff --git a/content/shell/renderer/gc_controller.h b/content/shell/renderer/gc_controller.h new file mode 100644 index 0000000..c2409e5 --- /dev/null +++ b/content/shell/renderer/gc_controller.h @@ -0,0 +1,42 @@ +// Copyright 2014 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. + +#ifndef CONTENT_SHELL_RENDERER_GC_CONTROLLER_H_ +#define CONTENT_SHELL_RENDERER_GC_CONTROLLER_H_ + +#include "base/basictypes.h" +#include "gin/wrappable.h" + +namespace blink { +class WebFrame; +} + +namespace gin { +class Arguments; +} + +namespace content { + +class GCController : public gin::Wrappable<GCController> { + public: + static gin::WrapperInfo kWrapperInfo; + static void Install(blink::WebFrame* frame); + + private: + GCController(); + virtual ~GCController(); + + // gin::Wrappable. + virtual gin::ObjectTemplateBuilder GetObjectTemplateBuilder( + v8::Isolate* isolate) OVERRIDE; + + void Collect(const gin::Arguments& args); + void MinorCollect(const gin::Arguments& args); + + DISALLOW_COPY_AND_ASSIGN(GCController); +}; + +} // namespace content + +#endif // CONTENT_SHELL_RENDERER_GC_CONTROLLER_H_ diff --git a/content/shell/renderer/gc_extension.cc b/content/shell/renderer/gc_extension.cc deleted file mode 100644 index 86afa2f..0000000 --- a/content/shell/renderer/gc_extension.cc +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 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 "content/shell/renderer/gc_extension.h" - -#include "v8/include/v8.h" - -const char kGCExtensionName[] = "v8/GCController"; - -namespace extensions_v8 { - -// static -v8::Extension* GCExtension::Get() { - v8::Extension* extension = new v8::Extension( - kGCExtensionName, - "(function () {" - " var v8_gc;" - " if (gc) v8_gc = gc;" - " GCController = new Object();" - " GCController.collect =" - " function() {if (v8_gc) v8_gc(); };" - " GCController.minorCollect =" - " function() {if (v8_gc) v8_gc(true); };" - " })();"); - return extension; -} - -} // namespace extensions_v8 diff --git a/content/shell/renderer/gc_extension.h b/content/shell/renderer/gc_extension.h deleted file mode 100644 index 4970a1c..0000000 --- a/content/shell/renderer/gc_extension.h +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 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. - -#ifndef CONTENT_SHELL_RENDERER_GC_EXTENSION_H_ -#define CONTENT_SHELL_RENDERER_GC_EXTENSION_H_ - -namespace v8 { -class Extension; -} - -namespace extensions_v8 { - -// GCExtension is a v8 extension to expose a method into JS for triggering -// garbage collection. This should only be used for debugging. -class GCExtension { - public: - static v8::Extension* Get(); -}; - -} // namespace extensions_v8 - -#endif // CONTENT_SHELL_RENDERER_GC_EXTENSION_H_ diff --git a/content/shell/renderer/shell_render_process_observer.cc b/content/shell/renderer/shell_render_process_observer.cc index 457ccc4..7c332a7 100644 --- a/content/shell/renderer/shell_render_process_observer.cc +++ b/content/shell/renderer/shell_render_process_observer.cc @@ -11,7 +11,6 @@ #include "content/public/test/layouttest_support.h" #include "content/shell/common/shell_messages.h" #include "content/shell/common/shell_switches.h" -#include "content/shell/renderer/gc_extension.h" #include "content/shell/renderer/shell_content_renderer_client.h" #include "content/shell/renderer/test_runner/WebTestInterfaces.h" #include "content/shell/renderer/webkit_test_runner.h" @@ -68,7 +67,6 @@ void ShellRenderProcessObserver::WebKitInitialized() { // We always expose GC to layout tests. webkit_glue::SetJavaScriptFlags(" --expose-gc"); - RenderThread::Get()->RegisterExtension(extensions_v8::GCExtension::Get()); if (!CommandLine::ForCurrentProcess()->HasSwitch( switches::kStableReleaseMode)) { diff --git a/content/shell/renderer/webkit_test_runner.cc b/content/shell/renderer/webkit_test_runner.cc index d733556..0f9f7e6 100644 --- a/content/shell/renderer/webkit_test_runner.cc +++ b/content/shell/renderer/webkit_test_runner.cc @@ -28,6 +28,7 @@ #include "content/public/test/layouttest_support.h" #include "content/shell/common/shell_messages.h" #include "content/shell/common/webkit_test_helpers.h" +#include "content/shell/renderer/gc_controller.h" #include "content/shell/renderer/shell_render_process_observer.h" #include "content/shell/renderer/test_runner/WebTask.h" #include "content/shell/renderer/test_runner/WebTestInterfaces.h" @@ -545,6 +546,8 @@ void WebKitTestRunner::captureHistoryForWindow( void WebKitTestRunner::DidClearWindowObject(WebFrame* frame, int world_id) { WebTestingSupport::injectInternalsObject(frame); ShellRenderProcessObserver::GetInstance()->test_interfaces()->bindTo(frame); + if (world_id == 0) + GCController::Install(frame); } bool WebKitTestRunner::OnMessageReceived(const IPC::Message& message) { |