[go: nahoru, domu]

Refactoring for portability:
 - Move chrome/common/env_util to base/sys_info
 - Move chrome/common/rand_util to base/rand_util (new), simplify its public
   interface, and fix its implementation

Patch by Paweł Hajdan, Jr. <phajdan.jr@gmail.com>

http://codereview.chromium.org/4079


git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2697 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/base/SConscript b/base/SConscript
index 11858d1..939ab6e 100644
--- a/base/SConscript
+++ b/base/SConscript
@@ -50,6 +50,7 @@
     'non_thread_safe.cc',
     'path_service.cc',
     'pickle.cc',
+    'rand_util.cc',
     'ref_counted.cc',
     'revocable_store.cc',
     'sha2.cc',
@@ -113,6 +114,7 @@
       'pe_image.cc',
       'platform_thread_win.cc',
       'process_util_win.cc',
+      'rand_util_win.cc',
       'registry.cc',
       'shared_memory_win.cc',
       'sys_info_win.cc',
@@ -136,6 +138,7 @@
       'message_pump_libevent.cc',
       'platform_thread_posix.cc',
       'process_util_posix.cc',
+      'rand_util_posix.cc',
       'shared_memory_posix.cc',
       'string16.cc',
       'sys_info_posix.cc',
@@ -261,6 +264,7 @@
     'path_service_unittest.cc',
     'pickle_unittest.cc',
     'pr_time_unittest.cc',
+    'rand_util_unittest.cc',
     'ref_counted_unittest.cc',
     'run_all_unittests.cc',
     'scoped_ptr_unittest.cc',
diff --git a/base/base.xcodeproj/project.pbxproj b/base/base.xcodeproj/project.pbxproj
index 4abf9c5..b8db42ec 100644
--- a/base/base.xcodeproj/project.pbxproj
+++ b/base/base.xcodeproj/project.pbxproj
@@ -35,6 +35,9 @@
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
+		4D11B59A0E91730200EF7617 /* rand_util.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D11B5940E9172F800EF7617 /* rand_util.cc */; };
+		4D11B59B0E91730200EF7617 /* rand_util_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D11B5960E9172F800EF7617 /* rand_util_posix.cc */; };
+		4D11B59C0E91730500EF7617 /* rand_util_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D11B5970E9172F800EF7617 /* rand_util_unittest.cc */; };
 		7B26302F0E82F218001CE27F /* message_pump_libevent.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B26302D0E82F218001CE27F /* message_pump_libevent.cc */; };
 		7B2630330E82F258001CE27F /* libevent.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B2630240E82F1E6001CE27F /* libevent.a */; };
 		7B4C5F4A0E4B6BF900679E8F /* sys_string_conversions_mac.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7B4C5F480E4B6BF900679E8F /* sys_string_conversions_mac.cc */; };
@@ -359,6 +362,10 @@
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+		4D11B5940E9172F800EF7617 /* rand_util.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rand_util.cc; sourceTree = "<group>"; };
+		4D11B5950E9172F800EF7617 /* rand_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand_util.h; sourceTree = "<group>"; };
+		4D11B5960E9172F800EF7617 /* rand_util_posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rand_util_posix.cc; sourceTree = "<group>"; };
+		4D11B5970E9172F800EF7617 /* rand_util_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rand_util_unittest.cc; sourceTree = "<group>"; };
 		7B1435DE0E78416400901940 /* skia_utils_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = skia_utils_mac.h; sourceTree = "<group>"; };
 		7B1435DF0E78419700901940 /* native_widget_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = native_widget_types.h; sourceTree = "<group>"; };
 		7B26301F0E82F1E6001CE27F /* libevent.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = libevent.xcodeproj; path = third_party/libevent/libevent.xcodeproj; sourceTree = "<group>"; };
@@ -914,6 +921,10 @@
 				825403490D92D23C0006B936 /* prtypes.h */,
 				825403550D92D2580006B936 /* pure.h */,
 				825403570D92D25E0006B936 /* pure_api.c */,
+				4D11B5940E9172F800EF7617 /* rand_util.cc */,
+				4D11B5950E9172F800EF7617 /* rand_util.h */,
+				4D11B5960E9172F800EF7617 /* rand_util_posix.cc */,
+				4D11B5970E9172F800EF7617 /* rand_util_unittest.cc */,
 				7B836C040E55BBB800F6AD31 /* ref_counted.cc */,
 				825403590D92D27C0006B936 /* ref_counted.h */,
 				E4AFA4BA0E50DDDF00201347 /* ref_counted_unittest.cc */,
@@ -1346,6 +1357,8 @@
 				93E703170E5D63E00046259B /* platform_thread_posix.cc in Sources */,
 				7BD8F4A10E65AA4600034DE9 /* process_util_posix.cc in Sources */,
 				824654DF0DC26521007C2BAA /* prtime.cc in Sources */,
+				4D11B59A0E91730200EF7617 /* rand_util.cc in Sources */,
+				4D11B59B0E91730200EF7617 /* rand_util_posix.cc in Sources */,
 				7B836C050E55BBB800F6AD31 /* ref_counted.cc in Sources */,
 				8246548C0DC259DB007C2BAA /* revocable_store.cc in Sources */,
 				7BA35DD30E8C0D5F0023C8B9 /* scoped_nsautorelease_pool.mm in Sources */,
@@ -1422,6 +1435,7 @@
 				A5CB82980E5C74E300FD6825 /* platform_test_mac.mm in Sources */,
 				7B8505D50E5B441000730B43 /* png_codec_unittest.cc in Sources */,
 				7B78D3980E54FE0100609465 /* pr_time_unittest.cc in Sources */,
+				4D11B59C0E91730500EF7617 /* rand_util_unittest.cc in Sources */,
 				7B8505D30E5B43EE00730B43 /* rect_unittest.cc in Sources */,
 				7B78D3990E54FE0100609465 /* ref_counted_unittest.cc in Sources */,
 				7B78D39A0E54FE0100609465 /* run_all_unittests.cc in Sources */,
diff --git a/base/build/base.vcproj b/base/build/base.vcproj
index c188a0f..a5cd362 100644
--- a/base/build/base.vcproj
+++ b/base/build/base.vcproj
@@ -558,6 +558,18 @@
 			>
 		</File>
 		<File
+			RelativePath="..\rand_util.cc"
+			>
+		</File>
+		<File
+			RelativePath="..\rand_util.h"
+			>
+		</File>
+		<File
+			RelativePath="..\rand_util_win.cc"
+			>
+		</File>
+		<File
 			RelativePath="..\ref_counted.cc"
 			>
 		</File>
diff --git a/base/build/base_unittests.vcproj b/base/build/base_unittests.vcproj
index 4f1d999..daf0360 100644
--- a/base/build/base_unittests.vcproj
+++ b/base/build/base_unittests.vcproj
@@ -256,6 +256,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\rand_util_unittest.cc"
+				>
+			</File>
+			<File
 				RelativePath="..\ref_counted_unittest.cc"
 				>
 			</File>
diff --git a/base/rand_util.cc b/base/rand_util.cc
new file mode 100644
index 0000000..89b5b326
--- /dev/null
+++ b/base/rand_util.cc
@@ -0,0 +1,47 @@
+// Copyright (c) 2008 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/rand_util.h"
+
+#include <math.h>
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+
+namespace {
+
+union uint64_splitter {
+  uint64 normal;
+  uint16 split[4];
+};
+
+}  // namespace
+
+namespace base {
+
+int RandInt(int min, int max) {
+  DCHECK(min <= max);
+
+  uint64 range = static_cast<int64>(max) - min + 1;
+  uint64 number = base::RandUInt64();
+  int result = min + static_cast<int>(number % range);
+  DCHECK(result >= min && result <= max);
+  return result;
+}
+
+double RandDouble() {
+  uint64_splitter number;
+  number.normal = base::RandUInt64();
+
+  // Standard code based on drand48 would give only 48 bits of precision.
+  // We try to get maximum precision for IEEE 754 double (52 bits).
+  double result = ldexp(static_cast<double>(number.split[0] & 0xf), -52) +
+                  ldexp(static_cast<double>(number.split[1]), -48) +
+                  ldexp(static_cast<double>(number.split[2]), -32) +
+                  ldexp(static_cast<double>(number.split[3]), -16);
+  DCHECK(result >= 0.0 && result < 1.0);
+  return result;
+}
+
+}  // namespace base
diff --git a/base/rand_util.h b/base/rand_util.h
new file mode 100644
index 0000000..cd687dd
--- /dev/null
+++ b/base/rand_util.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2008 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_RAND_UTIL_H_
+#define BASE_RAND_UTIL_H_
+
+#include "base/basictypes.h"
+
+namespace base {
+
+// Returns a random number in range [0, kuint64max]. Thread-safe.
+uint64 RandUInt64();
+
+// Returns a random number between min and max (inclusive). Thread-safe.
+int RandInt(int min, int max);
+
+// Returns a random double in range [0, 1). Thread-safe.
+double RandDouble();
+
+}  // namespace base
+
+#endif // BASE_RAND_UTIL_H_
diff --git a/base/rand_util_posix.cc b/base/rand_util_posix.cc
new file mode 100644
index 0000000..392cde50
--- /dev/null
+++ b/base/rand_util_posix.cc
@@ -0,0 +1,27 @@
+// Copyright (c) 2008 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/rand_util.h"
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "base/logging.h"
+
+namespace base {
+
+uint64 RandUInt64() {
+  uint64 number;
+
+  int urandom_fd = open("/dev/urandom", O_RDONLY);
+  CHECK(urandom_fd >= 0);
+  ssize_t bytes_read = read(urandom_fd, &number, sizeof(number));
+  CHECK(bytes_read == sizeof(number));
+  close(urandom_fd);
+
+  return number;
+}
+
+}  // namespace base
diff --git a/base/rand_util_unittest.cc b/base/rand_util_unittest.cc
new file mode 100644
index 0000000..27106278
--- /dev/null
+++ b/base/rand_util_unittest.cc
@@ -0,0 +1,22 @@
+// Copyright (c) 2008 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/rand_util.h"
+
+#include <limits>
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+const int kIntMin = std::numeric_limits<int>::min();
+const int kIntMax = std::numeric_limits<int>::max();
+
+}  // namespace
+
+TEST(RandUtilTest, SameMinAndMax) {
+  EXPECT_EQ(base::RandInt(0, 0), 0);
+  EXPECT_EQ(base::RandInt(kIntMin, kIntMin), kIntMin);
+  EXPECT_EQ(base::RandInt(kIntMax, kIntMax), kIntMax);
+}
diff --git a/base/rand_util_win.cc b/base/rand_util_win.cc
new file mode 100644
index 0000000..12cf11e1
--- /dev/null
+++ b/base/rand_util_win.cc
@@ -0,0 +1,30 @@
+// Copyright (c) 2008 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/rand_util.h"
+
+#include <stdlib.h>
+
+#include "base/basictypes.h"
+#include "base/logging.h"
+
+namespace {
+  
+uint32 RandUInt32() {
+  uint32 number;
+  CHECK(rand_s(&number) == 0);
+  return number;
+}
+
+}  // namespace
+
+namespace base {
+
+uint64 RandUInt64() {
+  uint32 first_half = RandUInt32();
+  uint32 second_half = RandUInt32();
+  return (static_cast<uint64>(first_half) << 32) + second_half;
+}
+
+}  // namespace base
diff --git a/base/sys_info.h b/base/sys_info.h
index 3d6a16a6..a70f5b6 100644
--- a/base/sys_info.h
+++ b/base/sys_info.h
@@ -28,6 +28,31 @@
   // or -1 on failure.
   static int64 AmountOfFreeDiskSpace(const std::wstring& path);
 
+  // Return true if the given environment variable is defined.
+  // TODO: find a better place for HasEnvVar.
+  static bool HasEnvVar(const wchar_t* var);
+
+  // Return the value of the given environment variable
+  // or an empty string if not defined.
+  // TODO: find a better place for GetEnvVar.
+  static std::wstring GetEnvVar(const wchar_t* var);
+
+  // Returns the name of the host operating system.
+  static std::string OperatingSystemName();
+
+  // Returns the version of the host operating system.
+  static std::string OperatingSystemVersion();
+
+  // Returns the CPU architecture of the system. Exact return value may differ
+  // across platforms.
+  static std::string CPUArchitecture();
+
+  // Returns the pixel dimensions of the primary display via the
+  // width and height parameters.
+  static void GetPrimaryDisplayDimensions(int* width, int* height);
+
+  // Return the number of displays.
+  static int DisplayCount();
 };
 
 }  // namespace base
diff --git a/base/sys_info_posix.cc b/base/sys_info_posix.cc
index 28c8bd6a..b39457d 100644
--- a/base/sys_info_posix.cc
+++ b/base/sys_info_posix.cc
@@ -8,6 +8,7 @@
 #include <errno.h>
 #include <string.h>
 #include <sys/statvfs.h>
+#include <sys/utsname.h>
 #include <unistd.h>
 
 #if defined(OS_MACOSX)
@@ -70,4 +71,62 @@
   return static_cast<int64>(stats.f_bavail) * stats.f_frsize;
 }
 
+// static
+bool SysInfo::HasEnvVar(const wchar_t* var) {
+  std::string var_utf8 = WideToUTF8(std::wstring(var));
+  return getenv(var_utf8.c_str()) != NULL;
+}
+
+// static
+std::wstring SysInfo::GetEnvVar(const wchar_t* var) {
+  std::string var_utf8 = WideToUTF8(std::wstring(var));
+  char* value = getenv(var_utf8.c_str());
+  if (!value) {
+    return L"";
+  } else {
+    return UTF8ToWide(value);
+  }
+}
+
+// static
+std::string SysInfo::OperatingSystemName() {
+  utsname info;
+  if (uname(&info) < 0) {
+    NOTREACHED();
+    return "";
+  }
+  return std::string(info.sysname);
+}
+
+// static
+std::string SysInfo::OperatingSystemVersion() {
+  utsname info;
+  if (uname(&info) < 0) {
+    NOTREACHED();
+    return "";
+  }
+  return std::string(info.release);
+}
+
+// static
+std::string SysInfo::CPUArchitecture() {
+  utsname info;
+  if (uname(&info) < 0) {
+    NOTREACHED();
+    return "";
+  }
+  return std::string(info.machine);
+}
+
+// static
+void SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
+  NOTIMPLEMENTED();
+}
+
+// static
+int SysInfo::DisplayCount() {
+  NOTIMPLEMENTED();
+  return 1;
+}
+
 }  // namespace base
diff --git a/base/sys_info_unittest.cc b/base/sys_info_unittest.cc
index 8357c5a5..ea67aa4 100644
--- a/base/sys_info_unittest.cc
+++ b/base/sys_info_unittest.cc
@@ -26,3 +26,13 @@
   ASSERT_TRUE(file_util::GetTempDir(&tmp_path));
   EXPECT_GT(base::SysInfo::AmountOfFreeDiskSpace(tmp_path), 0) << tmp_path;
 }
+
+TEST_F(SysInfoTest, GetEnvVar) {
+  // Every setup should have non-empty PATH...
+  EXPECT_NE(base::SysInfo::GetEnvVar(L"PATH"), L"");
+}
+
+TEST_F(SysInfoTest, HasEnvVar) {
+  // Every setup should have PATH...
+  EXPECT_TRUE(base::SysInfo::HasEnvVar(L"PATH"));
+}
diff --git a/base/sys_info_win.cc b/base/sys_info_win.cc
index 2d3c203..4d52c4a 100644
--- a/base/sys_info_win.cc
+++ b/base/sys_info_win.cc
@@ -7,6 +7,8 @@
 #include <windows.h>
 
 #include "base/logging.h"
+#include "base/scoped_ptr.h"
+#include "base/string_util.h"
 
 namespace base {
 
@@ -44,4 +46,58 @@
   return rv;
 }
 
+// static
+bool SysInfo::HasEnvVar(const wchar_t* var) {
+  return GetEnvironmentVariable(var, NULL, 0) != 0;
+}
+
+// static
+std::wstring SysInfo::GetEnvVar(const wchar_t* var) {
+  DWORD value_length = GetEnvironmentVariable(var, NULL, 0);
+  if (value_length == 0) {
+    return L"";
+  }
+  scoped_array<wchar_t> value(new wchar_t[value_length]);
+  GetEnvironmentVariable(var, value.get(), value_length);
+  return std::wstring(value.get());
+}
+
+// static
+std::string SysInfo::OperatingSystemName() {
+  return "Windows NT";
+}
+
+// static
+std::string SysInfo::OperatingSystemVersion() {
+  OSVERSIONINFO info = {0};
+  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+  GetVersionEx(&info);
+
+  return StringPrintf("%lu.%lu", info.dwMajorVersion, info.dwMinorVersion);
+}
+
+// TODO: Implement OperatingSystemVersionComplete, which would include
+// patchlevel/service pack number. See chrome/browser/views/bug_report_view.cc,
+// BugReportView::SetOSVersion.
+
+// static
+std::string SysInfo::CPUArchitecture() {
+  // TODO: Make this vary when we support any other architectures.
+  return "x86";
+}
+
+// static
+void SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
+  if (width)
+    *width = GetSystemMetrics(SM_CXSCREEN);
+
+  if (height)
+    *height = GetSystemMetrics(SM_CYSCREEN);
+}
+
+// static
+int SysInfo::DisplayCount() {
+  return GetSystemMetrics(SM_CMONITORS);
+}
+
 }  // namespace base
diff --git a/chrome/browser/browser_main.cc b/chrome/browser/browser_main.cc
index fbb216a9..3cb98f1 100644
--- a/chrome/browser/browser_main.cc
+++ b/chrome/browser/browser_main.cc
@@ -41,7 +41,6 @@
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/env_vars.h"
 #include "chrome/common/jstemplate_builder.h"
 #include "chrome/common/l10n_util.h"
diff --git a/chrome/browser/cache_manager_host.cc b/chrome/browser/cache_manager_host.cc
index 13fc1719b..be6faf3c 100644
--- a/chrome/browser/cache_manager_host.cc
+++ b/chrome/browser/cache_manager_host.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/render_process_host.h"
 #include "chrome/common/chrome_constants.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/pref_service.h"
 #include "chrome/common/notification_service.h"
diff --git a/chrome/browser/importer/importer_unittest.cc b/chrome/browser/importer/importer_unittest.cc
index 3d39db1..4a0a8df 100644
--- a/chrome/browser/importer/importer_unittest.cc
+++ b/chrome/browser/importer/importer_unittest.cc
@@ -19,7 +19,6 @@
 #include "chrome/browser/importer/importer.h"
 #include "chrome/browser/profile.h"
 #include "chrome/common/chrome_paths.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/win_util.h"
 
 class ImporterTest : public testing::Test {
@@ -274,10 +273,6 @@
 }
 
 TEST_F(ImporterTest, IEImporter) {
-  // Skips in Win2000 for the running environment can not be set up.
-  if (env_util::GetOperatingSystemVersion() == "5.0")
-    return;
-
   // Sets up a favorites folder.
   win_util::ScopedCOMInitializer com_init;
   std::wstring path = test_path_;
diff --git a/chrome/browser/metrics_log.cc b/chrome/browser/metrics_log.cc
index bb2c2bb..a1d8f675 100644
--- a/chrome/browser/metrics_log.cc
+++ b/chrome/browser/metrics_log.cc
@@ -12,7 +12,6 @@
 #include "base/sys_info.h"
 #include "chrome/browser/autocomplete/autocomplete.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/logging_chrome.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/pref_service.h"
@@ -447,7 +446,7 @@
 
   {
     OPEN_ELEMENT_FOR_SCOPE("cpu");
-    WriteAttribute("arch", env_util::GetCPUArchitecture());
+    WriteAttribute("arch", base::SysInfo::CPUArchitecture());
   }
 
   {
@@ -469,19 +468,19 @@
   {
     OPEN_ELEMENT_FOR_SCOPE("os");
     WriteAttribute("name",
-                   env_util::GetOperatingSystemName());
+                   base::SysInfo::OperatingSystemName());
     WriteAttribute("version",
-                   env_util::GetOperatingSystemVersion());
+                   base::SysInfo::OperatingSystemVersion());
   }
 
   {
     OPEN_ELEMENT_FOR_SCOPE("display");
     int width = 0;
     int height = 0;
-    env_util::GetPrimaryDisplayDimensions(&width, &height);
+    base::SysInfo::GetPrimaryDisplayDimensions(&width, &height);
     WriteIntAttribute("xsize", width);
     WriteIntAttribute("ysize", height);
-    WriteIntAttribute("screens", env_util::GetDisplayCount());
+    WriteIntAttribute("screens", base::SysInfo::DisplayCount());
   }
 
   {
diff --git a/chrome/browser/render_process_host.cc b/chrome/browser/render_process_host.cc
index a1244ed..ed969a6 100644
--- a/chrome/browser/render_process_host.cc
+++ b/chrome/browser/render_process_host.cc
@@ -19,6 +19,7 @@
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "base/process_util.h"
+#include "base/rand_util.h"
 #include "base/shared_event.h"
 #include "base/shared_memory.h"
 #include "base/string_util.h"
@@ -43,7 +44,6 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/debug_flags.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/l10n_util.h"
 #include "chrome/common/logging_chrome.h"
 #include "chrome/common/pref_names.h"
@@ -675,7 +675,7 @@
   // Now pick a random suitable renderer, if we have any
   if (!suitable_renderers.empty()) {
     int suitable_count = static_cast<int>(suitable_renderers.size());
-    int random_index = rand_util::RandInt(0, suitable_count - 1);
+    int random_index = base::RandInt(0, suitable_count - 1);
     return suitable_renderers[random_index];
   }
 
diff --git a/chrome/browser/render_process_host.h b/chrome/browser/render_process_host.h
index fd76ad72..0e6a2cc 100644
--- a/chrome/browser/render_process_host.h
+++ b/chrome/browser/render_process_host.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_RENDER_PROCESS_HOST_H_
 #define CHROME_BROWSER_RENDER_PROCESS_HOST_H_
 
+#include <limits>
 #include <set>
 #include <vector>
 #include <windows.h>
@@ -12,12 +13,12 @@
 #include "base/id_map.h"
 #include "base/object_watcher.h"
 #include "base/process.h"
+#include "base/rand_util.h"
 #include "base/ref_counted.h"
 #include "base/scoped_handle.h"
 #include "base/scoped_ptr.h"
 #include "chrome/common/ipc_sync_channel.h"
 #include "chrome/common/notification_service.h"
-#include "chrome/common/rand_util.h"
 #include "chrome/common/render_messages.h"
 
 class PrefService;
@@ -271,7 +272,7 @@
   // to fail.
   return StringPrintf(L"%d.%x.%d",
                       GetCurrentProcessId(), instance,
-                      rand_util::RandIntSecure(0, kint32max));
+                      base::RandInt(0, std::numeric_limits<int>::max()));
 }
 
 
diff --git a/chrome/browser/safe_browsing/bloom_filter_unittest.cc b/chrome/browser/safe_browsing/bloom_filter_unittest.cc
index 1612084..c0ac6cb 100644
--- a/chrome/browser/safe_browsing/bloom_filter_unittest.cc
+++ b/chrome/browser/safe_browsing/bloom_filter_unittest.cc
@@ -5,18 +5,20 @@
 
 #include "chrome/browser/safe_browsing/bloom_filter.h"
 
+#include <limits.h>
+
 #include <set>
 
 #include "base/logging.h"
+#include "base/rand_util.h"
 #include "base/string_util.h"
 #include "base/win_util.h"
-#include "chrome/common/rand_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
 uint32 GenHash() {
-  return static_cast<uint32>(rand_util::RandIntSecure(0, kint32max));
+  return static_cast<uint32>(base::RandInt(INT_MIN, INT_MAX));
 }
 
 }
diff --git a/chrome/browser/safe_browsing/protocol_manager.cc b/chrome/browser/safe_browsing/protocol_manager.cc
index 3e3c12b..e3a91ad 100644
--- a/chrome/browser/safe_browsing/protocol_manager.cc
+++ b/chrome/browser/safe_browsing/protocol_manager.cc
@@ -7,22 +7,22 @@
 #include "base/histogram.h"
 #include "base/logging.h"
 #include "base/message_loop.h"
+#include "base/rand_util.h"
 #include "base/string_util.h"
+#include "base/sys_info.h"
 #include "base/task.h"
 #include "base/timer.h"
 #include "chrome/browser/profile.h"
 #include "chrome/browser/safe_browsing/protocol_parser.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/env_vars.h"
-#include "chrome/common/rand_util.h"
 #include "chrome/common/stl_util-inl.h"
 #include "net/base/base64.h"
 #include "net/base/load_flags.h"
 
 
 // Maximum time, in seconds, from start up before we must issue an update query.
-static const int kSbTimerStartIntervalSec = 300;
+static const int kSbTimerStartIntervalSec = 5 * 60;
 
 // Update URL for querying about the latest set of chunk updates.
 static const char* const kSbUpdateUrl =
@@ -69,10 +69,10 @@
       client_key_(client_key),
       wrapped_key_(wrapped_key) {
   // Set the backoff multiplier fuzz to a random value between 0 and 1.
-  back_off_fuzz_ = static_cast<float>(rand_util::RandInt(1, INT_MAX)) / INT_MAX;
+  back_off_fuzz_ = static_cast<float>(base::RandDouble());
 
   // The first update must happen between 0-5 minutes of start up.
-  next_update_sec_ = rand_util::RandInt(60, kSbTimerStartIntervalSec);
+  next_update_sec_ = base::RandInt(60, kSbTimerStartIntervalSec);
 }
 
 SafeBrowsingProtocolManager::~SafeBrowsingProtocolManager() {
@@ -276,7 +276,7 @@
       if (next_update_sec > 0) {
         next_update_sec_ = next_update_sec;
       } else if (update_state_ == SECOND_REQUEST) {
-        next_update_sec_ = rand_util::RandInt(15, 45) * 60;
+        next_update_sec_ = base::RandInt(15 * 60, 45 * 60);
       }
 
       // We need to request a new set of keys for MAC.
@@ -372,7 +372,7 @@
 
 void SafeBrowsingProtocolManager::Initialize() {
   // Don't want to hit the safe browsing servers on build/chrome bots.
-  if (env_util::HasEnvironmentVariable(env_vars::kHeadless))
+  if (base::SysInfo::HasEnvVar(env_vars::kHeadless))
     return;
 
   ScheduleNextUpdate(false /* no back off */);
diff --git a/chrome/browser/views/bug_report_view.cc b/chrome/browser/views/bug_report_view.cc
index b1dfacb..77a0d313 100644
--- a/chrome/browser/views/bug_report_view.cc
+++ b/chrome/browser/views/bug_report_view.cc
@@ -330,7 +330,7 @@
 //   win_util::GetWinVersion returns WinVersion, which is just
 //     an enum of 2000, XP, 2003, or VISTA. Not enough detail for
 //     bug reports
-//   env_util::GetOperatingSystemVersion returns an std::string
+//   base::SysInfo::OperatingSystemVersion returns an std::string
 //     but doesn't include the build or service pack. That function
 //     is probably the right one to extend, but will require changing
 //     all the call sites or making it a wrapper around another util.
diff --git a/chrome/common/SConscript b/chrome/common/SConscript
index 7cc8c4df..24bf254f4 100644
--- a/chrome/common/SConscript
+++ b/chrome/common/SConscript
@@ -87,7 +87,6 @@
       'clipboard_service.cc',
       'common_glue.cc',
       'drag_drop_types.cc',
-      'env_util.cc',
       'gfx/chrome_canvas.cc',
       'gfx/chrome_font.cc',
       'gfx/emf.cc',
@@ -110,7 +109,6 @@
       'plugin_messages.cc',
       'pref_service.cc',
       'process_watcher.cc',
-      'rand_util.cc',
       'render_messages.cc',
       'resource_bundle.cc',
       'resource_dispatcher.cc',
diff --git a/chrome/common/common.vcproj b/chrome/common/common.vcproj
index 203aa3f..771ff8c 100644
--- a/chrome/common/common.vcproj
+++ b/chrome/common/common.vcproj
@@ -422,14 +422,6 @@
 			>
 		</File>
 		<File
-			RelativePath=".\env_util.cc"
-			>
-		</File>
-		<File
-			RelativePath=".\env_util.h"
-			>
-		</File>
-		<File
 			RelativePath=".\env_vars.cc"
 			>
 		</File>
@@ -598,14 +590,6 @@
 			>
 		</File>
 		<File
-			RelativePath=".\rand_util.cc"
-			>
-		</File>
-		<File
-			RelativePath=".\rand_util.h"
-			>
-		</File>
-		<File
 			RelativePath=".\ref_counted_util.h"
 			>
 		</File>
diff --git a/chrome/common/env_util.cc b/chrome/common/env_util.cc
deleted file mode 100644
index 3af22a6..0000000
--- a/chrome/common/env_util.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2006-2008 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 "chrome/common/env_util.h"
-
-#include "base/basictypes.h"
-#include "base/logging.h"
-
-namespace env_util {
-
-std::string GetOperatingSystemName() {
-  return "Windows";
-}
-
-std::string GetOperatingSystemVersion() {
-  OSVERSIONINFO info = {0};
-  info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-  GetVersionEx(&info);
-
-  char result[20];
-  memset(result, 0, arraysize(result));
-  _snprintf_s(result, arraysize(result),
-               "%lu.%lu", info.dwMajorVersion, info.dwMinorVersion);
-  return std::string(result);
-}
-
-std::string GetCPUArchitecture() {
-  // TODO: Make this vary when we support any other architectures.
-  return "x86";
-}
-
-void GetPrimaryDisplayDimensions(int* width, int* height) {
-  if (width)
-    *width = GetSystemMetrics(SM_CXSCREEN);
-
-  if (height)
-    *height = GetSystemMetrics(SM_CYSCREEN);
-}
-
-int GetDisplayCount() {
-  return GetSystemMetrics(SM_CMONITORS);
-}
-
-}  // namespace env_util
-
diff --git a/chrome/common/env_util.h b/chrome/common/env_util.h
deleted file mode 100644
index bb37935..0000000
--- a/chrome/common/env_util.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2006-2008 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.
-
-// This file defines utility functions that can report details about the
-// host operating environment.
-
-#ifndef CHROME_COMMON_ENV_UTIL_H__
-#define CHROME_COMMON_ENV_UTIL_H__
-
-#include <windows.h>
-#include <string>
-
-namespace env_util {
-
-// Test if the given environment variable is defined.
-inline bool HasEnvironmentVariable(const wchar_t* var) {
-  return GetEnvironmentVariable(var, NULL, 0) != 0;
-}
-
-// Returns the name of the host operating system.
-std::string GetOperatingSystemName();
-
-// Returns the version of the host operating system.
-std::string GetOperatingSystemVersion();
-
-// Returns the CPU architecture of the system.
-std::string GetCPUArchitecture();
-
-// Returns the pixel dimensions of the primary display via the
-// width and height parameters.
-void GetPrimaryDisplayDimensions(int* width, int* height);
-
-// Return the number of displays.
-int GetDisplayCount();
-
-}  // namespace env_util
-
-#endif  // CHROME_COMMON_ENV_UTIL_H__
-
diff --git a/chrome/common/logging_chrome.cc b/chrome/common/logging_chrome.cc
index 232e500..af6b647 100644
--- a/chrome/common/logging_chrome.cc
+++ b/chrome/common/logging_chrome.cc
@@ -14,9 +14,9 @@
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "base/string_util.h"
+#include "base/sys_info.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/env_vars.h"
 
 // When true, this means that error dialogs should not be shown.
@@ -96,7 +96,7 @@
   // headless mode to be configured either by the Environment
   // Variable or by the Command Line Switch.  This is for
   // automated test purposes.
-  if (env_util::HasEnvironmentVariable(env_vars::kHeadless) ||
+  if (base::SysInfo::HasEnvVar(env_vars::kHeadless) ||
       command_line.HasSwitch(switches::kNoErrorDialogs))
     SuppressDialogs();
 
diff --git a/chrome/common/process_watcher.cc b/chrome/common/process_watcher.cc
index b8d78bd2..c189c2d 100644
--- a/chrome/common/process_watcher.cc
+++ b/chrome/common/process_watcher.cc
@@ -6,8 +6,8 @@
 
 #include "base/message_loop.h"
 #include "base/object_watcher.h"
+#include "base/sys_info.h"
 #include "chrome/app/result_codes.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/env_vars.h"
 
 // Maximum amount of time (in milliseconds) to wait for the process to exit.
@@ -48,9 +48,9 @@
 
  private:
   void KillProcess() {
-    if (env_util::HasEnvironmentVariable(env_vars::kHeadless)) {
-     // If running the distributed tests, give the renderer a little time to figure out
-     // that the channel is shutdown and unwind.
+    if (base::SysInfo::HasEnvVar(env_vars::kHeadless)) {
+     // If running the distributed tests, give the renderer a little time
+     // to figure out that the channel is shutdown and unwind.
      if (WaitForSingleObject(process_, kWaitInterval) == WAIT_OBJECT_0) {
        OnObjectSignaled(process_);
        return;
diff --git a/chrome/common/rand_util.cc b/chrome/common/rand_util.cc
deleted file mode 100644
index 52492a0..0000000
--- a/chrome/common/rand_util.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2006-2008 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 "chrome/common/rand_util.h"
-
-#include <stdlib.h>
-
-#include "base/logging.h"
-
-namespace rand_util {
-
-int RandInt(int min, int max) {
-  return RandIntSecure(min, max);
-}
-
-int RandIntSecure(int min, int max) {
-  unsigned int number;
-  // This code will not work on win2k, which we do not support.
-  errno_t rv = rand_s(&number);
-  DCHECK(rv == 0) << "rand_s failed with error " << rv;
-
-  // From the rand man page, use this instead of just rand() % max, so that the
-  // higher bits are used.
-  return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
-      (number / (UINT_MAX + 1.0)));
-}
-
-}  // namespace rand_util
diff --git a/chrome/common/rand_util.h b/chrome/common/rand_util.h
deleted file mode 100644
index 08e735ff..0000000
--- a/chrome/common/rand_util.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2006-2008 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 CHROME_COMMON_RAND_UTIL_H__
-#define CHROME_COMMON_RAND_UTIL_H__
-
-#include "base/basictypes.h"
-
-namespace rand_util {
-
-// Returns a random number between min and max (inclusive). This is a
-// non-cryptographic random number generator, using rand() from the CRT.
-int RandInt(int min, int max);
-
-// Returns a random number between min and max (inclusive). This is a (slower)
-// cryptographic random number generator using rand_s() from the CRT.  Note
-// that it does not work in Win2K, so it degrades to RandInt.
-int RandIntSecure(int min, int max);
-
-}  // namespace rand_util
-
-#endif // CHROME_COMMON_RAND_UTIL_H__
-
diff --git a/chrome/renderer/renderer_main.cc b/chrome/renderer/renderer_main.cc
index d54a4bc..2553a65 100644
--- a/chrome/renderer/renderer_main.cc
+++ b/chrome/renderer/renderer_main.cc
@@ -10,7 +10,6 @@
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_counters.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/env_util.h"
 #include "chrome/common/l10n_util.h"
 #include "chrome/common/logging_chrome.h"
 #include "chrome/common/resource_bundle.h"
diff --git a/chrome/test/automated_ui_tests/automated_ui_tests.cc b/chrome/test/automated_ui_tests/automated_ui_tests.cc
index 694ad4e..7372030 100644
--- a/chrome/test/automated_ui_tests/automated_ui_tests.cc
+++ b/chrome/test/automated_ui_tests/automated_ui_tests.cc
@@ -7,13 +7,13 @@
 #include "base/command_line.h"
 #include "base/file_util.h"
 #include "base/path_service.h"
+#include "base/rand_util.h"
 #include "base/string_util.h"
 #include "chrome/app/chrome_dll_resource.h"
 #include "chrome/browser/character_encoding.h"
 #include "chrome/browser/view_ids.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/libxml_utils.h"
-#include "chrome/common/rand_util.h"
 #include "chrome/common/win_util.h"
 #include "chrome/test/automated_ui_tests/automated_ui_tests.h"
 #include "chrome/test/automation/browser_proxy.h"
@@ -421,9 +421,9 @@
 
   // The vector will contain mostly IDC values for encoding commands plus a few
   // menu separators (0 values). If we hit a separator we just retry.
-  int index = rand_util::RandInt(0, len);
+  int index = base::RandInt(0, len);
   while ((*encoding_ids)[index] == 0) {
-    index = rand_util::RandInt(0, len);
+    index = base::RandInt(0, len);
   }
 
   return RunCommand((*encoding_ids)[index]);
@@ -690,7 +690,7 @@
 }
 
 bool AutomatedUITest::ExerciseDialog() {
-  int index = rand_util::RandInt(0, arraysize(kDialogs) - 1);
+  int index = base::RandInt(0, arraysize(kDialogs) - 1);
   return DoAction(kDialogs[index]) && FuzzyTestDialog(kTestDialogActionsToRun);
 }
 
@@ -703,9 +703,9 @@
     // and Enter would close the dialog without performing more actions. We
     // rely on the fact that those two actions are first in the array and set
     // the lower bound to 2 if i == 0 to skip those two actions.
-    int action_index = rand_util::RandInt(i == 0 ? 2 : 0,
-                                          arraysize(kTestDialogPossibleActions)
-                                          - 1);
+    int action_index = base::RandInt(i == 0 ? 2 : 0,
+                                     arraysize(kTestDialogPossibleActions)
+                                         - 1);
     return_value = return_value &&
                    DoAction(kTestDialogPossibleActions[action_index]);
     if (DidCrash(false))
diff --git a/chrome/test/selenium/selenium_test.cc b/chrome/test/selenium/selenium_test.cc
index 6bfc72f..a1d8a094 100644
--- a/chrome/test/selenium/selenium_test.cc
+++ b/chrome/test/selenium/selenium_test.cc
@@ -14,9 +14,9 @@
 
 #include "base/file_util.h"
 #include "base/path_service.h"
+#include "base/rand_util.h"
 #include "base/string_util.h"
 #include "chrome/common/chrome_paths.h"
-#include "chrome/common/rand_util.h"
 #include "chrome/test/automation/tab_proxy.h"
 #include "chrome/test/automation/window_proxy.h"
 #include "chrome/test/ui/ui_test.h"
@@ -88,7 +88,7 @@
       L"5.selectFrame,6.click,13.verifyLocation,13.verifyLocation,13.click,24.selectAndWait,24.verifyTitle",
       L"5.selectFrame,6.click,24.selectAndWait"
     };
-    *failed = kBogusFailures[rand_util::RandInt(0, 2)];
+    *failed = kBogusFailures[base::RandInt(0, 2)];
 #else
     std::wstring test_path;
     PathService::Get(chrome::DIR_TEST_DATA, &test_path);