diff options
Diffstat (limited to 'content')
-rw-r--r-- | content/content_tests.gypi | 1 | ||||
-rw-r--r-- | content/renderer/render_thread_impl.cc | 1 | ||||
-rw-r--r-- | content/renderer/render_thread_impl_browsertest.cc | 62 |
3 files changed, 64 insertions, 0 deletions
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index ab5af6e..eb5e975 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -780,6 +780,7 @@ 'renderer/pepper/pepper_file_chooser_host_unittest.cc', 'renderer/pepper/pepper_graphics_2d_host_unittest.cc', 'renderer/pepper/pepper_url_request_unittest.cc', + 'renderer/render_thread_impl_browsertest.cc', 'renderer/render_view_browsertest.cc', 'renderer/render_view_browsertest_mac.mm', 'renderer/render_widget_browsertest.cc', diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index c35a2c5..0c4212b 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -438,6 +438,7 @@ RenderThreadImpl::~RenderThreadImpl() { compositor_output_surface_filter_ = NULL; } + compositor_thread_.reset(); if (input_handler_manager_.get()) { RemoveFilter(input_handler_manager_->GetMessageFilter()); input_handler_manager_.reset(); diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc new file mode 100644 index 0000000..79eb6bc --- /dev/null +++ b/content/renderer/render_thread_impl_browsertest.cc @@ -0,0 +1,62 @@ +// 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 "base/command_line.h" +#include "content/public/common/content_switches.h" +#include "content/public/renderer/content_renderer_client.h" +#include "content/renderer/render_process_impl.h" +#include "content/renderer/render_thread_impl.h" +#include "content/test/mock_render_process.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace content { +namespace { + +class RenderThreadImplBrowserTest : public testing::Test { + public: + virtual ~RenderThreadImplBrowserTest() {} +}; + +class DummyListener : public IPC::Listener { + public: + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { + return true; + } +}; + +void CheckRenderThreadInputHandlerManager(RenderThreadImpl* thread) { + ASSERT_TRUE(thread->input_handler_manager()); +} + +// Check that InputHandlerManager outlives compositor thread because it uses +// raw pointers to post tasks. +TEST_F(RenderThreadImplBrowserTest, + InputHandlerManagerDestroyedAfterCompositorThread) { + CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kEnableThreadedCompositing); + + ContentRendererClient content_renderer_client; + SetRendererClientForTesting(&content_renderer_client); + MessageLoopForIO message_loop_; + + std::string channel_id = IPC::Channel::GenerateVerifiedChannelID( + std::string()); + DummyListener dummy_listener; + IPC::Channel channel(channel_id, IPC::Channel::MODE_SERVER, &dummy_listener); + ASSERT_TRUE(channel.Connect()); + + scoped_ptr<MockRenderProcess> mock_process(new MockRenderProcess); + // Owned by mock_process. + RenderThreadImpl* thread = new RenderThreadImpl(channel_id); + thread->EnsureWebKitInitialized(); + + ASSERT_TRUE(thread->input_handler_manager()); + + thread->compositor_message_loop_proxy()->PostTask( + FROM_HERE, + base::Bind(&CheckRenderThreadInputHandlerManager, thread)); +} + +} // namespace +} // namespace content |