diff --git a/base/files/file.h b/base/files/file.h
index e000636..61239ad 100644
--- a/base/files/file.h
+++ b/base/files/file.h
@@ -13,8 +13,8 @@
 #include "base/files/platform_file.h"
 #include "base/files/scoped_file.h"
 #include "base/macros.h"
-#include "base/time/time.h"
 #include "util/build_config.h"
+#include "util/ticks.h"
 
 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
 #include <sys/stat.h>
@@ -132,13 +132,13 @@
     bool is_symbolic_link;
 
     // The last modified time of a file.
-    Time last_modified;
+    Ticks last_modified;
 
     // The last accessed time of a file.
-    Time last_accessed;
+    Ticks last_accessed;
 
     // The creation time of a file.
-    Time creation_time;
+    Ticks creation_time;
   };
 
   File();
@@ -249,9 +249,6 @@
   //  0.01 %  > 7.6 seconds
   bool Flush();
 
-  // Updates the file times.
-  bool SetTimes(Time last_access_time, Time last_modified_time);
-
   // Returns some basic information for the given file.
   bool GetInfo(Info* info);
 
diff --git a/base/files/file_enumerator.h b/base/files/file_enumerator.h
index edd5036..81f757b 100644
--- a/base/files/file_enumerator.h
+++ b/base/files/file_enumerator.h
@@ -13,8 +13,8 @@
 #include "base/containers/stack.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
-#include "base/time/time.h"
 #include "util/build_config.h"
+#include "util/ticks.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
@@ -52,7 +52,7 @@
     FilePath GetName() const;
 
     int64_t GetSize() const;
-    Time GetLastModifiedTime() const;
+    Ticks GetLastModifiedTime() const;
 
 #if defined(OS_WIN)
     // Note that the cAlternateFileName (used to hold the "short" 8.3 name)
diff --git a/base/files/file_enumerator_posix.cc b/base/files/file_enumerator_posix.cc
index 003f045..41d52b8 100644
--- a/base/files/file_enumerator_posix.cc
+++ b/base/files/file_enumerator_posix.cc
@@ -49,8 +49,8 @@
   return stat_.st_size;
 }
 
-base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const {
-  return base::Time::FromTimeT(stat_.st_mtime);
+Ticks FileEnumerator::FileInfo::GetLastModifiedTime() const {
+  return stat_.st_mtime;
 }
 
 // FileEnumerator --------------------------------------------------------------
diff --git a/base/files/file_enumerator_win.cc b/base/files/file_enumerator_win.cc
index a2bfabf..803b7bd 100644
--- a/base/files/file_enumerator_win.cc
+++ b/base/files/file_enumerator_win.cc
@@ -54,8 +54,8 @@
   return static_cast<int64_t>(size.QuadPart);
 }
 
-base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const {
-  return base::Time::FromFileTime(find_data_.ftLastWriteTime);
+Ticks FileEnumerator::FileInfo::GetLastModifiedTime() const {
+  return *reinterpret_cast<const uint64_t*>(&find_data_.ftLastWriteTime);
 }
 
 // FileEnumerator --------------------------------------------------------------
diff --git a/base/files/file_posix.cc b/base/files/file_posix.cc
index c4f1080..977eb1b 100644
--- a/base/files/file_posix.cc
+++ b/base/files/file_posix.cc
@@ -46,23 +46,6 @@
   return HANDLE_EINTR(ftruncate(file, length));
 }
 
-int CallFutimes(PlatformFile file, const struct timeval times[2]) {
-#ifdef __USE_XOPEN2K8
-  // futimens should be available, but futimes might not be
-  // http://pubs.opengroup.org/onlinepubs/9699919799/
-
-  timespec ts_times[2];
-  ts_times[0].tv_sec = times[0].tv_sec;
-  ts_times[0].tv_nsec = times[0].tv_usec * 1000;
-  ts_times[1].tv_sec = times[1].tv_sec;
-  ts_times[1].tv_nsec = times[1].tv_usec * 1000;
-
-  return futimens(file, ts_times);
-#else
-  return futimes(file, times);
-#endif
-}
-
 #if !defined(OS_FUCHSIA)
 File::Error CallFcntlFlock(PlatformFile file, bool do_lock) {
   struct flock lock;
@@ -90,11 +73,6 @@
   return 0;
 }
 
-int CallFutimes(PlatformFile file, const struct timeval times[2]) {
-  NOTIMPLEMENTED();  // NaCl doesn't implement futimes.
-  return 0;
-}
-
 File::Error CallFcntlFlock(PlatformFile file, bool do_lock) {
   NOTIMPLEMENTED();  // NaCl doesn't implement flock struct.
   return File::FILE_ERROR_INVALID_OPERATION;
@@ -126,17 +104,10 @@
 #error
 #endif
 
-  last_modified = Time::FromTimeT(last_modified_sec) +
-                  TimeDelta::FromMicroseconds(last_modified_nsec /
-                                              Time::kNanosecondsPerMicrosecond);
-
-  last_accessed = Time::FromTimeT(last_accessed_sec) +
-                  TimeDelta::FromMicroseconds(last_accessed_nsec /
-                                              Time::kNanosecondsPerMicrosecond);
-
-  creation_time = Time::FromTimeT(creation_time_sec) +
-                  TimeDelta::FromMicroseconds(creation_time_nsec /
-                                              Time::kNanosecondsPerMicrosecond);
+  constexpr uint64_t kNano = 1'000'000'000;
+  last_modified = last_modified_sec * kNano + last_modified_nsec;
+  last_accessed = last_accessed_sec * kNano + last_accessed_nsec;
+  creation_time = creation_time_sec * kNano + creation_time_nsec;
 }
 
 bool File::IsValid() const {
@@ -281,16 +252,6 @@
   return !CallFtruncate(file_.get(), length);
 }
 
-bool File::SetTimes(Time last_access_time, Time last_modified_time) {
-  DCHECK(IsValid());
-
-  timeval times[2];
-  times[0] = last_access_time.ToTimeVal();
-  times[1] = last_modified_time.ToTimeVal();
-
-  return !CallFutimes(file_.get(), times);
-}
-
 bool File::GetInfo(Info* info) {
   DCHECK(IsValid());
 
diff --git a/base/files/file_util.cc b/base/files/file_util.cc
index 674dd27..d087b00 100644
--- a/base/files/file_util.cc
+++ b/base/files/file_util.cc
@@ -218,23 +218,6 @@
   return true;
 }
 
-bool TouchFile(const FilePath& path,
-               const Time& last_accessed,
-               const Time& last_modified) {
-  int flags = File::FLAG_OPEN | File::FLAG_WRITE_ATTRIBUTES;
-
-#if defined(OS_WIN)
-  // On Windows, FILE_FLAG_BACKUP_SEMANTICS is needed to open a directory.
-  if (DirectoryExists(path))
-    flags |= File::FLAG_BACKUP_SEMANTICS;
-#endif  // OS_WIN
-
-  File file(path, flags);
-  if (!file.IsValid())
-    return false;
-
-  return file.SetTimes(last_accessed, last_modified);
-}
 #endif  // !defined(OS_NACL_NONSFI)
 
 bool CloseFile(FILE* file) {
diff --git a/base/files/file_util.h b/base/files/file_util.h
index 90f9cd6..bfcac01 100644
--- a/base/files/file_util.h
+++ b/base/files/file_util.h
@@ -36,7 +36,6 @@
 namespace base {
 
 class Environment;
-class Time;
 
 //-----------------------------------------------------------------------------
 // Functions that involve filesystem access or modification:
@@ -322,11 +321,6 @@
 // Returns information about the given file path.
 bool GetFileInfo(const FilePath& file_path, File::Info* info);
 
-// Sets the time of the last access and the time of the last modification.
-bool TouchFile(const FilePath& path,
-               const Time& last_accessed,
-               const Time& last_modified);
-
 // Wrapper for fopen-like calls. Returns non-NULL FILE* on success. The
 // underlying file descriptor (POSIX) or handle (Windows) is unconditionally
 // configured to not be propagated to child processes.
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 4c1360f..9415735 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -36,7 +36,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "util/build_config.h"
 
 #if defined(OS_MACOSX)
diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc
index 9133d7e..2a1e9ec 100644
--- a/base/files/file_util_win.cc
+++ b/base/files/file_util_win.cc
@@ -28,7 +28,6 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "base/win/scoped_handle.h"
 
 // #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036.  See the
@@ -704,9 +703,9 @@
 
   results->is_directory =
       (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
-  results->last_modified = Time::FromFileTime(attr.ftLastWriteTime);
-  results->last_accessed = Time::FromFileTime(attr.ftLastAccessTime);
-  results->creation_time = Time::FromFileTime(attr.ftCreationTime);
+  results->last_modified = *reinterpret_cast<uint64_t*>(&attr.ftLastWriteTime);
+  results->last_accessed = *reinterpret_cast<uint64_t*>(&attr.ftLastAccessTime);
+  results->creation_time = *reinterpret_cast<uint64_t*>(&attr.ftCreationTime);
 
   return true;
 }
diff --git a/base/files/file_win.cc b/base/files/file_win.cc
index 401ac33..7ca4461 100644
--- a/base/files/file_win.cc
+++ b/base/files/file_win.cc
@@ -169,15 +169,6 @@
            FALSE));
 }
 
-bool File::SetTimes(Time last_access_time, Time last_modified_time) {
-  DCHECK(IsValid());
-
-  FILETIME last_access_filetime = last_access_time.ToFileTime();
-  FILETIME last_modified_filetime = last_modified_time.ToFileTime();
-  return (::SetFileTime(file_.Get(), NULL, &last_access_filetime,
-                        &last_modified_filetime) != FALSE);
-}
-
 bool File::GetInfo(Info* info) {
   DCHECK(IsValid());
 
@@ -192,9 +183,11 @@
   info->is_directory =
       (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
   info->is_symbolic_link = false;  // Windows doesn't have symbolic links.
-  info->last_modified = Time::FromFileTime(file_info.ftLastWriteTime);
-  info->last_accessed = Time::FromFileTime(file_info.ftLastAccessTime);
-  info->creation_time = Time::FromFileTime(file_info.ftCreationTime);
+  info->last_modified =
+      *reinterpret_cast<uint64_t*>(&file_info.ftLastWriteTime);
+  info->last_accessed =
+      *reinterpret_cast<uint64_t*>(&file_info.ftLastAccessTime);
+  info->creation_time = *reinterpret_cast<uint64_t*>(&file_info.ftCreationTime);
   return true;
 }
 
diff --git a/base/json/json_perftest.cc b/base/json/json_perftest.cc
deleted file mode 100644
index fc05bdc..0000000
--- a/base/json/json_perftest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2017 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/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/memory/ptr_util.h"
-#include "base/time/time.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
-
-namespace base {
-
-namespace {
-// Generates a simple dictionary value with simple data types, a string and a
-// list.
-std::unique_ptr<DictionaryValue> GenerateDict() {
-  auto root = std::make_unique<DictionaryValue>();
-  root->SetDouble("Double", 3.141);
-  root->SetBoolean("Bool", true);
-  root->SetInteger("Int", 42);
-  root->SetString("String", "Foo");
-
-  auto list = std::make_unique<ListValue>();
-  list->Set(0, std::make_unique<Value>(2.718));
-  list->Set(1, std::make_unique<Value>(false));
-  list->Set(2, std::make_unique<Value>(123));
-  list->Set(3, std::make_unique<Value>("Bar"));
-  root->Set("List", std::move(list));
-
-  return root;
-}
-
-// Generates a tree-like dictionary value with a size of O(breadth ** depth).
-std::unique_ptr<DictionaryValue> GenerateLayeredDict(int breadth, int depth) {
-  if (depth == 1)
-    return GenerateDict();
-
-  auto root = GenerateDict();
-  auto next = GenerateLayeredDict(breadth, depth - 1);
-
-  for (int i = 0; i < breadth; ++i) {
-    root->Set("Dict" + std::to_string(i), next->CreateDeepCopy());
-  }
-
-  return root;
-}
-
-}  // namespace
-
-class JSONPerfTest : public testing::Test {
- public:
-  void TestWriteAndRead(int breadth, int depth) {
-    std::string description = "Breadth: " + std::to_string(breadth) +
-                              ", Depth: " + std::to_string(depth);
-    auto dict = GenerateLayeredDict(breadth, depth);
-    std::string json;
-
-    TimeTicks start_write = TimeTicks::Now();
-    JSONWriter::Write(*dict, &json);
-    TimeTicks end_write = TimeTicks::Now();
-    perf_test::PrintResult("Write", "", description,
-                           (end_write - start_write).InMillisecondsF(), "ms",
-                           true);
-
-    TimeTicks start_read = TimeTicks::Now();
-    JSONReader::Read(json);
-    TimeTicks end_read = TimeTicks::Now();
-    perf_test::PrintResult("Read", "", description,
-                           (end_read - start_read).InMillisecondsF(), "ms",
-                           true);
-  }
-};
-
-TEST_F(JSONPerfTest, StressTest) {
-  for (int i = 0; i < 4; ++i) {
-    for (int j = 0; j < 12; ++j) {
-      TestWriteAndRead(i + 1, j + 1);
-    }
-  }
-}
-
-}  // namespace base
diff --git a/base/logging.cc b/base/logging.cc
index f0ce6f5..c381a28 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -7,6 +7,8 @@
 #include <limits.h>
 #include <stdint.h>
 
+#include <thread>
+
 #include "base/macros.h"
 #include "util/build_config.h"
 
@@ -19,6 +21,7 @@
 #define STDERR_FILENO 2
 
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
+#include <sys/time.h>
 #include <time.h>
 #endif
 
@@ -49,7 +52,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/platform_thread.h"
 
 #if defined(OS_POSIX) || defined(OS_FUCHSIA)
 #include "base/posix/safe_strerror.h"
@@ -195,7 +197,7 @@
   // TODO(darin): It might be nice if the columns were fixed width.
 
   stream_ << '[';
-  stream_ << base::PlatformThread::CurrentId() << ':';
+  stream_ << std::this_thread::get_id() << ':';
 #if defined(OS_WIN)
   SYSTEMTIME local_time;
   GetLocalTime(&local_time);
diff --git a/base/threading/platform_thread.h b/base/threading/platform_thread.h
deleted file mode 100644
index 8b814c5..0000000
--- a/base/threading/platform_thread.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright (c) 2012 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.
-
-// WARNING: You should *NOT* be using this class directly.  PlatformThread is
-// the low-level platform-specific abstraction to the OS's threading interface.
-// You should instead be using a message-loop driven Thread, see thread.h.
-
-#ifndef BASE_THREADING_PLATFORM_THREAD_H_
-#define BASE_THREADING_PLATFORM_THREAD_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/time/time.h"
-#include "util/build_config.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_types.h"
-#elif defined(OS_MACOSX)
-#include <mach/mach_types.h>
-#elif defined(OS_POSIX)
-#include <pthread.h>
-#include <unistd.h>
-#endif
-
-namespace base {
-
-// Used for logging. Always an integer value.
-#if defined(OS_WIN)
-typedef DWORD PlatformThreadId;
-#elif defined(OS_MACOSX)
-typedef mach_port_t PlatformThreadId;
-#elif defined(OS_POSIX)
-typedef pid_t PlatformThreadId;
-#endif
-
-// Used for thread checking and debugging.
-// Meant to be as fast as possible.
-// These are produced by PlatformThread::CurrentRef(), and used to later
-// check if we are on the same thread or not by using ==. These are safe
-// to copy between threads, but can't be copied to another process as they
-// have no meaning there. Also, the internal identifier can be re-used
-// after a thread dies, so a PlatformThreadRef cannot be reliably used
-// to distinguish a new thread from an old, dead thread.
-class PlatformThreadRef {
- public:
-#if defined(OS_WIN)
-  typedef DWORD RefType;
-#else  //  OS_POSIX
-  typedef pthread_t RefType;
-#endif
-  constexpr PlatformThreadRef() : id_(0) {}
-
-  explicit constexpr PlatformThreadRef(RefType id) : id_(id) {}
-
-  bool operator==(PlatformThreadRef other) const { return id_ == other.id_; }
-
-  bool operator!=(PlatformThreadRef other) const { return id_ != other.id_; }
-
-  bool is_null() const { return id_ == 0; }
-
- private:
-  RefType id_;
-};
-
-// Used to operate on threads.
-class PlatformThreadHandle {
- public:
-#if defined(OS_WIN)
-  typedef void* Handle;
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  typedef pthread_t Handle;
-#endif
-
-  constexpr PlatformThreadHandle() : handle_(0) {}
-
-  explicit constexpr PlatformThreadHandle(Handle handle) : handle_(handle) {}
-
-  bool is_equal(const PlatformThreadHandle& other) const {
-    return handle_ == other.handle_;
-  }
-
-  bool is_null() const { return !handle_; }
-
-  Handle platform_handle() const { return handle_; }
-
- private:
-  Handle handle_;
-};
-
-const PlatformThreadId kInvalidThreadId(0);
-
-// A namespace for low-level thread functions.
-class PlatformThread {
- public:
-  // Implement this interface to run code on a background thread.  Your
-  // ThreadMain method will be called on the newly created thread.
-  class Delegate {
-   public:
-    virtual void ThreadMain() = 0;
-
-   protected:
-    virtual ~Delegate() = default;
-  };
-
-  // Gets the current thread id, which may be useful for logging purposes.
-  static PlatformThreadId CurrentId();
-
-  // Gets the current thread reference, which can be used to check if
-  // we're on the right thread quickly.
-  static PlatformThreadRef CurrentRef();
-
-  // Get the handle representing the current thread. On Windows, this is a
-  // pseudo handle constant which will always represent the thread using it and
-  // hence should not be shared with other threads nor be used to differentiate
-  // the current thread from another.
-  static PlatformThreadHandle CurrentHandle();
-
-  // Yield the current thread so another thread can be scheduled.
-  static void YieldCurrentThread();
-
-  // Sleeps for the specified duration.
-  static void Sleep(base::TimeDelta duration);
-
-  // Creates a new thread.  The |stack_size| parameter can be 0 to indicate
-  // that the default stack size should be used.  Upon success,
-  // |*thread_handle| will be assigned a handle to the newly created thread,
-  // and |delegate|'s ThreadMain method will be executed on the newly created
-  // thread.
-  // NOTE: When you are done with the thread handle, you must call Join to
-  // release system resources associated with the thread.  You must ensure that
-  // the Delegate object outlives the thread.
-  static bool Create(size_t stack_size,
-                     Delegate* delegate,
-                     PlatformThreadHandle* thread_handle);
-
-  // CreateNonJoinable() does the same thing as Create() except the thread
-  // cannot be Join()'d.  Therefore, it also does not output a
-  // PlatformThreadHandle.
-  static bool CreateNonJoinable(size_t stack_size, Delegate* delegate);
-
-  // Joins with a thread created via the Create function.  This function blocks
-  // the caller until the designated thread exits.  This will invalidate
-  // |thread_handle|.
-  static void Join(PlatformThreadHandle thread_handle);
-
-  // Detaches and releases the thread handle. The thread is no longer joinable
-  // and |thread_handle| is invalidated after this call.
-  static void Detach(PlatformThreadHandle thread_handle);
-
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(PlatformThread);
-};
-
-}  // namespace base
-
-#endif  // BASE_THREADING_PLATFORM_THREAD_H_
diff --git a/base/threading/platform_thread_linux.cc b/base/threading/platform_thread_linux.cc
deleted file mode 100644
index 1833c54..0000000
--- a/base/threading/platform_thread_linux.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2012 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/threading/platform_thread.h"
-
-#include <errno.h>
-#include <sched.h>
-#include <stddef.h>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "util/build_config.h"
-
-#if !defined(OS_NACL) && !defined(OS_AIX)
-#include <pthread.h>
-#include <sys/prctl.h>
-#include <sys/resource.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-namespace base {
-
-void InitThreading() {}
-
-void TerminateOnThread() {}
-
-size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) {
-#if !defined(THREAD_SANITIZER)
-  return 0;
-#else
-  // ThreadSanitizer bloats the stack heavily. Evidence has been that the
-  // default stack size isn't enough for some browser tests.
-  return 2 * (1 << 23);  // 2 times 8192K (the default stack size on Linux).
-#endif
-}
-
-}  // namespace base
diff --git a/base/threading/platform_thread_mac.mm b/base/threading/platform_thread_mac.mm
deleted file mode 100644
index 770b618..0000000
--- a/base/threading/platform_thread_mac.mm
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2012 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/threading/platform_thread.h"
-
-#import <Foundation/Foundation.h>
-#include <mach/mach.h>
-#include <mach/mach_time.h>
-#include <mach/thread_policy.h>
-#include <stddef.h>
-#include <sys/resource.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/mac/foundation_util.h"
-#include "base/mac/mach_logging.h"
-#include "util/build_config.h"
-
-namespace base {
-
-namespace {
-NSString* const kThreadPriorityKey = @"CrThreadPriorityKey";
-}  // namespace
-
-// If Cocoa is to be used on more than one thread, it must know that the
-// application is multithreaded.  Since it's possible to enter Cocoa code
-// from threads created by pthread_thread_create, Cocoa won't necessarily
-// be aware that the application is multithreaded.  Spawning an NSThread is
-// enough to get Cocoa to set up for multithreaded operation, so this is done
-// if necessary before pthread_thread_create spawns any threads.
-//
-// http://developer.apple.com/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/chapter_4_section_4.html
-void InitThreading() {
-  static BOOL multithreaded = [NSThread isMultiThreaded];
-  if (!multithreaded) {
-    // +[NSObject class] is idempotent.
-    [NSThread detachNewThreadSelector:@selector(class)
-                             toTarget:[NSObject class]
-                           withObject:nil];
-    multithreaded = YES;
-
-    DCHECK([NSThread isMultiThreaded]);
-  }
-}
-
-size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) {
-#if defined(OS_IOS)
-  return 0;
-#else
-  // The Mac OS X default for a pthread stack size is 512kB.
-  // Libc-594.1.4/pthreads/pthread.c's pthread_attr_init uses
-  // DEFAULT_STACK_SIZE for this purpose.
-  //
-  // 512kB isn't quite generous enough for some deeply recursive threads that
-  // otherwise request the default stack size by specifying 0. Here, adopt
-  // glibc's behavior as on Linux, which is to use the current stack size
-  // limit (ulimit -s) as the default stack size. See
-  // glibc-2.11.1/nptl/nptl-init.c's __pthread_initialize_minimal_internal. To
-  // avoid setting the limit below the Mac OS X default or the minimum usable
-  // stack size, these values are also considered. If any of these values
-  // can't be determined, or if stack size is unlimited (ulimit -s unlimited),
-  // stack_size is left at 0 to get the system default.
-  //
-  // Mac OS X normally only applies ulimit -s to the main thread stack. On
-  // contemporary OS X and Linux systems alike, this value is generally 8MB
-  // or in that neighborhood.
-  size_t default_stack_size = 0;
-  struct rlimit stack_rlimit;
-  if (pthread_attr_getstacksize(&attributes, &default_stack_size) == 0 &&
-      getrlimit(RLIMIT_STACK, &stack_rlimit) == 0 &&
-      stack_rlimit.rlim_cur != RLIM_INFINITY) {
-    default_stack_size = std::max(
-        std::max(default_stack_size, static_cast<size_t>(PTHREAD_STACK_MIN)),
-        static_cast<size_t>(stack_rlimit.rlim_cur));
-  }
-  return default_stack_size;
-#endif
-}
-
-void TerminateOnThread() {}
-
-}  // namespace base
diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc
deleted file mode 100644
index 42fbce5..0000000
--- a/base/threading/platform_thread_posix.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (c) 2012 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/threading/platform_thread.h"
-
-#include <errno.h>
-#include <pthread.h>
-#include <sched.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <memory>
-
-#include "base/logging.h"
-#include "util/build_config.h"
-
-#if defined(OS_LINUX)
-#include <sys/syscall.h>
-#endif
-
-#include <sys/resource.h>
-
-namespace base {
-
-void InitThreading();
-void TerminateOnThread();
-size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes);
-
-namespace {
-
-struct ThreadParams {
-  ThreadParams() : delegate(nullptr), joinable(false) {}
-
-  PlatformThread::Delegate* delegate;
-  bool joinable;
-};
-
-void* ThreadFunc(void* params) {
-  PlatformThread::Delegate* delegate = nullptr;
-
-  {
-    std::unique_ptr<ThreadParams> thread_params(
-        static_cast<ThreadParams*>(params));
-
-    delegate = thread_params->delegate;
-  }
-
-  delegate->ThreadMain();
-
-  base::TerminateOnThread();
-  return nullptr;
-}
-
-bool CreateThread(size_t stack_size,
-                  bool joinable,
-                  PlatformThread::Delegate* delegate,
-                  PlatformThreadHandle* thread_handle) {
-  DCHECK(thread_handle);
-  base::InitThreading();
-
-  pthread_attr_t attributes;
-  pthread_attr_init(&attributes);
-
-  // Pthreads are joinable by default, so only specify the detached
-  // attribute if the thread should be non-joinable.
-  if (!joinable)
-    pthread_attr_setdetachstate(&attributes, PTHREAD_CREATE_DETACHED);
-
-  // Get a better default if available.
-  if (stack_size == 0)
-    stack_size = base::GetDefaultThreadStackSize(attributes);
-
-  if (stack_size > 0)
-    pthread_attr_setstacksize(&attributes, stack_size);
-
-  std::unique_ptr<ThreadParams> params(new ThreadParams);
-  params->delegate = delegate;
-  params->joinable = joinable;
-
-  pthread_t handle;
-  int err = pthread_create(&handle, &attributes, ThreadFunc, params.get());
-  bool success = !err;
-  if (success) {
-    // ThreadParams should be deleted on the created thread after used.
-    ignore_result(params.release());
-  } else {
-    // Value of |handle| is undefined if pthread_create fails.
-    handle = 0;
-    errno = err;
-    PLOG(ERROR) << "pthread_create";
-  }
-  *thread_handle = PlatformThreadHandle(handle);
-
-  pthread_attr_destroy(&attributes);
-
-  return success;
-}
-
-}  // namespace
-
-// static
-PlatformThreadId PlatformThread::CurrentId() {
-// Pthreads doesn't have the concept of a thread ID, so we have to reach down
-// into the kernel.
-#if defined(OS_MACOSX)
-  return pthread_mach_thread_np(pthread_self());
-#elif defined(OS_LINUX)
-  return syscall(__NR_gettid);
-#else
-#error
-#endif
-}
-
-// static
-PlatformThreadRef PlatformThread::CurrentRef() {
-  return PlatformThreadRef(pthread_self());
-}
-
-// static
-PlatformThreadHandle PlatformThread::CurrentHandle() {
-  return PlatformThreadHandle(pthread_self());
-}
-
-// static
-void PlatformThread::YieldCurrentThread() {
-  sched_yield();
-}
-
-// static
-void PlatformThread::Sleep(TimeDelta duration) {
-  struct timespec sleep_time, remaining;
-
-  // Break the duration into seconds and nanoseconds.
-  // NOTE: TimeDelta's microseconds are int64s while timespec's
-  // nanoseconds are longs, so this unpacking must prevent overflow.
-  sleep_time.tv_sec = duration.InSeconds();
-  duration -= TimeDelta::FromSeconds(sleep_time.tv_sec);
-  sleep_time.tv_nsec = duration.InMicroseconds() * 1000;  // nanoseconds
-
-  while (nanosleep(&sleep_time, &remaining) == -1 && errno == EINTR)
-    sleep_time = remaining;
-}
-
-// static
-bool PlatformThread::Create(size_t stack_size,
-                            Delegate* delegate,
-                            PlatformThreadHandle* thread_handle) {
-  return CreateThread(stack_size, true /* joinable thread */, delegate,
-                      thread_handle);
-}
-
-// static
-bool PlatformThread::CreateNonJoinable(size_t stack_size, Delegate* delegate) {
-  PlatformThreadHandle unused;
-
-  bool result = CreateThread(stack_size, false /* non-joinable thread */,
-                             delegate, &unused);
-  return result;
-}
-
-// static
-void PlatformThread::Join(PlatformThreadHandle thread_handle) {
-  CHECK_EQ(0, pthread_join(thread_handle.platform_handle(), nullptr));
-}
-
-// static
-void PlatformThread::Detach(PlatformThreadHandle thread_handle) {
-  CHECK_EQ(0, pthread_detach(thread_handle.platform_handle()));
-}
-
-}  // namespace base
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc
deleted file mode 100644
index 349a6cf..0000000
--- a/base/threading/platform_thread_win.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright (c) 2012 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/threading/platform_thread.h"
-
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/scoped_handle.h"
-
-#include <windows.h>
-
-namespace base {
-
-namespace {
-
-// The information on how to set the thread name comes from
-// a MSDN article: http://msdn2.microsoft.com/en-us/library/xcb2z8hs.aspx
-const DWORD kVCThreadNameException = 0x406D1388;
-
-typedef struct tagTHREADNAME_INFO {
-  DWORD dwType;      // Must be 0x1000.
-  LPCSTR szName;     // Pointer to name (in user addr space).
-  DWORD dwThreadID;  // Thread ID (-1=caller thread).
-  DWORD dwFlags;     // Reserved for future use, must be zero.
-} THREADNAME_INFO;
-
-// The SetThreadDescription API was brought in version 1607 of Windows 10.
-typedef HRESULT(WINAPI* SetThreadDescription)(HANDLE hThread,
-                                              PCWSTR lpThreadDescription);
-
-// This function has try handling, so it is separated out of its caller.
-void SetNameInternal(PlatformThreadId thread_id, const char* name) {
-  THREADNAME_INFO info;
-  info.dwType = 0x1000;
-  info.szName = name;
-  info.dwThreadID = thread_id;
-  info.dwFlags = 0;
-
-  __try {
-    RaiseException(kVCThreadNameException, 0, sizeof(info) / sizeof(DWORD),
-                   reinterpret_cast<DWORD_PTR*>(&info));
-  } __except (EXCEPTION_CONTINUE_EXECUTION) {
-  }
-}
-
-struct ThreadParams {
-  PlatformThread::Delegate* delegate;
-  bool joinable;
-};
-
-DWORD __stdcall ThreadFunc(void* params) {
-  ThreadParams* thread_params = static_cast<ThreadParams*>(params);
-  PlatformThread::Delegate* delegate = thread_params->delegate;
-
-  // Retrieve a copy of the thread handle to use as the key in the
-  // thread name mapping.
-  PlatformThreadHandle::Handle platform_handle;
-  BOOL did_dup = DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
-                                 GetCurrentProcess(), &platform_handle, 0,
-                                 FALSE, DUPLICATE_SAME_ACCESS);
-
-  win::ScopedHandle scoped_platform_handle;
-
-  if (did_dup) {
-    scoped_platform_handle.Set(platform_handle);
-  }
-
-  delete thread_params;
-  delegate->ThreadMain();
-
-  return 0;
-}
-
-// CreateThreadInternal() matches PlatformThread::CreateWithPriority(), except
-// that |out_thread_handle| may be nullptr, in which case a non-joinable thread
-// is created.
-bool CreateThreadInternal(size_t stack_size,
-                          PlatformThread::Delegate* delegate,
-                          PlatformThreadHandle* out_thread_handle) {
-  unsigned int flags = 0;
-  if (stack_size > 0) {
-    flags = STACK_SIZE_PARAM_IS_A_RESERVATION;
-  }
-
-  ThreadParams* params = new ThreadParams;
-  params->delegate = delegate;
-  params->joinable = out_thread_handle != nullptr;
-
-  void* thread_handle;
-  {
-    // Using CreateThread here vs _beginthreadex makes thread creation a bit
-    // faster and doesn't require the loader lock to be available.  Our code
-    // will  have to work running on CreateThread() threads anyway, since we run
-    // code on the Windows thread pool, etc.  For some background on the
-    // difference:
-    //   http://www.microsoft.com/msj/1099/win32/win321099.aspx
-    thread_handle =
-        ::CreateThread(nullptr, stack_size, ThreadFunc, params, flags, nullptr);
-  }
-
-  if (!thread_handle) {
-    delete params;
-    return false;
-  }
-
-  if (out_thread_handle)
-    *out_thread_handle = PlatformThreadHandle(thread_handle);
-  else
-    CloseHandle(thread_handle);
-  return true;
-}
-
-}  // namespace
-
-// static
-PlatformThreadId PlatformThread::CurrentId() {
-  return ::GetCurrentThreadId();
-}
-
-// static
-PlatformThreadRef PlatformThread::CurrentRef() {
-  return PlatformThreadRef(::GetCurrentThreadId());
-}
-
-// static
-PlatformThreadHandle PlatformThread::CurrentHandle() {
-  return PlatformThreadHandle(::GetCurrentThread());
-}
-
-// static
-void PlatformThread::YieldCurrentThread() {
-  ::Sleep(0);
-}
-
-// static
-void PlatformThread::Sleep(TimeDelta duration) {
-  // When measured with a high resolution clock, Sleep() sometimes returns much
-  // too early. We may need to call it repeatedly to get the desired duration.
-  TimeTicks end = TimeTicks::Now() + duration;
-  for (TimeTicks now = TimeTicks::Now(); now < end; now = TimeTicks::Now())
-    ::Sleep(static_cast<DWORD>((end - now).InMillisecondsRoundedUp()));
-}
-
-// static
-bool PlatformThread::Create(size_t stack_size,
-                            Delegate* delegate,
-                            PlatformThreadHandle* thread_handle) {
-  DCHECK(thread_handle);
-  return CreateThreadInternal(stack_size, delegate, thread_handle);
-}
-
-// static
-bool PlatformThread::CreateNonJoinable(size_t stack_size, Delegate* delegate) {
-  return CreateThreadInternal(stack_size, delegate, nullptr /* non-joinable */
-  );
-}
-
-// static
-void PlatformThread::Join(PlatformThreadHandle thread_handle) {
-  DCHECK(thread_handle.platform_handle());
-  // TODO(willchan): Enable this check once I can get it to work for Windows
-  // shutdown.
-  // Joining another thread may block the current thread for a long time, since
-  // the thread referred to by |thread_handle| may still be running long-lived /
-  // blocking tasks.
-  // AssertBlockingAllowed();
-
-  DWORD thread_id = 0;
-  thread_id = ::GetThreadId(thread_handle.platform_handle());
-  DWORD last_error = 0;
-  if (!thread_id)
-    last_error = ::GetLastError();
-
-  // Wait for the thread to exit.  It should already have terminated but make
-  // sure this assumption is valid.
-  CHECK_EQ(WAIT_OBJECT_0,
-           WaitForSingleObject(thread_handle.platform_handle(), INFINITE));
-  CloseHandle(thread_handle.platform_handle());
-}
-
-// static
-void PlatformThread::Detach(PlatformThreadHandle thread_handle) {
-  CloseHandle(thread_handle.platform_handle());
-}
-
-}  // namespace base
diff --git a/base/time/clock.cc b/base/time/clock.cc
deleted file mode 100644
index 9e3f271..0000000
--- a/base/time/clock.cc
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2012 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/time/clock.h"
-
-namespace base {
-
-Clock::~Clock() = default;
-
-}  // namespace base
diff --git a/base/time/clock.h b/base/time/clock.h
deleted file mode 100644
index 8f3a27f..0000000
--- a/base/time/clock.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright (c) 2012 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_TIME_CLOCK_H_
-#define BASE_TIME_CLOCK_H_
-
-#include "base/time/time.h"
-
-namespace base {
-
-// A Clock is an interface for objects that vend Times.  It is
-// intended to be able to test the behavior of classes with respect to
-// time.
-//
-// See DefaultClock (base/time/default_clock.h) for the default
-// implementation that simply uses Time::Now().
-//
-// (An implementation that uses Time::SystemTime() should be added as
-// needed.)
-//
-// See SimpleTestClock (base/test/simple_test_clock.h) for a simple
-// test implementation.
-//
-// See TickClock (base/time/tick_clock.h) for the equivalent interface for
-// TimeTicks.
-class Clock {
- public:
-  virtual ~Clock();
-
-  // Now() must be safe to call from any thread.  The caller cannot
-  // make any ordering assumptions about the returned Time.  For
-  // example, the system clock may change to an earlier time.
-  virtual Time Now() const = 0;
-};
-
-}  // namespace base
-
-#endif  // BASE_TIME_CLOCK_H_
diff --git a/base/time/time.cc b/base/time/time.cc
deleted file mode 100644
index 13b2343..0000000
--- a/base/time/time.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright (c) 2012 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/time/time.h"
-
-#include <cmath>
-#include <ios>
-#include <limits>
-#include <ostream>
-#include <sstream>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/no_destructor.h"
-#include "base/strings/stringprintf.h"
-#include "base/time/time_override.h"
-#include "util/build_config.h"
-
-namespace base {
-
-namespace internal {
-
-TimeNowFunction g_time_now_function = &subtle::TimeNowIgnoringOverride;
-
-TimeNowFunction g_time_now_from_system_time_function =
-    &subtle::TimeNowFromSystemTimeIgnoringOverride;
-
-TimeTicksNowFunction g_time_ticks_now_function =
-    &subtle::TimeTicksNowIgnoringOverride;
-
-ThreadTicksNowFunction g_thread_ticks_now_function =
-    &subtle::ThreadTicksNowIgnoringOverride;
-
-}  // namespace internal
-
-// TimeDelta ------------------------------------------------------------------
-
-int TimeDelta::InDays() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int>::max();
-  }
-  return static_cast<int>(delta_ / Time::kMicrosecondsPerDay);
-}
-
-int TimeDelta::InHours() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int>::max();
-  }
-  return static_cast<int>(delta_ / Time::kMicrosecondsPerHour);
-}
-
-int TimeDelta::InMinutes() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int>::max();
-  }
-  return static_cast<int>(delta_ / Time::kMicrosecondsPerMinute);
-}
-
-double TimeDelta::InSecondsF() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<double>::infinity();
-  }
-  return static_cast<double>(delta_) / Time::kMicrosecondsPerSecond;
-}
-
-int64_t TimeDelta::InSeconds() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return delta_ / Time::kMicrosecondsPerSecond;
-}
-
-double TimeDelta::InMillisecondsF() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<double>::infinity();
-  }
-  return static_cast<double>(delta_) / Time::kMicrosecondsPerMillisecond;
-}
-
-int64_t TimeDelta::InMilliseconds() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return delta_ / Time::kMicrosecondsPerMillisecond;
-}
-
-int64_t TimeDelta::InMillisecondsRoundedUp() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return (delta_ + Time::kMicrosecondsPerMillisecond - 1) /
-         Time::kMicrosecondsPerMillisecond;
-}
-
-int64_t TimeDelta::InMicroseconds() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return delta_;
-}
-
-double TimeDelta::InMicrosecondsF() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<double>::infinity();
-  }
-  return static_cast<double>(delta_);
-}
-
-int64_t TimeDelta::InNanoseconds() const {
-  if (is_max()) {
-    // Preserve max to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return delta_ * Time::kNanosecondsPerMicrosecond;
-}
-
-namespace time_internal {
-
-int64_t SaturatedAdd(TimeDelta delta, int64_t value) {
-  CheckedNumeric<int64_t> rv(delta.delta_);
-  rv += value;
-  if (rv.IsValid())
-    return rv.ValueOrDie();
-  // Positive RHS overflows. Negative RHS underflows.
-  if (value < 0)
-    return std::numeric_limits<int64_t>::min();
-  return std::numeric_limits<int64_t>::max();
-}
-
-int64_t SaturatedSub(TimeDelta delta, int64_t value) {
-  CheckedNumeric<int64_t> rv(delta.delta_);
-  rv -= value;
-  if (rv.IsValid())
-    return rv.ValueOrDie();
-  // Negative RHS overflows. Positive RHS underflows.
-  if (value < 0)
-    return std::numeric_limits<int64_t>::max();
-  return std::numeric_limits<int64_t>::min();
-}
-
-}  // namespace time_internal
-
-std::ostream& operator<<(std::ostream& os, TimeDelta time_delta) {
-  return os << time_delta.InSecondsF() << " s";
-}
-
-// Time -----------------------------------------------------------------------
-
-// static
-Time Time::Now() {
-  return internal::g_time_now_function();
-}
-
-// static
-Time Time::NowFromSystemTime() {
-  // Just use g_time_now_function because it returns the system time.
-  return internal::g_time_now_from_system_time_function();
-}
-
-// static
-Time Time::FromDeltaSinceWindowsEpoch(TimeDelta delta) {
-  return Time(delta.InMicroseconds());
-}
-
-TimeDelta Time::ToDeltaSinceWindowsEpoch() const {
-  return TimeDelta::FromMicroseconds(us_);
-}
-
-// static
-Time Time::FromTimeT(time_t tt) {
-  if (tt == 0)
-    return Time();  // Preserve 0 so we can tell it doesn't exist.
-  if (tt == std::numeric_limits<time_t>::max())
-    return Max();
-  return Time(kTimeTToMicrosecondsOffset) + TimeDelta::FromSeconds(tt);
-}
-
-time_t Time::ToTimeT() const {
-  if (is_null())
-    return 0;  // Preserve 0 so we can tell it doesn't exist.
-  if (is_max()) {
-    // Preserve max without offset to prevent overflow.
-    return std::numeric_limits<time_t>::max();
-  }
-  if (std::numeric_limits<int64_t>::max() - kTimeTToMicrosecondsOffset <= us_) {
-    DLOG(WARNING) << "Overflow when converting base::Time with internal "
-                  << "value " << us_ << " to time_t.";
-    return std::numeric_limits<time_t>::max();
-  }
-  return (us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerSecond;
-}
-
-// static
-Time Time::FromDoubleT(double dt) {
-  if (dt == 0 || std::isnan(dt))
-    return Time();  // Preserve 0 so we can tell it doesn't exist.
-  return Time(kTimeTToMicrosecondsOffset) + TimeDelta::FromSecondsD(dt);
-}
-
-double Time::ToDoubleT() const {
-  if (is_null())
-    return 0;  // Preserve 0 so we can tell it doesn't exist.
-  if (is_max()) {
-    // Preserve max without offset to prevent overflow.
-    return std::numeric_limits<double>::infinity();
-  }
-  return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
-          static_cast<double>(kMicrosecondsPerSecond));
-}
-
-#if defined(OS_POSIX)
-// static
-Time Time::FromTimeSpec(const timespec& ts) {
-  return FromDoubleT(ts.tv_sec + static_cast<double>(ts.tv_nsec) /
-                                     base::Time::kNanosecondsPerSecond);
-}
-#endif
-
-// static
-Time Time::FromJsTime(double ms_since_epoch) {
-  // The epoch is a valid time, so this constructor doesn't interpret
-  // 0 as the null time.
-  return Time(kTimeTToMicrosecondsOffset) +
-         TimeDelta::FromMillisecondsD(ms_since_epoch);
-}
-
-double Time::ToJsTime() const {
-  if (is_null()) {
-    // Preserve 0 so the invalid result doesn't depend on the platform.
-    return 0;
-  }
-  if (is_max()) {
-    // Preserve max without offset to prevent overflow.
-    return std::numeric_limits<double>::infinity();
-  }
-  return (static_cast<double>(us_ - kTimeTToMicrosecondsOffset) /
-          kMicrosecondsPerMillisecond);
-}
-
-Time Time::FromJavaTime(int64_t ms_since_epoch) {
-  return base::Time::UnixEpoch() +
-         base::TimeDelta::FromMilliseconds(ms_since_epoch);
-}
-
-int64_t Time::ToJavaTime() const {
-  if (is_null()) {
-    // Preserve 0 so the invalid result doesn't depend on the platform.
-    return 0;
-  }
-  if (is_max()) {
-    // Preserve max without offset to prevent overflow.
-    return std::numeric_limits<int64_t>::max();
-  }
-  return ((us_ - kTimeTToMicrosecondsOffset) / kMicrosecondsPerMillisecond);
-}
-
-// static
-Time Time::UnixEpoch() {
-  Time time;
-  time.us_ = kTimeTToMicrosecondsOffset;
-  return time;
-}
-
-// TimeTicks ------------------------------------------------------------------
-
-// static
-TimeTicks TimeTicks::Now() {
-  return internal::g_time_ticks_now_function();
-}
-
-// static
-TimeTicks TimeTicks::UnixEpoch() {
-  static const base::NoDestructor<base::TimeTicks> epoch([]() {
-    return subtle::TimeTicksNowIgnoringOverride() -
-           (subtle::TimeNowIgnoringOverride() - Time::UnixEpoch());
-  }());
-  return *epoch;
-}
-
-TimeTicks TimeTicks::SnappedToNextTick(TimeTicks tick_phase,
-                                       TimeDelta tick_interval) const {
-  // |interval_offset| is the offset from |this| to the next multiple of
-  // |tick_interval| after |tick_phase|, possibly negative if in the past.
-  TimeDelta interval_offset = (tick_phase - *this) % tick_interval;
-  // If |this| is exactly on the interval (i.e. offset==0), don't adjust.
-  // Otherwise, if |tick_phase| was in the past, adjust forward to the next
-  // tick after |this|.
-  if (!interval_offset.is_zero() && tick_phase < *this)
-    interval_offset += tick_interval;
-  return *this + interval_offset;
-}
-
-std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks) {
-  // This function formats a TimeTicks object as "bogo-microseconds".
-  // The origin and granularity of the count are platform-specific, and may very
-  // from run to run. Although bogo-microseconds usually roughly correspond to
-  // real microseconds, the only real guarantee is that the number never goes
-  // down during a single run.
-  const TimeDelta as_time_delta = time_ticks - TimeTicks();
-  return os << as_time_delta.InMicroseconds() << " bogo-microseconds";
-}
-
-// ThreadTicks ----------------------------------------------------------------
-
-// static
-ThreadTicks ThreadTicks::Now() {
-  return internal::g_thread_ticks_now_function();
-}
-
-std::ostream& operator<<(std::ostream& os, ThreadTicks thread_ticks) {
-  const TimeDelta as_time_delta = thread_ticks - ThreadTicks();
-  return os << as_time_delta.InMicroseconds() << " bogo-thread-microseconds";
-}
-
-// Time::Exploded -------------------------------------------------------------
-
-inline bool is_in_range(int value, int lo, int hi) {
-  return lo <= value && value <= hi;
-}
-
-bool Time::Exploded::HasValidValues() const {
-  return is_in_range(month, 1, 12) && is_in_range(day_of_week, 0, 6) &&
-         is_in_range(day_of_month, 1, 31) && is_in_range(hour, 0, 23) &&
-         is_in_range(minute, 0, 59) && is_in_range(second, 0, 60) &&
-         is_in_range(millisecond, 0, 999);
-}
-
-}  // namespace base
diff --git a/base/time/time.h b/base/time/time.h
deleted file mode 100644
index 47d7536..0000000
--- a/base/time/time.h
+++ /dev/null
@@ -1,871 +0,0 @@
-// Copyright (c) 2012 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.
-
-// Time represents an absolute point in coordinated universal time (UTC),
-// internally represented as microseconds (s/1,000,000) since the Windows epoch
-// (1601-01-01 00:00:00 UTC). System-dependent clock interface routines are
-// defined in time_PLATFORM.cc. Note that values for Time may skew and jump
-// around as the operating system makes adjustments to synchronize (e.g., with
-// NTP servers). Thus, client code that uses the Time class must account for
-// this.
-//
-// TimeDelta represents a duration of time, internally represented in
-// microseconds.
-//
-// TimeTicks and ThreadTicks represent an abstract time that is most of the time
-// incrementing, for use in measuring time durations. Internally, they are
-// represented in microseconds. They cannot be converted to a human-readable
-// time, but are guaranteed not to decrease (unlike the Time class). Note that
-// TimeTicks may "stand still" (e.g., if the computer is suspended), and
-// ThreadTicks will "stand still" whenever the thread has been de-scheduled by
-// the operating system.
-//
-// All time classes are copyable, assignable, and occupy 64-bits per instance.
-// As a result, prefer passing them by value:
-//   void MyFunction(TimeDelta arg);
-// If circumstances require, you may also pass by const reference:
-//   void MyFunction(const TimeDelta& arg);  // Not preferred.
-//
-// Definitions of operator<< are provided to make these types work with
-// DCHECK_EQ() and other log macros. For human-readable formatting, see
-// "base/i18n/time_formatting.h".
-//
-// So many choices!  Which time class should you use?  Examples:
-//
-//   Time:        Interpreting the wall-clock time provided by a remote system.
-//                Detecting whether cached resources have expired. Providing the
-//                user with a display of the current date and time. Determining
-//                the amount of time between events across re-boots of the
-//                machine.
-//
-//   TimeTicks:   Tracking the amount of time a task runs. Executing delayed
-//                tasks at the right time. Computing presentation timestamps.
-//                Synchronizing audio and video using TimeTicks as a common
-//                reference clock (lip-sync). Measuring network round-trip
-//                latency.
-//
-//   ThreadTicks: Benchmarking how long the current thread has been doing actual
-//                work.
-
-#ifndef BASE_TIME_TIME_H_
-#define BASE_TIME_TIME_H_
-
-#include <stdint.h>
-#include <time.h>
-
-#include <iosfwd>
-#include <limits>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/numerics/safe_math.h"
-#include "util/build_config.h"
-
-#if defined(OS_MACOSX)
-#include <CoreFoundation/CoreFoundation.h>
-// Avoid Mac system header macro leak.
-#undef TYPE_BOOL
-#endif
-
-#if defined(OS_POSIX)
-#include <sys/time.h>
-#include <unistd.h>
-#endif
-
-#if defined(OS_WIN)
-#include "base/gtest_prod_util.h"
-#include "base/win/windows_types.h"
-#endif
-
-namespace base {
-
-class PlatformThreadHandle;
-class TimeDelta;
-
-// The functions in the time_internal namespace are meant to be used only by the
-// time classes and functions.  Please use the math operators defined in the
-// time classes instead.
-namespace time_internal {
-
-// Add or subtract |value| from a TimeDelta. The int64_t argument and return
-// value are in terms of a microsecond timebase.
-int64_t SaturatedAdd(TimeDelta delta, int64_t value);
-int64_t SaturatedSub(TimeDelta delta, int64_t value);
-
-}  // namespace time_internal
-
-// TimeDelta ------------------------------------------------------------------
-
-class TimeDelta {
- public:
-  constexpr TimeDelta() : delta_(0) {}
-
-  // Converts units of time to TimeDeltas.
-  static constexpr TimeDelta FromDays(int days);
-  static constexpr TimeDelta FromHours(int hours);
-  static constexpr TimeDelta FromMinutes(int minutes);
-  static constexpr TimeDelta FromSeconds(int64_t secs);
-  static constexpr TimeDelta FromMilliseconds(int64_t ms);
-  static constexpr TimeDelta FromMicroseconds(int64_t us);
-  static constexpr TimeDelta FromNanoseconds(int64_t ns);
-  static constexpr TimeDelta FromSecondsD(double secs);
-  static constexpr TimeDelta FromMillisecondsD(double ms);
-  static constexpr TimeDelta FromMicrosecondsD(double us);
-  static constexpr TimeDelta FromNanosecondsD(double ns);
-#if defined(OS_WIN)
-  static TimeDelta FromQPCValue(LONGLONG qpc_value);
-  static TimeDelta FromFileTime(FILETIME ft);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  static TimeDelta FromTimeSpec(const timespec& ts);
-#endif
-
-  // Converts an integer value representing TimeDelta to a class. This is used
-  // when deserializing a |TimeDelta| structure, using a value known to be
-  // compatible. It is not provided as a constructor because the integer type
-  // may be unclear from the perspective of a caller.
-  //
-  // DEPRECATED - Do not use in new code. http://crbug.com/634507
-  static constexpr TimeDelta FromInternalValue(int64_t delta) {
-    return TimeDelta(delta);
-  }
-
-  // Returns the maximum time delta, which should be greater than any reasonable
-  // time delta we might compare it to. Adding or subtracting the maximum time
-  // delta to a time or another time delta has an undefined result.
-  static constexpr TimeDelta Max();
-
-  // Returns the minimum time delta, which should be less than than any
-  // reasonable time delta we might compare it to. Adding or subtracting the
-  // minimum time delta to a time or another time delta has an undefined result.
-  static constexpr TimeDelta Min();
-
-  // Returns the internal numeric value of the TimeDelta object. Please don't
-  // use this and do arithmetic on it, as it is more error prone than using the
-  // provided operators.
-  // For serializing, use FromInternalValue to reconstitute.
-  //
-  // DEPRECATED - Do not use in new code. http://crbug.com/634507
-  constexpr int64_t ToInternalValue() const { return delta_; }
-
-  // Returns the magnitude (absolute value) of this TimeDelta.
-  constexpr TimeDelta magnitude() const {
-    // Some toolchains provide an incomplete C++11 implementation and lack an
-    // int64_t overload for std::abs().  The following is a simple branchless
-    // implementation:
-    const int64_t mask = delta_ >> (sizeof(delta_) * 8 - 1);
-    return TimeDelta((delta_ + mask) ^ mask);
-  }
-
-  // Returns true if the time delta is zero.
-  constexpr bool is_zero() const { return delta_ == 0; }
-
-  // Returns true if the time delta is the maximum/minimum time delta.
-  constexpr bool is_max() const {
-    return delta_ == std::numeric_limits<int64_t>::max();
-  }
-  constexpr bool is_min() const {
-    return delta_ == std::numeric_limits<int64_t>::min();
-  }
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  struct timespec ToTimeSpec() const;
-#endif
-
-  // Returns the time delta in some unit. The F versions return a floating
-  // point value, the "regular" versions return a rounded-down value.
-  //
-  // InMillisecondsRoundedUp() instead returns an integer that is rounded up
-  // to the next full millisecond.
-  int InDays() const;
-  int InHours() const;
-  int InMinutes() const;
-  double InSecondsF() const;
-  int64_t InSeconds() const;
-  double InMillisecondsF() const;
-  int64_t InMilliseconds() const;
-  int64_t InMillisecondsRoundedUp() const;
-  int64_t InMicroseconds() const;
-  double InMicrosecondsF() const;
-  int64_t InNanoseconds() const;
-
-  constexpr TimeDelta& operator=(TimeDelta other) {
-    delta_ = other.delta_;
-    return *this;
-  }
-
-  // Computations with other deltas. Can easily be made constexpr with C++17 but
-  // hard to do until then per limitations around
-  // __builtin_(add|sub)_overflow in safe_math_clang_gcc_impl.h :
-  // https://chromium-review.googlesource.com/c/chromium/src/+/873352#message-59594ab70827795a67e0780404adf37b4b6c2f14
-  TimeDelta operator+(TimeDelta other) const {
-    return TimeDelta(time_internal::SaturatedAdd(*this, other.delta_));
-  }
-  TimeDelta operator-(TimeDelta other) const {
-    return TimeDelta(time_internal::SaturatedSub(*this, other.delta_));
-  }
-
-  TimeDelta& operator+=(TimeDelta other) { return *this = (*this + other); }
-  TimeDelta& operator-=(TimeDelta other) { return *this = (*this - other); }
-  constexpr TimeDelta operator-() const { return TimeDelta(-delta_); }
-
-  // Computations with numeric types. operator*() isn't constexpr because of a
-  // limitation around __builtin_mul_overflow (but operator/(1.0/a) works for
-  // |a|'s of "reasonable" size -- i.e. that don't risk overflow).
-  template <typename T>
-  TimeDelta operator*(T a) const {
-    CheckedNumeric<int64_t> rv(delta_);
-    rv *= a;
-    if (rv.IsValid())
-      return TimeDelta(rv.ValueOrDie());
-    // Matched sign overflows. Mismatched sign underflows.
-    if ((delta_ < 0) ^ (a < 0))
-      return TimeDelta(std::numeric_limits<int64_t>::min());
-    return TimeDelta(std::numeric_limits<int64_t>::max());
-  }
-  template <typename T>
-  constexpr TimeDelta operator/(T a) const {
-    CheckedNumeric<int64_t> rv(delta_);
-    rv /= a;
-    if (rv.IsValid())
-      return TimeDelta(rv.ValueOrDie());
-    // Matched sign overflows. Mismatched sign underflows.
-    // Special case to catch divide by zero.
-    if ((delta_ < 0) ^ (a <= 0))
-      return TimeDelta(std::numeric_limits<int64_t>::min());
-    return TimeDelta(std::numeric_limits<int64_t>::max());
-  }
-  template <typename T>
-  TimeDelta& operator*=(T a) {
-    return *this = (*this * a);
-  }
-  template <typename T>
-  constexpr TimeDelta& operator/=(T a) {
-    return *this = (*this / a);
-  }
-
-  constexpr int64_t operator/(TimeDelta a) const { return delta_ / a.delta_; }
-  constexpr TimeDelta operator%(TimeDelta a) const {
-    return TimeDelta(delta_ % a.delta_);
-  }
-
-  // Comparison operators.
-  constexpr bool operator==(TimeDelta other) const {
-    return delta_ == other.delta_;
-  }
-  constexpr bool operator!=(TimeDelta other) const {
-    return delta_ != other.delta_;
-  }
-  constexpr bool operator<(TimeDelta other) const {
-    return delta_ < other.delta_;
-  }
-  constexpr bool operator<=(TimeDelta other) const {
-    return delta_ <= other.delta_;
-  }
-  constexpr bool operator>(TimeDelta other) const {
-    return delta_ > other.delta_;
-  }
-  constexpr bool operator>=(TimeDelta other) const {
-    return delta_ >= other.delta_;
-  }
-
-#if defined(OS_WIN)
-  // This works around crbug.com/635974
-  constexpr TimeDelta(const TimeDelta& other) : delta_(other.delta_) {}
-#endif
-
- private:
-  friend int64_t time_internal::SaturatedAdd(TimeDelta delta, int64_t value);
-  friend int64_t time_internal::SaturatedSub(TimeDelta delta, int64_t value);
-
-  // Constructs a delta given the duration in microseconds. This is private
-  // to avoid confusion by callers with an integer constructor. Use
-  // FromSeconds, FromMilliseconds, etc. instead.
-  constexpr explicit TimeDelta(int64_t delta_us) : delta_(delta_us) {}
-
-  // Private method to build a delta from a double.
-  static constexpr TimeDelta FromDouble(double value);
-
-  // Private method to build a delta from the product of a user-provided value
-  // and a known-positive value.
-  static constexpr TimeDelta FromProduct(int64_t value, int64_t positive_value);
-
-  // Delta in microseconds.
-  int64_t delta_;
-};
-
-template <typename T>
-TimeDelta operator*(T a, TimeDelta td) {
-  return td * a;
-}
-
-// For logging use only.
-std::ostream& operator<<(std::ostream& os, TimeDelta time_delta);
-
-// Do not reference the time_internal::TimeBase template class directly.  Please
-// use one of the time subclasses instead, and only reference the public
-// TimeBase members via those classes.
-namespace time_internal {
-
-// TimeBase--------------------------------------------------------------------
-
-// Provides value storage and comparison/math operations common to all time
-// classes. Each subclass provides for strong type-checking to ensure
-// semantically meaningful comparison/math of time values from the same clock
-// source or timeline.
-template <class TimeClass>
-class TimeBase {
- public:
-  static const int64_t kHoursPerDay = 24;
-  static const int64_t kMillisecondsPerSecond = 1000;
-  static const int64_t kMillisecondsPerDay =
-      kMillisecondsPerSecond * 60 * 60 * kHoursPerDay;
-  static const int64_t kMicrosecondsPerMillisecond = 1000;
-  static const int64_t kMicrosecondsPerSecond =
-      kMicrosecondsPerMillisecond * kMillisecondsPerSecond;
-  static const int64_t kMicrosecondsPerMinute = kMicrosecondsPerSecond * 60;
-  static const int64_t kMicrosecondsPerHour = kMicrosecondsPerMinute * 60;
-  static const int64_t kMicrosecondsPerDay =
-      kMicrosecondsPerHour * kHoursPerDay;
-  static const int64_t kMicrosecondsPerWeek = kMicrosecondsPerDay * 7;
-  static const int64_t kNanosecondsPerMicrosecond = 1000;
-  static const int64_t kNanosecondsPerSecond =
-      kNanosecondsPerMicrosecond * kMicrosecondsPerSecond;
-
-  // Returns true if this object has not been initialized.
-  //
-  // Warning: Be careful when writing code that performs math on time values,
-  // since it's possible to produce a valid "zero" result that should not be
-  // interpreted as a "null" value.
-  bool is_null() const { return us_ == 0; }
-
-  // Returns true if this object represents the maximum/minimum time.
-  bool is_max() const { return us_ == std::numeric_limits<int64_t>::max(); }
-  bool is_min() const { return us_ == std::numeric_limits<int64_t>::min(); }
-
-  // Returns the maximum/minimum times, which should be greater/less than than
-  // any reasonable time with which we might compare it.
-  static TimeClass Max() {
-    return TimeClass(std::numeric_limits<int64_t>::max());
-  }
-
-  static TimeClass Min() {
-    return TimeClass(std::numeric_limits<int64_t>::min());
-  }
-
-  // For serializing only. Use FromInternalValue() to reconstitute. Please don't
-  // use this and do arithmetic on it, as it is more error prone than using the
-  // provided operators.
-  //
-  // DEPRECATED - Do not use in new code. For serializing Time values, prefer
-  // Time::ToDeltaSinceWindowsEpoch().InMicroseconds(). http://crbug.com/634507
-  int64_t ToInternalValue() const { return us_; }
-
-  // The amount of time since the origin (or "zero") point. This is a syntactic
-  // convenience to aid in code readability, mainly for debugging/testing use
-  // cases.
-  //
-  // Warning: While the Time subclass has a fixed origin point, the origin for
-  // the other subclasses can vary each time the application is restarted.
-  TimeDelta since_origin() const { return TimeDelta::FromMicroseconds(us_); }
-
-  TimeClass& operator=(TimeClass other) {
-    us_ = other.us_;
-    return *(static_cast<TimeClass*>(this));
-  }
-
-  // Compute the difference between two times.
-  TimeDelta operator-(TimeClass other) const {
-    return TimeDelta::FromMicroseconds(us_ - other.us_);
-  }
-
-  // Return a new time modified by some delta.
-  TimeClass operator+(TimeDelta delta) const {
-    return TimeClass(time_internal::SaturatedAdd(delta, us_));
-  }
-  TimeClass operator-(TimeDelta delta) const {
-    return TimeClass(-time_internal::SaturatedSub(delta, us_));
-  }
-
-  // Modify by some time delta.
-  TimeClass& operator+=(TimeDelta delta) {
-    return static_cast<TimeClass&>(*this = (*this + delta));
-  }
-  TimeClass& operator-=(TimeDelta delta) {
-    return static_cast<TimeClass&>(*this = (*this - delta));
-  }
-
-  // Comparison operators
-  bool operator==(TimeClass other) const { return us_ == other.us_; }
-  bool operator!=(TimeClass other) const { return us_ != other.us_; }
-  bool operator<(TimeClass other) const { return us_ < other.us_; }
-  bool operator<=(TimeClass other) const { return us_ <= other.us_; }
-  bool operator>(TimeClass other) const { return us_ > other.us_; }
-  bool operator>=(TimeClass other) const { return us_ >= other.us_; }
-
- protected:
-  constexpr explicit TimeBase(int64_t us) : us_(us) {}
-
-  // Time value in a microsecond timebase.
-  int64_t us_;
-};
-
-}  // namespace time_internal
-
-template <class TimeClass>
-inline TimeClass operator+(TimeDelta delta, TimeClass t) {
-  return t + delta;
-}
-
-// Time -----------------------------------------------------------------------
-
-// Represents a wall clock time in UTC. Values are not guaranteed to be
-// monotonically non-decreasing and are subject to large amounts of skew.
-class Time : public time_internal::TimeBase<Time> {
- public:
-  // Offset of UNIX epoch (1970-01-01 00:00:00 UTC) from Windows FILETIME epoch
-  // (1601-01-01 00:00:00 UTC), in microseconds. This value is derived from the
-  // following: ((1970-1601)*365+89)*24*60*60*1000*1000, where 89 is the number
-  // of leap year days between 1601 and 1970: (1970-1601)/4 excluding 1700,
-  // 1800, and 1900.
-  static constexpr int64_t kTimeTToMicrosecondsOffset =
-      INT64_C(11644473600000000);
-
-#if defined(OS_WIN)
-  // To avoid overflow in QPC to Microseconds calculations, since we multiply
-  // by kMicrosecondsPerSecond, then the QPC value should not exceed
-  // (2^63 - 1) / 1E6. If it exceeds that threshold, we divide then multiply.
-  static constexpr int64_t kQPCOverflowThreshold = INT64_C(0x8637BD05AF7);
-#endif
-
-// kExplodedMinYear and kExplodedMaxYear define the platform-specific limits
-// for values passed to FromUTCExploded() and FromLocalExploded(). Those
-// functions will return false if passed values outside these limits. The limits
-// are inclusive, meaning that the API should support all dates within a given
-// limit year.
-#if defined(OS_WIN)
-  static constexpr int kExplodedMinYear = 1601;
-  static constexpr int kExplodedMaxYear = 30827;
-#elif defined(OS_MACOSX)
-  static constexpr int kExplodedMinYear = 1902;
-  static constexpr int kExplodedMaxYear = std::numeric_limits<int>::max();
-#else
-  static constexpr int kExplodedMinYear =
-      (sizeof(time_t) == 4 ? 1902 : std::numeric_limits<int>::min());
-  static constexpr int kExplodedMaxYear =
-      (sizeof(time_t) == 4 ? 2037 : std::numeric_limits<int>::max());
-#endif
-
-  // Represents an exploded time that can be formatted nicely. This is kind of
-  // like the Win32 SYSTEMTIME structure or the Unix "struct tm" with a few
-  // additions and changes to prevent errors.
-  struct Exploded {
-    int year;          // Four digit year "2007"
-    int month;         // 1-based month (values 1 = January, etc.)
-    int day_of_week;   // 0-based day of week (0 = Sunday, etc.)
-    int day_of_month;  // 1-based day of month (1-31)
-    int hour;          // Hour within the current day (0-23)
-    int minute;        // Minute within the current hour (0-59)
-    int second;        // Second within the current minute (0-59 plus leap
-                       //   seconds which may take it up to 60).
-    int millisecond;   // Milliseconds within the current second (0-999)
-
-    // A cursory test for whether the data members are within their
-    // respective ranges. A 'true' return value does not guarantee the
-    // Exploded value can be successfully converted to a Time value.
-    bool HasValidValues() const;
-  };
-
-  // Contains the NULL time. Use Time::Now() to get the current time.
-  constexpr Time() : TimeBase(0) {}
-
-  // Returns the time for epoch in Unix-like system (Jan 1, 1970).
-  static Time UnixEpoch();
-
-  // Returns the current time. Watch out, the system might adjust its clock
-  // in which case time will actually go backwards. We don't guarantee that
-  // times are increasing, or that two calls to Now() won't be the same.
-  static Time Now();
-
-  // Returns the current time. Same as Now() except that this function always
-  // uses system time so that there are no discrepancies between the returned
-  // time and system time even on virtual environments including our test bot.
-  // For timing sensitive unittests, this function should be used.
-  static Time NowFromSystemTime();
-
-  // Converts to/from TimeDeltas relative to the Windows epoch (1601-01-01
-  // 00:00:00 UTC). Prefer these methods for opaque serialization and
-  // deserialization of time values, e.g.
-  //
-  //   // Serialization:
-  //   base::Time last_updated = ...;
-  //   SaveToDatabase(last_updated.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  //
-  //   // Deserialization:
-  //   base::Time last_updated = base::Time::FromDeltaSinceWindowsEpoch(
-  //       base::TimeDelta::FromMicroseconds(LoadFromDatabase()));
-  static Time FromDeltaSinceWindowsEpoch(TimeDelta delta);
-  TimeDelta ToDeltaSinceWindowsEpoch() const;
-
-  // Converts to/from time_t in UTC and a Time class.
-  static Time FromTimeT(time_t tt);
-  time_t ToTimeT() const;
-
-  // Converts time to/from a double which is the number of seconds since epoch
-  // (Jan 1, 1970).  Webkit uses this format to represent time.
-  // Because WebKit initializes double time value to 0 to indicate "not
-  // initialized", we map it to empty Time object that also means "not
-  // initialized".
-  static Time FromDoubleT(double dt);
-  double ToDoubleT() const;
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  // Converts the timespec structure to time. MacOS X 10.8.3 (and tentatively,
-  // earlier versions) will have the |ts|'s tv_nsec component zeroed out,
-  // having a 1 second resolution, which agrees with
-  // https://developer.apple.com/legacy/library/#technotes/tn/tn1150.html#HFSPlusDates.
-  static Time FromTimeSpec(const timespec& ts);
-#endif
-
-  // Converts to/from the Javascript convention for times, a number of
-  // milliseconds since the epoch:
-  // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/getTime.
-  static Time FromJsTime(double ms_since_epoch);
-  double ToJsTime() const;
-
-  // Converts to/from Java convention for times, a number of milliseconds since
-  // the epoch. Because the Java format has less resolution, converting to Java
-  // time is a lossy operation.
-  static Time FromJavaTime(int64_t ms_since_epoch);
-  int64_t ToJavaTime() const;
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  static Time FromTimeVal(struct timeval t);
-  struct timeval ToTimeVal() const;
-#endif
-
-#if defined(OS_MACOSX)
-  static Time FromCFAbsoluteTime(CFAbsoluteTime t);
-  CFAbsoluteTime ToCFAbsoluteTime() const;
-#endif
-
-#if defined(OS_WIN)
-  static Time FromFileTime(FILETIME ft);
-  FILETIME ToFileTime() const;
-
-  // The minimum time of a low resolution timer.  This is basically a windows
-  // constant of ~15.6ms.  While it does vary on some older OS versions, we'll
-  // treat it as static across all windows versions.
-  static const int kMinLowResolutionThresholdMs = 16;
-
-  // Enable or disable Windows high resolution timer.
-  static void EnableHighResolutionTimer(bool enable);
-
-  // Activates or deactivates the high resolution timer based on the |activate|
-  // flag.  If the HighResolutionTimer is not Enabled (see
-  // EnableHighResolutionTimer), this function will return false.  Otherwise
-  // returns true.  Each successful activate call must be paired with a
-  // subsequent deactivate call.
-  // All callers to activate the high resolution timer must eventually call
-  // this function to deactivate the high resolution timer.
-  static bool ActivateHighResolutionTimer(bool activate);
-
-  // Returns true if the high resolution timer is both enabled and activated.
-  // This is provided for testing only, and is not tracked in a thread-safe
-  // way.
-  static bool IsHighResolutionTimerInUse();
-
-  // The following two functions are used to report the fraction of elapsed time
-  // that the high resolution timer is activated.
-  // ResetHighResolutionTimerUsage() resets the cumulative usage and starts the
-  // measurement interval and GetHighResolutionTimerUsage() returns the
-  // percentage of time since the reset that the high resolution timer was
-  // activated.
-  // ResetHighResolutionTimerUsage() must be called at least once before calling
-  // GetHighResolutionTimerUsage(); otherwise the usage result would be
-  // undefined.
-  static void ResetHighResolutionTimerUsage();
-  static double GetHighResolutionTimerUsage();
-#endif  // defined(OS_WIN)
-
-  // Converts an integer value representing Time to a class. This may be used
-  // when deserializing a |Time| structure, using a value known to be
-  // compatible. It is not provided as a constructor because the integer type
-  // may be unclear from the perspective of a caller.
-  //
-  // DEPRECATED - Do not use in new code. For deserializing Time values, prefer
-  // Time::FromDeltaSinceWindowsEpoch(). http://crbug.com/634507
-  static constexpr Time FromInternalValue(int64_t us) { return Time(us); }
-
- private:
-  friend class time_internal::TimeBase<Time>;
-
-  constexpr explicit Time(int64_t us) : TimeBase(us) {}
-};
-
-// static
-constexpr TimeDelta TimeDelta::FromDays(int days) {
-  return days == std::numeric_limits<int>::max()
-             ? Max()
-             : TimeDelta(days * Time::kMicrosecondsPerDay);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromHours(int hours) {
-  return hours == std::numeric_limits<int>::max()
-             ? Max()
-             : TimeDelta(hours * Time::kMicrosecondsPerHour);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromMinutes(int minutes) {
-  return minutes == std::numeric_limits<int>::max()
-             ? Max()
-             : TimeDelta(minutes * Time::kMicrosecondsPerMinute);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromSeconds(int64_t secs) {
-  return FromProduct(secs, Time::kMicrosecondsPerSecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromMilliseconds(int64_t ms) {
-  return FromProduct(ms, Time::kMicrosecondsPerMillisecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromMicroseconds(int64_t us) {
-  return TimeDelta(us);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromNanoseconds(int64_t ns) {
-  return TimeDelta(ns / Time::kNanosecondsPerMicrosecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromSecondsD(double secs) {
-  return FromDouble(secs * Time::kMicrosecondsPerSecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromMillisecondsD(double ms) {
-  return FromDouble(ms * Time::kMicrosecondsPerMillisecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromMicrosecondsD(double us) {
-  return FromDouble(us);
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromNanosecondsD(double ns) {
-  return FromDouble(ns / Time::kNanosecondsPerMicrosecond);
-}
-
-// static
-constexpr TimeDelta TimeDelta::Max() {
-  return TimeDelta(std::numeric_limits<int64_t>::max());
-}
-
-// static
-constexpr TimeDelta TimeDelta::Min() {
-  return TimeDelta(std::numeric_limits<int64_t>::min());
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromDouble(double value) {
-  // TODO(crbug.com/612601): Use saturated_cast<int64_t>(value) once we sort out
-  // the Min() behavior.
-  return value > std::numeric_limits<int64_t>::max()
-             ? Max()
-             : value < std::numeric_limits<int64_t>::min()
-                   ? Min()
-                   : TimeDelta(static_cast<int64_t>(value));
-}
-
-// static
-constexpr TimeDelta TimeDelta::FromProduct(int64_t value,
-                                           int64_t positive_value) {
-  DCHECK(positive_value > 0);
-  return value > std::numeric_limits<int64_t>::max() / positive_value
-             ? Max()
-             : value < std::numeric_limits<int64_t>::min() / positive_value
-                   ? Min()
-                   : TimeDelta(value * positive_value);
-}
-
-// For logging use only.
-std::ostream& operator<<(std::ostream& os, Time time);
-
-// TimeTicks ------------------------------------------------------------------
-
-// Represents monotonically non-decreasing clock time.
-class TimeTicks : public time_internal::TimeBase<TimeTicks> {
- public:
-  // The underlying clock used to generate new TimeTicks.
-  enum class Clock {
-    FUCHSIA_ZX_CLOCK_MONOTONIC,
-    LINUX_CLOCK_MONOTONIC,
-    IOS_CF_ABSOLUTE_TIME_MINUS_KERN_BOOTTIME,
-    MAC_MACH_ABSOLUTE_TIME,
-    WIN_QPC,
-    WIN_ROLLOVER_PROTECTED_TIME_GET_TIME
-  };
-
-  constexpr TimeTicks() : TimeBase(0) {}
-
-  // Platform-dependent tick count representing "right now." When
-  // IsHighResolution() returns false, the resolution of the clock could be
-  // as coarse as ~15.6ms. Otherwise, the resolution should be no worse than one
-  // microsecond.
-  static TimeTicks Now();
-
-  // Returns true if the high resolution clock is working on this system and
-  // Now() will return high resolution values. Note that, on systems where the
-  // high resolution clock works but is deemed inefficient, the low resolution
-  // clock will be used instead.
-  static bool IsHighResolution() WARN_UNUSED_RESULT;
-
-  // Returns true if TimeTicks is consistent across processes, meaning that
-  // timestamps taken on different processes can be safely compared with one
-  // another. (Note that, even on platforms where this returns true, time values
-  // from different threads that are within one tick of each other must be
-  // considered to have an ambiguous ordering.)
-  static bool IsConsistentAcrossProcesses() WARN_UNUSED_RESULT;
-
-#if defined(OS_WIN)
-  // Translates an absolute QPC timestamp into a TimeTicks value. The returned
-  // value has the same origin as Now(). Do NOT attempt to use this if
-  // IsHighResolution() returns false.
-  static TimeTicks FromQPCValue(LONGLONG qpc_value);
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  static TimeTicks FromMachAbsoluteTime(uint64_t mach_absolute_time);
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-  // Get an estimate of the TimeTick value at the time of the UnixEpoch. Because
-  // Time and TimeTicks respond differently to user-set time and NTP
-  // adjustments, this number is only an estimate. Nevertheless, this can be
-  // useful when you need to relate the value of TimeTicks to a real time and
-  // date. Note: Upon first invocation, this function takes a snapshot of the
-  // realtime clock to establish a reference point.  This function will return
-  // the same value for the duration of the application, but will be different
-  // in future application runs.
-  static TimeTicks UnixEpoch();
-
-  // Returns |this| snapped to the next tick, given a |tick_phase| and
-  // repeating |tick_interval| in both directions. |this| may be before,
-  // after, or equal to the |tick_phase|.
-  TimeTicks SnappedToNextTick(TimeTicks tick_phase,
-                              TimeDelta tick_interval) const;
-
-  // Returns an enum indicating the underlying clock being used to generate
-  // TimeTicks timestamps. This function should only be used for debugging and
-  // logging purposes.
-  static Clock GetClock();
-
-  // Converts an integer value representing TimeTicks to a class. This may be
-  // used when deserializing a |TimeTicks| structure, using a value known to be
-  // compatible. It is not provided as a constructor because the integer type
-  // may be unclear from the perspective of a caller.
-  //
-  // DEPRECATED - Do not use in new code. For deserializing TimeTicks values,
-  // prefer TimeTicks + TimeDelta(). http://crbug.com/634507
-  static constexpr TimeTicks FromInternalValue(int64_t us) {
-    return TimeTicks(us);
-  }
-
- private:
-  friend class time_internal::TimeBase<TimeTicks>;
-
-  // Please use Now() to create a new object. This is for internal use
-  // and testing.
-  constexpr explicit TimeTicks(int64_t us) : TimeBase(us) {}
-};
-
-// For logging use only.
-std::ostream& operator<<(std::ostream& os, TimeTicks time_ticks);
-
-// ThreadTicks ----------------------------------------------------------------
-
-// Represents a clock, specific to a particular thread, than runs only while the
-// thread is running.
-class ThreadTicks : public time_internal::TimeBase<ThreadTicks> {
- public:
-  ThreadTicks() : TimeBase(0) {}
-
-  // Returns true if ThreadTicks::Now() is supported on this system.
-  static bool IsSupported() WARN_UNUSED_RESULT {
-#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
-    (defined(OS_MACOSX) && !defined(OS_IOS)) || defined(OS_ANDROID) ||  \
-    defined(OS_FUCHSIA) || defined(OS_WIN)
-    return true;
-#else
-    return false;
-#endif
-  }
-
-  // Waits until the initialization is completed. Needs to be guarded with a
-  // call to IsSupported().
-  static void WaitUntilInitialized() {
-#if defined(OS_WIN)
-    WaitUntilInitializedWin();
-#endif
-  }
-
-  // Returns thread-specific CPU-time on systems that support this feature.
-  // Needs to be guarded with a call to IsSupported(). Use this timer
-  // to (approximately) measure how much time the calling thread spent doing
-  // actual work vs. being de-scheduled. May return bogus results if the thread
-  // migrates to another CPU between two calls. Returns an empty ThreadTicks
-  // object until the initialization is completed. If a clock reading is
-  // absolutely needed, call WaitUntilInitialized() before this method.
-  static ThreadTicks Now();
-
-#if defined(OS_WIN)
-  // Similar to Now() above except this returns thread-specific CPU time for an
-  // arbitrary thread. All comments for Now() method above apply apply to this
-  // method as well.
-  static ThreadTicks GetForThread(const PlatformThreadHandle& thread_handle);
-#endif
-
-  // Converts an integer value representing ThreadTicks to a class. This may be
-  // used when deserializing a |ThreadTicks| structure, using a value known to
-  // be compatible. It is not provided as a constructor because the integer type
-  // may be unclear from the perspective of a caller.
-  //
-  // DEPRECATED - Do not use in new code. For deserializing ThreadTicks values,
-  // prefer ThreadTicks + TimeDelta(). http://crbug.com/634507
-  static constexpr ThreadTicks FromInternalValue(int64_t us) {
-    return ThreadTicks(us);
-  }
-
- private:
-  friend class time_internal::TimeBase<ThreadTicks>;
-
-  // Please use Now() or GetForThread() to create a new object. This is for
-  // internal use and testing.
-  constexpr explicit ThreadTicks(int64_t us) : TimeBase(us) {}
-
-#if defined(OS_WIN)
-  FRIEND_TEST_ALL_PREFIXES(TimeTicks, TSCTicksPerSecond);
-
-  // Returns the frequency of the TSC in ticks per second, or 0 if it hasn't
-  // been measured yet. Needs to be guarded with a call to IsSupported().
-  // This method is declared here rather than in the anonymous namespace to
-  // allow testing.
-  static double TSCTicksPerSecond();
-
-  static void WaitUntilInitializedWin();
-#endif
-};
-
-// For logging use only.
-std::ostream& operator<<(std::ostream& os, ThreadTicks time_ticks);
-
-}  // namespace base
-
-#endif  // BASE_TIME_TIME_H_
diff --git a/base/time/time_conversion_posix.cc b/base/time/time_conversion_posix.cc
deleted file mode 100644
index ba0a2b2..0000000
--- a/base/time/time_conversion_posix.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2012 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/time/time.h"
-
-#include <stdint.h>
-#include <sys/time.h>
-#include <time.h>
-
-#include <limits>
-
-#include "base/logging.h"
-
-namespace base {
-
-// static
-TimeDelta TimeDelta::FromTimeSpec(const timespec& ts) {
-  return TimeDelta(ts.tv_sec * Time::kMicrosecondsPerSecond +
-                   ts.tv_nsec / Time::kNanosecondsPerMicrosecond);
-}
-
-struct timespec TimeDelta::ToTimeSpec() const {
-  int64_t microseconds = InMicroseconds();
-  time_t seconds = 0;
-  if (microseconds >= Time::kMicrosecondsPerSecond) {
-    seconds = InSeconds();
-    microseconds -= seconds * Time::kMicrosecondsPerSecond;
-  }
-  struct timespec result = {
-      seconds,
-      static_cast<long>(microseconds * Time::kNanosecondsPerMicrosecond)};
-  return result;
-}
-
-// static
-Time Time::FromTimeVal(struct timeval t) {
-  DCHECK_LT(t.tv_usec, static_cast<int>(Time::kMicrosecondsPerSecond));
-  DCHECK_GE(t.tv_usec, 0);
-  if (t.tv_usec == 0 && t.tv_sec == 0)
-    return Time();
-  if (t.tv_usec == static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1 &&
-      t.tv_sec == std::numeric_limits<time_t>::max())
-    return Max();
-  return Time((static_cast<int64_t>(t.tv_sec) * Time::kMicrosecondsPerSecond) +
-              t.tv_usec + kTimeTToMicrosecondsOffset);
-}
-
-struct timeval Time::ToTimeVal() const {
-  struct timeval result;
-  if (is_null()) {
-    result.tv_sec = 0;
-    result.tv_usec = 0;
-    return result;
-  }
-  if (is_max()) {
-    result.tv_sec = std::numeric_limits<time_t>::max();
-    result.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1;
-    return result;
-  }
-  int64_t us = us_ - kTimeTToMicrosecondsOffset;
-  result.tv_sec = us / Time::kMicrosecondsPerSecond;
-  result.tv_usec = us % Time::kMicrosecondsPerSecond;
-  return result;
-}
-
-}  // namespace base
diff --git a/base/time/time_mac.cc b/base/time/time_mac.cc
deleted file mode 100644
index 2d024e9..0000000
--- a/base/time/time_mac.cc
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright (c) 2012 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/time/time.h"
-
-#include <CoreFoundation/CFDate.h>
-#include <CoreFoundation/CFTimeZone.h>
-#include <mach/mach.h>
-#include <mach/mach_time.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/sysctl.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <time.h>
-
-#include "base/logging.h"
-#include "base/mac/mach_logging.h"
-#include "base/mac/scoped_cftyperef.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/macros.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/time/time_override.h"
-#include "util/build_config.h"
-
-#if defined(OS_IOS)
-#include <time.h>
-#include "base/ios/ios_util.h"
-#endif
-
-namespace {
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-int64_t MachAbsoluteTimeToTicks(uint64_t mach_absolute_time) {
-  static mach_timebase_info_data_t timebase_info;
-  if (timebase_info.denom == 0) {
-    // Zero-initialization of statics guarantees that denom will be 0 before
-    // calling mach_timebase_info.  mach_timebase_info will never set denom to
-    // 0 as that would be invalid, so the zero-check can be used to determine
-    // whether mach_timebase_info has already been called.  This is
-    // recommended by Apple's QA1398.
-    kern_return_t kr = mach_timebase_info(&timebase_info);
-    MACH_DCHECK(kr == KERN_SUCCESS, kr) << "mach_timebase_info";
-  }
-
-  // timebase_info converts absolute time tick units into nanoseconds.  Convert
-  // to microseconds up front to stave off overflows.
-  base::CheckedNumeric<uint64_t> result(mach_absolute_time /
-                                        base::Time::kNanosecondsPerMicrosecond);
-  result *= timebase_info.numer;
-  result /= timebase_info.denom;
-
-  // Don't bother with the rollover handling that the Windows version does.
-  // With numer and denom = 1 (the expected case), the 64-bit absolute time
-  // reported in nanoseconds is enough to last nearly 585 years.
-  return base::checked_cast<int64_t>(result.ValueOrDie());
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-// Returns monotonically growing number of ticks in microseconds since some
-// unspecified starting point.
-int64_t ComputeCurrentTicks() {
-#if defined(OS_IOS)
-  // iOS 10 supports clock_gettime(CLOCK_MONOTONIC, ...), which is
-  // around 15 times faster than sysctl() call. Use it if possible;
-  // otherwise, fall back to sysctl().
-  if (__builtin_available(iOS 10, *)) {
-    struct timespec tp;
-    if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0) {
-      return (int64_t)tp.tv_sec * 1000000 + tp.tv_nsec / 1000;
-    }
-  }
-
-  // On iOS mach_absolute_time stops while the device is sleeping. Instead use
-  // now - KERN_BOOTTIME to get a time difference that is not impacted by clock
-  // changes. KERN_BOOTTIME will be updated by the system whenever the system
-  // clock change.
-  struct timeval boottime;
-  int mib[2] = {CTL_KERN, KERN_BOOTTIME};
-  size_t size = sizeof(boottime);
-  int kr = sysctl(mib, arraysize(mib), &boottime, &size, nullptr, 0);
-  DCHECK_EQ(KERN_SUCCESS, kr);
-  base::TimeDelta time_difference =
-      base::subtle::TimeNowIgnoringOverride() -
-      (base::Time::FromTimeT(boottime.tv_sec) +
-       base::TimeDelta::FromMicroseconds(boottime.tv_usec));
-  return time_difference.InMicroseconds();
-#else
-  // mach_absolute_time is it when it comes to ticks on the Mac.  Other calls
-  // with less precision (such as TickCount) just call through to
-  // mach_absolute_time.
-  return MachAbsoluteTimeToTicks(mach_absolute_time());
-#endif  // defined(OS_IOS)
-}
-
-int64_t ComputeThreadTicks() {
-#if defined(OS_IOS)
-  NOTREACHED();
-  return 0;
-#else
-  base::mac::ScopedMachSendRight thread(mach_thread_self());
-  mach_msg_type_number_t thread_info_count = THREAD_BASIC_INFO_COUNT;
-  thread_basic_info_data_t thread_info_data;
-
-  if (thread.get() == MACH_PORT_NULL) {
-    DLOG(ERROR) << "Failed to get mach_thread_self()";
-    return 0;
-  }
-
-  kern_return_t kr = thread_info(
-      thread.get(), THREAD_BASIC_INFO,
-      reinterpret_cast<thread_info_t>(&thread_info_data), &thread_info_count);
-  MACH_DCHECK(kr == KERN_SUCCESS, kr) << "thread_info";
-
-  base::CheckedNumeric<int64_t> absolute_micros(
-      thread_info_data.user_time.seconds +
-      thread_info_data.system_time.seconds);
-  absolute_micros *= base::Time::kMicrosecondsPerSecond;
-  absolute_micros += (thread_info_data.user_time.microseconds +
-                      thread_info_data.system_time.microseconds);
-  return absolute_micros.ValueOrDie();
-#endif  // defined(OS_IOS)
-}
-
-}  // namespace
-
-namespace base {
-
-// The Time routines in this file use Mach and CoreFoundation APIs, since the
-// POSIX definition of time_t in Mac OS X wraps around after 2038--and
-// there are already cookie expiration dates, etc., past that time out in
-// the field.  Using CFDate prevents that problem, and using mach_absolute_time
-// for TimeTicks gives us nice high-resolution interval timing.
-
-// Time -----------------------------------------------------------------------
-
-namespace subtle {
-Time TimeNowIgnoringOverride() {
-  return Time::FromCFAbsoluteTime(CFAbsoluteTimeGetCurrent());
-}
-
-Time TimeNowFromSystemTimeIgnoringOverride() {
-  // Just use TimeNowIgnoringOverride() because it returns the system time.
-  return TimeNowIgnoringOverride();
-}
-}  // namespace subtle
-
-// static
-Time Time::FromCFAbsoluteTime(CFAbsoluteTime t) {
-  static_assert(std::numeric_limits<CFAbsoluteTime>::has_infinity,
-                "CFAbsoluteTime must have an infinity value");
-  if (t == 0)
-    return Time();  // Consider 0 as a null Time.
-  if (t == std::numeric_limits<CFAbsoluteTime>::infinity())
-    return Max();
-  return Time(static_cast<int64_t>((t + kCFAbsoluteTimeIntervalSince1970) *
-                                   kMicrosecondsPerSecond) +
-              kTimeTToMicrosecondsOffset);
-}
-
-CFAbsoluteTime Time::ToCFAbsoluteTime() const {
-  static_assert(std::numeric_limits<CFAbsoluteTime>::has_infinity,
-                "CFAbsoluteTime must have an infinity value");
-  if (is_null())
-    return 0;  // Consider 0 as a null Time.
-  if (is_max())
-    return std::numeric_limits<CFAbsoluteTime>::infinity();
-  return (static_cast<CFAbsoluteTime>(us_ - kTimeTToMicrosecondsOffset) /
-          kMicrosecondsPerSecond) -
-         kCFAbsoluteTimeIntervalSince1970;
-}
-
-// Note: These implementations of Time::FromExploded() and Time::Explode() are
-// only used on iOS now. Since Mac is now always 64-bit, we can use the POSIX
-// versions of these functions as time_t is not capped at year 2038 on 64-bit
-// builds. The POSIX functions are preferred since they don't suffer from some
-// performance problems that are present in these implementations.
-// See crbug.com/781601 for more details.
-#if defined(OS_IOS)
-// static
-bool Time::FromExploded(bool is_local, const Exploded& exploded, Time* time) {
-  base::ScopedCFTypeRef<CFTimeZoneRef> time_zone(
-      is_local
-          ? CFTimeZoneCopySystem()
-          : CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorDefault, 0));
-  base::ScopedCFTypeRef<CFCalendarRef> gregorian(CFCalendarCreateWithIdentifier(
-      kCFAllocatorDefault, kCFGregorianCalendar));
-  CFCalendarSetTimeZone(gregorian, time_zone);
-  CFAbsoluteTime absolute_time;
-  // 'S' is not defined in componentDesc in Apple documentation, but can be
-  // found at http://www.opensource.apple.com/source/CF/CF-855.17/CFCalendar.c
-  CFCalendarComposeAbsoluteTime(
-      gregorian, &absolute_time, "yMdHmsS", exploded.year, exploded.month,
-      exploded.day_of_month, exploded.hour, exploded.minute, exploded.second,
-      exploded.millisecond);
-  CFAbsoluteTime seconds = absolute_time + kCFAbsoluteTimeIntervalSince1970;
-
-  // CFAbsolutTime is typedef of double. Convert seconds to
-  // microseconds and then cast to int64. If
-  // it cannot be suited to int64, then fail to avoid overflows.
-  double microseconds =
-      (seconds * kMicrosecondsPerSecond) + kTimeTToMicrosecondsOffset;
-  if (microseconds > std::numeric_limits<int64_t>::max() ||
-      microseconds < std::numeric_limits<int64_t>::min()) {
-    *time = Time(0);
-    return false;
-  }
-
-  base::Time converted_time = Time(static_cast<int64_t>(microseconds));
-
-  // If |exploded.day_of_month| is set to 31
-  // on a 28-30 day month, it will return the first day of the next month.
-  // Thus round-trip the time and compare the initial |exploded| with
-  // |utc_to_exploded| time.
-  base::Time::Exploded to_exploded;
-  if (!is_local)
-    converted_time.UTCExplode(&to_exploded);
-  else
-    converted_time.LocalExplode(&to_exploded);
-
-  if (ExplodedMostlyEquals(to_exploded, exploded)) {
-    *time = converted_time;
-    return true;
-  }
-
-  *time = Time(0);
-  return false;
-}
-
-void Time::Explode(bool is_local, Exploded* exploded) const {
-  // Avoid rounding issues, by only putting the integral number of seconds
-  // (rounded towards -infinity) into a |CFAbsoluteTime| (which is a |double|).
-  int64_t microsecond = us_ % kMicrosecondsPerSecond;
-  if (microsecond < 0)
-    microsecond += kMicrosecondsPerSecond;
-  CFAbsoluteTime seconds = ((us_ - microsecond - kTimeTToMicrosecondsOffset) /
-                            kMicrosecondsPerSecond) -
-                           kCFAbsoluteTimeIntervalSince1970;
-
-  base::ScopedCFTypeRef<CFTimeZoneRef> time_zone(
-      is_local
-          ? CFTimeZoneCopySystem()
-          : CFTimeZoneCreateWithTimeIntervalFromGMT(kCFAllocatorDefault, 0));
-  base::ScopedCFTypeRef<CFCalendarRef> gregorian(CFCalendarCreateWithIdentifier(
-      kCFAllocatorDefault, kCFGregorianCalendar));
-  CFCalendarSetTimeZone(gregorian, time_zone);
-  int second, day_of_week;
-  // 'E' sets the day of week, but is not defined in componentDesc in Apple
-  // documentation. It can be found in open source code here:
-  // http://www.opensource.apple.com/source/CF/CF-855.17/CFCalendar.c
-  CFCalendarDecomposeAbsoluteTime(gregorian, seconds, "yMdHmsE",
-                                  &exploded->year, &exploded->month,
-                                  &exploded->day_of_month, &exploded->hour,
-                                  &exploded->minute, &second, &day_of_week);
-  // Make sure seconds are rounded down towards -infinity.
-  exploded->second = floor(second);
-  // |Exploded|'s convention for day of week is 0 = Sunday, i.e. different
-  // from CF's 1 = Sunday.
-  exploded->day_of_week = (day_of_week - 1) % 7;
-  // Calculate milliseconds ourselves, since we rounded the |seconds|, making
-  // sure to round towards -infinity.
-  exploded->millisecond =
-      (microsecond >= 0) ? microsecond / kMicrosecondsPerMillisecond
-                         : (microsecond - kMicrosecondsPerMillisecond + 1) /
-                               kMicrosecondsPerMillisecond;
-}
-#endif  // OS_IOS
-
-// TimeTicks ------------------------------------------------------------------
-
-namespace subtle {
-TimeTicks TimeTicksNowIgnoringOverride() {
-  return TimeTicks() + TimeDelta::FromMicroseconds(ComputeCurrentTicks());
-}
-}  // namespace subtle
-
-// static
-bool TimeTicks::IsHighResolution() {
-  return true;
-}
-
-// static
-bool TimeTicks::IsConsistentAcrossProcesses() {
-  return true;
-}
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// static
-TimeTicks TimeTicks::FromMachAbsoluteTime(uint64_t mach_absolute_time) {
-  return TimeTicks(MachAbsoluteTimeToTicks(mach_absolute_time));
-}
-#endif  // defined(OS_MACOSX) && !defined(OS_IOS)
-
-// static
-TimeTicks::Clock TimeTicks::GetClock() {
-#if defined(OS_IOS)
-  return Clock::IOS_CF_ABSOLUTE_TIME_MINUS_KERN_BOOTTIME;
-#else
-  return Clock::MAC_MACH_ABSOLUTE_TIME;
-#endif  // defined(OS_IOS)
-}
-
-// ThreadTicks ----------------------------------------------------------------
-
-namespace subtle {
-ThreadTicks ThreadTicksNowIgnoringOverride() {
-  return ThreadTicks() + TimeDelta::FromMicroseconds(ComputeThreadTicks());
-}
-}  // namespace subtle
-
-}  // namespace base
diff --git a/base/time/time_now_posix.cc b/base/time/time_now_posix.cc
deleted file mode 100644
index a3f4602..0000000
--- a/base/time/time_now_posix.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright (c) 2012 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/time/time.h"
-
-#include <stdint.h>
-#include <sys/time.h>
-#include <time.h>
-#if defined(OS_ANDROID) && !defined(__LP64__)
-#include <time64.h>
-#endif
-#include <unistd.h>
-
-#include "base/logging.h"
-#include "base/numerics/safe_math.h"
-#include "base/time/time_override.h"
-#include "util/build_config.h"
-
-// Ensure the Fuchsia and Mac builds do not include this module. Instead,
-// non-POSIX implementation is used for sampling the system clocks.
-#if defined(OS_FUCHSIA) || defined(OS_MACOSX)
-#error "This implementation is for POSIX platforms other than Fuchsia or Mac."
-#endif
-
-namespace {
-
-int64_t ConvertTimespecToMicros(const struct timespec& ts) {
-  // On 32-bit systems, the calculation cannot overflow int64_t.
-  // 2**32 * 1000000 + 2**64 / 1000 < 2**63
-  if (sizeof(ts.tv_sec) <= 4 && sizeof(ts.tv_nsec) <= 8) {
-    int64_t result = ts.tv_sec;
-    result *= base::Time::kMicrosecondsPerSecond;
-    result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
-    return result;
-  } else {
-    base::CheckedNumeric<int64_t> result(ts.tv_sec);
-    result *= base::Time::kMicrosecondsPerSecond;
-    result += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond);
-    return result.ValueOrDie();
-  }
-}
-
-// Helper function to get results from clock_gettime() and convert to a
-// microsecond timebase. Minimum requirement is MONOTONIC_CLOCK to be supported
-// on the system. FreeBSD 6 has CLOCK_MONOTONIC but defines
-// _POSIX_MONOTONIC_CLOCK to -1.
-#if (defined(OS_POSIX) && defined(_POSIX_MONOTONIC_CLOCK) && \
-     _POSIX_MONOTONIC_CLOCK >= 0) ||                         \
-    defined(OS_BSD) || defined(OS_ANDROID)
-int64_t ClockNow(clockid_t clk_id) {
-  struct timespec ts;
-  CHECK(clock_gettime(clk_id, &ts) == 0);
-  return ConvertTimespecToMicros(ts);
-}
-#else  // _POSIX_MONOTONIC_CLOCK
-#error No usable tick clock function on this platform.
-#endif  // _POSIX_MONOTONIC_CLOCK
-
-}  // namespace
-
-namespace base {
-
-// Time -----------------------------------------------------------------------
-
-namespace subtle {
-Time TimeNowIgnoringOverride() {
-  struct timeval tv;
-  struct timezone tz = {0, 0};  // UTC
-  CHECK(gettimeofday(&tv, &tz) == 0);
-  // Combine seconds and microseconds in a 64-bit field containing microseconds
-  // since the epoch.  That's enough for nearly 600 centuries.  Adjust from
-  // Unix (1970) to Windows (1601) epoch.
-  return Time() + TimeDelta::FromMicroseconds(
-                      (tv.tv_sec * Time::kMicrosecondsPerSecond + tv.tv_usec) +
-                      Time::kTimeTToMicrosecondsOffset);
-}
-
-Time TimeNowFromSystemTimeIgnoringOverride() {
-  // Just use TimeNowIgnoringOverride() because it returns the system time.
-  return TimeNowIgnoringOverride();
-}
-}  // namespace subtle
-
-// TimeTicks ------------------------------------------------------------------
-
-namespace subtle {
-TimeTicks TimeTicksNowIgnoringOverride() {
-  return TimeTicks() + TimeDelta::FromMicroseconds(ClockNow(CLOCK_MONOTONIC));
-}
-}  // namespace subtle
-
-// static
-TimeTicks::Clock TimeTicks::GetClock() {
-  return Clock::LINUX_CLOCK_MONOTONIC;
-}
-
-// static
-bool TimeTicks::IsHighResolution() {
-  return true;
-}
-
-// static
-bool TimeTicks::IsConsistentAcrossProcesses() {
-  return true;
-}
-
-// ThreadTicks ----------------------------------------------------------------
-
-namespace subtle {
-ThreadTicks ThreadTicksNowIgnoringOverride() {
-#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \
-    defined(OS_ANDROID)
-  return ThreadTicks() +
-         TimeDelta::FromMicroseconds(ClockNow(CLOCK_THREAD_CPUTIME_ID));
-#else
-  NOTREACHED();
-  return ThreadTicks();
-#endif
-}
-}  // namespace subtle
-
-}  // namespace base
diff --git a/base/time/time_override.cc b/base/time/time_override.cc
deleted file mode 100644
index 09692b5..0000000
--- a/base/time/time_override.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 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/time/time_override.h"
-
-namespace base {
-namespace subtle {
-
-#if DCHECK_IS_ON()
-// static
-bool ScopedTimeClockOverrides::overrides_active_ = false;
-#endif
-
-ScopedTimeClockOverrides::ScopedTimeClockOverrides(
-    TimeNowFunction time_override,
-    TimeTicksNowFunction time_ticks_override,
-    ThreadTicksNowFunction thread_ticks_override) {
-#if DCHECK_IS_ON()
-  DCHECK(!overrides_active_);
-  overrides_active_ = true;
-#endif
-  if (time_override) {
-    internal::g_time_now_function = time_override;
-    internal::g_time_now_from_system_time_function = time_override;
-  }
-  if (time_ticks_override)
-    internal::g_time_ticks_now_function = time_ticks_override;
-  if (thread_ticks_override)
-    internal::g_thread_ticks_now_function = thread_ticks_override;
-}
-
-ScopedTimeClockOverrides::~ScopedTimeClockOverrides() {
-  internal::g_time_now_function = &TimeNowIgnoringOverride;
-  internal::g_time_now_from_system_time_function =
-      &TimeNowFromSystemTimeIgnoringOverride;
-  internal::g_time_ticks_now_function = &TimeTicksNowIgnoringOverride;
-  internal::g_thread_ticks_now_function = &ThreadTicksNowIgnoringOverride;
-#if DCHECK_IS_ON()
-  overrides_active_ = false;
-#endif
-}
-
-}  // namespace subtle
-}  // namespace base
diff --git a/base/time/time_override.h b/base/time/time_override.h
deleted file mode 100644
index 4e068f7..0000000
--- a/base/time/time_override.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2018 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_TIME_TIME_OVERRIDE_H_
-#define BASE_TIME_TIME_OVERRIDE_H_
-
-#include "base/time/time.h"
-
-namespace base {
-
-using TimeNowFunction = decltype(&Time::Now);
-using TimeTicksNowFunction = decltype(&TimeTicks::Now);
-using ThreadTicksNowFunction = decltype(&ThreadTicks::Now);
-
-// Time overrides should be used with extreme caution. Discuss with //base/time
-// OWNERS before adding a new one.
-namespace subtle {
-
-// Override the return value of Time::Now and Time::NowFromSystemTime /
-// TimeTicks::Now / ThreadTicks::Now to emulate time, e.g. for tests or to
-// modify progression of time. Note that the override should be set while
-// single-threaded and before the first call to Now() to avoid threading issues
-// and inconsistencies in returned values. Nested overrides are not allowed.
-class ScopedTimeClockOverrides {
- public:
-  // Pass |nullptr| for any override if it shouldn't be overriden.
-  ScopedTimeClockOverrides(TimeNowFunction time_override,
-                           TimeTicksNowFunction time_ticks_override,
-                           ThreadTicksNowFunction thread_ticks_override);
-
-  // Restores the platform default Now() functions.
-  ~ScopedTimeClockOverrides();
-
- private:
-#if DCHECK_IS_ON()
-  static bool overrides_active_;
-#endif
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedTimeClockOverrides);
-};
-
-// These methods return the platform default Time::Now / TimeTicks::Now /
-// ThreadTicks::Now values even while an override is in place. These methods
-// should only be used in places where emulated time should be disregarded. For
-// example, they can be used to implement test timeouts for tests that may
-// override time.
-Time TimeNowIgnoringOverride();
-Time TimeNowFromSystemTimeIgnoringOverride();
-TimeTicks TimeTicksNowIgnoringOverride();
-ThreadTicks ThreadTicksNowIgnoringOverride();
-
-}  // namespace subtle
-
-namespace internal {
-
-// These function pointers are used by platform-independent implementations of
-// the Now() methods and ScopedTimeClockOverrides. They are set to point to the
-// respective NowIgnoringOverride functions by default, but can also be set by
-// platform-specific code to select a default implementation at runtime, thereby
-// avoiding the indirection via the NowIgnoringOverride functions. Note that the
-// pointers can be overridden and later reset to the NowIgnoringOverride
-// functions by ScopedTimeClockOverrides.
-extern TimeNowFunction g_time_now_function;
-extern TimeNowFunction g_time_now_from_system_time_function;
-extern TimeTicksNowFunction g_time_ticks_now_function;
-extern ThreadTicksNowFunction g_thread_ticks_now_function;
-
-}  // namespace internal
-
-}  // namespace base
-
-#endif  // BASE_TIME_TIME_OVERRIDE_H_
diff --git a/base/time/time_win.cc b/base/time/time_win.cc
deleted file mode 100644
index 8632369..0000000
--- a/base/time/time_win.cc
+++ /dev/null
@@ -1,542 +0,0 @@
-// Copyright (c) 2012 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.
-
-// Windows Timer Primer
-//
-// A good article:  http://www.ddj.com/windows/184416651
-// A good mozilla bug:  http://bugzilla.mozilla.org/show_bug.cgi?id=363258
-//
-// The default windows timer, GetSystemTimeAsFileTime is not very precise.
-// It is only good to ~15.5ms.
-//
-// QueryPerformanceCounter is the logical choice for a high-precision timer.
-// However, it is known to be buggy on some hardware.  Specifically, it can
-// sometimes "jump".  On laptops, QPC can also be very expensive to call.
-// It's 3-4x slower than timeGetTime() on desktops, but can be 10x slower
-// on laptops.  A unittest exists which will show the relative cost of various
-// timers on any system.
-//
-// The next logical choice is timeGetTime().  timeGetTime has a precision of
-// 1ms, but only if you call APIs (timeBeginPeriod()) which affect all other
-// applications on the system.  By default, precision is only 15.5ms.
-// Unfortunately, we don't want to call timeBeginPeriod because we don't
-// want to affect other applications.  Further, on mobile platforms, use of
-// faster multimedia timers can hurt battery life.  See the intel
-// article about this here:
-// http://softwarecommunity.intel.com/articles/eng/1086.htm
-//
-// To work around all this, we're going to generally use timeGetTime().  We
-// will only increase the system-wide timer if we're not running on battery
-// power.
-
-#include "base/time/time.h"
-
-#include <windows.h>
-
-#include <mmsystem.h>
-#include <stdint.h>
-
-#include <mutex>
-
-#include "base/bit_cast.h"
-#include "base/logging.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time_override.h"
-
-namespace base {
-
-namespace {
-
-// From MSDN, FILETIME "Contains a 64-bit value representing the number of
-// 100-nanosecond intervals since January 1, 1601 (UTC)."
-int64_t FileTimeToMicroseconds(const FILETIME& ft) {
-  // Need to bit_cast to fix alignment, then divide by 10 to convert
-  // 100-nanoseconds to microseconds. This only works on little-endian
-  // machines.
-  return bit_cast<int64_t, FILETIME>(ft) / 10;
-}
-
-void MicrosecondsToFileTime(int64_t us, FILETIME* ft) {
-  DCHECK_GE(us, 0LL) << "Time is less than 0, negative values are not "
-                        "representable in FILETIME";
-
-  // Multiply by 10 to convert microseconds to 100-nanoseconds. Bit_cast will
-  // handle alignment problems. This only works on little-endian machines.
-  *ft = bit_cast<FILETIME, int64_t>(us * 10);
-}
-
-int64_t CurrentWallclockMicroseconds() {
-  FILETIME ft;
-  ::GetSystemTimeAsFileTime(&ft);
-  return FileTimeToMicroseconds(ft);
-}
-
-// Time between resampling the un-granular clock for this API.
-constexpr TimeDelta kMaxTimeToAvoidDrift = TimeDelta::FromSeconds(60);
-
-int64_t g_initial_time = 0;
-TimeTicks g_initial_ticks;
-
-void InitializeClock() {
-  g_initial_ticks = subtle::TimeTicksNowIgnoringOverride();
-  g_initial_time = CurrentWallclockMicroseconds();
-}
-
-// The two values that ActivateHighResolutionTimer uses to set the systemwide
-// timer interrupt frequency on Windows. It controls how precise timers are
-// but also has a big impact on battery life.
-const int kMinTimerIntervalHighResMs = 1;
-const int kMinTimerIntervalLowResMs = 4;
-// Track if kMinTimerIntervalHighResMs or kMinTimerIntervalLowResMs is active.
-bool g_high_res_timer_enabled = false;
-// How many times the high resolution timer has been called.
-uint32_t g_high_res_timer_count = 0;
-// Start time of the high resolution timer usage monitoring. This is needed
-// to calculate the usage as percentage of the total elapsed time.
-TimeTicks g_high_res_timer_usage_start;
-// The cumulative time the high resolution timer has been in use since
-// |g_high_res_timer_usage_start| moment.
-TimeDelta g_high_res_timer_usage;
-// Timestamp of the last activation change of the high resolution timer. This
-// is used to calculate the cumulative usage.
-TimeTicks g_high_res_timer_last_activation;
-// The lock to control access to the above two variables.
-std::mutex* GetHighResLock() {
-  static auto* lock = new std::mutex();
-  return lock;
-}
-
-// Returns the current value of the performance counter.
-uint64_t QPCNowRaw() {
-  LARGE_INTEGER perf_counter_now = {};
-  // According to the MSDN documentation for QueryPerformanceCounter(), this
-  // will never fail on systems that run XP or later.
-  // https://msdn.microsoft.com/library/windows/desktop/ms644904.aspx
-  ::QueryPerformanceCounter(&perf_counter_now);
-  return perf_counter_now.QuadPart;
-}
-
-bool SafeConvertToWord(int in, WORD* out) {
-  CheckedNumeric<WORD> result = in;
-  *out = result.ValueOrDefault(std::numeric_limits<WORD>::max());
-  return result.IsValid();
-}
-
-}  // namespace
-
-// Time -----------------------------------------------------------------------
-
-namespace subtle {
-Time TimeNowIgnoringOverride() {
-  if (g_initial_time == 0)
-    InitializeClock();
-
-  // We implement time using the high-resolution timers so that we can get
-  // timeouts which are smaller than 10-15ms.  If we just used
-  // CurrentWallclockMicroseconds(), we'd have the less-granular timer.
-  //
-  // To make this work, we initialize the clock (g_initial_time) and the
-  // counter (initial_ctr).  To compute the initial time, we can check
-  // the number of ticks that have elapsed, and compute the delta.
-  //
-  // To avoid any drift, we periodically resync the counters to the system
-  // clock.
-  while (true) {
-    TimeTicks ticks = TimeTicksNowIgnoringOverride();
-
-    // Calculate the time elapsed since we started our timer
-    TimeDelta elapsed = ticks - g_initial_ticks;
-
-    // Check if enough time has elapsed that we need to resync the clock.
-    if (elapsed > kMaxTimeToAvoidDrift) {
-      InitializeClock();
-      continue;
-    }
-
-    return Time() + elapsed + TimeDelta::FromMicroseconds(g_initial_time);
-  }
-}
-
-Time TimeNowFromSystemTimeIgnoringOverride() {
-  // Force resync.
-  InitializeClock();
-  return Time() + TimeDelta::FromMicroseconds(g_initial_time);
-}
-}  // namespace subtle
-
-// static
-Time Time::FromFileTime(FILETIME ft) {
-  if (bit_cast<int64_t, FILETIME>(ft) == 0)
-    return Time();
-  if (ft.dwHighDateTime == std::numeric_limits<DWORD>::max() &&
-      ft.dwLowDateTime == std::numeric_limits<DWORD>::max())
-    return Max();
-  return Time(FileTimeToMicroseconds(ft));
-}
-
-FILETIME Time::ToFileTime() const {
-  if (is_null())
-    return bit_cast<FILETIME, int64_t>(0);
-  if (is_max()) {
-    FILETIME result;
-    result.dwHighDateTime = std::numeric_limits<DWORD>::max();
-    result.dwLowDateTime = std::numeric_limits<DWORD>::max();
-    return result;
-  }
-  FILETIME utc_ft;
-  MicrosecondsToFileTime(us_, &utc_ft);
-  return utc_ft;
-}
-
-// static
-void Time::EnableHighResolutionTimer(bool enable) {
-  std::lock_guard<std::mutex> lock(*GetHighResLock());
-  if (g_high_res_timer_enabled == enable)
-    return;
-  g_high_res_timer_enabled = enable;
-  if (!g_high_res_timer_count)
-    return;
-  // Since g_high_res_timer_count != 0, an ActivateHighResolutionTimer(true)
-  // was called which called timeBeginPeriod with g_high_res_timer_enabled
-  // with a value which is the opposite of |enable|. With that information we
-  // call timeEndPeriod with the same value used in timeBeginPeriod and
-  // therefore undo the period effect.
-  if (enable) {
-    timeEndPeriod(kMinTimerIntervalLowResMs);
-    timeBeginPeriod(kMinTimerIntervalHighResMs);
-  } else {
-    timeEndPeriod(kMinTimerIntervalHighResMs);
-    timeBeginPeriod(kMinTimerIntervalLowResMs);
-  }
-}
-
-// static
-bool Time::ActivateHighResolutionTimer(bool activating) {
-  // We only do work on the transition from zero to one or one to zero so we
-  // can easily undo the effect (if necessary) when EnableHighResolutionTimer is
-  // called.
-  const uint32_t max = std::numeric_limits<uint32_t>::max();
-
-  std::lock_guard<std::mutex> lock(*GetHighResLock());
-  UINT period = g_high_res_timer_enabled ? kMinTimerIntervalHighResMs
-                                         : kMinTimerIntervalLowResMs;
-  if (activating) {
-    DCHECK_NE(g_high_res_timer_count, max);
-    ++g_high_res_timer_count;
-    if (g_high_res_timer_count == 1) {
-      g_high_res_timer_last_activation = subtle::TimeTicksNowIgnoringOverride();
-      timeBeginPeriod(period);
-    }
-  } else {
-    DCHECK_NE(g_high_res_timer_count, 0u);
-    --g_high_res_timer_count;
-    if (g_high_res_timer_count == 0) {
-      g_high_res_timer_usage += subtle::TimeTicksNowIgnoringOverride() -
-                                g_high_res_timer_last_activation;
-      timeEndPeriod(period);
-    }
-  }
-  return (period == kMinTimerIntervalHighResMs);
-}
-
-// static
-bool Time::IsHighResolutionTimerInUse() {
-  std::lock_guard<std::mutex> lock(*GetHighResLock());
-  return g_high_res_timer_enabled && g_high_res_timer_count > 0;
-}
-
-// static
-void Time::ResetHighResolutionTimerUsage() {
-  std::lock_guard<std::mutex> lock(*GetHighResLock());
-  g_high_res_timer_usage = TimeDelta();
-  g_high_res_timer_usage_start = subtle::TimeTicksNowIgnoringOverride();
-  if (g_high_res_timer_count > 0)
-    g_high_res_timer_last_activation = g_high_res_timer_usage_start;
-}
-
-// static
-double Time::GetHighResolutionTimerUsage() {
-  std::lock_guard<std::mutex> lock(*GetHighResLock());
-  TimeTicks now = subtle::TimeTicksNowIgnoringOverride();
-  TimeDelta elapsed_time = now - g_high_res_timer_usage_start;
-  if (elapsed_time.is_zero()) {
-    // This is unexpected but possible if TimeTicks resolution is low and
-    // GetHighResolutionTimerUsage() is called promptly after
-    // ResetHighResolutionTimerUsage().
-    return 0.0;
-  }
-  TimeDelta used_time = g_high_res_timer_usage;
-  if (g_high_res_timer_count > 0) {
-    // If currently activated add the remainder of time since the last
-    // activation.
-    used_time += now - g_high_res_timer_last_activation;
-  }
-  return used_time.InMillisecondsF() / elapsed_time.InMillisecondsF() * 100;
-}
-
-// TimeTicks ------------------------------------------------------------------
-
-namespace {
-
-// Discussion of tick counter options on Windows:
-//
-// (1) CPU cycle counter. (Retrieved via RDTSC)
-// The CPU counter provides the highest resolution time stamp and is the least
-// expensive to retrieve. However, on older CPUs, two issues can affect its
-// reliability: First it is maintained per processor and not synchronized
-// between processors. Also, the counters will change frequency due to thermal
-// and power changes, and stop in some states.
-//
-// (2) QueryPerformanceCounter (QPC). The QPC counter provides a high-
-// resolution (<1 microsecond) time stamp. On most hardware running today, it
-// auto-detects and uses the constant-rate RDTSC counter to provide extremely
-// efficient and reliable time stamps.
-//
-// On older CPUs where RDTSC is unreliable, it falls back to using more
-// expensive (20X to 40X more costly) alternate clocks, such as HPET or the ACPI
-// PM timer, and can involve system calls; and all this is up to the HAL (with
-// some help from ACPI). According to
-// http://blogs.msdn.com/oldnewthing/archive/2005/09/02/459952.aspx, in the
-// worst case, it gets the counter from the rollover interrupt on the
-// programmable interrupt timer. In best cases, the HAL may conclude that the
-// RDTSC counter runs at a constant frequency, then it uses that instead. On
-// multiprocessor machines, it will try to verify the values returned from
-// RDTSC on each processor are consistent with each other, and apply a handful
-// of workarounds for known buggy hardware. In other words, QPC is supposed to
-// give consistent results on a multiprocessor computer, but for older CPUs it
-// can be unreliable due bugs in BIOS or HAL.
-//
-// (3) System time. The system time provides a low-resolution (from ~1 to ~15.6
-// milliseconds) time stamp but is comparatively less expensive to retrieve and
-// more reliable. Time::EnableHighResolutionTimer() and
-// Time::ActivateHighResolutionTimer() can be called to alter the resolution of
-// this timer; and also other Windows applications can alter it, affecting this
-// one.
-
-TimeTicks InitialNowFunction();
-
-// See "threading notes" in InitializeNowFunctionPointer() for details on how
-// concurrent reads/writes to these globals has been made safe.
-TimeTicksNowFunction g_time_ticks_now_ignoring_override_function =
-    &InitialNowFunction;
-int64_t g_qpc_ticks_per_second = 0;
-
-// As of January 2015, use of <atomic> is forbidden in Chromium code. This is
-// what std::atomic_thread_fence does on Windows on all Intel architectures when
-// the memory_order argument is anything but std::memory_order_seq_cst:
-#define ATOMIC_THREAD_FENCE(memory_order) _ReadWriteBarrier();
-
-TimeDelta QPCValueToTimeDelta(LONGLONG qpc_value) {
-  // Ensure that the assignment to |g_qpc_ticks_per_second|, made in
-  // InitializeNowFunctionPointer(), has happened by this point.
-  ATOMIC_THREAD_FENCE(memory_order_acquire);
-
-  DCHECK_GT(g_qpc_ticks_per_second, 0);
-
-  // If the QPC Value is below the overflow threshold, we proceed with
-  // simple multiply and divide.
-  if (qpc_value < Time::kQPCOverflowThreshold) {
-    return TimeDelta::FromMicroseconds(
-        qpc_value * Time::kMicrosecondsPerSecond / g_qpc_ticks_per_second);
-  }
-  // Otherwise, calculate microseconds in a round about manner to avoid
-  // overflow and precision issues.
-  int64_t whole_seconds = qpc_value / g_qpc_ticks_per_second;
-  int64_t leftover_ticks = qpc_value - (whole_seconds * g_qpc_ticks_per_second);
-  return TimeDelta::FromMicroseconds(
-      (whole_seconds * Time::kMicrosecondsPerSecond) +
-      ((leftover_ticks * Time::kMicrosecondsPerSecond) /
-       g_qpc_ticks_per_second));
-}
-
-TimeTicks QPCNow() {
-  return TimeTicks() + QPCValueToTimeDelta(QPCNowRaw());
-}
-
-void InitializeNowFunctionPointer() {
-  LARGE_INTEGER ticks_per_sec = {};
-  if (!QueryPerformanceFrequency(&ticks_per_sec))
-    ticks_per_sec.QuadPart = 0;
-
-  TimeTicksNowFunction now_function = &QPCNow;
-
-  // Threading note 1: In an unlikely race condition, it's possible for two or
-  // more threads to enter InitializeNowFunctionPointer() in parallel. This is
-  // not a problem since all threads should end up writing out the same values
-  // to the global variables.
-  //
-  // Threading note 2: A release fence is placed here to ensure, from the
-  // perspective of other threads using the function pointers, that the
-  // assignment to |g_qpc_ticks_per_second| happens before the function pointers
-  // are changed.
-  g_qpc_ticks_per_second = ticks_per_sec.QuadPart;
-  ATOMIC_THREAD_FENCE(memory_order_release);
-  // Also set g_time_ticks_now_function to avoid the additional indirection via
-  // TimeTicksNowIgnoringOverride() for future calls to TimeTicks::Now(). But
-  // g_time_ticks_now_function may have already be overridden.
-  if (internal::g_time_ticks_now_function ==
-      &subtle::TimeTicksNowIgnoringOverride) {
-    internal::g_time_ticks_now_function = now_function;
-  }
-  g_time_ticks_now_ignoring_override_function = now_function;
-}
-
-TimeTicks InitialNowFunction() {
-  InitializeNowFunctionPointer();
-  return g_time_ticks_now_ignoring_override_function();
-}
-
-}  // namespace
-
-namespace subtle {
-TimeTicks TimeTicksNowIgnoringOverride() {
-  return g_time_ticks_now_ignoring_override_function();
-}
-}  // namespace subtle
-
-// static
-bool TimeTicks::IsHighResolution() {
-  if (g_time_ticks_now_ignoring_override_function == &InitialNowFunction)
-    InitializeNowFunctionPointer();
-  return g_time_ticks_now_ignoring_override_function == &QPCNow;
-}
-
-// static
-bool TimeTicks::IsConsistentAcrossProcesses() {
-  // According to Windows documentation [1] QPC is consistent post-Windows
-  // Vista. So if we are using QPC then we are consistent which is the same as
-  // being high resolution.
-  //
-  // [1]
-  // https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx
-  //
-  // "In general, the performance counter results are consistent across all
-  // processors in multi-core and multi-processor systems, even when measured on
-  // different threads or processes. Here are some exceptions to this rule:
-  // - Pre-Windows Vista operating systems that run on certain processors might
-  // violate this consistency because of one of these reasons:
-  //     1. The hardware processors have a non-invariant TSC and the BIOS
-  //     doesn't indicate this condition correctly.
-  //     2. The TSC synchronization algorithm that was used wasn't suitable for
-  //     systems with large numbers of processors."
-  return IsHighResolution();
-}
-
-// static
-TimeTicks::Clock TimeTicks::GetClock() {
-  return IsHighResolution() ? Clock::WIN_QPC
-                            : Clock::WIN_ROLLOVER_PROTECTED_TIME_GET_TIME;
-}
-
-// ThreadTicks ----------------------------------------------------------------
-
-namespace subtle {
-ThreadTicks ThreadTicksNowIgnoringOverride() {
-  return ThreadTicks::GetForThread(PlatformThread::CurrentHandle());
-}
-}  // namespace subtle
-
-// static
-ThreadTicks ThreadTicks::GetForThread(
-    const PlatformThreadHandle& thread_handle) {
-  DCHECK(IsSupported());
-
-  // Get the number of TSC ticks used by the current thread.
-  ULONG64 thread_cycle_time = 0;
-  ::QueryThreadCycleTime(thread_handle.platform_handle(), &thread_cycle_time);
-
-  // Get the frequency of the TSC.
-  double tsc_ticks_per_second = TSCTicksPerSecond();
-  if (tsc_ticks_per_second == 0)
-    return ThreadTicks();
-
-  // Return the CPU time of the current thread.
-  double thread_time_seconds = thread_cycle_time / tsc_ticks_per_second;
-  return ThreadTicks(
-      static_cast<int64_t>(thread_time_seconds * Time::kMicrosecondsPerSecond));
-}
-
-// static
-void ThreadTicks::WaitUntilInitializedWin() {
-  while (TSCTicksPerSecond() == 0)
-    ::Sleep(10);
-}
-
-double ThreadTicks::TSCTicksPerSecond() {
-  DCHECK(IsSupported());
-
-  // The value returned by QueryPerformanceFrequency() cannot be used as the TSC
-  // frequency, because there is no guarantee that the TSC frequency is equal to
-  // the performance counter frequency.
-
-  // The TSC frequency is cached in a static variable because it takes some time
-  // to compute it.
-  static double tsc_ticks_per_second = 0;
-  if (tsc_ticks_per_second != 0)
-    return tsc_ticks_per_second;
-
-  // Increase the thread priority to reduces the chances of having a context
-  // switch during a reading of the TSC and the performance counter.
-  int previous_priority = ::GetThreadPriority(::GetCurrentThread());
-  ::SetThreadPriority(::GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
-
-  // The first time that this function is called, make an initial reading of the
-  // TSC and the performance counter.
-  static const uint64_t tsc_initial = __rdtsc();
-  static const uint64_t perf_counter_initial = QPCNowRaw();
-
-  // Make a another reading of the TSC and the performance counter every time
-  // that this function is called.
-  uint64_t tsc_now = __rdtsc();
-  uint64_t perf_counter_now = QPCNowRaw();
-
-  // Reset the thread priority.
-  ::SetThreadPriority(::GetCurrentThread(), previous_priority);
-
-  // Make sure that at least 50 ms elapsed between the 2 readings. The first
-  // time that this function is called, we don't expect this to be the case.
-  // Note: The longer the elapsed time between the 2 readings is, the more
-  //   accurate the computed TSC frequency will be. The 50 ms value was
-  //   chosen because local benchmarks show that it allows us to get a
-  //   stddev of less than 1 tick/us between multiple runs.
-  // Note: According to the MSDN documentation for QueryPerformanceFrequency(),
-  //   this will never fail on systems that run XP or later.
-  //   https://msdn.microsoft.com/library/windows/desktop/ms644905.aspx
-  LARGE_INTEGER perf_counter_frequency = {};
-  ::QueryPerformanceFrequency(&perf_counter_frequency);
-  DCHECK_GE(perf_counter_now, perf_counter_initial);
-  uint64_t perf_counter_ticks = perf_counter_now - perf_counter_initial;
-  double elapsed_time_seconds =
-      perf_counter_ticks / static_cast<double>(perf_counter_frequency.QuadPart);
-
-  static constexpr double kMinimumEvaluationPeriodSeconds = 0.05;
-  if (elapsed_time_seconds < kMinimumEvaluationPeriodSeconds)
-    return 0;
-
-  // Compute the frequency of the TSC.
-  DCHECK_GE(tsc_now, tsc_initial);
-  uint64_t tsc_ticks = tsc_now - tsc_initial;
-  tsc_ticks_per_second = tsc_ticks / elapsed_time_seconds;
-
-  return tsc_ticks_per_second;
-}
-
-// static
-TimeTicks TimeTicks::FromQPCValue(LONGLONG qpc_value) {
-  return TimeTicks() + QPCValueToTimeDelta(qpc_value);
-}
-
-// TimeDelta ------------------------------------------------------------------
-
-// static
-TimeDelta TimeDelta::FromQPCValue(LONGLONG qpc_value) {
-  return QPCValueToTimeDelta(qpc_value);
-}
-
-// static
-TimeDelta TimeDelta::FromFileTime(FILETIME ft) {
-  return TimeDelta::FromMicroseconds(FileTimeToMicroseconds(ft));
-}
-
-}  // namespace base
diff --git a/base/timer/elapsed_timer.cc b/base/timer/elapsed_timer.cc
index ca86ccd..68992f4 100644
--- a/base/timer/elapsed_timer.cc
+++ b/base/timer/elapsed_timer.cc
@@ -7,7 +7,7 @@
 namespace base {
 
 ElapsedTimer::ElapsedTimer() {
-  begin_ = TimeTicks::Now();
+  begin_ = TicksNow();
 }
 
 ElapsedTimer::ElapsedTimer(ElapsedTimer&& other) {
@@ -18,8 +18,8 @@
   begin_ = other.begin_;
 }
 
-TimeDelta ElapsedTimer::Elapsed() const {
-  return TimeTicks::Now() - begin_;
+TickDelta ElapsedTimer::Elapsed() const {
+  return TicksDelta(TicksNow(), begin_);
 }
 
 }  // namespace base
diff --git a/base/timer/elapsed_timer.h b/base/timer/elapsed_timer.h
index c9d254b..fbbc83d 100644
--- a/base/timer/elapsed_timer.h
+++ b/base/timer/elapsed_timer.h
@@ -6,11 +6,11 @@
 #define BASE_TIMER_ELAPSED_TIMER_H_
 
 #include "base/macros.h"
-#include "base/time/time.h"
+#include "util/ticks.h"
 
 namespace base {
 
-// A simple wrapper around TimeTicks::Now().
+// A simple wrapper around TicksNow().
 class ElapsedTimer {
  public:
   ElapsedTimer();
@@ -19,10 +19,10 @@
   void operator=(ElapsedTimer&& other);
 
   // Returns the time elapsed since object construction.
-  TimeDelta Elapsed() const;
+  TickDelta Elapsed() const;
 
  private:
-  TimeTicks begin_;
+  Ticks begin_;
 
   DISALLOW_COPY_AND_ASSIGN(ElapsedTimer);
 };
diff --git a/build/gen.py b/build/gen.py
index f253bc3..44435f6 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -254,8 +254,6 @@
         'base/strings/utf_string_conversion_utils.cc',
         'base/strings/utf_string_conversions.cc',
         'base/third_party/icu/icu_utf.cc',
-        'base/time/clock.cc',
-        'base/time/time.cc',
         'base/timer/elapsed_timer.cc',
         'base/value_iterators.cc',
         'base/values.cc',
@@ -385,6 +383,7 @@
         'util/msg_loop.cc',
         'util/semaphore.cc',
         'util/sys_info.cc',
+        'util/ticks.cc',
         'util/worker_pool.cc',
       ], 'tool': 'cxx', 'include_dirs': []},
   }
@@ -469,15 +468,11 @@
         'base/posix/file_descriptor_shuffle.cc',
         'base/posix/safe_strerror.cc',
         'base/strings/string16.cc',
-        'base/threading/platform_thread_posix.cc',
-        'base/time/time_conversion_posix.cc',
     ])
 
   if is_linux:
     static_libraries['base']['sources'].extend([
         'base/strings/sys_string_conversions_posix.cc',
-        'base/time/time_now_posix.cc',
-        'base/threading/platform_thread_linux.cc',
     ])
     libs.extend([
         '-lc',
@@ -498,8 +493,6 @@
         'base/mac/scoped_mach_port.cc',
         'base/mac/scoped_nsautorelease_pool.mm',
         'base/strings/sys_string_conversions_mac.mm',
-        'base/time/time_mac.cc',
-        'base/threading/platform_thread_mac.mm',
     ])
 
     libs.extend([
@@ -515,8 +508,6 @@
         'base/files/file_util_win.cc',
         'base/files/file_win.cc',
         'base/strings/sys_string_conversions_win.cc',
-        'base/threading/platform_thread_win.cc',
-        'base/time/time_win.cc',
         'base/win/registry.cc',
         'base/win/scoped_handle.cc',
         'base/win/scoped_process_information.cc',
diff --git a/tools/gn/command_gen.cc b/tools/gn/command_gen.cc
index af5dd1f..eb1b4d2 100644
--- a/tools/gn/command_gen.cc
+++ b/tools/gn/command_gen.cc
@@ -455,7 +455,7 @@
     return 1;
   }
 
-  base::TimeDelta elapsed_time = timer.Elapsed();
+  TickDelta elapsed_time = timer.Elapsed();
 
   if (!command_line->HasSwitch(switches::kQuiet)) {
     OutputString("Done. ", DECORATION_GREEN);
diff --git a/tools/gn/filesystem_utils_unittest.cc b/tools/gn/filesystem_utils_unittest.cc
index 8bfd52c..87e37f8 100644
--- a/tools/gn/filesystem_utils_unittest.cc
+++ b/tools/gn/filesystem_utils_unittest.cc
@@ -3,12 +3,14 @@
 // found in the LICENSE file.
 
 #include "tools/gn/filesystem_utils.h"
+
+#include <thread>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/platform_thread.h"
 #include "tools/gn/target.h"
 #include "util/build_config.h"
 #include "util/test/test.h"
@@ -645,15 +647,17 @@
 
   base::File::Info file_info;
   ASSERT_TRUE(base::GetFileInfo(file_path, &file_info));
-  base::Time last_modified = file_info.last_modified;
+  Ticks last_modified = file_info.last_modified;
 
+  {
+    using namespace std::chrono_literals;
 #if defined(OS_MACOSX)
-  // Modification times are in seconds in HFS on Mac.
-  base::TimeDelta sleep_time = base::TimeDelta::FromSeconds(1);
+    // Modification times are in seconds in HFS on Mac.
+    std::this_thread::sleep_for(1s);
 #else
-  base::TimeDelta sleep_time = base::TimeDelta::FromMilliseconds(1);
+    std::this_thread::sleep_for(1ms);
 #endif
-  base::PlatformThread::Sleep(sleep_time);
+  }
 
   // Don't write if contents is the same.
   EXPECT_TRUE(WriteFileIfChanged(file_path, data, nullptr));
diff --git a/tools/gn/function_exec_script.cc b/tools/gn/function_exec_script.cc
index e1ada23..e0b6265 100644
--- a/tools/gn/function_exec_script.cc
+++ b/tools/gn/function_exec_script.cc
@@ -7,7 +7,6 @@
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "tools/gn/err.h"
 #include "tools/gn/exec_process.h"
 #include "tools/gn/filesystem_utils.h"
@@ -19,6 +18,7 @@
 #include "tools/gn/trace.h"
 #include "tools/gn/value.h"
 #include "util/build_config.h"
+#include "util/ticks.h"
 
 namespace functions {
 
@@ -198,7 +198,7 @@
 
   // Log command line for debugging help.
   trace.SetCommandLine(cmdline);
-  base::TimeTicks begin_exec;
+  Ticks begin_exec = 0;
   if (g_scheduler->verbose_logging()) {
 #if defined(OS_WIN)
     g_scheduler->Log("Pythoning",
@@ -206,7 +206,7 @@
 #else
     g_scheduler->Log("Pythoning", cmdline.GetCommandLineString());
 #endif
-    begin_exec = base::TimeTicks::Now();
+    begin_exec = TicksNow();
   }
 
   base::FilePath startup_dir =
@@ -239,7 +239,7 @@
         "Pythoning",
         script_source_path + " took " +
             base::Int64ToString(
-                (base::TimeTicks::Now() - begin_exec).InMilliseconds()) +
+                TicksDelta(TicksNow(), begin_exec).InMilliseconds()) +
             "ms");
   }
 
diff --git a/tools/gn/function_write_file_unittest.cc b/tools/gn/function_write_file_unittest.cc
index b12f037..95414ce 100644
--- a/tools/gn/function_write_file_unittest.cc
+++ b/tools/gn/function_write_file_unittest.cc
@@ -70,13 +70,21 @@
   EXPECT_EQ("line 1\n2\n", result_contents);
 
   // Test that the file is not rewritten if the contents are not changed.
-  // Start by setting the modified time to something old to avoid clock
-  // resolution issues.
-  base::Time old_time = base::Time::Now() - base::TimeDelta::FromDays(1);
   base::File foo_file(foo_name, base::File::FLAG_OPEN | base::File::FLAG_READ |
                                     base::File::FLAG_WRITE);
   ASSERT_TRUE(foo_file.IsValid());
-  foo_file.SetTimes(old_time, old_time);
+
+  // Start by setting the modified time to something old to avoid clock
+  // resolution issues.
+#if defined(OS_WIN)
+  FILETIME last_access_filetime = {};
+  FILETIME last_modified_filetime = {};
+  ASSERT_TRUE(::SetFileTime(foo_file.GetPlatformFile(), nullptr,
+                            &last_access_filetime, &last_modified_filetime));
+#else
+  timespec ts_times[2] = {};
+  ASSERT_EQ(futimens(foo_file.GetPlatformFile(), ts_times), 0);
+#endif
 
   // Read the current time to avoid timer resolution issues when comparing
   // below.
diff --git a/tools/gn/import_manager.cc b/tools/gn/import_manager.cc
index f4aa32a..36c7088 100644
--- a/tools/gn/import_manager.cc
+++ b/tools/gn/import_manager.cc
@@ -11,6 +11,7 @@
 #include "tools/gn/scheduler.h"
 #include "tools/gn/scope_per_file_provider.h"
 #include "tools/gn/trace.h"
+#include "util/ticks.h"
 
 namespace {
 
@@ -75,8 +76,9 @@
                              Scope* scope,
                              Err* err) {
   // Key for the current import on the current thread in imports_in_progress_.
-  std::string key =
-      std::to_string(base::PlatformThread::CurrentId()) + file.value();
+  std::stringstream ss;
+  ss << std::this_thread::get_id() << file.value();
+  std::string key = ss.str();
 
   // See if we have a cached import, but be careful to actually do the scope
   // copying outside of the lock.
@@ -101,7 +103,7 @@
   // is already processing the import.
   const Scope* import_scope = nullptr;
   {
-    base::TimeTicks import_block_begin = base::TimeTicks::Now();
+    Ticks import_block_begin = TicksNow();
     std::lock_guard<std::mutex> lock(import_info->load_lock);
 
     if (!import_info->scope) {
@@ -117,14 +119,14 @@
     } else {
       // Add trace if this thread was blocked for a long period of time and did
       // not load the import itself.
-      base::TimeTicks import_block_end = base::TimeTicks::Now();
-      constexpr auto kImportBlockTraceThreshold =
-          base::TimeDelta::FromMilliseconds(20);
+      Ticks import_block_end = TicksNow();
+      constexpr auto kImportBlockTraceThresholdMS = 20;
       if (TracingEnabled() &&
-          import_block_end - import_block_begin > kImportBlockTraceThreshold) {
+          TicksDelta(import_block_end, import_block_begin).InMilliseconds() >
+              kImportBlockTraceThresholdMS) {
         auto* import_block_trace =
             new TraceItem(TraceItem::TRACE_IMPORT_BLOCK, file.value(),
-                          base::PlatformThread::CurrentId());
+                          std::this_thread::get_id());
         import_block_trace->set_begin(import_block_begin);
         import_block_trace->set_end(import_block_end);
         AddTrace(import_block_trace);
diff --git a/tools/gn/trace.cc b/tools/gn/trace.cc
index 76fc00d..184c450 100644
--- a/tools/gn/trace.cc
+++ b/tools/gn/trace.cc
@@ -56,7 +56,7 @@
 };
 
 bool DurationGreater(const TraceItem* a, const TraceItem* b) {
-  return a->delta() > b->delta();
+  return a->delta().raw() > b->delta().raw();
 }
 
 bool CoalescedDurationGreater(const Coalesced& a, const Coalesced& b) {
@@ -112,7 +112,7 @@
 
 TraceItem::TraceItem(Type type,
                      const std::string& name,
-                     base::PlatformThreadId thread_id)
+                     std::thread::id thread_id)
     : type_(type), name_(name), thread_id_(thread_id) {}
 
 TraceItem::~TraceItem() = default;
@@ -120,8 +120,8 @@
 ScopedTrace::ScopedTrace(TraceItem::Type t, const std::string& name)
     : item_(nullptr), done_(false) {
   if (trace_log) {
-    item_ = new TraceItem(t, name, base::PlatformThread::CurrentId());
-    item_->set_begin(base::TimeTicks::Now());
+    item_ = new TraceItem(t, name, std::this_thread::get_id());
+    item_->set_begin(TicksNow());
   }
 }
 
@@ -129,8 +129,8 @@
     : item_(nullptr), done_(false) {
   if (trace_log) {
     item_ = new TraceItem(t, label.GetUserVisibleName(false),
-                          base::PlatformThread::CurrentId());
-    item_->set_begin(base::TimeTicks::Now());
+                          std::this_thread::get_id());
+    item_->set_begin(TicksNow());
   }
 }
 
@@ -152,7 +152,7 @@
   if (!done_) {
     done_ = true;
     if (trace_log) {
-      item_->set_end(base::TimeTicks::Now());
+      item_->set_end(TicksNow());
       AddTrace(item_);
     }
   }
@@ -244,7 +244,7 @@
 
   // Write main thread metadata (assume this is being written on the main
   // thread).
-  out << "{\"pid\":0,\"tid\":" << base::PlatformThread::CurrentId();
+  out << "{\"pid\":0,\"tid\":" << std::this_thread::get_id();
   out << ",\"ts\":0,\"ph\":\"M\",";
   out << "\"name\":\"thread_name\",\"args\":{\"name\":\"Main thread\"}},";
 
@@ -255,7 +255,7 @@
     if (i != 0)
       out << ",";
     out << "{\"pid\":0,\"tid\":" << item.thread_id();
-    out << ",\"ts\":" << item.begin().ToInternalValue();
+    out << ",\"ts\":" << item.begin();
     out << ",\"ph\":\"X\"";  // "X" = complete event with begin & duration.
     out << ",\"dur\":" << item.delta().InMicroseconds();
 
diff --git a/tools/gn/trace.h b/tools/gn/trace.h
index 3b91aaa..f4f06df 100644
--- a/tools/gn/trace.h
+++ b/tools/gn/trace.h
@@ -6,10 +6,10 @@
 #define TOOLS_GN_TRACE_H_
 
 #include <string>
+#include <thread>
 
 #include "base/macros.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
+#include "util/ticks.h"
 
 class Label;
 
@@ -35,21 +35,19 @@
     TRACE_CHECK_HEADERS,  // All files.
   };
 
-  TraceItem(Type type,
-            const std::string& name,
-            base::PlatformThreadId thread_id);
+  TraceItem(Type type, const std::string& name, std::thread::id thread_id);
   ~TraceItem();
 
   Type type() const { return type_; }
   const std::string& name() const { return name_; }
-  base::PlatformThreadId thread_id() const { return thread_id_; }
+  std::thread::id thread_id() const { return thread_id_; }
 
-  base::TimeTicks begin() const { return begin_; }
-  void set_begin(base::TimeTicks b) { begin_ = b; }
-  base::TimeTicks end() const { return end_; }
-  void set_end(base::TimeTicks e) { end_ = e; }
+  Ticks begin() const { return begin_; }
+  void set_begin(Ticks b) { begin_ = b; }
+  Ticks end() const { return end_; }
+  void set_end(Ticks e) { end_ = e; }
 
-  base::TimeDelta delta() const { return end_ - begin_; }
+  TickDelta delta() const { return TicksDelta(end_, begin_); }
 
   // Optional toolchain label.
   const std::string& toolchain() const { return toolchain_; }
@@ -62,10 +60,10 @@
  private:
   Type type_;
   std::string name_;
-  base::PlatformThreadId thread_id_;
+  std::thread::id thread_id_;
 
-  base::TimeTicks begin_;
-  base::TimeTicks end_;
+  Ticks begin_;
+  Ticks end_;
 
   std::string toolchain_;
   std::string cmdline_;
diff --git a/tools/gn/unique_vector.h b/tools/gn/unique_vector.h
index 25b4f5b..732b663 100644
--- a/tools/gn/unique_vector.h
+++ b/tools/gn/unique_vector.h
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include <unordered_set>
+#include <vector>
 
 namespace internal {
 
diff --git a/tools/gn/unique_vector_unittest.cc b/tools/gn/unique_vector_unittest.cc
index 87430ea..afea1e2 100644
--- a/tools/gn/unique_vector_unittest.cc
+++ b/tools/gn/unique_vector_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 
-#include "base/time/time.h"
 #include "tools/gn/unique_vector.h"
 #include "util/test/test.h"
 
diff --git a/util/ticks.cc b/util/ticks.cc
new file mode 100644
index 0000000..df35375
--- /dev/null
+++ b/util/ticks.cc
@@ -0,0 +1,93 @@
+// Copyright 2018 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 "ticks.h"
+
+#include "base/logging.h"
+#include "build_config.h"
+
+#if defined(OS_WIN)
+#include <windows.h>
+#elif defined(OS_MACOSX)
+#include <mach/mach_time.h>
+#elif defined(OS_LINUX)
+#include <time.h>
+#else
+#error Port.
+#endif
+
+namespace {
+
+bool g_initialized;
+
+#if defined(OS_WIN)
+LARGE_INTEGER g_frequency;
+LARGE_INTEGER g_start;
+#elif defined(OS_MACOSX)
+mach_timebase_info_data_t g_timebase;
+uint64_t g_start;
+#elif defined(OS_LINUX)
+uint64_t g_start;
+#else
+#error Port.
+#endif
+
+constexpr uint64_t kNano = 1'000'000'000;
+
+void Init() {
+  DCHECK(!g_initialized);
+
+#if defined(OS_WIN)
+  QueryPerformanceFrequency(&g_frequency);
+  QueryPerformanceCounter(&g_start);
+#elif defined(OS_MACOSX)
+  mach_timebase_info(&g_timebase);
+  g_start = (mach_absolute_time() * g_timebase.numer) / g_timebase.denom;
+#elif defined(OS_LINUX)
+  struct timespec ts;
+  clock_gettime(CLOCK_MONOTONIC, &ts);
+  g_start = static_cast<uint64_t>(ts.tv_sec) * kNano +
+            static_cast<uint64_t>(ts.tv_nsec);
+#else
+#error Port.
+#endif
+
+  g_initialized = true;
+}
+
+}  // namespace
+
+Ticks TicksNow() {
+  static bool initialized = []() {
+    Init();
+    return true;
+  }();
+  DCHECK(initialized);
+
+  Ticks now;
+
+#if defined(OS_WIN)
+  LARGE_INTEGER t;
+  QueryPerformanceCounter(&t);
+  now = ((t.QuadPart - g_start.QuadPart) * kNano) / g_frequency.QuadPart;
+#elif defined(OS_MACOSX)
+  now =
+      ((mach_absolute_time() * g_timebase.numer) / g_timebase.denom) - g_start;
+#elif defined(OS_LINUX)
+  struct timespec ts;
+  clock_gettime(CLOCK_MONOTONIC, &ts);
+  now = (static_cast<uint64_t>(ts.tv_sec) * kNano +
+         static_cast<uint64_t>(ts.tv_nsec)) -
+        g_start;
+#else
+#error Port.
+#endif
+
+  return now;
+}
+
+TickDelta TicksDelta(Ticks new_ticks, Ticks old_ticks) {
+  DCHECK(new_ticks >= old_ticks);
+  return TickDelta(new_ticks - old_ticks);
+}
diff --git a/util/ticks.h b/util/ticks.h
new file mode 100644
index 0000000..fcbde05
--- /dev/null
+++ b/util/ticks.h
@@ -0,0 +1,45 @@
+// Copyright 2018 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 UTIL_TICKS_H_
+#define UTIL_TICKS_H_
+
+#include <stdint.h>
+
+using Ticks = uint64_t;
+
+class TickDelta {
+ public:
+  explicit TickDelta(uint64_t delta) : delta_(delta) {}
+
+  double InSecondsF() const { return delta_ / 1000000000.0; }
+  double InMillisecondsF() const { return delta_ / 1000000.0; }
+  double InMicrosecondsF() const { return delta_ / 1000.0; }
+  double InNanosecondsF() const { return delta_; }
+
+  uint64_t InSeconds() const { return delta_ / 1000000000; }
+  uint64_t InMilliseconds() const { return delta_ / 1000000; }
+  uint64_t InMicroseconds() const { return delta_ / 1000; }
+  uint64_t InNanoseconds() const { return delta_; }
+
+  uint64_t raw() const { return delta_; }
+
+ private:
+  uint64_t delta_;
+};
+
+Ticks TicksNow();
+
+TickDelta TicksDelta(Ticks new_ticks, Ticks old_ticks);
+
+class ElapsedTimer {
+ public:
+  ElapsedTimer() : start_(TicksNow()) {}
+  TickDelta Elapsed() { return TicksDelta(TicksNow(), start_); }
+
+ private:
+  Ticks start_;
+};
+
+#endif  // UTIL_TICKS_H_
