Index: chrome/browser/diagnostics/recon_diagnostics.cc |
=================================================================== |
--- chrome/browser/diagnostics/recon_diagnostics.cc (revision 70409) |
+++ chrome/browser/diagnostics/recon_diagnostics.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2011 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. |
@@ -22,6 +22,7 @@ |
#if defined(OS_WIN) |
#include "base/win/windows_version.h" |
+#include "chrome/browser/enumerate_modules_model_win.h" |
#include "chrome/installer/util/install_util.h" |
#endif |
@@ -29,7 +30,7 @@ |
// diagnostic tests. Here we check for the existence of critical files. |
// TODO(cpu): Define if it makes sense to localize strings. |
-// TODO(cpu): There are a few maxium file sizes hardcoded in this file |
+// TODO(cpu): There are a few maximum file sizes hardcoded in this file |
// that have little or no theoretical or experimental ground. Find a way |
// to justify them. |
@@ -61,7 +62,7 @@ |
return false; |
} |
#else |
- // TODO(port): define the OS criteria for linux and mac. |
+ // TODO(port): define the OS criteria for Linux and Mac. |
#endif // defined(OS_WIN) |
RecordSuccess(ASCIIToUTF16(StringPrintf("%s %s (%d [%d:%d])", |
base::SysInfo::OperatingSystemName().c_str(), |
@@ -74,6 +75,60 @@ |
DISALLOW_COPY_AND_ASSIGN(OperatingSystemTest); |
}; |
+// Check if any conflicting DLLs are loaded. |
+class ConflictingDllsTest : public DiagnosticTest { |
+ public: |
+ ConflictingDllsTest() : DiagnosticTest(ASCIIToUTF16("Conflicting modules")) {} |
+ |
+ virtual int GetId() { return 0; } |
+ |
+ virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) { |
+#if defined(OS_WIN) |
+ EnumerateModulesModel* model = EnumerateModulesModel::GetInstance(); |
+ model->set_limited_mode(true); |
+ model->ScanNow(); |
+ ListValue* list = model->GetModuleList(); |
+ if (!model->confirmed_bad_modules_detected() && |
+ !model->suspected_bad_modules_detected()) { |
+ RecordSuccess(ASCIIToUTF16("No conflicting modules found")); |
+ return true; |
+ } |
+ |
+ string16 failures = ASCIIToUTF16("Possibly conflicting modules:"); |
+ DictionaryValue* dictionary; |
+ for (size_t i = 0; i < list->GetSize(); ++i) { |
+ list->GetDictionary(i, &dictionary); |
+ int status; |
+ string16 location; |
+ string16 name; |
+ if (!dictionary->GetInteger("status", &status)) |
+ RecordFailure(ASCIIToUTF16("No 'status' field found")); |
+ if (status < ModuleEnumerator::SUSPECTED_BAD) |
+ continue; |
+ |
+ if (!dictionary->GetString("location", &location)) { |
+ RecordFailure(ASCIIToUTF16("No 'location' field found")); |
+ return true; |
+ } |
+ if (!dictionary->GetString("name", &name)) { |
+ RecordFailure(ASCIIToUTF16("No 'name' field found")); |
+ return true; |
+ } |
+ |
+ failures += ASCIIToUTF16("\n") + location + name; |
+ } |
+ RecordFailure(failures); |
+ return true; |
+#else |
+ RecordFailure(ASCIIToUTF16("Not implemented")); |
+ return true; |
+#endif // defined(OS_WIN) |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(ConflictingDllsTest); |
+}; |
+ |
// Check if it is system install or per-user install. |
class InstallTypeTest : public DiagnosticTest { |
public: |
@@ -163,9 +218,9 @@ |
true, false, false, 0} |
}; |
-// Check that the user's data directory exists and the paths are writeable. |
-// If it is a systemwide install some paths are not expected to be writeable. |
-// This test depends on |InstallTypeTest| having run succesfuly. |
+// Check that the user's data directory exists and the paths are writable. |
+// If it is a systemwide install some paths are not expected to be writable. |
+// This test depends on |InstallTypeTest| having run successfully. |
class PathTest : public DiagnosticTest { |
public: |
explicit PathTest(const TestPathInfo& path_info) |
@@ -227,7 +282,7 @@ |
}; |
// Check that the disk space in the volume where the user data dir normally |
-// lives is not dangerosly low. |
+// lives is not dangerously low. |
class DiskSpaceTest : public DiagnosticTest { |
public: |
DiskSpaceTest() : DiagnosticTest(ASCIIToUTF16("Disk Space")) {} |
@@ -337,6 +392,10 @@ |
return new OperatingSystemTest(); |
} |
+DiagnosticTest* MakeConflictingDllsTest() { |
+ return new ConflictingDllsTest(); |
+} |
+ |
DiagnosticTest* MakeInstallTypeTest() { |
return new InstallTypeTest(); |
} |