summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/test/ash_test_base.cc14
-rw-r--r--ash/test/test_metro_viewer_process_host.cc16
-rw-r--r--ash/test/test_metro_viewer_process_host.h4
-rw-r--r--base/base.gyp2
-rw-r--r--base/test/BUILD.gn2
-rw-r--r--base/test/test_process_killer_win.cc167
-rw-r--r--base/test/test_process_killer_win.h19
-rw-r--r--win8/metro_driver/chrome_app_view_ash.cc3
8 files changed, 24 insertions, 203 deletions
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc
index 166e2b7..e6ddbcf 100644
--- a/ash/test/ash_test_base.cc
+++ b/ash/test/ash_test_base.cc
@@ -39,7 +39,6 @@
#if defined(OS_WIN)
#include "ash/test/test_metro_viewer_process_host.h"
-#include "base/test/test_process_killer_win.h"
#include "base/win/metro.h"
#include "base/win/windows_version.h"
#include "ui/aura/remote_window_tree_host_win.h"
@@ -176,15 +175,10 @@ void AshTestBase::TearDown() {
#if defined(OS_WIN)
ui::test::SetUsePopupAsRootWindowForTest(false);
// Kill the viewer process if we spun one up.
- metro_viewer_host_.reset();
-
- // Clean up any dangling viewer processes as the metro APIs sometimes leave
- // zombies behind. A default browser process in metro will have the
- // following command line arg so use that to avoid killing all processes named
- // win8::test::kDefaultTestExePath.
- const wchar_t kViewerProcessArgument[] = L"DefaultBrowserServer";
- base::KillAllNamedProcessesWithArgument(win8::test::kDefaultTestExePath,
- kViewerProcessArgument);
+ if (metro_viewer_host_) {
+ metro_viewer_host_->TerminateViewer();
+ metro_viewer_host_.reset();
+ }
#endif
event_generator_.reset();
diff --git a/ash/test/test_metro_viewer_process_host.cc b/ash/test/test_metro_viewer_process_host.cc
index 85df3e2..156cf99 100644
--- a/ash/test/test_metro_viewer_process_host.cc
+++ b/ash/test/test_metro_viewer_process_host.cc
@@ -22,6 +22,22 @@ TestMetroViewerProcessHost::TestMetroViewerProcessHost(
TestMetroViewerProcessHost::~TestMetroViewerProcessHost() {
}
+void TestMetroViewerProcessHost::TerminateViewer() {
+ base::ProcessId viewer_process_id = GetViewerProcessId();
+ if (viewer_process_id != base::kNullProcessId) {
+ base::ProcessHandle viewer_process = NULL;
+ base::OpenProcessHandleWithAccess(
+ viewer_process_id,
+ PROCESS_QUERY_INFORMATION | SYNCHRONIZE | PROCESS_TERMINATE,
+ &viewer_process);
+ if (viewer_process) {
+ ::TerminateProcess(viewer_process, 0);
+ ::WaitForSingleObject(viewer_process, INFINITE);
+ ::CloseHandle(viewer_process);
+ }
+ }
+}
+
void TestMetroViewerProcessHost::OnChannelError() {
closed_unexpectedly_ = true;
aura::RemoteWindowTreeHostWin::Instance()->Disconnected();
diff --git a/ash/test/test_metro_viewer_process_host.h b/ash/test/test_metro_viewer_process_host.h
index f04ff0f..cf7dcd0 100644
--- a/ash/test/test_metro_viewer_process_host.h
+++ b/ash/test/test_metro_viewer_process_host.h
@@ -20,6 +20,10 @@ class TestMetroViewerProcessHost : public win8::MetroViewerProcessHost {
bool closed_unexpectedly() { return closed_unexpectedly_; }
+ // Forcibly terminate the viewer. Used on completion of tests to ensure that
+ // it's gone (quickly) so that we can start the next test immediately.
+ void TerminateViewer();
+
private:
// win8::MetroViewerProcessHost implementation
virtual void OnChannelError() OVERRIDE;
diff --git a/base/base.gyp b/base/base.gyp
index 9e1a748..3ecf841 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -939,8 +939,6 @@
'test/test_listener_ios.mm',
'test/test_pending_task.cc',
'test/test_pending_task.h',
- 'test/test_process_killer_win.cc',
- 'test/test_process_killer_win.h',
'test/test_reg_util_win.cc',
'test/test_reg_util_win.h',
'test/test_shortcut_win.cc',
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index f86f9ae..c2a825e 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -76,8 +76,6 @@ source_set("test_support") {
"test_listener_ios.mm",
"test_pending_task.cc",
"test_pending_task.h",
- "test_process_killer_win.cc",
- "test_process_killer_win.h",
"test_reg_util_win.cc",
"test_reg_util_win.h",
"test_shortcut_win.cc",
diff --git a/base/test/test_process_killer_win.cc b/base/test/test_process_killer_win.cc
deleted file mode 100644
index bb73251..0000000
--- a/base/test/test_process_killer_win.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (c) 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/test/test_process_killer_win.h"
-
-#include <windows.h>
-#include <winternl.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/process/kill.h"
-#include "base/process/process_iterator.h"
-#include "base/strings/string_util.h"
-#include "base/win/scoped_handle.h"
-
-namespace {
-
-typedef LONG WINAPI
-NtQueryInformationProcess(
- IN HANDLE ProcessHandle,
- IN PROCESSINFOCLASS ProcessInformationClass,
- OUT PVOID ProcessInformation,
- IN ULONG ProcessInformationLength,
- OUT PULONG ReturnLength OPTIONAL
-);
-
-// Get the function pointer to NtQueryInformationProcess in NTDLL.DLL
-static bool GetQIP(NtQueryInformationProcess** qip_func_ptr) {
- static NtQueryInformationProcess* qip_func =
- reinterpret_cast<NtQueryInformationProcess*>(
- GetProcAddress(GetModuleHandle(L"ntdll.dll"),
- "NtQueryInformationProcess"));
- DCHECK(qip_func) << "Could not get pointer to NtQueryInformationProcess.";
- *qip_func_ptr = qip_func;
- return qip_func != NULL;
-}
-
-// Get the command line of a process
-bool GetCommandLineForProcess(uint32 process_id, base::string16* cmd_line) {
- DCHECK(process_id != 0);
- DCHECK(cmd_line);
-
- // Open the process
- base::win::ScopedHandle process_handle(::OpenProcess(
- PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
- false,
- process_id));
- if (!process_handle) {
- DLOG(ERROR) << "Failed to open process " << process_id << ", last error = "
- << GetLastError();
- }
-
- // Obtain Process Environment Block
- NtQueryInformationProcess* qip_func = NULL;
- if (process_handle) {
- GetQIP(&qip_func);
- }
-
- // Read the address of the process params from the peb.
- DWORD process_params_address = 0;
- if (qip_func) {
- PROCESS_BASIC_INFORMATION info = { 0 };
- // NtQueryInformationProcess returns an NTSTATUS for whom negative values
- // are negative. Just check for that instead of pulling in DDK macros.
- if ((qip_func(process_handle.Get(),
- ProcessBasicInformation,
- &info,
- sizeof(info),
- NULL)) < 0) {
- DLOG(ERROR) << "Failed to invoke NtQueryProcessInformation, last error = "
- << GetLastError();
- } else {
- BYTE* peb = reinterpret_cast<BYTE*>(info.PebBaseAddress);
-
- // The process command line parameters are (or were once) located at
- // the base address of the PEB + 0x10 for 32 bit processes. 64 bit
- // processes have a different PEB struct as per
- // http://msdn.microsoft.com/en-us/library/aa813706(VS.85).aspx.
- // TODO(robertshield): See about doing something about this.
- SIZE_T bytes_read = 0;
- if (!::ReadProcessMemory(process_handle.Get(),
- peb + 0x10,
- &process_params_address,
- sizeof(process_params_address),
- &bytes_read)) {
- DLOG(ERROR) << "Failed to read process params address, last error = "
- << GetLastError();
- }
- }
- }
-
- // Copy all the process parameters into a buffer.
- bool success = false;
- base::string16 buffer;
- if (process_params_address) {
- SIZE_T bytes_read;
- RTL_USER_PROCESS_PARAMETERS params = { 0 };
- if (!::ReadProcessMemory(process_handle.Get(),
- reinterpret_cast<void*>(process_params_address),
- &params,
- sizeof(params),
- &bytes_read)) {
- DLOG(ERROR) << "Failed to read RTL_USER_PROCESS_PARAMETERS, "
- << "last error = " << GetLastError();
- } else {
- // Read the command line parameter
- const int max_cmd_line_len = std::min(
- static_cast<int>(params.CommandLine.MaximumLength),
- 4096);
- buffer.resize(max_cmd_line_len + 1);
- if (!::ReadProcessMemory(process_handle.Get(),
- params.CommandLine.Buffer,
- &buffer[0],
- max_cmd_line_len,
- &bytes_read)) {
- DLOG(ERROR) << "Failed to copy process command line, "
- << "last error = " << GetLastError();
- } else {
- *cmd_line = buffer;
- success = true;
- }
- }
- }
-
- return success;
-}
-
-// Used to filter processes by process ID.
-class ArgumentFilter : public base::ProcessFilter {
- public:
- explicit ArgumentFilter(const base::string16& argument)
- : argument_to_find_(argument) {}
-
- // Returns true to indicate set-inclusion and false otherwise. This method
- // should not have side-effects and should be idempotent.
- virtual bool Includes(const base::ProcessEntry& entry) const {
- bool found = false;
- base::string16 command_line;
- if (GetCommandLineForProcess(entry.pid(), &command_line)) {
- base::string16::const_iterator it =
- std::search(command_line.begin(),
- command_line.end(),
- argument_to_find_.begin(),
- argument_to_find_.end(),
- base::CaseInsensitiveCompareASCII<wchar_t>());
- found = (it != command_line.end());
- }
- return found;
- }
-
- protected:
- base::string16 argument_to_find_;
-};
-
-} // namespace
-
-namespace base {
-
-bool KillAllNamedProcessesWithArgument(const string16& process_name,
- const string16& argument) {
- ArgumentFilter argument_filter(argument);
- return base::KillProcesses(process_name, 0, &argument_filter);
-}
-
-} // namespace base
diff --git a/base/test/test_process_killer_win.h b/base/test/test_process_killer_win.h
deleted file mode 100644
index 08ef21b..0000000
--- a/base/test/test_process_killer_win.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 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 BASE_TEST_TEST_PROCESS_KILLER_WIN_H_
-#define BASE_TEST_TEST_PROCESS_KILLER_WIN_H_
-
-#include "base/strings/string16.h"
-
-namespace base {
-
-// Kills all running processes named |process_name| that have the string
-// |argument| on their command line.
-bool KillAllNamedProcessesWithArgument(const string16& process_name,
- const string16& argument);
-
-} // namespace base
-
-#endif // BASE_TEST_TEST_PROCESS_KILLER_WIN_H_
diff --git a/win8/metro_driver/chrome_app_view_ash.cc b/win8/metro_driver/chrome_app_view_ash.cc
index 991857d..db2d9f3 100644
--- a/win8/metro_driver/chrome_app_view_ash.cc
+++ b/win8/metro_driver/chrome_app_view_ash.cc
@@ -970,9 +970,6 @@ void ChromeAppViewAsh::OnMetroExit(MetroTerminateMethod method) {
globals.app_exit->Exit();
}
-
- // Try really hard, see http://crbug.com/411147 for details.
- ::TerminateProcess(::GetCurrentProcess(), 0);
}
void ChromeAppViewAsh::OnInputSourceChanged() {