Index: chrome/browser/image_decoder_browsertest.cc |
diff --git a/chrome/browser/image_decoder_browsertest.cc b/chrome/browser/image_decoder_browsertest.cc |
index 5621815a3bab0fb5a732e41c4c232cf6dc77dd71..f5c81eeb1bbae5eeabdd4a4138ab50d9d5e3a173 100644 |
--- a/chrome/browser/image_decoder_browsertest.cc |
+++ b/chrome/browser/image_decoder_browsertest.cc |
@@ -4,8 +4,15 @@ |
#include "chrome/browser/image_decoder.h" |
+#if defined(OS_POSIX) |
+#include <sys/types.h> |
+#include <signal.h> |
+#endif |
+ |
#include "chrome/test/base/in_process_browser_test.h" |
+#include "content/public/browser/browser_child_process_observer.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/child_process_data.h" |
#include "content/public/test/test_utils.h" |
using content::BrowserThread; |
@@ -46,6 +53,59 @@ class TestImageRequest : public ImageDecoder::ImageRequest { |
DISALLOW_COPY_AND_ASSIGN(TestImageRequest); |
}; |
+class KillProcessObserver : public content::BrowserChildProcessObserver { |
+ public: |
+ KillProcessObserver() { |
+ Add(this); |
+ } |
+ |
+ ~KillProcessObserver() override { |
+ Remove(this); |
+ } |
+ |
+ private: |
+ void BrowserChildProcessHostConnected( |
+ const content::ChildProcessData& data) override { |
+ base::ProcessHandle handle = data.handle; |
+ |
+ if (handle == base::kNullProcessHandle) |
+ return; |
+ |
+#if defined(OS_WIN) |
+ // On windows, duplicate the process handle since base::Process closes it on |
+ // destruction. |
+ base::ProcessHandle out_handle; |
+ if (!::DuplicateHandle(GetCurrentProcess(), handle, |
+ GetCurrentProcess(), &out_handle, |
+ 0, FALSE, DUPLICATE_SAME_ACCESS)) |
+ return; |
+ handle = out_handle; |
+#endif |
+ |
+ EXPECT_TRUE(base::Process(handle).Terminate(0, true)); |
+ } |
+}; |
+ |
+#if defined(OS_POSIX) |
+class FreezeProcessObserver : public content::BrowserChildProcessObserver { |
+ public: |
+ FreezeProcessObserver() { |
+ Add(this); |
+ } |
+ |
+ ~FreezeProcessObserver() override { |
+ Remove(this); |
+ } |
+ |
+ private: |
+ void BrowserChildProcessHostConnected( |
+ const content::ChildProcessData& data) override { |
+ if (data.handle != base::kNullProcessHandle) |
+ EXPECT_EQ(0, kill(data.handle, SIGSTOP)); |
+ } |
+}; |
+#endif // defined(OS_POSIX) |
+ |
} // namespace |
class ImageDecoderBrowserTest : public InProcessBrowserTest { |
@@ -68,3 +128,25 @@ IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndDestroy) { |
test_request.reset(); |
runner->Run(); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndKillProcess) { |
+ KillProcessObserver observer; |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ scoped_ptr<TestImageRequest> test_request( |
+ new TestImageRequest(runner->QuitClosure())); |
+ ImageDecoder::Start(test_request.get(), std::string()); |
+ runner->Run(); |
+} |
+ |
+#if defined(OS_POSIX) |
+IN_PROC_BROWSER_TEST_F(ImageDecoderBrowserTest, StartAndFreezeProcess) { |
+ FreezeProcessObserver observer; |
+ scoped_refptr<content::MessageLoopRunner> runner = |
+ new content::MessageLoopRunner; |
+ scoped_ptr<TestImageRequest> test_request( |
+ new TestImageRequest(runner->QuitClosure())); |
+ ImageDecoder::Start(test_request.get(), std::string()); |
+ runner->Run(); |
+} |
+#endif // defined(OS_POSIX) |