diff --git a/base/i18n/OWNERS b/base/i18n/OWNERS
deleted file mode 100644
index d717b8d..0000000
--- a/base/i18n/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-jshin@chromium.org
diff --git a/base/i18n/base_i18n_export.h b/base/i18n/base_i18n_export.h
deleted file mode 100644
index e8a2add..0000000
--- a/base/i18n/base_i18n_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_BASE_I18N_EXPORT_H_
-#define BASE_I18N_BASE_I18N_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(BASE_I18N_IMPLEMENTATION)
-#define BASE_I18N_EXPORT __declspec(dllexport)
-#else
-#define BASE_I18N_EXPORT __declspec(dllimport)
-#endif  // defined(BASE_I18N_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(BASE_I18N_IMPLEMENTATION)
-#define BASE_I18N_EXPORT __attribute__((visibility("default")))
-#else
-#define BASE_I18N_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define BASE_I18N_EXPORT
-#endif
-
-#endif  // BASE_I18N_BASE_I18N_EXPORT_H_
diff --git a/base/i18n/base_i18n_switches.cc b/base/i18n/base_i18n_switches.cc
deleted file mode 100644
index 103d665..0000000
--- a/base/i18n/base_i18n_switches.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 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/i18n/base_i18n_switches.h"
-
-namespace switches {
-
-// Force the UI to a specific direction. Valid values are "ltr" (left-to-right)
-// and "rtl" (right-to-left).
-const char kForceUIDirection[]   = "force-ui-direction";
-
-// Force the text rendering to a specific direction. Valid values are "ltr"
-// (left-to-right) and "rtl" (right-to-left). Only tested meaningfully with
-// RTL.
-const char kForceTextDirection[] = "force-text-direction";
-
-const char kForceDirectionLTR[]  = "ltr";
-const char kForceDirectionRTL[]  = "rtl";
-
-}  // namespace switches
diff --git a/base/i18n/base_i18n_switches.h b/base/i18n/base_i18n_switches.h
deleted file mode 100644
index d1ba690..0000000
--- a/base/i18n/base_i18n_switches.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2015 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_I18N_BASE_I18N_SWITCHES_H_
-#define BASE_I18N_BASE_I18N_SWITCHES_H_
-
-#include "base/i18n/base_i18n_export.h"
-
-namespace switches {
-
-BASE_I18N_EXPORT extern const char kForceUIDirection[];
-BASE_I18N_EXPORT extern const char kForceTextDirection[];
-
-// kForce*Direction choices for the switches above.
-BASE_I18N_EXPORT extern const char kForceDirectionLTR[];
-BASE_I18N_EXPORT extern const char kForceDirectionRTL[];
-
-}  // namespace switches
-
-#endif  // BASE_I18N_BASE_I18N_SWITCHES_H_
diff --git a/base/i18n/bidi_line_iterator.cc b/base/i18n/bidi_line_iterator.cc
deleted file mode 100644
index 3f7f868..0000000
--- a/base/i18n/bidi_line_iterator.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/bidi_line_iterator.h"
-
-#include "base/logging.h"
-
-namespace base {
-namespace i18n {
-
-namespace {
-
-UBiDiLevel GetParagraphLevelForDirection(TextDirection direction) {
-  switch (direction) {
-    case UNKNOWN_DIRECTION:
-      return UBIDI_DEFAULT_LTR;
-      break;
-    case RIGHT_TO_LEFT:
-      return 1;  // Highest RTL level.
-      break;
-    case LEFT_TO_RIGHT:
-      return 0;  // Highest LTR level.
-      break;
-    default:
-      NOTREACHED();
-      return 0;
-  }
-}
-
-// Overrides the default bidi class for a given character, for the custom
-// "AS_URL" behavior. Returns U_BIDI_CLASS_DEFAULT to defer to the default ICU
-// behavior.
-//
-// Matches the C callback interface of ICU's UBiDiClassCallback type (which is
-// why there is an unused argument).
-UCharDirection GetURLBiDiClassCallback(const void* /*unused*/, UChar32 c) {
-  // Note: Use a switch statement instead of strchr() to avoid iterating over a
-  // string for each character (the switch allows for much better compiler
-  // optimization).
-  switch (c) {
-    // The set of characters that delimit URL components (separating the scheme,
-    // username, password, domain labels, host, path segments, query
-    // names/values and fragment).
-    case '#':
-    case '&':
-    case '.':
-    case '/':
-    case ':':
-    case '=':
-    case '?':
-    case '@':
-      // Treat all of these characters as strong LTR, which effectively
-      // surrounds all of the text components of a URL (e.g., the domain labels
-      // and path segments) in a left-to-right embedding. This ensures that the
-      // URL components read from left to right, regardless of any RTL
-      // characters. (Within each component, RTL sequences are rendered from
-      // right to left as expected.)
-      return U_LEFT_TO_RIGHT;
-    default:
-      return U_BIDI_CLASS_DEFAULT;
-  }
-}
-
-}  // namespace
-
-BiDiLineIterator::BiDiLineIterator() : bidi_(nullptr) {}
-
-BiDiLineIterator::~BiDiLineIterator() {
-  if (bidi_) {
-    ubidi_close(bidi_);
-    bidi_ = nullptr;
-  }
-}
-
-bool BiDiLineIterator::Open(const string16& text,
-                            TextDirection direction,
-                            CustomBehavior behavior) {
-  DCHECK(!bidi_);
-  UErrorCode error = U_ZERO_ERROR;
-  bidi_ = ubidi_openSized(static_cast<int>(text.length()), 0, &error);
-  if (U_FAILURE(error))
-    return false;
-
-  if (behavior == CustomBehavior::AS_URL) {
-    ubidi_setClassCallback(bidi_, GetURLBiDiClassCallback, nullptr, nullptr,
-                           nullptr, &error);
-    if (U_FAILURE(error))
-      return false;
-  }
-
-  ubidi_setPara(bidi_, text.data(), static_cast<int>(text.length()),
-                GetParagraphLevelForDirection(direction), nullptr, &error);
-  return (U_SUCCESS(error));
-}
-
-int BiDiLineIterator::CountRuns() const {
-  DCHECK(bidi_ != nullptr);
-  UErrorCode error = U_ZERO_ERROR;
-  const int runs = ubidi_countRuns(bidi_, &error);
-  return U_SUCCESS(error) ? runs : 0;
-}
-
-UBiDiDirection BiDiLineIterator::GetVisualRun(int index,
-                                              int* start,
-                                              int* length) const {
-  DCHECK(bidi_ != nullptr);
-  return ubidi_getVisualRun(bidi_, index, start, length);
-}
-
-void BiDiLineIterator::GetLogicalRun(int start,
-                                     int* end,
-                                     UBiDiLevel* level) const {
-  DCHECK(bidi_ != nullptr);
-  ubidi_getLogicalRun(bidi_, start, end, level);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/bidi_line_iterator.h b/base/i18n/bidi_line_iterator.h
deleted file mode 100644
index d840f61..0000000
--- a/base/i18n/bidi_line_iterator.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_BIDI_LINE_ITERATOR_H_
-#define BASE_I18N_BIDI_LINE_ITERATOR_H_
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/i18n/rtl.h"
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "third_party/icu/source/common/unicode/ubidi.h"
-#include "third_party/icu/source/common/unicode/uchar.h"
-
-namespace base {
-namespace i18n {
-
-// A simple wrapper class for the bidirectional iterator of ICU.
-// This class uses the bidirectional iterator of ICU to split a line of
-// bidirectional texts into visual runs in its display order.
-class BASE_I18N_EXPORT BiDiLineIterator {
- public:
-  // Specifies some alternative iteration behavior.
-  enum class CustomBehavior {
-    // No special behavior.
-    NONE,
-    // Treat URL delimiter characters as strong LTR. This is a special treatment
-    // for URLs that purposefully violates the URL Standard, as an experiment.
-    // It should only be used behind a flag.
-    AS_URL
-  };
-
-  BiDiLineIterator();
-  ~BiDiLineIterator();
-
-  // Initializes the bidirectional iterator with the specified text.  Returns
-  // whether initialization succeeded.
-  bool Open(const string16& text,
-            TextDirection direction,
-            CustomBehavior behavior);
-
-  // Returns the number of visual runs in the text, or zero on error.
-  int CountRuns() const;
-
-  // Gets the logical offset, length, and direction of the specified visual run.
-  UBiDiDirection GetVisualRun(int index, int* start, int* length) const;
-
-  // Given a start position, figure out where the run ends (and the BiDiLevel).
-  void GetLogicalRun(int start, int* end, UBiDiLevel* level) const;
-
- private:
-  UBiDi* bidi_;
-
-  DISALLOW_COPY_AND_ASSIGN(BiDiLineIterator);
-};
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_BIDI_LINE_ITERATOR_H_
diff --git a/base/i18n/break_iterator.cc b/base/i18n/break_iterator.cc
deleted file mode 100644
index 251cd00..0000000
--- a/base/i18n/break_iterator.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/break_iterator.h"
-
-#include <stdint.h>
-
-#include "base/logging.h"
-#include "third_party/icu/source/common/unicode/ubrk.h"
-#include "third_party/icu/source/common/unicode/uchar.h"
-#include "third_party/icu/source/common/unicode/ustring.h"
-
-namespace base {
-namespace i18n {
-
-const size_t npos = static_cast<size_t>(-1);
-
-BreakIterator::BreakIterator(const StringPiece16& str, BreakType break_type)
-    : iter_(nullptr),
-      string_(str),
-      break_type_(break_type),
-      prev_(npos),
-      pos_(0) {}
-
-BreakIterator::BreakIterator(const StringPiece16& str, const string16& rules)
-    : iter_(nullptr),
-      string_(str),
-      rules_(rules),
-      break_type_(RULE_BASED),
-      prev_(npos),
-      pos_(0) {}
-
-BreakIterator::~BreakIterator() {
-  if (iter_)
-    ubrk_close(static_cast<UBreakIterator*>(iter_));
-}
-
-bool BreakIterator::Init() {
-  UErrorCode status = U_ZERO_ERROR;
-  UParseError parse_error;
-  UBreakIteratorType break_type;
-  switch (break_type_) {
-    case BREAK_CHARACTER:
-      break_type = UBRK_CHARACTER;
-      break;
-    case BREAK_WORD:
-      break_type = UBRK_WORD;
-      break;
-    case BREAK_LINE:
-    case BREAK_NEWLINE:
-    case RULE_BASED: // (Keep compiler happy, break_type not used in this case)
-      break_type = UBRK_LINE;
-      break;
-    default:
-      NOTREACHED() << "invalid break_type_";
-      return false;
-  }
-  if (break_type_ == RULE_BASED) {
-    iter_ = ubrk_openRules(rules_.c_str(),
-                           static_cast<int32_t>(rules_.length()),
-                           string_.data(),
-                           static_cast<int32_t>(string_.size()),
-                           &parse_error,
-                           &status);
-    if (U_FAILURE(status)) {
-      NOTREACHED() << "ubrk_openRules failed to parse rule string at line "
-          << parse_error.line << ", offset " << parse_error.offset;
-    }
-  } else {
-    iter_ = ubrk_open(break_type, nullptr, string_.data(),
-                      static_cast<int32_t>(string_.size()), &status);
-    if (U_FAILURE(status)) {
-      NOTREACHED() << "ubrk_open failed for type " << break_type
-          << " with error " << status;
-    }
-  }
-
-  if (U_FAILURE(status)) {
-    return false;
-  }
-
-  // Move the iterator to the beginning of the string.
-  ubrk_first(static_cast<UBreakIterator*>(iter_));
-  return true;
-}
-
-bool BreakIterator::Advance() {
-  int32_t pos;
-  int32_t status;
-  prev_ = pos_;
-  switch (break_type_) {
-    case BREAK_CHARACTER:
-    case BREAK_WORD:
-    case BREAK_LINE:
-    case RULE_BASED:
-      pos = ubrk_next(static_cast<UBreakIterator*>(iter_));
-      if (pos == UBRK_DONE) {
-        pos_ = npos;
-        return false;
-      }
-      pos_ = static_cast<size_t>(pos);
-      return true;
-    case BREAK_NEWLINE:
-      do {
-        pos = ubrk_next(static_cast<UBreakIterator*>(iter_));
-        if (pos == UBRK_DONE)
-          break;
-        pos_ = static_cast<size_t>(pos);
-        status = ubrk_getRuleStatus(static_cast<UBreakIterator*>(iter_));
-      } while (status >= UBRK_LINE_SOFT && status < UBRK_LINE_SOFT_LIMIT);
-      if (pos == UBRK_DONE && prev_ == pos_) {
-        pos_ = npos;
-        return false;
-      }
-      return true;
-    default:
-      NOTREACHED() << "invalid break_type_";
-      return false;
-  }
-}
-
-bool BreakIterator::SetText(const base::char16* text, const size_t length) {
-  UErrorCode status = U_ZERO_ERROR;
-  ubrk_setText(static_cast<UBreakIterator*>(iter_),
-               text, length, &status);
-  pos_ = 0;  // implicit when ubrk_setText is done
-  prev_ = npos;
-  if (U_FAILURE(status)) {
-    NOTREACHED() << "ubrk_setText failed";
-    return false;
-  }
-  string_ = StringPiece16(text, length);
-  return true;
-}
-
-bool BreakIterator::IsWord() const {
-  return GetWordBreakStatus() == IS_WORD_BREAK;
-}
-
-BreakIterator::WordBreakStatus BreakIterator::GetWordBreakStatus() const {
-  int32_t status = ubrk_getRuleStatus(static_cast<UBreakIterator*>(iter_));
-  if (break_type_ != BREAK_WORD && break_type_ != RULE_BASED)
-    return IS_LINE_OR_CHAR_BREAK;
-  // In ICU 60, trying to advance past the end of the text does not change
-  // |status| so that |pos_| has to be checked as well as |status|.
-  // See http://bugs.icu-project.org/trac/ticket/13447 .
-  return (status == UBRK_WORD_NONE || pos_ == npos) ? IS_SKIPPABLE_WORD
-                                                    : IS_WORD_BREAK;
-}
-
-bool BreakIterator::IsEndOfWord(size_t position) const {
-  if (break_type_ != BREAK_WORD && break_type_ != RULE_BASED)
-    return false;
-
-  UBreakIterator* iter = static_cast<UBreakIterator*>(iter_);
-  UBool boundary = ubrk_isBoundary(iter, static_cast<int32_t>(position));
-  int32_t status = ubrk_getRuleStatus(iter);
-  return (!!boundary && status != UBRK_WORD_NONE);
-}
-
-bool BreakIterator::IsStartOfWord(size_t position) const {
-  if (break_type_ != BREAK_WORD && break_type_ != RULE_BASED)
-    return false;
-
-  UBreakIterator* iter = static_cast<UBreakIterator*>(iter_);
-  UBool boundary = ubrk_isBoundary(iter, static_cast<int32_t>(position));
-  ubrk_next(iter);
-  int32_t next_status = ubrk_getRuleStatus(iter);
-  return (!!boundary && next_status != UBRK_WORD_NONE);
-}
-
-bool BreakIterator::IsGraphemeBoundary(size_t position) const {
-  if (break_type_ != BREAK_CHARACTER)
-    return false;
-
-  UBreakIterator* iter = static_cast<UBreakIterator*>(iter_);
-  return !!ubrk_isBoundary(iter, static_cast<int32_t>(position));
-}
-
-string16 BreakIterator::GetString() const {
-  return GetStringPiece().as_string();
-}
-
-StringPiece16 BreakIterator::GetStringPiece() const {
-  DCHECK(prev_ != npos && pos_ != npos);
-  return string_.substr(prev_, pos_ - prev_);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/break_iterator.h b/base/i18n/break_iterator.h
deleted file mode 100644
index dc30b64..0000000
--- a/base/i18n/break_iterator.h
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_BREAK_ITERATOR_H_
-#define BASE_I18N_BREAK_ITERATOR_H_
-
-#include <stddef.h>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-
-// The BreakIterator class iterates through the words, word breaks, and
-// line breaks in a UTF-16 string.
-//
-// It provides several modes, BREAK_WORD, BREAK_LINE, and BREAK_NEWLINE,
-// which modify how characters are aggregated into the returned string.
-//
-// Under BREAK_WORD mode, once a word is encountered any non-word
-// characters are not included in the returned string (e.g. in the
-// UTF-16 equivalent of the string " foo bar! ", the word breaks are at
-// the periods in ". .foo. .bar.!. .").
-// Note that Chinese/Japanese/Thai do not use spaces between words so that
-// boundaries can fall in the middle of a continuous run of non-space /
-// non-punctuation characters.
-//
-// Under BREAK_LINE mode, once a line breaking opportunity is encountered,
-// any non-word  characters are included in the returned string, breaking
-// only when a space-equivalent character or a line breaking opportunity
-// is encountered (e.g. in the UTF16-equivalent of the string " foo bar! ",
-// the breaks are at the periods in ". .foo .bar! .").
-//
-// Note that lines can be broken at any character/syllable/grapheme cluster
-// boundary in Chinese/Japanese/Korean and at word boundaries in Thai
-// (Thai does not use spaces between words). Therefore, this is NOT the same
-// as breaking only at space-equivalent characters where its former
-// name (BREAK_SPACE) implied.
-//
-// Under BREAK_NEWLINE mode, all characters are included in the returned
-// string, breaking only when a newline-equivalent character is encountered
-// (eg. in the UTF-16 equivalent of the string "foo\nbar!\n\n", the line
-// breaks are at the periods in ".foo\n.bar\n.\n.").
-//
-// To extract the words from a string, move a BREAK_WORD BreakIterator
-// through the string and test whether IsWord() is true. E.g.,
-//   BreakIterator iter(str, BreakIterator::BREAK_WORD);
-//   if (!iter.Init())
-//     return false;
-//   while (iter.Advance()) {
-//     if (iter.IsWord()) {
-//       // Region [iter.prev(), iter.pos()) contains a word.
-//       VLOG(1) << "word: " << iter.GetString();
-//     }
-//   }
-
-namespace base {
-namespace i18n {
-
-class BASE_I18N_EXPORT BreakIterator {
- public:
-  enum BreakType {
-    BREAK_WORD,
-    BREAK_LINE,
-    // TODO(jshin): Remove this after reviewing call sites.
-    // If call sites really need break only on space-like characters
-    // implement it separately.
-    BREAK_SPACE = BREAK_LINE,
-    BREAK_NEWLINE,
-    BREAK_CHARACTER,
-    // But don't remove this one!
-    RULE_BASED,
-  };
-
-  enum WordBreakStatus {
-    // The end of text that the iterator recognizes as word characters.
-    // Non-word characters are things like punctuation and spaces.
-    IS_WORD_BREAK,
-    // Characters that the iterator can skip past, such as punctuation,
-    // whitespace, and, if using RULE_BASED mode, characters from another
-    // character set.
-    IS_SKIPPABLE_WORD,
-    // Only used if not in BREAK_WORD or RULE_BASED mode. This is returned for
-    // newlines, line breaks, and character breaks.
-    IS_LINE_OR_CHAR_BREAK
-  };
-
-  // Requires |str| to live as long as the BreakIterator does.
-  BreakIterator(const StringPiece16& str, BreakType break_type);
-  // Make a rule-based iterator. BreakType == RULE_BASED is implied.
-  // TODO(andrewhayden): This signature could easily be misinterpreted as
-  // "(const string16& str, const string16& locale)". We should do something
-  // better.
-  BreakIterator(const StringPiece16& str, const string16& rules);
-  ~BreakIterator();
-
-  // Init() must be called before any of the iterators are valid.
-  // Returns false if ICU failed to initialize.
-  bool Init();
-
-  // Advance to the next break.  Returns false if we've run past the end of
-  // the string.  (Note that the very last "break" is after the final
-  // character in the string, and when we advance to that position it's the
-  // last time Advance() returns true.)
-  bool Advance();
-
-  // Updates the text used by the iterator, resetting the iterator as if
-  // if Init() had been called again. Any old state is lost. Returns true
-  // unless there is an error setting the text.
-  bool SetText(const base::char16* text, const size_t length);
-
-  // Under BREAK_WORD mode, returns true if the break we just hit is the
-  // end of a word. (Otherwise, the break iterator just skipped over e.g.
-  // whitespace or punctuation.)  Under BREAK_LINE and BREAK_NEWLINE modes,
-  // this distinction doesn't apply and it always returns false.
-  bool IsWord() const;
-
-  // Under BREAK_WORD mode:
-  //  - Returns IS_SKIPPABLE_WORD if non-word characters, such as punctuation or
-  //    spaces, are found.
-  //  - Returns IS_WORD_BREAK if the break we just hit is the end of a sequence
-  //    of word characters.
-  // Under RULE_BASED mode:
-  //  - Returns IS_SKIPPABLE_WORD if characters outside the rules' character set
-  //    or non-word characters, such as punctuation or spaces, are found.
-  //  - Returns IS_WORD_BREAK if the break we just hit is the end of a sequence
-  //    of word characters that are in the rules' character set.
-  // Not under BREAK_WORD or RULE_BASED mode:
-  //  - Returns IS_LINE_OR_CHAR_BREAK.
-  BreakIterator::WordBreakStatus GetWordBreakStatus() const;
-
-  // Under BREAK_WORD mode, returns true if |position| is at the end of word or
-  // at the start of word. It always returns false under BREAK_LINE and
-  // BREAK_NEWLINE modes.
-  bool IsEndOfWord(size_t position) const;
-  bool IsStartOfWord(size_t position) const;
-
-  // Under BREAK_CHARACTER mode, returns whether |position| is a Unicode
-  // grapheme boundary.
-  bool IsGraphemeBoundary(size_t position) const;
-
-  // Returns the string between prev() and pos().
-  // Advance() must have been called successfully at least once for pos() to
-  // have advanced to somewhere useful.
-  string16 GetString() const;
-
-  StringPiece16 GetStringPiece() const;
-
-  // Returns the value of pos() returned before Advance() was last called.
-  size_t prev() const { return prev_; }
-
-  // Returns the current break position within the string,
-  // or BreakIterator::npos when done.
-  size_t pos() const { return pos_; }
-
- private:
-  // ICU iterator, avoiding ICU ubrk.h dependence.
-  // This is actually an ICU UBreakiterator* type, which turns out to be
-  // a typedef for a void* in the ICU headers. Using void* directly prevents
-  // callers from needing access to the ICU public headers directory.
-  void* iter_;
-
-  // The string we're iterating over. Can be changed with SetText(...)
-  StringPiece16 string_;
-
-  // Rules for our iterator. Mutually exclusive with break_type_.
-  const string16 rules_;
-
-  // The breaking style (word/space/newline). Mutually exclusive with rules_
-  BreakType break_type_;
-
-  // Previous and current iterator positions.
-  size_t prev_, pos_;
-
-  DISALLOW_COPY_AND_ASSIGN(BreakIterator);
-};
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_BREAK_ITERATOR_H_
diff --git a/base/i18n/build_utf8_validator_tables.cc b/base/i18n/build_utf8_validator_tables.cc
deleted file mode 100644
index 0cdcc35..0000000
--- a/base/i18n/build_utf8_validator_tables.cc
+++ /dev/null
@@ -1,470 +0,0 @@
-// Copyright 2014 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.
-
-// Create a state machine for validating UTF-8. The algorithm in brief:
-// 1. Convert the complete unicode range of code points, except for the
-//    surrogate code points, to an ordered array of sequences of bytes in
-//    UTF-8.
-// 2. Convert individual bytes to ranges, starting from the right of each byte
-//    sequence. For each range, ensure the bytes on the left and the ranges
-//    on the right are the identical.
-// 3. Convert the resulting list of ranges into a state machine, collapsing
-//    identical states.
-// 4. Convert the state machine to an array of bytes.
-// 5. Output as a C++ file.
-//
-// To use:
-//  $ ninja -C out/Release build_utf8_validator_tables
-//  $ out/Release/build_utf8_validator_tables
-//                                   --output=base/i18n/utf8_validator_tables.cc
-//  $ git add base/i18n/utf8_validator_tables.cc
-//
-// Because the table is not expected to ever change, it is checked into the
-// repository rather than being regenerated at build time.
-//
-// This code uses type uint8_t throughout to represent bytes, to avoid
-// signed/unsigned char confusion.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "third_party/icu/source/common/unicode/utf8.h"
-
-namespace {
-
-const char kHelpText[] =
-    "Usage: build_utf8_validator_tables [ --help ] [ --output=<file> ]\n";
-
-const char kProlog[] =
-    "// Copyright 2013 The Chromium Authors. All rights reserved.\n"
-    "// Use of this source code is governed by a BSD-style license that can "
-    "be\n"
-    "// found in the LICENSE file.\n"
-    "\n"
-    "// This file is auto-generated by build_utf8_validator_tables.\n"
-    "// DO NOT EDIT.\n"
-    "\n"
-    "#include \"base/i18n/utf8_validator_tables.h\"\n"
-    "\n"
-    "namespace base {\n"
-    "namespace internal {\n"
-    "\n"
-    "const uint8_t kUtf8ValidatorTables[] = {\n";
-
-const char kEpilog[] =
-    "};\n"
-    "\n"
-    "const size_t kUtf8ValidatorTablesSize = arraysize(kUtf8ValidatorTables);\n"
-    "\n"
-    "}  // namespace internal\n"
-    "}  // namespace base\n";
-
-// Ranges are inclusive at both ends--they represent [from, to]
-class Range {
- public:
-  // Ranges always start with just one byte.
-  explicit Range(uint8_t value) : from_(value), to_(value) {}
-
-  // Range objects are copyable and assignable to be used in STL
-  // containers. Since they only contain non-pointer POD types, the default copy
-  // constructor, assignment operator and destructor will work.
-
-  // Add a byte to the range. We intentionally only support adding a byte at the
-  // end, since that is the only operation the code needs.
-  void AddByte(uint8_t to) {
-    CHECK(to == to_ + 1);
-    to_ = to;
-  }
-
-  uint8_t from() const { return from_; }
-  uint8_t to() const { return to_; }
-
-  bool operator<(const Range& rhs) const {
-    return (from() < rhs.from() || (from() == rhs.from() && to() < rhs.to()));
-  }
-
-  bool operator==(const Range& rhs) const {
-    return from() == rhs.from() && to() == rhs.to();
-  }
-
- private:
-  uint8_t from_;
-  uint8_t to_;
-};
-
-// A vector of Ranges is like a simple regular expression--it corresponds to
-// a set of strings of the same length that have bytes in each position in
-// the appropriate range.
-typedef std::vector<Range> StringSet;
-
-// A UTF-8 "character" is represented by a sequence of bytes.
-typedef std::vector<uint8_t> Character;
-
-// In the second stage of the algorithm, we want to convert a large list of
-// Characters into a small list of StringSets.
-struct Pair {
-  Character character;
-  StringSet set;
-};
-
-typedef std::vector<Pair> PairVector;
-
-// A class to print a table of numbers in the same style as clang-format.
-class TablePrinter {
- public:
-  explicit TablePrinter(FILE* stream)
-      : stream_(stream), values_on_this_line_(0), current_offset_(0) {}
-
-  void PrintValue(uint8_t value) {
-    if (values_on_this_line_ == 0) {
-      fputs("   ", stream_);
-    } else if (values_on_this_line_ == kMaxValuesPerLine) {
-      fprintf(stream_, "  // 0x%02x\n   ", current_offset_);
-      values_on_this_line_ = 0;
-    }
-    fprintf(stream_, " 0x%02x,", static_cast<int>(value));
-    ++values_on_this_line_;
-    ++current_offset_;
-  }
-
-  void NewLine() {
-    while (values_on_this_line_ < kMaxValuesPerLine) {
-      fputs("      ", stream_);
-      ++values_on_this_line_;
-    }
-    fprintf(stream_, "  // 0x%02x\n", current_offset_);
-    values_on_this_line_ = 0;
-  }
-
- private:
-  // stdio stream. Not owned.
-  FILE* stream_;
-
-  // Number of values so far printed on this line.
-  int values_on_this_line_;
-
-  // Total values printed so far.
-  int current_offset_;
-
-  static const int kMaxValuesPerLine = 8;
-
-  DISALLOW_COPY_AND_ASSIGN(TablePrinter);
-};
-
-// Start by filling a PairVector with characters. The resulting vector goes from
-// "\x00" to "\xf4\x8f\xbf\xbf".
-PairVector InitializeCharacters() {
-  PairVector vector;
-  for (int i = 0; i <= 0x10FFFF; ++i) {
-    if (i >= 0xD800 && i < 0xE000) {
-      // Surrogate codepoints are not permitted. Non-character code points are
-      // explicitly permitted.
-      continue;
-    }
-    uint8_t bytes[4];
-    unsigned int offset = 0;
-    UBool is_error = false;
-    U8_APPEND(bytes, offset, arraysize(bytes), i, is_error);
-    DCHECK(!is_error);
-    DCHECK_GT(offset, 0u);
-    DCHECK_LE(offset, arraysize(bytes));
-    Pair pair = {Character(bytes, bytes + offset), StringSet()};
-    vector.push_back(pair);
-  }
-  return vector;
-}
-
-// Construct a new Pair from |character| and the concatenation of |new_range|
-// and |existing_set|, and append it to |pairs|.
-void ConstructPairAndAppend(const Character& character,
-                            const Range& new_range,
-                            const StringSet& existing_set,
-                            PairVector* pairs) {
-  Pair new_pair = {character, StringSet(1, new_range)};
-  new_pair.set.insert(
-      new_pair.set.end(), existing_set.begin(), existing_set.end());
-  pairs->push_back(new_pair);
-}
-
-// Each pass over the PairVector strips one byte off the right-hand-side of the
-// characters and adds a range to the set on the right. For example, the first
-// pass converts the range from "\xe0\xa0\x80" to "\xe0\xa0\xbf" to ("\xe0\xa0",
-// [\x80-\xbf]), then the second pass converts the range from ("\xe0\xa0",
-// [\x80-\xbf]) to ("\xe0\xbf", [\x80-\xbf]) to ("\xe0",
-// [\xa0-\xbf][\x80-\xbf]).
-void MoveRightMostCharToSet(PairVector* pairs) {
-  PairVector new_pairs;
-  PairVector::const_iterator it = pairs->begin();
-  while (it != pairs->end() && it->character.empty()) {
-    new_pairs.push_back(*it);
-    ++it;
-  }
-  CHECK(it != pairs->end());
-  Character unconverted_bytes(it->character.begin(), it->character.end() - 1);
-  Range new_range(it->character.back());
-  StringSet converted = it->set;
-  ++it;
-  while (it != pairs->end()) {
-    const Pair& current_pair = *it++;
-    if (current_pair.character.size() == unconverted_bytes.size() + 1 &&
-        std::equal(unconverted_bytes.begin(),
-                   unconverted_bytes.end(),
-                   current_pair.character.begin()) &&
-        converted == current_pair.set) {
-      // The particular set of UTF-8 codepoints we are validating guarantees
-      // that each byte range will be contiguous. This would not necessarily be
-      // true for an arbitrary set of UTF-8 codepoints.
-      DCHECK_EQ(new_range.to() + 1, current_pair.character.back());
-      new_range.AddByte(current_pair.character.back());
-      continue;
-    }
-    ConstructPairAndAppend(unconverted_bytes, new_range, converted, &new_pairs);
-    unconverted_bytes = Character(current_pair.character.begin(),
-                                  current_pair.character.end() - 1);
-    new_range = Range(current_pair.character.back());
-    converted = current_pair.set;
-  }
-  ConstructPairAndAppend(unconverted_bytes, new_range, converted, &new_pairs);
-  new_pairs.swap(*pairs);
-}
-
-void MoveAllCharsToSets(PairVector* pairs) {
-  // Since each pass of the function moves one character, and UTF-8 sequences
-  // are at most 4 characters long, this simply runs the algorithm four times.
-  for (int i = 0; i < 4; ++i) {
-    MoveRightMostCharToSet(pairs);
-  }
-#if DCHECK_IS_ON()
-  for (PairVector::const_iterator it = pairs->begin(); it != pairs->end();
-       ++it) {
-    DCHECK(it->character.empty());
-  }
-#endif
-}
-
-// Logs the generated string sets in regular-expression style, ie. [\x00-\x7f],
-// [\xc2-\xdf][\x80-\xbf], etc. This can be a useful sanity-check that the
-// algorithm is working. Use the command-line option
-// --vmodule=build_utf8_validator_tables=1 to see this output.
-void LogStringSets(const PairVector& pairs) {
-  for (PairVector::const_iterator pair_it = pairs.begin();
-       pair_it != pairs.end();
-       ++pair_it) {
-    std::string set_as_string;
-    for (StringSet::const_iterator set_it = pair_it->set.begin();
-         set_it != pair_it->set.end();
-         ++set_it) {
-      set_as_string += base::StringPrintf("[\\x%02x-\\x%02x]",
-                                          static_cast<int>(set_it->from()),
-                                          static_cast<int>(set_it->to()));
-    }
-    VLOG(1) << set_as_string;
-  }
-}
-
-// A single state in the state machine is represented by a sorted vector of
-// start bytes and target states. All input bytes in the range between the start
-// byte and the next entry in the vector (or 0xFF) result in a transition to the
-// target state.
-struct StateRange {
-  uint8_t from;
-  uint8_t target_state;
-};
-
-typedef std::vector<StateRange> State;
-
-// Generates a state where all bytes go to state 1 (invalid). This is also used
-// as an initialiser for other states (since bytes from outside the desired
-// range are invalid).
-State GenerateInvalidState() {
-  const StateRange range = {0, 1};
-  return State(1, range);
-}
-
-// A map from a state (ie. a set of strings which will match from this state) to
-// a number (which is an index into the array of states).
-typedef std::map<StringSet, uint8_t> StateMap;
-
-// Create a new state corresponding to |set|, add it |states| and |state_map|
-// and return the index it was given in |states|.
-uint8_t MakeState(const StringSet& set,
-                  std::vector<State>* states,
-                  StateMap* state_map) {
-  DCHECK(!set.empty());
-  const Range& range = set.front();
-  const StringSet rest(set.begin() + 1, set.end());
-  const StateMap::const_iterator where = state_map->find(rest);
-  const uint8_t target_state = where == state_map->end()
-                                   ? MakeState(rest, states, state_map)
-                                   : where->second;
-  DCHECK_LT(0, range.from());
-  DCHECK_LT(range.to(), 0xFF);
-  const StateRange new_state_initializer[] = {
-      {0, 1},
-      {range.from(), target_state},
-      {static_cast<uint8_t>(range.to() + 1), 1}};
-  states->push_back(
-      State(new_state_initializer,
-            new_state_initializer + arraysize(new_state_initializer)));
-  const uint8_t new_state_number =
-      base::checked_cast<uint8_t>(states->size() - 1);
-  CHECK(state_map->insert(std::make_pair(set, new_state_number)).second);
-  return new_state_number;
-}
-
-std::vector<State> GenerateStates(const PairVector& pairs) {
-  // States 0 and 1 are the initial/valid state and invalid state, respectively.
-  std::vector<State> states(2, GenerateInvalidState());
-  StateMap state_map;
-  state_map.insert(std::make_pair(StringSet(), 0));
-  for (PairVector::const_iterator it = pairs.begin(); it != pairs.end(); ++it) {
-    DCHECK(it->character.empty());
-    DCHECK(!it->set.empty());
-    const Range& range = it->set.front();
-    const StringSet rest(it->set.begin() + 1, it->set.end());
-    const StateMap::const_iterator where = state_map.find(rest);
-    const uint8_t target_state = where == state_map.end()
-                                     ? MakeState(rest, &states, &state_map)
-                                     : where->second;
-    if (states[0].back().from == range.from()) {
-      DCHECK_EQ(1, states[0].back().target_state);
-      states[0].back().target_state = target_state;
-      DCHECK_LT(range.to(), 0xFF);
-      const StateRange new_range = {static_cast<uint8_t>(range.to() + 1), 1};
-      states[0].push_back(new_range);
-    } else {
-      DCHECK_LT(range.to(), 0xFF);
-      const StateRange new_range_initializer[] = {
-          {range.from(), target_state},
-          {static_cast<uint8_t>(range.to() + 1), 1}};
-      states[0]
-          .insert(states[0].end(),
-                  new_range_initializer,
-                  new_range_initializer + arraysize(new_range_initializer));
-    }
-  }
-  return states;
-}
-
-// Output the generated states as a C++ table. Two tricks are used to compact
-// the table: each state in the table starts with a shift value which indicates
-// how many bits we can discard from the right-hand-side of the byte before
-// doing the table lookup. Secondly, only the state-transitions for bytes
-// with the top-bit set are included in the table; bytes without the top-bit set
-// are just ASCII and are handled directly by the code.
-void PrintStates(const std::vector<State>& states, FILE* stream) {
-  // First calculate the start-offset of each state. This allows the state
-  // machine to jump directly to the correct offset, avoiding an extra
-  // indirection. State 0 starts at offset 0.
-  std::vector<uint8_t> state_offset(1, 0);
-  std::vector<uint8_t> shifts;
-  uint8_t pos = 0;
-
-  for (std::vector<State>::const_iterator state_it = states.begin();
-       state_it != states.end();
-       ++state_it) {
-    // We want to set |shift| to the (0-based) index of the least-significant
-    // set bit in any of the ranges for this state, since this tells us how many
-    // bits we can discard and still determine what range a byte lies in. Sadly
-    // it appears that ffs() is not portable, so we do it clumsily.
-    uint8_t shift = 7;
-    for (State::const_iterator range_it = state_it->begin();
-         range_it != state_it->end();
-         ++range_it) {
-      while (shift > 0 && range_it->from % (1 << shift) != 0) {
-        --shift;
-      }
-    }
-    shifts.push_back(shift);
-    pos += 1 + (1 << (7 - shift));
-    state_offset.push_back(pos);
-  }
-
-  DCHECK_EQ(129, state_offset[1]);
-
-  fputs(kProlog, stream);
-  TablePrinter table_printer(stream);
-
-  for (uint8_t state_index = 0; state_index < states.size(); ++state_index) {
-    const uint8_t shift = shifts[state_index];
-    uint8_t next_range = 0;
-    uint8_t target_state = 1;
-    fprintf(stream,
-            "    // State %d, offset 0x%02x\n",
-            static_cast<int>(state_index),
-            static_cast<int>(state_offset[state_index]));
-    table_printer.PrintValue(shift);
-    for (int i = 0; i < 0x100; i += (1 << shift)) {
-      if (next_range < states[state_index].size() &&
-          states[state_index][next_range].from == i) {
-        target_state = states[state_index][next_range].target_state;
-        ++next_range;
-      }
-      if (i >= 0x80) {
-        table_printer.PrintValue(state_offset[target_state]);
-      }
-    }
-    table_printer.NewLine();
-  }
-
-  fputs(kEpilog, stream);
-}
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  base::CommandLine::Init(argc, argv);
-  logging::LoggingSettings settings;
-  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
-  logging::InitLogging(settings);
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch("help")) {
-    fwrite(kHelpText, 1, arraysize(kHelpText), stdout);
-    exit(EXIT_SUCCESS);
-  }
-  base::FilePath filename =
-      base::CommandLine::ForCurrentProcess()->GetSwitchValuePath("output");
-
-  FILE* output = stdout;
-  if (!filename.empty()) {
-    output = base::OpenFile(filename, "wb");
-    if (!output)
-      PLOG(FATAL) << "Couldn't open '" << filename.AsUTF8Unsafe()
-                  << "' for writing";
-  }
-
-  // Step 1: Enumerate the characters
-  PairVector pairs = InitializeCharacters();
-  // Step 2: Convert to sets.
-  MoveAllCharsToSets(&pairs);
-  if (VLOG_IS_ON(1)) {
-    LogStringSets(pairs);
-  }
-  // Step 3: Generate states.
-  std::vector<State> states = GenerateStates(pairs);
-  // Step 4/5: Print output
-  PrintStates(states, output);
-
-  if (!filename.empty()) {
-    if (!base::CloseFile(output))
-      PLOG(FATAL) << "Couldn't finish writing '" << filename.AsUTF8Unsafe()
-                  << "'";
-  }
-
-  return EXIT_SUCCESS;
-}
diff --git a/base/i18n/case_conversion.cc b/base/i18n/case_conversion.cc
deleted file mode 100644
index a4a104c..0000000
--- a/base/i18n/case_conversion.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/case_conversion.h"
-
-#include <stdint.h>
-
-#include "base/numerics/safe_conversions.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_util.h"
-#include "third_party/icu/source/common/unicode/uchar.h"
-#include "third_party/icu/source/common/unicode/unistr.h"
-#include "third_party/icu/source/common/unicode/ustring.h"
-
-namespace base {
-namespace i18n {
-
-namespace {
-
-// Provides a uniform interface for upper/lower/folding which take take
-// slightly varying parameters.
-typedef int32_t (*CaseMapperFunction)(UChar* dest, int32_t dest_capacity,
-                                      const UChar* src, int32_t src_length,
-                                      UErrorCode* error);
-
-int32_t ToUpperMapper(UChar* dest, int32_t dest_capacity,
-                      const UChar* src, int32_t src_length,
-                      UErrorCode* error) {
-  // Use default locale.
-  return u_strToUpper(dest, dest_capacity, src, src_length, nullptr, error);
-}
-
-int32_t ToLowerMapper(UChar* dest, int32_t dest_capacity,
-                      const UChar* src, int32_t src_length,
-                      UErrorCode* error) {
-  // Use default locale.
-  return u_strToLower(dest, dest_capacity, src, src_length, nullptr, error);
-}
-
-int32_t FoldCaseMapper(UChar* dest, int32_t dest_capacity,
-                       const UChar* src, int32_t src_length,
-                       UErrorCode* error) {
-  return u_strFoldCase(dest, dest_capacity, src, src_length,
-                       U_FOLD_CASE_DEFAULT, error);
-}
-
-// Provides similar functionality as UnicodeString::caseMap but on string16.
-string16 CaseMap(StringPiece16 string, CaseMapperFunction case_mapper) {
-  string16 dest;
-  if (string.empty())
-    return dest;
-
-  // Provide an initial guess that the string length won't change. The typical
-  // strings we use will very rarely change length in this process, so don't
-  // optimize for that case.
-  dest.resize(string.size());
-
-  UErrorCode error;
-  do {
-    error = U_ZERO_ERROR;
-
-    // ICU won't terminate the string if there's not enough room for the null
-    // terminator, but will otherwise. So we don't need to save room for that.
-    // Don't use WriteInto, which assumes null terminators.
-    int32_t new_length = case_mapper(
-        &dest[0], saturated_cast<int32_t>(dest.size()),
-        string.data(), saturated_cast<int32_t>(string.size()),
-        &error);
-    dest.resize(new_length);
-  } while (error == U_BUFFER_OVERFLOW_ERROR);
-  return dest;
-}
-
-}  // namespace
-
-string16 ToLower(StringPiece16 string) {
-  return CaseMap(string, &ToLowerMapper);
-}
-
-string16 ToUpper(StringPiece16 string) {
-  return CaseMap(string, &ToUpperMapper);
-}
-
-string16 FoldCase(StringPiece16 string) {
-  return CaseMap(string, &FoldCaseMapper);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/case_conversion.h b/base/i18n/case_conversion.h
deleted file mode 100644
index 0631a80..0000000
--- a/base/i18n/case_conversion.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_CASE_CONVERSION_H_
-#define BASE_I18N_CASE_CONVERSION_H_
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-namespace i18n {
-
-// UNICODE CASE-HANDLING ADVICE
-//
-// In English it's always safe to convert to upper-case or lower-case text
-// and get a good answer. But some languages have rules specific to those
-// locales. One example is the Turkish I:
-//   http://www.i18nguy.com/unicode/turkish-i18n.html
-//
-// ToLower/ToUpper use the current ICU locale which will take into account
-// the user language preference. Use this when dealing with user typing.
-//
-// FoldCase canonicalizes to a standardized form independent of the current
-// locale. Use this when comparing general Unicode strings that don't
-// necessarily belong in the user's current locale (like commands, protocol
-// names, other strings from the web) for case-insensitive equality.
-//
-// Note that case conversions will change the length of the string in some
-// not-uncommon cases. Never assume that the output is the same length as
-// the input.
-
-// Returns the lower case equivalent of string. Uses ICU's current locale.
-BASE_I18N_EXPORT string16 ToLower(StringPiece16 string);
-
-// Returns the upper case equivalent of string. Uses ICU's current locale.
-BASE_I18N_EXPORT string16 ToUpper(StringPiece16 string);
-
-// Convert the given string to a canonical case, independent of the current
-// locale. For ASCII the canonical form is lower case.
-// See http://unicode.org/faq/casemap_charprop.html#2
-BASE_I18N_EXPORT string16 FoldCase(StringPiece16 string);
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_CASE_CONVERSION_H_
diff --git a/base/i18n/char_iterator.cc b/base/i18n/char_iterator.cc
deleted file mode 100644
index d80b8b6..0000000
--- a/base/i18n/char_iterator.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/char_iterator.h"
-
-#include "third_party/icu/source/common/unicode/utf8.h"
-#include "third_party/icu/source/common/unicode/utf16.h"
-
-namespace base {
-namespace i18n {
-
-UTF8CharIterator::UTF8CharIterator(const std::string* str)
-    : str_(reinterpret_cast<const uint8_t*>(str->data())),
-      len_(str->size()),
-      array_pos_(0),
-      next_pos_(0),
-      char_pos_(0),
-      char_(0) {
-  if (len_)
-    U8_NEXT(str_, next_pos_, len_, char_);
-}
-
-UTF8CharIterator::~UTF8CharIterator() = default;
-
-bool UTF8CharIterator::Advance() {
-  if (array_pos_ >= len_)
-    return false;
-
-  array_pos_ = next_pos_;
-  char_pos_++;
-  if (next_pos_ < len_)
-    U8_NEXT(str_, next_pos_, len_, char_);
-
-  return true;
-}
-
-UTF16CharIterator::UTF16CharIterator(const string16* str)
-    : str_(reinterpret_cast<const char16*>(str->data())),
-      len_(str->size()),
-      array_pos_(0),
-      next_pos_(0),
-      char_pos_(0),
-      char_(0) {
-  if (len_)
-    ReadChar();
-}
-
-UTF16CharIterator::UTF16CharIterator(const char16* str, size_t str_len)
-    : str_(str),
-      len_(str_len),
-      array_pos_(0),
-      next_pos_(0),
-      char_pos_(0),
-      char_(0) {
-  if (len_)
-    ReadChar();
-}
-
-UTF16CharIterator::~UTF16CharIterator() = default;
-
-bool UTF16CharIterator::Advance() {
-  if (array_pos_ >= len_)
-    return false;
-
-  array_pos_ = next_pos_;
-  char_pos_++;
-  if (next_pos_ < len_)
-    ReadChar();
-
-  return true;
-}
-
-void UTF16CharIterator::ReadChar() {
-  // This is actually a huge macro, so is worth having in a separate function.
-  U16_NEXT(str_, next_pos_, len_, char_);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/char_iterator.h b/base/i18n/char_iterator.h
deleted file mode 100644
index 33f2934..0000000
--- a/base/i18n/char_iterator.h
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_CHAR_ITERATOR_H_
-#define BASE_I18N_CHAR_ITERATOR_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "build_config.h"
-
-// The CharIterator classes iterate through the characters in UTF8 and
-// UTF16 strings.  Example usage:
-//
-//   UTF8CharIterator iter(&str);
-//   while (!iter.end()) {
-//     VLOG(1) << iter.get();
-//     iter.Advance();
-//   }
-
-#if defined(OS_WIN)
-typedef unsigned char uint8_t;
-#endif
-
-namespace base {
-namespace i18n {
-
-class BASE_I18N_EXPORT UTF8CharIterator {
- public:
-  // Requires |str| to live as long as the UTF8CharIterator does.
-  explicit UTF8CharIterator(const std::string* str);
-  ~UTF8CharIterator();
-
-  // Return the starting array index of the current character within the
-  // string.
-  int32_t array_pos() const { return array_pos_; }
-
-  // Return the logical index of the current character, independent of the
-  // number of bytes each character takes.
-  int32_t char_pos() const { return char_pos_; }
-
-  // Return the current char.
-  int32_t get() const { return char_; }
-
-  // Returns true if we're at the end of the string.
-  bool end() const { return array_pos_ == len_; }
-
-  // Advance to the next actual character.  Returns false if we're at the
-  // end of the string.
-  bool Advance();
-
- private:
-  // The string we're iterating over.
-  const uint8_t* str_;
-
-  // The length of the encoded string.
-  int32_t len_;
-
-  // Array index.
-  int32_t array_pos_;
-
-  // The next array index.
-  int32_t next_pos_;
-
-  // Character index.
-  int32_t char_pos_;
-
-  // The current character.
-  int32_t char_;
-
-  DISALLOW_COPY_AND_ASSIGN(UTF8CharIterator);
-};
-
-class BASE_I18N_EXPORT UTF16CharIterator {
- public:
-  // Requires |str| to live as long as the UTF16CharIterator does.
-  explicit UTF16CharIterator(const string16* str);
-  UTF16CharIterator(const char16* str, size_t str_len);
-  ~UTF16CharIterator();
-
-  // Return the starting array index of the current character within the
-  // string.
-  int32_t array_pos() const { return array_pos_; }
-
-  // Return the logical index of the current character, independent of the
-  // number of codewords each character takes.
-  int32_t char_pos() const { return char_pos_; }
-
-  // Return the current char.
-  int32_t get() const { return char_; }
-
-  // Returns true if we're at the end of the string.
-  bool end() const { return array_pos_ == len_; }
-
-  // Advance to the next actual character.  Returns false if we're at the
-  // end of the string.
-  bool Advance();
-
- private:
-  // Fills in the current character we found and advances to the next
-  // character, updating all flags as necessary.
-  void ReadChar();
-
-  // The string we're iterating over.
-  const char16* str_;
-
-  // The length of the encoded string.
-  int32_t len_;
-
-  // Array index.
-  int32_t array_pos_;
-
-  // The next array index.
-  int32_t next_pos_;
-
-  // Character index.
-  int32_t char_pos_;
-
-  // The current character.
-  int32_t char_;
-
-  DISALLOW_COPY_AND_ASSIGN(UTF16CharIterator);
-};
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_CHAR_ITERATOR_H_
diff --git a/base/i18n/character_encoding.cc b/base/i18n/character_encoding.cc
deleted file mode 100644
index a1068c3..0000000
--- a/base/i18n/character_encoding.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2016 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/i18n/character_encoding.h"
-
-#include "base/macros.h"
-#include "third_party/icu/source/common/unicode/ucnv.h"
-
-namespace base {
-namespace {
-
-// An array of all supported canonical encoding names.
-const char* const kCanonicalEncodingNames[] = {
-    "Big5",         "EUC-JP",       "EUC-KR",       "gb18030",
-    "GBK",          "IBM866",       "ISO-2022-JP",  "ISO-8859-10",
-    "ISO-8859-13",  "ISO-8859-14",  "ISO-8859-15",  "ISO-8859-16",
-    "ISO-8859-2",   "ISO-8859-3",   "ISO-8859-4",   "ISO-8859-5",
-    "ISO-8859-6",   "ISO-8859-7",   "ISO-8859-8",   "ISO-8859-8-I",
-    "KOI8-R",       "KOI8-U",       "macintosh",    "Shift_JIS",
-    "UTF-16LE",     "UTF-8",        "windows-1250", "windows-1251",
-    "windows-1252", "windows-1253", "windows-1254", "windows-1255",
-    "windows-1256", "windows-1257", "windows-1258", "windows-874"};
-
-}  // namespace
-
-std::string GetCanonicalEncodingNameByAliasName(const std::string& alias_name) {
-  for (auto* encoding_name : kCanonicalEncodingNames) {
-    if (alias_name == encoding_name)
-      return alias_name;
-  }
-  static const char* kStandards[3] = {"HTML", "MIME", "IANA"};
-  for (auto* standard : kStandards) {
-    UErrorCode error_code = U_ZERO_ERROR;
-    const char* canonical_name =
-        ucnv_getStandardName(alias_name.c_str(), standard, &error_code);
-    if (U_SUCCESS(error_code) && canonical_name)
-      return canonical_name;
-  }
-  return std::string();
-}
-}  // namespace base
diff --git a/base/i18n/character_encoding.h b/base/i18n/character_encoding.h
deleted file mode 100644
index 974cb5a..0000000
--- a/base/i18n/character_encoding.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2016 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_I18N_CHARACTER_ENCODING_H_
-#define BASE_I18N_CHARACTER_ENCODING_H_
-
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-
-namespace base {
-
-// Return canonical encoding name according to the encoding alias name.
-BASE_I18N_EXPORT std::string GetCanonicalEncodingNameByAliasName(
-    const std::string& alias_name);
-
-}  // namespace base
-
-#endif  // BASE_I18N_CHARACTER_ENCODING_H_
diff --git a/base/i18n/encoding_detection.cc b/base/i18n/encoding_detection.cc
deleted file mode 100644
index f6bbf4a..0000000
--- a/base/i18n/encoding_detection.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2016 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/i18n/encoding_detection.h"
-
-#include "build_config.h"
-#include "third_party/ced/src/compact_enc_det/compact_enc_det.h"
-
-// third_party/ced/src/util/encodings/encodings.h, which is included
-// by the include above, undefs UNICODE because that is a macro used
-// internally in ced. If we later in the same translation unit do
-// anything related to Windows or Windows headers those will then use
-// the ASCII versions which we do not want. To avoid that happening in
-// jumbo builds, we redefine UNICODE again here.
-#if defined(OS_WIN)
-#define UNICODE 1
-#endif  // OS_WIN
-
-namespace base {
-
-bool DetectEncoding(const std::string& text, std::string* encoding) {
-  int consumed_bytes;
-  bool is_reliable;
-  Encoding enc = CompactEncDet::DetectEncoding(
-      text.c_str(), text.length(), nullptr, nullptr, nullptr,
-      UNKNOWN_ENCODING,
-      UNKNOWN_LANGUAGE,
-      CompactEncDet::QUERY_CORPUS,  // plain text
-      false,  // Include 7-bit encodings
-      &consumed_bytes,
-      &is_reliable);
-
-  if (enc == UNKNOWN_ENCODING)
-    return false;
-
-  *encoding = MimeEncodingName(enc);
-  return true;
-}
-}  // namespace base
diff --git a/base/i18n/encoding_detection.h b/base/i18n/encoding_detection.h
deleted file mode 100644
index c8e660c..0000000
--- a/base/i18n/encoding_detection.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 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_I18N_ENCODING_DETECTION_H_
-#define BASE_I18N_ENCODING_DETECTION_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/i18n/base_i18n_export.h"
-
-namespace base {
-
-// Detect encoding of |text| and put the name of encoding in |encoding|.
-// Returns true on success.
-BASE_I18N_EXPORT bool DetectEncoding(const std::string& text,
-                                     std::string* encoding) WARN_UNUSED_RESULT;
-}  // namespace base
-
-#endif  // BASE_I18N_ENCODING_DETECTION_H_
diff --git a/base/i18n/file_util_icu.cc b/base/i18n/file_util_icu.cc
deleted file mode 100644
index 20a7d2d..0000000
--- a/base/i18n/file_util_icu.cc
+++ /dev/null
@@ -1,179 +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.
-
-// File utilities that use the ICU library go in this file.
-
-#include "base/i18n/file_util_icu.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/i18n/icu_string_conversions.h"
-#include "base/i18n/string_compare.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "base/strings/string_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "third_party/icu/source/common/unicode/uniset.h"
-#include "third_party/icu/source/i18n/unicode/coll.h"
-
-namespace base {
-namespace i18n {
-
-namespace {
-
-class IllegalCharacters {
- public:
-  static IllegalCharacters* GetInstance() {
-    return Singleton<IllegalCharacters>::get();
-  }
-
-  bool DisallowedEverywhere(UChar32 ucs4) {
-    return !!illegal_anywhere_->contains(ucs4);
-  }
-
-  bool DisallowedLeadingOrTrailing(UChar32 ucs4) {
-    return !!illegal_at_ends_->contains(ucs4);
-  }
-
-  bool IsAllowedName(const string16& s) {
-    return s.empty() || (!!illegal_anywhere_->containsNone(
-                             icu::UnicodeString(s.c_str(), s.size())) &&
-                         !illegal_at_ends_->contains(*s.begin()) &&
-                         !illegal_at_ends_->contains(*s.rbegin()));
-  }
-
- private:
-  friend class Singleton<IllegalCharacters>;
-  friend struct DefaultSingletonTraits<IllegalCharacters>;
-
-  IllegalCharacters();
-  ~IllegalCharacters() = default;
-
-  // set of characters considered invalid anywhere inside a filename.
-  std::unique_ptr<icu::UnicodeSet> illegal_anywhere_;
-
-  // set of characters considered invalid at either end of a filename.
-  std::unique_ptr<icu::UnicodeSet> illegal_at_ends_;
-
-  DISALLOW_COPY_AND_ASSIGN(IllegalCharacters);
-};
-
-IllegalCharacters::IllegalCharacters() {
-  UErrorCode everywhere_status = U_ZERO_ERROR;
-  UErrorCode ends_status = U_ZERO_ERROR;
-  // Control characters, formatting characters, non-characters, path separators,
-  // and some printable ASCII characters regarded as dangerous ('"*/:<>?\\').
-  // See  http://blogs.msdn.com/michkap/archive/2006/11/03/941420.aspx
-  // and http://msdn2.microsoft.com/en-us/library/Aa365247.aspx
-  // Note that code points in the "Other, Format" (Cf) category are ignored on
-  // HFS+ despite the ZERO_WIDTH_JOINER and ZERO_WIDTH_NON-JOINER being
-  // legitimate in Arabic and some S/SE Asian scripts. In addition tilde (~) is
-  // also excluded due to the possibility of interacting poorly with short
-  // filenames on VFAT. (Related to CVE-2014-9390)
-  illegal_anywhere_.reset(new icu::UnicodeSet(
-      UNICODE_STRING_SIMPLE("[[\"~*/:<>?\\\\|][:Cc:][:Cf:]]"),
-      everywhere_status));
-  illegal_at_ends_.reset(new icu::UnicodeSet(
-      UNICODE_STRING_SIMPLE("[[:WSpace:][.]]"), ends_status));
-  DCHECK(U_SUCCESS(everywhere_status));
-  DCHECK(U_SUCCESS(ends_status));
-
-  // Add non-characters. If this becomes a performance bottleneck by
-  // any chance, do not add these to |set| and change IsFilenameLegal()
-  // to check |ucs4 & 0xFFFEu == 0xFFFEu|, in addiition to calling
-  // IsAllowedName().
-  illegal_anywhere_->add(0xFDD0, 0xFDEF);
-  for (int i = 0; i <= 0x10; ++i) {
-    int plane_base = 0x10000 * i;
-    illegal_anywhere_->add(plane_base + 0xFFFE, plane_base + 0xFFFF);
-  }
-  illegal_anywhere_->freeze();
-  illegal_at_ends_->freeze();
-}
-
-}  // namespace
-
-bool IsFilenameLegal(const string16& file_name) {
-  return IllegalCharacters::GetInstance()->IsAllowedName(file_name);
-}
-
-void ReplaceIllegalCharactersInPath(FilePath::StringType* file_name,
-                                    char replace_char) {
-  IllegalCharacters* illegal = IllegalCharacters::GetInstance();
-
-  DCHECK(!(illegal->DisallowedEverywhere(replace_char)));
-  DCHECK(!(illegal->DisallowedLeadingOrTrailing(replace_char)));
-
-  int cursor = 0;  // The ICU macros expect an int.
-  while (cursor < static_cast<int>(file_name->size())) {
-    int char_begin = cursor;
-    uint32_t code_point;
-#if defined(OS_WIN)
-    // Windows uses UTF-16 encoding for filenames.
-    U16_NEXT(file_name->data(), cursor, static_cast<int>(file_name->length()),
-             code_point);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-    // Mac and Chrome OS use UTF-8 encoding for filenames.
-    // Linux doesn't actually define file system encoding. Try to parse as
-    // UTF-8.
-    U8_NEXT(file_name->data(), cursor, static_cast<int>(file_name->length()),
-            code_point);
-#else
-#error Unsupported platform
-#endif
-
-    if (illegal->DisallowedEverywhere(code_point) ||
-        ((char_begin == 0 || cursor == static_cast<int>(file_name->length())) &&
-         illegal->DisallowedLeadingOrTrailing(code_point))) {
-      file_name->replace(char_begin, cursor - char_begin, 1, replace_char);
-      // We just made the potentially multi-byte/word char into one that only
-      // takes one byte/word, so need to adjust the cursor to point to the next
-      // character again.
-      cursor = char_begin + 1;
-    }
-  }
-}
-
-bool LocaleAwareCompareFilenames(const FilePath& a, const FilePath& b) {
-  UErrorCode error_code = U_ZERO_ERROR;
-  // Use the default collator. The default locale should have been properly
-  // set by the time this constructor is called.
-  std::unique_ptr<icu::Collator> collator(
-      icu::Collator::createInstance(error_code));
-  DCHECK(U_SUCCESS(error_code));
-  // Make it case-sensitive.
-  collator->setStrength(icu::Collator::TERTIARY);
-
-#if defined(OS_WIN)
-  return CompareString16WithCollator(*collator, WideToUTF16(a.value()),
-                                     WideToUTF16(b.value())) == UCOL_LESS;
-
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  // On linux, the file system encoding is not defined. We assume
-  // SysNativeMBToWide takes care of it.
-  return CompareString16WithCollator(
-             *collator, WideToUTF16(SysNativeMBToWide(a.value())),
-             WideToUTF16(SysNativeMBToWide(b.value()))) == UCOL_LESS;
-#endif
-}
-
-void NormalizeFileNameEncoding(FilePath* file_name) {
-#if defined(OS_CHROMEOS)
-  std::string normalized_str;
-  if (ConvertToUtf8AndNormalize(file_name->BaseName().value(), kCodepageUTF8,
-                                &normalized_str) &&
-      !normalized_str.empty()) {
-    *file_name = file_name->DirName().Append(FilePath(normalized_str));
-  }
-#endif
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/file_util_icu.h b/base/i18n/file_util_icu.h
deleted file mode 100644
index f8bd9f4..0000000
--- a/base/i18n/file_util_icu.h
+++ /dev/null
@@ -1,58 +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_I18N_FILE_UTIL_ICU_H_
-#define BASE_I18N_FILE_UTIL_ICU_H_
-
-// File utilities that use the ICU library go in this file.
-
-#include "base/files/file_path.h"
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-
-namespace base {
-namespace i18n {
-
-// Returns true if file_name does not have any illegal character. The input
-// param has the same restriction as that for ReplaceIllegalCharacters.
-BASE_I18N_EXPORT bool IsFilenameLegal(const string16& file_name);
-
-// Replaces characters in |file_name| that are illegal for file names with
-// |replace_char|. |file_name| must not be a full or relative path, but just the
-// file name component (since slashes are considered illegal). Any leading or
-// trailing whitespace or periods in |file_name| is also replaced with the
-// |replace_char|.
-//
-// Example:
-//   "bad:file*name?.txt" will be turned into "bad_file_name_.txt" when
-//   |replace_char| is '_'.
-//
-// Warning: Do not use this function as the sole means of sanitizing a filename.
-//   While the resulting filename itself would be legal, it doesn't necessarily
-//   mean that the file will behave safely. On Windows, certain reserved names
-//   refer to devices rather than files (E.g. LPT1), and some filenames could be
-//   interpreted as shell namespace extensions (E.g. Foo.{<GUID>}).
-//
-// On Windows, Chrome OS and Mac, the file system encoding is already known and
-// parsed as UTF-8 and UTF-16 accordingly.
-// On Linux, the file name will be parsed as UTF8.
-// TODO(asanka): Move full filename sanitization logic here.
-BASE_I18N_EXPORT void ReplaceIllegalCharactersInPath(
-    FilePath::StringType* file_name,
-    char replace_char);
-
-// Compares two filenames using the current locale information. This can be
-// used to sort directory listings. It behaves like "operator<" for use in
-// std::sort.
-BASE_I18N_EXPORT bool LocaleAwareCompareFilenames(const FilePath& a,
-                                                  const FilePath& b);
-
-// Calculates the canonical file-system representation of |file_name| base name.
-// Modifies |file_name| in place. No-op if not on ChromeOS.
-BASE_I18N_EXPORT void NormalizeFileNameEncoding(FilePath* file_name);
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_FILE_UTIL_ICU_H_
diff --git a/base/i18n/i18n_constants.cc b/base/i18n/i18n_constants.cc
deleted file mode 100644
index 7d2f5fc..0000000
--- a/base/i18n/i18n_constants.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/i18n_constants.h"
-
-namespace base {
-
-const char kCodepageLatin1[] = "ISO-8859-1";
-const char kCodepageUTF8[] = "UTF-8";
-
-}  // namespace base
-
diff --git a/base/i18n/i18n_constants.h b/base/i18n/i18n_constants.h
deleted file mode 100644
index c1bd87d..0000000
--- a/base/i18n/i18n_constants.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_I18N_CONSTANTS_H_
-#define BASE_I18N_I18N_CONSTANTS_H_
-
-#include "base/i18n/base_i18n_export.h"
-
-namespace base {
-
-// Names of codepages (charsets) understood by icu.
-BASE_I18N_EXPORT extern const char kCodepageLatin1[];  // a.k.a. ISO 8859-1
-BASE_I18N_EXPORT extern const char kCodepageUTF8[];
-
-// The other possible options are UTF-16BE and UTF-16LE, but they are unused in
-// Chromium as of this writing.
-
-}  // namespace base
-
-#endif  // BASE_I18N_I18N_CONSTANTS_H_
diff --git a/base/i18n/icu_string_conversions.cc b/base/i18n/icu_string_conversions.cc
deleted file mode 100644
index 6ec9980..0000000
--- a/base/i18n/icu_string_conversions.cc
+++ /dev/null
@@ -1,223 +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/i18n/icu_string_conversions.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "third_party/icu/source/common/unicode/normalizer2.h"
-#include "third_party/icu/source/common/unicode/ucnv.h"
-#include "third_party/icu/source/common/unicode/ucnv_cb.h"
-#include "third_party/icu/source/common/unicode/ucnv_err.h"
-#include "third_party/icu/source/common/unicode/ustring.h"
-
-namespace base {
-
-namespace {
-// ToUnicodeCallbackSubstitute() is based on UCNV_TO_U_CALLBACK_SUBSTITUTE
-// in source/common/ucnv_err.c.
-
-// Copyright (c) 1995-2006 International Business Machines Corporation
-// and others
-//
-// All rights reserved.
-//
-
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, and/or
-// sell copies of the Software, and to permit persons to whom the Software
-// is furnished to do so, provided that the above copyright notice(s) and
-// this permission notice appear in all copies of the Software and that
-// both the above copyright notice(s) and this permission notice appear in
-// supporting documentation.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-// OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
-// INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
-// OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-// OR PERFORMANCE OF THIS SOFTWARE.
-//
-// Except as contained in this notice, the name of a copyright holder
-// shall not be used in advertising or otherwise to promote the sale, use
-// or other dealings in this Software without prior written authorization
-// of the copyright holder.
-
-//  ___________________________________________________________________________
-//
-// All trademarks and registered trademarks mentioned herein are the property
-// of their respective owners.
-
-void ToUnicodeCallbackSubstitute(const void* context,
-                                 UConverterToUnicodeArgs *to_args,
-                                 const char* code_units,
-                                 int32_t length,
-                                 UConverterCallbackReason reason,
-                                 UErrorCode * err) {
-  static const UChar kReplacementChar = 0xFFFD;
-  if (reason <= UCNV_IRREGULAR) {
-    if (context == nullptr ||
-        (*(reinterpret_cast<const char*>(context)) == 'i' &&
-         reason == UCNV_UNASSIGNED)) {
-      *err = U_ZERO_ERROR;
-      ucnv_cbToUWriteUChars(to_args, &kReplacementChar, 1, 0, err);
-      }
-      // else the caller must have set the error code accordingly.
-  }
-  // else ignore the reset, close and clone calls.
-}
-
-bool ConvertFromUTF16(UConverter* converter, const UChar* uchar_src,
-                      int uchar_len, OnStringConversionError::Type on_error,
-                      std::string* encoded) {
-  int encoded_max_length = UCNV_GET_MAX_BYTES_FOR_STRING(uchar_len,
-      ucnv_getMaxCharSize(converter));
-  encoded->resize(encoded_max_length);
-
-  UErrorCode status = U_ZERO_ERROR;
-
-  // Setup our error handler.
-  switch (on_error) {
-    case OnStringConversionError::FAIL:
-      ucnv_setFromUCallBack(converter, UCNV_FROM_U_CALLBACK_STOP, nullptr,
-                            nullptr, nullptr, &status);
-      break;
-    case OnStringConversionError::SKIP:
-    case OnStringConversionError::SUBSTITUTE:
-      ucnv_setFromUCallBack(converter, UCNV_FROM_U_CALLBACK_SKIP, nullptr,
-                            nullptr, nullptr, &status);
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  // ucnv_fromUChars returns size not including terminating null
-  int actual_size = ucnv_fromUChars(converter, &(*encoded)[0],
-      encoded_max_length, uchar_src, uchar_len, &status);
-  encoded->resize(actual_size);
-  ucnv_close(converter);
-  if (U_SUCCESS(status))
-    return true;
-  encoded->clear();  // Make sure the output is empty on error.
-  return false;
-}
-
-// Set up our error handler for ToUTF-16 converters
-void SetUpErrorHandlerForToUChars(OnStringConversionError::Type on_error,
-                                  UConverter* converter, UErrorCode* status) {
-  switch (on_error) {
-    case OnStringConversionError::FAIL:
-      ucnv_setToUCallBack(converter, UCNV_TO_U_CALLBACK_STOP, nullptr, nullptr,
-                          nullptr, status);
-      break;
-    case OnStringConversionError::SKIP:
-      ucnv_setToUCallBack(converter, UCNV_TO_U_CALLBACK_SKIP, nullptr, nullptr,
-                          nullptr, status);
-      break;
-    case OnStringConversionError::SUBSTITUTE:
-      ucnv_setToUCallBack(converter, ToUnicodeCallbackSubstitute, nullptr,
-                          nullptr, nullptr, status);
-      break;
-    default:
-      NOTREACHED();
-  }
-}
-
-}  // namespace
-
-// Codepage <-> Wide/UTF-16  ---------------------------------------------------
-
-bool UTF16ToCodepage(const string16& utf16,
-                     const char* codepage_name,
-                     OnStringConversionError::Type on_error,
-                     std::string* encoded) {
-  encoded->clear();
-
-  UErrorCode status = U_ZERO_ERROR;
-  UConverter* converter = ucnv_open(codepage_name, &status);
-  if (!U_SUCCESS(status))
-    return false;
-
-  return ConvertFromUTF16(converter, utf16.c_str(),
-                          static_cast<int>(utf16.length()), on_error, encoded);
-}
-
-bool CodepageToUTF16(const std::string& encoded,
-                     const char* codepage_name,
-                     OnStringConversionError::Type on_error,
-                     string16* utf16) {
-  utf16->clear();
-
-  UErrorCode status = U_ZERO_ERROR;
-  UConverter* converter = ucnv_open(codepage_name, &status);
-  if (!U_SUCCESS(status))
-    return false;
-
-  // Even in the worst case, the maximum length in 2-byte units of UTF-16
-  // output would be at most the same as the number of bytes in input. There
-  // is no single-byte encoding in which a character is mapped to a
-  // non-BMP character requiring two 2-byte units.
-  //
-  // Moreover, non-BMP characters in legacy multibyte encodings
-  // (e.g. EUC-JP, GB18030) take at least 2 bytes. The only exceptions are
-  // BOCU and SCSU, but we don't care about them.
-  size_t uchar_max_length = encoded.length() + 1;
-
-  SetUpErrorHandlerForToUChars(on_error, converter, &status);
-  std::unique_ptr<char16[]> buffer(new char16[uchar_max_length]);
-  int actual_size = ucnv_toUChars(converter, buffer.get(),
-      static_cast<int>(uchar_max_length), encoded.data(),
-      static_cast<int>(encoded.length()), &status);
-  ucnv_close(converter);
-  if (!U_SUCCESS(status)) {
-    utf16->clear();  // Make sure the output is empty on error.
-    return false;
-  }
-
-  utf16->assign(buffer.get(), actual_size);
-  return true;
-}
-
-bool ConvertToUtf8AndNormalize(const std::string& text,
-                               const std::string& charset,
-                               std::string* result) {
-  result->clear();
-  string16 utf16;
-  if (!CodepageToUTF16(
-      text, charset.c_str(), OnStringConversionError::FAIL, &utf16))
-    return false;
-
-  UErrorCode status = U_ZERO_ERROR;
-  const icu::Normalizer2* normalizer = icu::Normalizer2::getNFCInstance(status);
-  DCHECK(U_SUCCESS(status));
-  if (U_FAILURE(status))
-    return false;
-  int32_t utf16_length = static_cast<int32_t>(utf16.length());
-  icu::UnicodeString normalized(utf16.data(), utf16_length);
-  int32_t normalized_prefix_length =
-      normalizer->spanQuickCheckYes(normalized, status);
-  if (normalized_prefix_length < utf16_length) {
-    icu::UnicodeString un_normalized(normalized, normalized_prefix_length);
-    normalized.truncate(normalized_prefix_length);
-    normalizer->normalizeSecondAndAppend(normalized, un_normalized, status);
-  }
-  if (U_FAILURE(status))
-    return false;
-  normalized.toUTF8String(*result);
-  return true;
-}
-
-}  // namespace base
diff --git a/base/i18n/icu_string_conversions.h b/base/i18n/icu_string_conversions.h
deleted file mode 100644
index cbdcb99..0000000
--- a/base/i18n/icu_string_conversions.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_ICU_STRING_CONVERSIONS_H_
-#define BASE_I18N_ICU_STRING_CONVERSIONS_H_
-
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/i18n/i18n_constants.h"
-#include "base/strings/string16.h"
-
-namespace base {
-
-// Defines the error handling modes of UTF16ToCodepage and CodepageToUTF16.
-class OnStringConversionError {
- public:
-  enum Type {
-    // The function will return failure. The output buffer will be empty.
-    FAIL,
-
-    // The offending characters are skipped and the conversion will proceed as
-    // if they did not exist.
-    SKIP,
-
-    // When converting to Unicode, the offending byte sequences are substituted
-    // by Unicode replacement character (U+FFFD). When converting from Unicode,
-    // this is the same as SKIP.
-    SUBSTITUTE,
-  };
-
- private:
-  OnStringConversionError() = delete;
-};
-
-// Converts between UTF-16 strings and the encoding specified.  If the
-// encoding doesn't exist or the encoding fails (when on_error is FAIL),
-// returns false.
-BASE_I18N_EXPORT bool UTF16ToCodepage(const string16& utf16,
-                                      const char* codepage_name,
-                                      OnStringConversionError::Type on_error,
-                                      std::string* encoded);
-BASE_I18N_EXPORT bool CodepageToUTF16(const std::string& encoded,
-                                      const char* codepage_name,
-                                      OnStringConversionError::Type on_error,
-                                      string16* utf16);
-
-// Converts from any codepage to UTF-8 and ensures the resulting UTF-8 is
-// normalized.
-BASE_I18N_EXPORT bool ConvertToUtf8AndNormalize(const std::string& text,
-                                                const std::string& charset,
-                                                std::string* result);
-
-}  // namespace base
-
-#endif  // BASE_I18N_ICU_STRING_CONVERSIONS_H_
diff --git a/base/i18n/icu_util.cc b/base/i18n/icu_util.cc
deleted file mode 100644
index 1cbfbd6..0000000
--- a/base/i18n/icu_util.cc
+++ /dev/null
@@ -1,275 +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/i18n/icu_util.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-#include <string>
-
-#include "base/debug/alias.h"
-#include "base/files/file_path.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/strings/string_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "build_config.h"
-#include "third_party/icu/source/common/unicode/putil.h"
-#include "third_party/icu/source/common/unicode/udata.h"
-#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_ANDROID)
-#include "third_party/icu/source/i18n/unicode/timezone.h"
-#endif
-
-#if defined(OS_ANDROID)
-#include "base/android/apk_assets.h"
-#include "base/android/timezone_utils.h"
-#endif
-
-#if defined(OS_IOS)
-#include "base/ios/ios_util.h"
-#endif
-
-#if defined(OS_MACOSX)
-#include "base/mac/foundation_util.h"
-#endif
-
-#if defined(OS_FUCHSIA)
-#include "base/base_paths_fuchsia.h"
-#endif
-
-namespace base {
-namespace i18n {
-
-#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_SHARED
-#define ICU_UTIL_DATA_SYMBOL "icudt" U_ICU_VERSION_SHORT "_dat"
-#if defined(OS_WIN)
-#define ICU_UTIL_DATA_SHARED_MODULE_NAME "icudt.dll"
-#endif
-#endif
-
-namespace {
-#if !defined(OS_NACL)
-#if DCHECK_IS_ON()
-// Assert that we are not called more than once.  Even though calling this
-// function isn't harmful (ICU can handle it), being called twice probably
-// indicates a programming error.
-bool g_check_called_once = true;
-bool g_called_once = false;
-#endif  // DCHECK_IS_ON()
-
-#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-
-// Use an unversioned file name to simplify a icu version update down the road.
-// No need to change the filename in multiple places (gyp files, windows
-// build pkg configurations, etc). 'l' stands for Little Endian.
-// This variable is exported through the header file.
-const char kIcuDataFileName[] = "icudtl.dat";
-#if defined(OS_ANDROID)
-const char kAndroidAssetsIcuDataFileName[] = "assets/icudtl.dat";
-#endif
-
-// File handle intentionally never closed. Not using File here because its
-// Windows implementation guards against two instances owning the same
-// PlatformFile (which we allow since we know it is never freed).
-PlatformFile g_icudtl_pf = kInvalidPlatformFile;
-MemoryMappedFile* g_icudtl_mapped_file = nullptr;
-MemoryMappedFile::Region g_icudtl_region;
-
-void LazyInitIcuDataFile() {
-  if (g_icudtl_pf != kInvalidPlatformFile) {
-    return;
-  }
-#if defined(OS_ANDROID)
-  int fd = base::android::OpenApkAsset(kAndroidAssetsIcuDataFileName,
-                                       &g_icudtl_region);
-  g_icudtl_pf = fd;
-  if (fd != -1) {
-    return;
-  }
-// For unit tests, data file is located on disk, so try there as a fallback.
-#endif  // defined(OS_ANDROID)
-#if !defined(OS_MACOSX)
-  FilePath data_path;
-  if (!PathService::Get(DIR_ASSETS, &data_path)) {
-    LOG(ERROR) << "Can't find " << kIcuDataFileName;
-    return;
-  }
-  data_path = data_path.AppendASCII(kIcuDataFileName);
-#else
-  // Assume it is in the framework bundle's Resources directory.
-  ScopedCFTypeRef<CFStringRef> data_file_name(
-      SysUTF8ToCFStringRef(kIcuDataFileName));
-  FilePath data_path = mac::PathForFrameworkBundleResource(data_file_name);
-#if defined(OS_IOS)
-  FilePath override_data_path = base::ios::FilePathOfEmbeddedICU();
-  if (!override_data_path.empty()) {
-    data_path = override_data_path;
-  }
-#endif  // !defined(OS_IOS)
-  if (data_path.empty()) {
-    LOG(ERROR) << kIcuDataFileName << " not found in bundle";
-    return;
-  }
-#endif  // !defined(OS_MACOSX)
-  File file(data_path, File::FLAG_OPEN | File::FLAG_READ);
-  if (file.IsValid()) {
-    g_icudtl_pf = file.TakePlatformFile();
-    g_icudtl_region = MemoryMappedFile::Region::kWholeFile;
-  }
-}
-
-bool InitializeICUWithFileDescriptorInternal(
-    PlatformFile data_fd,
-    const MemoryMappedFile::Region& data_region) {
-  // This can be called multiple times in tests.
-  if (g_icudtl_mapped_file) {
-    return true;
-  }
-  if (data_fd == kInvalidPlatformFile) {
-    LOG(ERROR) << "Invalid file descriptor to ICU data received.";
-    return false;
-  }
-
-  std::unique_ptr<MemoryMappedFile> icudtl_mapped_file(new MemoryMappedFile());
-  if (!icudtl_mapped_file->Initialize(File(data_fd), data_region)) {
-    LOG(ERROR) << "Couldn't mmap icu data file";
-    return false;
-  }
-  g_icudtl_mapped_file = icudtl_mapped_file.release();
-
-  UErrorCode err = U_ZERO_ERROR;
-  udata_setCommonData(const_cast<uint8_t*>(g_icudtl_mapped_file->data()), &err);
-#if defined(OS_ANDROID)
-  if (err == U_ZERO_ERROR) {
-    // On Android, we can't leave it up to ICU to set the default timezone
-    // because ICU's timezone detection does not work in many timezones (e.g.
-    // Australia/Sydney, Asia/Seoul, Europe/Paris ). Use JNI to detect the host
-    // timezone and set the ICU default timezone accordingly in advance of
-    // actual use. See crbug.com/722821 and
-    // https://ssl.icu-project.org/trac/ticket/13208 .
-    base::string16 timezone_id = base::android::GetDefaultTimeZoneId();
-    icu::TimeZone::adoptDefault(icu::TimeZone::createTimeZone(
-        icu::UnicodeString(FALSE, timezone_id.data(), timezone_id.length())));
-  }
-#endif
-  // Never try to load ICU data from files.
-  udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
-  return err == U_ZERO_ERROR;
-}
-#endif  // ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-#endif  // !defined(OS_NACL)
-
-}  // namespace
-
-#if !defined(OS_NACL)
-#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-#if defined(OS_ANDROID)
-bool InitializeICUWithFileDescriptor(
-    PlatformFile data_fd,
-    const MemoryMappedFile::Region& data_region) {
-#if DCHECK_IS_ON()
-  DCHECK(!g_check_called_once || !g_called_once);
-  g_called_once = true;
-#endif
-  return InitializeICUWithFileDescriptorInternal(data_fd, data_region);
-}
-
-PlatformFile GetIcuDataFileHandle(MemoryMappedFile::Region* out_region) {
-  CHECK_NE(g_icudtl_pf, kInvalidPlatformFile);
-  *out_region = g_icudtl_region;
-  return g_icudtl_pf;
-}
-#endif
-
-const uint8_t* GetRawIcuMemory() {
-  CHECK(g_icudtl_mapped_file);
-  return g_icudtl_mapped_file->data();
-}
-
-bool InitializeICUFromRawMemory(const uint8_t* raw_memory) {
-#if !defined(COMPONENT_BUILD)
-#if DCHECK_IS_ON()
-  DCHECK(!g_check_called_once || !g_called_once);
-  g_called_once = true;
-#endif
-
-  UErrorCode err = U_ZERO_ERROR;
-  udata_setCommonData(const_cast<uint8_t*>(raw_memory), &err);
-  // Never try to load ICU data from files.
-  udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
-  return err == U_ZERO_ERROR;
-#else
-  return true;
-#endif
-}
-
-#endif  // ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-
-bool InitializeICU() {
-#if DCHECK_IS_ON()
-  DCHECK(!g_check_called_once || !g_called_once);
-  g_called_once = true;
-#endif
-
-  bool result;
-#if (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_SHARED)
-  FilePath data_path;
-  PathService::Get(DIR_ASSETS, &data_path);
-  data_path = data_path.AppendASCII(ICU_UTIL_DATA_SHARED_MODULE_NAME);
-
-  HMODULE module = LoadLibrary(data_path.value().c_str());
-  if (!module) {
-    LOG(ERROR) << "Failed to load " << ICU_UTIL_DATA_SHARED_MODULE_NAME;
-    return false;
-  }
-
-  FARPROC addr = GetProcAddress(module, ICU_UTIL_DATA_SYMBOL);
-  if (!addr) {
-    LOG(ERROR) << ICU_UTIL_DATA_SYMBOL << ": not found in "
-               << ICU_UTIL_DATA_SHARED_MODULE_NAME;
-    return false;
-  }
-
-  UErrorCode err = U_ZERO_ERROR;
-  udata_setCommonData(reinterpret_cast<void*>(addr), &err);
-  // Never try to load ICU data from files.
-  udata_setFileAccess(UDATA_ONLY_PACKAGES, &err);
-  result = (err == U_ZERO_ERROR);
-#elif (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_STATIC)
-  // The ICU data is statically linked.
-  result = true;
-#elif (ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE)
-  // If the ICU data directory is set, ICU won't actually load the data until
-  // it is needed.  This can fail if the process is sandboxed at that time.
-  // Instead, we map the file in and hand off the data so the sandbox won't
-  // cause any problems.
-  LazyInitIcuDataFile();
-  result =
-      InitializeICUWithFileDescriptorInternal(g_icudtl_pf, g_icudtl_region);
-#endif
-
-// To respond to the timezone change properly, the default timezone
-// cache in ICU has to be populated on starting up.
-// TODO(jungshik): Some callers do not care about tz at all. If necessary,
-// add a boolean argument to this function to init'd the default tz only
-// when requested.
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-  if (result)
-    std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
-#endif
-  return result;
-}
-#endif  // !defined(OS_NACL)
-
-void AllowMultipleInitializeCallsForTesting() {
-#if DCHECK_IS_ON() && !defined(OS_NACL)
-  g_check_called_once = false;
-#endif
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/icu_util.h b/base/i18n/icu_util.h
deleted file mode 100644
index 9bae8a1..0000000
--- a/base/i18n/icu_util.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_ICU_UTIL_H_
-#define BASE_I18N_ICU_UTIL_H_
-
-#include <stdint.h>
-
-#include "base/files/memory_mapped_file.h"
-#include "base/i18n/base_i18n_export.h"
-#include "build_config.h"
-
-#define ICU_UTIL_DATA_FILE   0
-#define ICU_UTIL_DATA_SHARED 1
-#define ICU_UTIL_DATA_STATIC 2
-
-namespace base {
-namespace i18n {
-
-#if !defined(OS_NACL)
-// Call this function to load ICU's data tables for the current process.  This
-// function should be called before ICU is used.
-BASE_I18N_EXPORT bool InitializeICU();
-
-#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-#if defined(OS_ANDROID)
-// Returns the PlatformFile and Region that was initialized by InitializeICU().
-// Use with InitializeICUWithFileDescriptor().
-BASE_I18N_EXPORT PlatformFile GetIcuDataFileHandle(
-    MemoryMappedFile::Region* out_region);
-
-// Android uses a file descriptor passed by browser process to initialize ICU
-// in render processes.
-BASE_I18N_EXPORT bool InitializeICUWithFileDescriptor(
-    PlatformFile data_fd,
-    const MemoryMappedFile::Region& data_region);
-#endif
-
-// Returns a void pointer to the memory mapped ICU data file.
-//
-// There are cases on Android where we would be unsafely reusing a file
-// descriptor within the same process when initializing two copies of ICU from
-// different binaries in the same address space. This returns an unowned
-// pointer to the memory mapped icu data file; consumers copies of base must
-// not outlive the copy of base that owns the memory mapped file.
-BASE_I18N_EXPORT const uint8_t* GetRawIcuMemory();
-
-// Initializes ICU memory
-//
-// This does nothing in component builds; this initialization should only be
-// done in cases where there could be two copies of base in a single process in
-// non-component builds. (The big example is standalone service libraries: the
-// Service Manager will have a copy of base linked in, and the majority of
-// service libraries will have base linked in but in non-component builds,
-// these will be separate copies of base.)
-BASE_I18N_EXPORT bool InitializeICUFromRawMemory(const uint8_t* raw_memory);
-#endif  // ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE
-#endif  // !defined(OS_NACL)
-
-// In a test binary, the call above might occur twice.
-BASE_I18N_EXPORT void AllowMultipleInitializeCallsForTesting();
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_ICU_UTIL_H_
diff --git a/base/i18n/message_formatter.cc b/base/i18n/message_formatter.cc
deleted file mode 100644
index c69dd07..0000000
--- a/base/i18n/message_formatter.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright 2015 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/i18n/message_formatter.h"
-
-#include "base/i18n/unicodestring.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/time/time.h"
-#include "third_party/icu/source/common/unicode/unistr.h"
-#include "third_party/icu/source/common/unicode/utypes.h"
-#include "third_party/icu/source/i18n/unicode/fmtable.h"
-#include "third_party/icu/source/i18n/unicode/msgfmt.h"
-
-using icu::UnicodeString;
-
-namespace base {
-namespace i18n {
-namespace {
-UnicodeString UnicodeStringFromStringPiece(StringPiece str) {
-  return UnicodeString::fromUTF8(
-      icu::StringPiece(str.data(), base::checked_cast<int32_t>(str.size())));
-}
-}  // anonymous namespace
-
-namespace internal {
-MessageArg::MessageArg() : formattable(nullptr) {}
-
-MessageArg::MessageArg(const char* s)
-    : formattable(new icu::Formattable(UnicodeStringFromStringPiece(s))) {}
-
-MessageArg::MessageArg(StringPiece s)
-    : formattable(new icu::Formattable(UnicodeStringFromStringPiece(s))) {}
-
-MessageArg::MessageArg(const std::string& s)
-    : formattable(new icu::Formattable(UnicodeString::fromUTF8(s))) {}
-
-MessageArg::MessageArg(const string16& s)
-    : formattable(new icu::Formattable(UnicodeString(s.data(), s.size()))) {}
-
-MessageArg::MessageArg(int i) : formattable(new icu::Formattable(i)) {}
-
-MessageArg::MessageArg(int64_t i) : formattable(new icu::Formattable(i)) {}
-
-MessageArg::MessageArg(double d) : formattable(new icu::Formattable(d)) {}
-
-MessageArg::MessageArg(const Time& t)
-    : formattable(new icu::Formattable(static_cast<UDate>(t.ToJsTime()))) {}
-
-MessageArg::~MessageArg() = default;
-
-// Tests if this argument has a value, and if so increments *count.
-bool MessageArg::has_value(int *count) const {
-  if (formattable == nullptr)
-    return false;
-
-  ++*count;
-  return true;
-}
-
-}  // namespace internal
-
-string16 MessageFormatter::FormatWithNumberedArgs(
-    StringPiece16 msg,
-    const internal::MessageArg& arg0,
-    const internal::MessageArg& arg1,
-    const internal::MessageArg& arg2,
-    const internal::MessageArg& arg3,
-    const internal::MessageArg& arg4,
-    const internal::MessageArg& arg5,
-    const internal::MessageArg& arg6) {
-  int32_t args_count = 0;
-  icu::Formattable args[] = {
-      arg0.has_value(&args_count) ? *arg0.formattable : icu::Formattable(),
-      arg1.has_value(&args_count) ? *arg1.formattable : icu::Formattable(),
-      arg2.has_value(&args_count) ? *arg2.formattable : icu::Formattable(),
-      arg3.has_value(&args_count) ? *arg3.formattable : icu::Formattable(),
-      arg4.has_value(&args_count) ? *arg4.formattable : icu::Formattable(),
-      arg5.has_value(&args_count) ? *arg5.formattable : icu::Formattable(),
-      arg6.has_value(&args_count) ? *arg6.formattable : icu::Formattable(),
-  };
-
-  UnicodeString msg_string(msg.data(), msg.size());
-  UErrorCode error = U_ZERO_ERROR;
-  icu::MessageFormat format(msg_string,  error);
-  icu::UnicodeString formatted;
-  icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
-  format.format(args, args_count, formatted, ignore, error);
-  if (U_FAILURE(error)) {
-    LOG(ERROR) << "MessageFormat(" << msg.as_string() << ") failed with "
-               << u_errorName(error);
-    return string16();
-  }
-  return i18n::UnicodeStringToString16(formatted);
-}
-
-string16 MessageFormatter::FormatWithNamedArgs(
-    StringPiece16 msg,
-    StringPiece name0, const internal::MessageArg& arg0,
-    StringPiece name1, const internal::MessageArg& arg1,
-    StringPiece name2, const internal::MessageArg& arg2,
-    StringPiece name3, const internal::MessageArg& arg3,
-    StringPiece name4, const internal::MessageArg& arg4,
-    StringPiece name5, const internal::MessageArg& arg5,
-    StringPiece name6, const internal::MessageArg& arg6) {
-  icu::UnicodeString names[] = {
-      UnicodeStringFromStringPiece(name0),
-      UnicodeStringFromStringPiece(name1),
-      UnicodeStringFromStringPiece(name2),
-      UnicodeStringFromStringPiece(name3),
-      UnicodeStringFromStringPiece(name4),
-      UnicodeStringFromStringPiece(name5),
-      UnicodeStringFromStringPiece(name6),
-  };
-  int32_t args_count = 0;
-  icu::Formattable args[] = {
-      arg0.has_value(&args_count) ? *arg0.formattable : icu::Formattable(),
-      arg1.has_value(&args_count) ? *arg1.formattable : icu::Formattable(),
-      arg2.has_value(&args_count) ? *arg2.formattable : icu::Formattable(),
-      arg3.has_value(&args_count) ? *arg3.formattable : icu::Formattable(),
-      arg4.has_value(&args_count) ? *arg4.formattable : icu::Formattable(),
-      arg5.has_value(&args_count) ? *arg5.formattable : icu::Formattable(),
-      arg6.has_value(&args_count) ? *arg6.formattable : icu::Formattable(),
-  };
-
-  UnicodeString msg_string(msg.data(), msg.size());
-  UErrorCode error = U_ZERO_ERROR;
-  icu::MessageFormat format(msg_string, error);
-
-  icu::UnicodeString formatted;
-  format.format(names, args, args_count, formatted, error);
-  if (U_FAILURE(error)) {
-    LOG(ERROR) << "MessageFormat(" << msg.as_string() << ") failed with "
-               << u_errorName(error);
-    return string16();
-  }
-  return i18n::UnicodeStringToString16(formatted);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/message_formatter.h b/base/i18n/message_formatter.h
deleted file mode 100644
index 36a656d..0000000
--- a/base/i18n/message_formatter.h
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2015 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_I18N_MESSAGE_FORMATTER_H_
-#define BASE_I18N_MESSAGE_FORMATTER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "third_party/icu/source/common/unicode/uversion.h"
-
-U_NAMESPACE_BEGIN
-class Formattable;
-U_NAMESPACE_END
-
-namespace base {
-
-class Time;
-
-namespace i18n {
-
-class MessageFormatter;
-
-namespace internal {
-
-class BASE_I18N_EXPORT MessageArg {
- public:
-  MessageArg(const char* s);
-  MessageArg(StringPiece s);
-  MessageArg(const std::string& s);
-  MessageArg(const string16& s);
-  MessageArg(int i);
-  MessageArg(int64_t i);
-  MessageArg(double d);
-  MessageArg(const Time& t);
-  ~MessageArg();
-
- private:
-  friend class base::i18n::MessageFormatter;
-  MessageArg();
-  // Tests if this argument has a value, and if so increments *count.
-  bool has_value(int* count) const;
-  std::unique_ptr<icu::Formattable> formattable;
-  DISALLOW_COPY_AND_ASSIGN(MessageArg);
-};
-
-}  // namespace internal
-
-// Message Formatter with the ICU message format syntax support.
-// It can format strings (UTF-8 and UTF-16), numbers and base::Time with
-// plural, gender and other 'selectors' support. This is handy if you
-// have multiple parameters of differnt types and some of them require
-// plural or gender/selector support.
-//
-// To use this API for locale-sensitive formatting, retrieve a 'message
-// template' in the ICU message format from a message bundle (e.g. with
-// l10n_util::GetStringUTF16()) and pass it to FormatWith{Named,Numbered}Args.
-//
-// MessageFormat specs:
-//   http://icu-project.org/apiref/icu4j/com/ibm/icu/text/MessageFormat.html
-//   http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html#details
-// Examples:
-//   http://userguide.icu-project.org/formatparse/messages
-//   message_formatter_unittest.cc
-//   go/plurals inside Google.
-//   TODO(jshin): Document this API in md format docs.
-// Caveat:
-//   When plural/select/gender is used along with other format specifiers such
-//   as date or number, plural/select/gender should be at the top level. It's
-//   not an ICU restriction but a constraint imposed by Google's translation
-//   infrastructure. Message A does not work. It must be revised to Message B.
-//
-//     A.
-//       Rated <ph name="RATING">{0, number,0.0}<ex>3.2</ex></ph>
-//       by {1, plural, =1{a user} other{# users}}
-//
-//     B.
-//       {1, plural,
-//         =1{Rated <ph name="RATING">{0, number,0.0}<ex>3.2</ex></ph>
-//             by a user.}
-//         other{Rated <ph name="RATING">{0, number,0.0}<ex>3.2</ex></ph>
-//               by # users.}}
-
-class BASE_I18N_EXPORT MessageFormatter {
- public:
-  static string16 FormatWithNamedArgs(
-      StringPiece16 msg,
-      StringPiece name0 = StringPiece(),
-      const internal::MessageArg& arg0 = internal::MessageArg(),
-      StringPiece name1 = StringPiece(),
-      const internal::MessageArg& arg1 = internal::MessageArg(),
-      StringPiece name2 = StringPiece(),
-      const internal::MessageArg& arg2 = internal::MessageArg(),
-      StringPiece name3 = StringPiece(),
-      const internal::MessageArg& arg3 = internal::MessageArg(),
-      StringPiece name4 = StringPiece(),
-      const internal::MessageArg& arg4 = internal::MessageArg(),
-      StringPiece name5 = StringPiece(),
-      const internal::MessageArg& arg5 = internal::MessageArg(),
-      StringPiece name6 = StringPiece(),
-      const internal::MessageArg& arg6 = internal::MessageArg());
-
-  static string16 FormatWithNumberedArgs(
-      StringPiece16 msg,
-      const internal::MessageArg& arg0 = internal::MessageArg(),
-      const internal::MessageArg& arg1 = internal::MessageArg(),
-      const internal::MessageArg& arg2 = internal::MessageArg(),
-      const internal::MessageArg& arg3 = internal::MessageArg(),
-      const internal::MessageArg& arg4 = internal::MessageArg(),
-      const internal::MessageArg& arg5 = internal::MessageArg(),
-      const internal::MessageArg& arg6 = internal::MessageArg());
-
- private:
-  MessageFormatter() = delete;
-  DISALLOW_COPY_AND_ASSIGN(MessageFormatter);
-};
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_MESSAGE_FORMATTER_H_
diff --git a/base/i18n/number_formatting.cc b/base/i18n/number_formatting.cc
deleted file mode 100644
index 0ab031e..0000000
--- a/base/i18n/number_formatting.cc
+++ /dev/null
@@ -1,97 +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/i18n/number_formatting.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/format_macros.h"
-#include "base/i18n/message_formatter.h"
-#include "base/i18n/unicodestring.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "third_party/icu/source/common/unicode/ustring.h"
-#include "third_party/icu/source/i18n/unicode/numfmt.h"
-
-namespace base {
-
-namespace {
-
-// A simple wrapper around icu::NumberFormat that allows for resetting it
-// (as LazyInstance does not).
-struct NumberFormatWrapper {
-  NumberFormatWrapper() {
-    Reset();
-  }
-
-  void Reset() {
-    // There's no ICU call to destroy a NumberFormat object other than
-    // operator delete, so use the default Delete, which calls operator delete.
-    // This can cause problems if a different allocator is used by this file
-    // than by ICU.
-    UErrorCode status = U_ZERO_ERROR;
-    number_format.reset(icu::NumberFormat::createInstance(status));
-    DCHECK(U_SUCCESS(status));
-  }
-
-  std::unique_ptr<icu::NumberFormat> number_format;
-};
-
-LazyInstance<NumberFormatWrapper>::DestructorAtExit g_number_format_int =
-    LAZY_INSTANCE_INITIALIZER;
-LazyInstance<NumberFormatWrapper>::DestructorAtExit g_number_format_float =
-    LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-string16 FormatNumber(int64_t number) {
-  icu::NumberFormat* number_format =
-      g_number_format_int.Get().number_format.get();
-
-  if (!number_format) {
-    // As a fallback, just return the raw number in a string.
-    return ASCIIToUTF16(StringPrintf("%" PRId64, number));
-  }
-  icu::UnicodeString ustr;
-  number_format->format(number, ustr);
-
-  return i18n::UnicodeStringToString16(ustr);
-}
-
-string16 FormatDouble(double number, int fractional_digits) {
-  icu::NumberFormat* number_format =
-      g_number_format_float.Get().number_format.get();
-
-  if (!number_format) {
-    // As a fallback, just return the raw number in a string.
-    return ASCIIToUTF16(StringPrintf("%f", number));
-  }
-  number_format->setMaximumFractionDigits(fractional_digits);
-  number_format->setMinimumFractionDigits(fractional_digits);
-  icu::UnicodeString ustr;
-  number_format->format(number, ustr);
-
-  return i18n::UnicodeStringToString16(ustr);
-}
-
-string16 FormatPercent(int number) {
-  return i18n::MessageFormatter::FormatWithNumberedArgs(
-      ASCIIToUTF16("{0,number,percent}"), static_cast<double>(number) / 100.0);
-}
-
-namespace testing {
-
-void ResetFormatters() {
-  g_number_format_int.Get().Reset();
-  g_number_format_float.Get().Reset();
-}
-
-}  // namespace testing
-
-}  // namespace base
diff --git a/base/i18n/number_formatting.h b/base/i18n/number_formatting.h
deleted file mode 100644
index 9636bf4..0000000
--- a/base/i18n/number_formatting.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_NUMBER_FORMATTING_H_
-#define BASE_I18N_NUMBER_FORMATTING_H_
-
-#include <stdint.h>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-
-namespace base {
-
-// Return a number formatted with separators in the user's locale.
-// Ex: FormatNumber(1234567) => "1,234,567" in English, "1.234.567" in German
-BASE_I18N_EXPORT string16 FormatNumber(int64_t number);
-
-// Return a number formatted with separators in the user's locale.
-// Ex: FormatDouble(1234567.8, 1)
-//         => "1,234,567.8" in English, "1.234.567,8" in German
-BASE_I18N_EXPORT string16 FormatDouble(double number, int fractional_digits);
-
-// Return a percentage formatted with space and symbol in the user's locale.
-// Ex: FormatPercent(12) => "12%" in English, "12 %" in Romanian
-BASE_I18N_EXPORT string16 FormatPercent(int number);
-
-namespace testing {
-
-// Causes cached formatters to be discarded and recreated. Only useful for
-// testing.
-BASE_I18N_EXPORT void ResetFormatters();
-
-}  // namespace testing
-
-}  // namespace base
-
-#endif  // BASE_I18N_NUMBER_FORMATTING_H_
diff --git a/base/i18n/rtl.cc b/base/i18n/rtl.cc
deleted file mode 100644
index 295968b..0000000
--- a/base/i18n/rtl.cc
+++ /dev/null
@@ -1,491 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/rtl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/i18n/base_i18n_switches.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "third_party/icu/source/common/unicode/locid.h"
-#include "third_party/icu/source/common/unicode/uchar.h"
-#include "third_party/icu/source/common/unicode/uscript.h"
-#include "third_party/icu/source/i18n/unicode/coll.h"
-
-#if defined(OS_IOS)
-#include "base/debug/crash_logging.h"
-#include "base/ios/ios_util.h"
-#endif
-
-namespace {
-
-// Extract language, country and variant, but ignore keywords.  For example,
-// en-US, ca@valencia, ca-ES@valencia.
-std::string GetLocaleString(const icu::Locale& locale) {
-  const char* language = locale.getLanguage();
-  const char* country = locale.getCountry();
-  const char* variant = locale.getVariant();
-
-  std::string result =
-      (language != nullptr && *language != '\0') ? language : "und";
-
-  if (country != nullptr && *country != '\0') {
-    result += '-';
-    result += country;
-  }
-
-  if (variant != nullptr && *variant != '\0')
-    result += '@' + base::ToLowerASCII(variant);
-
-  return result;
-}
-
-// Returns LEFT_TO_RIGHT or RIGHT_TO_LEFT if |character| has strong
-// directionality, returns UNKNOWN_DIRECTION if it doesn't. Please refer to
-// http://unicode.org/reports/tr9/ for more information.
-base::i18n::TextDirection GetCharacterDirection(UChar32 character) {
-  static bool has_switch = base::CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kForceTextDirection);
-  if (has_switch) {
-    base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-    std::string force_flag =
-        command_line->GetSwitchValueASCII(switches::kForceTextDirection);
-
-    if (force_flag == switches::kForceDirectionRTL)
-      return base::i18n::RIGHT_TO_LEFT;
-    if (force_flag == switches::kForceDirectionLTR)
-      return base::i18n::LEFT_TO_RIGHT;
-  }
-  // Now that we have the character, we use ICU in order to query for the
-  // appropriate Unicode BiDi character type.
-  int32_t property = u_getIntPropertyValue(character, UCHAR_BIDI_CLASS);
-  if ((property == U_RIGHT_TO_LEFT) ||
-      (property == U_RIGHT_TO_LEFT_ARABIC) ||
-      (property == U_RIGHT_TO_LEFT_EMBEDDING) ||
-      (property == U_RIGHT_TO_LEFT_OVERRIDE)) {
-    return base::i18n::RIGHT_TO_LEFT;
-  } else if ((property == U_LEFT_TO_RIGHT) ||
-             (property == U_LEFT_TO_RIGHT_EMBEDDING) ||
-             (property == U_LEFT_TO_RIGHT_OVERRIDE)) {
-    return base::i18n::LEFT_TO_RIGHT;
-  }
-  return base::i18n::UNKNOWN_DIRECTION;
-}
-
-}  // namespace
-
-namespace base {
-namespace i18n {
-
-// Represents the locale-specific ICU text direction.
-static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION;
-
-// Convert the ICU default locale to a string.
-std::string GetConfiguredLocale() {
-  return GetLocaleString(icu::Locale::getDefault());
-}
-
-// Convert the ICU canonicalized locale to a string.
-std::string GetCanonicalLocale(const std::string& locale) {
-  return GetLocaleString(icu::Locale::createCanonical(locale.c_str()));
-}
-
-// Convert Chrome locale name to ICU locale name
-std::string ICULocaleName(const std::string& locale_string) {
-  // If not Spanish, just return it.
-  if (locale_string.substr(0, 2) != "es")
-    return locale_string;
-  // Expand es to es-ES.
-  if (LowerCaseEqualsASCII(locale_string, "es"))
-    return "es-ES";
-  // Map es-419 (Latin American Spanish) to es-FOO depending on the system
-  // locale.  If it's es-RR other than es-ES, map to es-RR. Otherwise, map
-  // to es-MX (the most populous in Spanish-speaking Latin America).
-  if (LowerCaseEqualsASCII(locale_string, "es-419")) {
-    const icu::Locale& locale = icu::Locale::getDefault();
-    std::string language = locale.getLanguage();
-    const char* country = locale.getCountry();
-    if (LowerCaseEqualsASCII(language, "es") &&
-      !LowerCaseEqualsASCII(country, "es")) {
-        language += '-';
-        language += country;
-        return language;
-    }
-    return "es-MX";
-  }
-  // Currently, Chrome has only "es" and "es-419", but later we may have
-  // more specific "es-RR".
-  return locale_string;
-}
-
-void SetICUDefaultLocale(const std::string& locale_string) {
-#if defined(OS_IOS)
-  static base::debug::CrashKeyString* crash_key_locale =
-      base::debug::AllocateCrashKeyString("icu_locale_input",
-                                          base::debug::CrashKeySize::Size256);
-  base::debug::SetCrashKeyString(crash_key_locale, locale_string);
-#endif
-  icu::Locale locale(ICULocaleName(locale_string).c_str());
-  UErrorCode error_code = U_ZERO_ERROR;
-  const char* lang = locale.getLanguage();
-  if (lang != nullptr && *lang != '\0') {
-    icu::Locale::setDefault(locale, error_code);
-  } else {
-    LOG(ERROR) << "Failed to set the ICU default locale to " << locale_string
-               << ". Falling back to en-US.";
-    icu::Locale::setDefault(icu::Locale::getUS(), error_code);
-  }
-  g_icu_text_direction = UNKNOWN_DIRECTION;
-}
-
-bool IsRTL() {
-  return ICUIsRTL();
-}
-
-bool ICUIsRTL() {
-  if (g_icu_text_direction == UNKNOWN_DIRECTION) {
-    const icu::Locale& locale = icu::Locale::getDefault();
-    g_icu_text_direction = GetTextDirectionForLocaleInStartUp(locale.getName());
-  }
-  return g_icu_text_direction == RIGHT_TO_LEFT;
-}
-
-TextDirection GetForcedTextDirection() {
-// On iOS, check for RTL forcing.
-#if defined(OS_IOS)
-  if (base::ios::IsInForcedRTL())
-    return base::i18n::RIGHT_TO_LEFT;
-#endif
-
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kForceUIDirection)) {
-    std::string force_flag =
-        command_line->GetSwitchValueASCII(switches::kForceUIDirection);
-
-    if (force_flag == switches::kForceDirectionLTR)
-      return base::i18n::LEFT_TO_RIGHT;
-
-    if (force_flag == switches::kForceDirectionRTL)
-      return base::i18n::RIGHT_TO_LEFT;
-  }
-
-  return base::i18n::UNKNOWN_DIRECTION;
-}
-
-TextDirection GetTextDirectionForLocaleInStartUp(const char* locale_name) {
-  // Check for direction forcing.
-  TextDirection forced_direction = GetForcedTextDirection();
-  if (forced_direction != UNKNOWN_DIRECTION)
-    return forced_direction;
-
-  // This list needs to be updated in alphabetical order if we add more RTL
-  // locales.
-  static const char kRTLLanguageCodes[][3] = {"ar", "fa", "he", "iw", "ur"};
-  std::vector<StringPiece> locale_split =
-      SplitStringPiece(locale_name, "-_", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  const StringPiece& language_code = locale_split[0];
-  if (std::binary_search(kRTLLanguageCodes,
-                         kRTLLanguageCodes + arraysize(kRTLLanguageCodes),
-                         language_code))
-    return RIGHT_TO_LEFT;
-  return LEFT_TO_RIGHT;
-}
-
-TextDirection GetTextDirectionForLocale(const char* locale_name) {
-  // Check for direction forcing.
-  TextDirection forced_direction = GetForcedTextDirection();
-  if (forced_direction != UNKNOWN_DIRECTION)
-    return forced_direction;
-
-  UErrorCode status = U_ZERO_ERROR;
-  ULayoutType layout_dir = uloc_getCharacterOrientation(locale_name, &status);
-  DCHECK(U_SUCCESS(status));
-  // Treat anything other than RTL as LTR.
-  return (layout_dir != ULOC_LAYOUT_RTL) ? LEFT_TO_RIGHT : RIGHT_TO_LEFT;
-}
-
-TextDirection GetFirstStrongCharacterDirection(const string16& text) {
-  const UChar* string = text.c_str();
-  size_t length = text.length();
-  size_t position = 0;
-  while (position < length) {
-    UChar32 character;
-    size_t next_position = position;
-    U16_NEXT(string, next_position, length, character);
-    TextDirection direction = GetCharacterDirection(character);
-    if (direction != UNKNOWN_DIRECTION)
-      return direction;
-    position = next_position;
-  }
-  return LEFT_TO_RIGHT;
-}
-
-TextDirection GetLastStrongCharacterDirection(const string16& text) {
-  const UChar* string = text.c_str();
-  size_t position = text.length();
-  while (position > 0) {
-    UChar32 character;
-    size_t prev_position = position;
-    U16_PREV(string, 0, prev_position, character);
-    TextDirection direction = GetCharacterDirection(character);
-    if (direction != UNKNOWN_DIRECTION)
-      return direction;
-    position = prev_position;
-  }
-  return LEFT_TO_RIGHT;
-}
-
-TextDirection GetStringDirection(const string16& text) {
-  const UChar* string = text.c_str();
-  size_t length = text.length();
-  size_t position = 0;
-
-  TextDirection result(UNKNOWN_DIRECTION);
-  while (position < length) {
-    UChar32 character;
-    size_t next_position = position;
-    U16_NEXT(string, next_position, length, character);
-    TextDirection direction = GetCharacterDirection(character);
-    if (direction != UNKNOWN_DIRECTION) {
-      if (result != UNKNOWN_DIRECTION && result != direction)
-        return UNKNOWN_DIRECTION;
-      result = direction;
-    }
-    position = next_position;
-  }
-
-  // Handle the case of a string not containing any strong directionality
-  // characters defaulting to LEFT_TO_RIGHT.
-  if (result == UNKNOWN_DIRECTION)
-    return LEFT_TO_RIGHT;
-
-  return result;
-}
-
-#if defined(OS_WIN)
-bool AdjustStringForLocaleDirection(string16* text) {
-  if (!IsRTL() || text->empty())
-    return false;
-
-  // Marking the string as LTR if the locale is RTL and the string does not
-  // contain strong RTL characters. Otherwise, mark the string as RTL.
-  bool has_rtl_chars = StringContainsStrongRTLChars(*text);
-  if (!has_rtl_chars)
-    WrapStringWithLTRFormatting(text);
-  else
-    WrapStringWithRTLFormatting(text);
-
-  return true;
-}
-
-bool UnadjustStringForLocaleDirection(string16* text) {
-  if (!IsRTL() || text->empty())
-    return false;
-
-  *text = StripWrappingBidiControlCharacters(*text);
-  return true;
-}
-#else
-bool AdjustStringForLocaleDirection(string16* text) {
-  // On OS X & GTK the directionality of a label is determined by the first
-  // strongly directional character.
-  // However, we want to make sure that in an LTR-language-UI all strings are
-  // left aligned and vice versa.
-  // A problem can arise if we display a string which starts with user input.
-  // User input may be of the opposite directionality to the UI. So the whole
-  // string will be displayed in the opposite directionality, e.g. if we want to
-  // display in an LTR UI [such as US English]:
-  //
-  // EMAN_NOISNETXE is now installed.
-  //
-  // Since EXTENSION_NAME begins with a strong RTL char, the label's
-  // directionality will be set to RTL and the string will be displayed visually
-  // as:
-  //
-  // .is now installed EMAN_NOISNETXE
-  //
-  // In order to solve this issue, we prepend an LRM to the string. An LRM is a
-  // strongly directional LTR char.
-  // We also append an LRM at the end, which ensures that we're in an LTR
-  // context.
-
-  // Unlike Windows, Linux and OS X can correctly display RTL glyphs out of the
-  // box so there is no issue with displaying zero-width bidi control characters
-  // on any system.  Thus no need for the !IsRTL() check here.
-  if (text->empty())
-    return false;
-
-  bool ui_direction_is_rtl = IsRTL();
-
-  bool has_rtl_chars = StringContainsStrongRTLChars(*text);
-  if (!ui_direction_is_rtl && has_rtl_chars) {
-    WrapStringWithRTLFormatting(text);
-    text->insert(static_cast<size_t>(0), static_cast<size_t>(1),
-                 kLeftToRightMark);
-    text->push_back(kLeftToRightMark);
-  } else if (ui_direction_is_rtl && has_rtl_chars) {
-    WrapStringWithRTLFormatting(text);
-    text->insert(static_cast<size_t>(0), static_cast<size_t>(1),
-                 kRightToLeftMark);
-    text->push_back(kRightToLeftMark);
-  } else if (ui_direction_is_rtl) {
-    WrapStringWithLTRFormatting(text);
-    text->insert(static_cast<size_t>(0), static_cast<size_t>(1),
-                 kRightToLeftMark);
-    text->push_back(kRightToLeftMark);
-  } else {
-    return false;
-  }
-
-  return true;
-}
-
-bool UnadjustStringForLocaleDirection(string16* text) {
-  if (text->empty())
-    return false;
-
-  size_t begin_index = 0;
-  char16 begin = text->at(begin_index);
-  if (begin == kLeftToRightMark ||
-      begin == kRightToLeftMark) {
-    ++begin_index;
-  }
-
-  size_t end_index = text->length() - 1;
-  char16 end = text->at(end_index);
-  if (end == kLeftToRightMark ||
-      end == kRightToLeftMark) {
-    --end_index;
-  }
-
-  string16 unmarked_text =
-      text->substr(begin_index, end_index - begin_index + 1);
-  *text = StripWrappingBidiControlCharacters(unmarked_text);
-  return true;
-}
-
-#endif  // !OS_WIN
-
-void EnsureTerminatedDirectionalFormatting(string16* text) {
-  int count = 0;
-  for (auto c : *text) {
-    if (c == kLeftToRightEmbeddingMark || c == kRightToLeftEmbeddingMark ||
-        c == kLeftToRightOverride || c == kRightToLeftOverride) {
-      ++count;
-    } else if (c == kPopDirectionalFormatting && count > 0) {
-      --count;
-    }
-  }
-  for (int j = 0; j < count; j++)
-    text->push_back(kPopDirectionalFormatting);
-}
-
-void SanitizeUserSuppliedString(string16* text) {
-  EnsureTerminatedDirectionalFormatting(text);
-  AdjustStringForLocaleDirection(text);
-}
-
-bool StringContainsStrongRTLChars(const string16& text) {
-  const UChar* string = text.c_str();
-  size_t length = text.length();
-  size_t position = 0;
-  while (position < length) {
-    UChar32 character;
-    size_t next_position = position;
-    U16_NEXT(string, next_position, length, character);
-
-    // Now that we have the character, we use ICU in order to query for the
-    // appropriate Unicode BiDi character type.
-    int32_t property = u_getIntPropertyValue(character, UCHAR_BIDI_CLASS);
-    if ((property == U_RIGHT_TO_LEFT) || (property == U_RIGHT_TO_LEFT_ARABIC))
-      return true;
-
-    position = next_position;
-  }
-
-  return false;
-}
-
-void WrapStringWithLTRFormatting(string16* text) {
-  if (text->empty())
-    return;
-
-  // Inserting an LRE (Left-To-Right Embedding) mark as the first character.
-  text->insert(static_cast<size_t>(0), static_cast<size_t>(1),
-               kLeftToRightEmbeddingMark);
-
-  // Inserting a PDF (Pop Directional Formatting) mark as the last character.
-  text->push_back(kPopDirectionalFormatting);
-}
-
-void WrapStringWithRTLFormatting(string16* text) {
-  if (text->empty())
-    return;
-
-  // Inserting an RLE (Right-To-Left Embedding) mark as the first character.
-  text->insert(static_cast<size_t>(0), static_cast<size_t>(1),
-               kRightToLeftEmbeddingMark);
-
-  // Inserting a PDF (Pop Directional Formatting) mark as the last character.
-  text->push_back(kPopDirectionalFormatting);
-}
-
-void WrapPathWithLTRFormatting(const FilePath& path,
-                               string16* rtl_safe_path) {
-  // Wrap the overall path with LRE-PDF pair which essentialy marks the
-  // string as a Left-To-Right string.
-  // Inserting an LRE (Left-To-Right Embedding) mark as the first character.
-  rtl_safe_path->push_back(kLeftToRightEmbeddingMark);
-#if defined(OS_MACOSX)
-    rtl_safe_path->append(UTF8ToUTF16(path.value()));
-#elif defined(OS_WIN)
-    rtl_safe_path->append(path.value());
-#else  // defined(OS_POSIX) && !defined(OS_MACOSX)
-    std::wstring wide_path = base::SysNativeMBToWide(path.value());
-    rtl_safe_path->append(WideToUTF16(wide_path));
-#endif
-  // Inserting a PDF (Pop Directional Formatting) mark as the last character.
-  rtl_safe_path->push_back(kPopDirectionalFormatting);
-}
-
-string16 GetDisplayStringInLTRDirectionality(const string16& text) {
-  // Always wrap the string in RTL UI (it may be appended to RTL string).
-  // Also wrap strings with an RTL first strong character direction in LTR UI.
-  if (IsRTL() || GetFirstStrongCharacterDirection(text) == RIGHT_TO_LEFT) {
-    string16 text_mutable(text);
-    WrapStringWithLTRFormatting(&text_mutable);
-    return text_mutable;
-  }
-  return text;
-}
-
-string16 StripWrappingBidiControlCharacters(const string16& text) {
-  if (text.empty())
-    return text;
-  size_t begin_index = 0;
-  char16 begin = text[begin_index];
-  if (begin == kLeftToRightEmbeddingMark ||
-      begin == kRightToLeftEmbeddingMark ||
-      begin == kLeftToRightOverride ||
-      begin == kRightToLeftOverride)
-    ++begin_index;
-  size_t end_index = text.length() - 1;
-  if (text[end_index] == kPopDirectionalFormatting)
-    --end_index;
-  return text.substr(begin_index, end_index - begin_index + 1);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/rtl.h b/base/i18n/rtl.h
deleted file mode 100644
index d3ba29f..0000000
--- a/base/i18n/rtl.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_RTL_H_
-#define BASE_I18N_RTL_H_
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-#include "build_config.h"
-
-namespace base {
-
-class FilePath;
-
-namespace i18n {
-
-const char16 kRightToLeftMark = 0x200F;
-const char16 kLeftToRightMark = 0x200E;
-const char16 kLeftToRightEmbeddingMark = 0x202A;
-const char16 kRightToLeftEmbeddingMark = 0x202B;
-const char16 kPopDirectionalFormatting = 0x202C;
-const char16 kLeftToRightOverride = 0x202D;
-const char16 kRightToLeftOverride = 0x202E;
-
-// Locale.java mirrored this enum TextDirection. Please keep in sync.
-enum TextDirection {
-  UNKNOWN_DIRECTION = 0,
-  RIGHT_TO_LEFT = 1,
-  LEFT_TO_RIGHT = 2,
-  TEXT_DIRECTION_MAX = LEFT_TO_RIGHT,
-};
-
-// Get the locale that the currently running process has been configured to use.
-// The return value is of the form language[-country] (e.g., en-US) where the
-// language is the 2 or 3 letter code from ISO-639.
-BASE_I18N_EXPORT std::string GetConfiguredLocale();
-
-// Canonicalize a string (eg. a POSIX locale string) to a Chrome locale name.
-BASE_I18N_EXPORT std::string GetCanonicalLocale(const std::string& locale);
-
-// Sets the default locale of ICU.
-// Once the application locale of Chrome in GetApplicationLocale is determined,
-// the default locale of ICU need to be changed to match the application locale
-// so that ICU functions work correctly in a locale-dependent manner.
-// This is handy in that we don't have to call GetApplicationLocale()
-// everytime we call locale-dependent ICU APIs as long as we make sure
-// that this is called before any locale-dependent API is called.
-BASE_I18N_EXPORT void SetICUDefaultLocale(const std::string& locale_string);
-
-// Returns true if the application text direction is right-to-left.
-BASE_I18N_EXPORT bool IsRTL();
-
-// Returns whether the text direction for the default ICU locale is RTL.  This
-// assumes that SetICUDefaultLocale has been called to set the default locale to
-// the UI locale of Chrome.
-// NOTE: Generally, you should call IsRTL() instead of this.
-BASE_I18N_EXPORT bool ICUIsRTL();
-
-// Gets the explicitly forced text direction for debugging. If no forcing is
-// applied, returns UNKNOWN_DIRECTION.
-BASE_I18N_EXPORT TextDirection GetForcedTextDirection();
-
-// Returns the text direction for |locale_name|.
-// As a startup optimization, this method checks the locale against a list of
-// Chrome-supported RTL locales.
-BASE_I18N_EXPORT TextDirection
-GetTextDirectionForLocaleInStartUp(const char* locale_name);
-
-// Returns the text direction for |locale_name|.
-BASE_I18N_EXPORT TextDirection GetTextDirectionForLocale(
-    const char* locale_name);
-
-// Given the string in |text|, returns the directionality of the first or last
-// character with strong directionality in the string. If no character in the
-// text has strong directionality, LEFT_TO_RIGHT is returned. The Bidi
-// character types L, LRE, LRO, R, AL, RLE, and RLO are considered as strong
-// directionality characters. Please refer to http://unicode.org/reports/tr9/
-// for more information.
-BASE_I18N_EXPORT TextDirection GetFirstStrongCharacterDirection(
-    const string16& text);
-BASE_I18N_EXPORT TextDirection GetLastStrongCharacterDirection(
-    const string16& text);
-
-// Given the string in |text|, returns LEFT_TO_RIGHT or RIGHT_TO_LEFT if all the
-// strong directionality characters in the string are of the same
-// directionality. It returns UNKNOWN_DIRECTION if the string contains a mix of
-// LTR and RTL strong directionality characters. Defaults to LEFT_TO_RIGHT if
-// the string does not contain directionality characters. Please refer to
-// http://unicode.org/reports/tr9/ for more information.
-BASE_I18N_EXPORT TextDirection GetStringDirection(const string16& text);
-
-// Given the string in |text|, this function modifies the string in place with
-// the appropriate Unicode formatting marks that mark the string direction
-// (either left-to-right or right-to-left). The function checks both the current
-// locale and the contents of the string in order to determine the direction of
-// the returned string. The function returns true if the string in |text| was
-// properly adjusted.
-//
-// Certain LTR strings are not rendered correctly when the context is RTL. For
-// example, the string "Foo!" will appear as "!Foo" if it is rendered as is in
-// an RTL context. Calling this function will make sure the returned localized
-// string is always treated as a right-to-left string. This is done by
-// inserting certain Unicode formatting marks into the returned string.
-//
-// ** Notes about the Windows version of this function:
-// TODO(idana) bug 6806: this function adjusts the string in question only
-// if the current locale is right-to-left. The function does not take care of
-// the opposite case (an RTL string displayed in an LTR context) since
-// adjusting the string involves inserting Unicode formatting characters that
-// Windows does not handle well unless right-to-left language support is
-// installed. Since the English version of Windows doesn't have right-to-left
-// language support installed by default, inserting the direction Unicode mark
-// results in Windows displaying squares.
-BASE_I18N_EXPORT bool AdjustStringForLocaleDirection(string16* text);
-
-// Undoes the actions of the above function (AdjustStringForLocaleDirection).
-BASE_I18N_EXPORT bool UnadjustStringForLocaleDirection(string16* text);
-
-// Ensures |text| contains no unterminated directional formatting characters, by
-// appending the appropriate pop-directional-formatting characters to the end of
-// |text|.
-BASE_I18N_EXPORT void EnsureTerminatedDirectionalFormatting(string16* text);
-
-// Sanitizes the |text| by terminating any directional override/embedding
-// characters and then adjusting the string for locale direction.
-BASE_I18N_EXPORT void SanitizeUserSuppliedString(string16* text);
-
-// Returns true if the string contains at least one character with strong right
-// to left directionality; that is, a character with either R or AL Unicode
-// BiDi character type.
-BASE_I18N_EXPORT bool StringContainsStrongRTLChars(const string16& text);
-
-// Wraps a string with an LRE-PDF pair which essentialy marks the string as a
-// Left-To-Right string. Doing this is useful in order to make sure LTR
-// strings are rendered properly in an RTL context.
-BASE_I18N_EXPORT void WrapStringWithLTRFormatting(string16* text);
-
-// Wraps a string with an RLE-PDF pair which essentialy marks the string as a
-// Right-To-Left string. Doing this is useful in order to make sure RTL
-// strings are rendered properly in an LTR context.
-BASE_I18N_EXPORT void WrapStringWithRTLFormatting(string16* text);
-
-// Wraps file path to get it to display correctly in RTL UI. All filepaths
-// should be passed through this function before display in UI for RTL locales.
-BASE_I18N_EXPORT void WrapPathWithLTRFormatting(const FilePath& path,
-                                                string16* rtl_safe_path);
-
-// Return the string in |text| wrapped with LRE (Left-To-Right Embedding) and
-// PDF (Pop Directional Formatting) marks, if needed for UI display purposes.
-BASE_I18N_EXPORT string16 GetDisplayStringInLTRDirectionality(
-    const string16& text) WARN_UNUSED_RESULT;
-
-// Strip the beginning (U+202A..U+202B, U+202D..U+202E) and/or ending (U+202C)
-// explicit bidi control characters from |text|, if there are any. Otherwise,
-// return the text itself. Explicit bidi control characters display and have
-// semantic effect. They can be deleted so they might not always appear in a
-// pair.
-BASE_I18N_EXPORT string16 StripWrappingBidiControlCharacters(
-    const string16& text) WARN_UNUSED_RESULT;
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_RTL_H_
diff --git a/base/i18n/streaming_utf8_validator.cc b/base/i18n/streaming_utf8_validator.cc
deleted file mode 100644
index 19c86a3..0000000
--- a/base/i18n/streaming_utf8_validator.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This implementation doesn't use ICU. The ICU macros are oriented towards
-// character-at-a-time processing, whereas byte-at-a-time processing is easier
-// with streaming input.
-
-#include "base/i18n/streaming_utf8_validator.h"
-
-#include "base/i18n/utf8_validator_tables.h"
-#include "base/logging.h"
-
-namespace base {
-namespace {
-
-uint8_t StateTableLookup(uint8_t offset) {
-  DCHECK_LT(offset, internal::kUtf8ValidatorTablesSize);
-  return internal::kUtf8ValidatorTables[offset];
-}
-
-}  // namespace
-
-StreamingUtf8Validator::State StreamingUtf8Validator::AddBytes(const char* data,
-                                                               size_t size) {
-  // Copy |state_| into a local variable so that the compiler doesn't have to be
-  // careful of aliasing.
-  uint8_t state = state_;
-  for (const char* p = data; p != data + size; ++p) {
-    if ((*p & 0x80) == 0) {
-      if (state == 0)
-        continue;
-      state = internal::I18N_UTF8_VALIDATOR_INVALID_INDEX;
-      break;
-    }
-    const uint8_t shift_amount = StateTableLookup(state);
-    const uint8_t shifted_char = (*p & 0x7F) >> shift_amount;
-    state = StateTableLookup(state + shifted_char + 1);
-    // State may be INVALID here, but this code is optimised for the case of
-    // valid UTF-8 and it is more efficient (by about 2%) to not attempt an
-    // early loop exit unless we hit an ASCII character.
-  }
-  state_ = state;
-  return state == 0 ? VALID_ENDPOINT
-      : state == internal::I18N_UTF8_VALIDATOR_INVALID_INDEX
-      ? INVALID
-      : VALID_MIDPOINT;
-}
-
-void StreamingUtf8Validator::Reset() {
-  state_ = 0u;
-}
-
-bool StreamingUtf8Validator::Validate(const std::string& string) {
-  return StreamingUtf8Validator().AddBytes(string.data(), string.size()) ==
-         VALID_ENDPOINT;
-}
-
-}  // namespace base
diff --git a/base/i18n/streaming_utf8_validator.h b/base/i18n/streaming_utf8_validator.h
deleted file mode 100644
index ebf38a6..0000000
--- a/base/i18n/streaming_utf8_validator.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 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.
-
-// A streaming validator for UTF-8. Validation is based on the definition in
-// RFC-3629. In particular, it does not reject the invalid characters rejected
-// by base::IsStringUTF8().
-//
-// The implementation detects errors on the first possible byte.
-
-#ifndef BASE_I18N_STREAMING_UTF8_VALIDATOR_H_
-#define BASE_I18N_STREAMING_UTF8_VALIDATOR_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/macros.h"
-
-namespace base {
-
-class BASE_I18N_EXPORT StreamingUtf8Validator {
- public:
-  // The validator exposes 3 states. It starts in state VALID_ENDPOINT. As it
-  // processes characters it alternates between VALID_ENDPOINT and
-  // VALID_MIDPOINT. If it encounters an invalid byte or UTF-8 sequence the
-  // state changes permanently to INVALID.
-  enum State {
-    VALID_ENDPOINT,
-    VALID_MIDPOINT,
-    INVALID
-  };
-
-  StreamingUtf8Validator() : state_(0u) {}
-  // Trivial destructor intentionally omitted.
-
-  // Validate |size| bytes starting at |data|. If the concatenation of all calls
-  // to AddBytes() since this object was constructed or reset is a valid UTF-8
-  // string, returns VALID_ENDPOINT. If it could be the prefix of a valid UTF-8
-  // string, returns VALID_MIDPOINT. If an invalid byte or UTF-8 sequence was
-  // present, returns INVALID.
-  State AddBytes(const char* data, size_t size);
-
-  // Return the object to a freshly-constructed state so that it can be re-used.
-  void Reset();
-
-  // Validate a complete string using the same criteria. Returns true if the
-  // string only contains complete, valid UTF-8 codepoints.
-  static bool Validate(const std::string& string);
-
- private:
-  // The current state of the validator. Value 0 is the initial/valid state.
-  // The state is stored as an offset into |kUtf8ValidatorTables|. The special
-  // state |kUtf8InvalidState| is invalid.
-  uint8_t state_;
-
-  // This type could be made copyable but there is currently no use-case for
-  // it.
-  DISALLOW_COPY_AND_ASSIGN(StreamingUtf8Validator);
-};
-
-}  // namespace base
-
-#endif  // BASE_I18N_STREAMING_UTF8_VALIDATOR_H_
diff --git a/base/i18n/streaming_utf8_validator_perftest.cc b/base/i18n/streaming_utf8_validator_perftest.cc
deleted file mode 100644
index ad328f8..0000000
--- a/base/i18n/streaming_utf8_validator_perftest.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright 2014 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.
-
-// All data that is passed through a WebSocket with type "Text" needs to be
-// validated as UTF8. Since this is done on the IO thread, it needs to be
-// reasonably fast.
-
-// We are only interested in the performance on valid UTF8. Invalid UTF8 will
-// result in a connection failure, so is unlikely to become a source of
-// performance issues.
-
-#include "base/i18n/streaming_utf8_validator.h"
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/perf_time_logger.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-// We want to test ranges of valid UTF-8 sequences. These ranges are inclusive.
-// They are intended to be large enough that the validator needs to do
-// meaningful work while being in some sense "realistic" (eg. control characters
-// are not included).
-const char kOneByteSeqRangeStart[] = " ";  // U+0020
-const char kOneByteSeqRangeEnd[] = "~";    // U+007E
-
-const char kTwoByteSeqRangeStart[] = "\xc2\xa0";  // U+00A0 non-breaking space
-const char kTwoByteSeqRangeEnd[] = "\xc9\x8f";    // U+024F small y with stroke
-
-const char kThreeByteSeqRangeStart[] = "\xe3\x81\x82";  // U+3042 Hiragana "a"
-const char kThreeByteSeqRangeEnd[] = "\xe9\xbf\x83";    // U+9FC3 "to blink"
-
-const char kFourByteSeqRangeStart[] = "\xf0\xa0\x80\x8b";  // U+2000B
-const char kFourByteSeqRangeEnd[] = "\xf0\xaa\x9a\xb2";    // U+2A6B2
-
-// The different lengths of strings to test.
-const size_t kTestLengths[] = {1, 32, 256, 32768, 1 << 20};
-
-// Simplest possible byte-at-a-time validator, to provide a baseline
-// for comparison. This is only tried on 1-byte UTF-8 sequences, as
-// the results will not be meaningful with sequences containing
-// top-bit-set bytes.
-bool IsString7Bit(const std::string& s) {
-  for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
-    if (*it & 0x80)
-      return false;
-  }
-  return true;
-}
-
-// Assumes that |previous| is a valid UTF-8 sequence, and attempts to return
-// the next one. Is just barely smart enough to iterate through the ranges
-// defined about.
-std::string NextUtf8Sequence(const std::string& previous) {
-  DCHECK(StreamingUtf8Validator::Validate(previous));
-  std::string next = previous;
-  for (int i = static_cast<int>(previous.length() - 1); i >= 0; --i) {
-    // All bytes in a UTF-8 sequence except the first one are
-    // constrained to the range 0x80 to 0xbf, inclusive. When we
-    // increment past 0xbf, we carry into the previous byte.
-    if (i > 0 && next[i] == '\xbf') {
-      next[i] = '\x80';
-      continue;  // carry
-    }
-    ++next[i];
-    break;  // no carry
-  }
-  DCHECK(StreamingUtf8Validator::Validate(next))
-      << "Result \"" << next << "\" failed validation";
-  return next;
-}
-
-typedef bool (*TestTargetType)(const std::string&);
-
-// Run fuction |target| over |test_string| |times| times, and report the results
-// using |description|.
-bool RunTest(const std::string& description,
-             TestTargetType target,
-             const std::string& test_string,
-             int times) {
-  base::PerfTimeLogger timer(description.c_str());
-  bool result = true;
-  for (int i = 0; i < times; ++i) {
-    result = target(test_string) && result;
-  }
-  timer.Done();
-  return result;
-}
-
-// Construct a string by repeating |input| enough times to equal or exceed
-// |length|.
-std::string ConstructRepeatedTestString(const std::string& input,
-                                        size_t length) {
-  std::string output = input;
-  while (output.length() * 2 < length) {
-    output += output;
-  }
-  if (output.length() < length) {
-    output += ConstructRepeatedTestString(input, length - output.length());
-  }
-  return output;
-}
-
-// Construct a string by expanding the range of UTF-8 sequences
-// between |input_start| and |input_end|, inclusive, and then
-// repeating the resulting string until it equals or exceeds |length|
-// bytes. |input_start| and |input_end| must be valid UTF-8
-// sequences.
-std::string ConstructRangedTestString(const std::string& input_start,
-                                      const std::string& input_end,
-                                      size_t length) {
-  std::string output = input_start;
-  std::string input = input_start;
-  while (output.length() < length && input != input_end) {
-    input = NextUtf8Sequence(input);
-    output += input;
-  }
-  if (output.length() < length) {
-    output = ConstructRepeatedTestString(output, length);
-  }
-  return output;
-}
-
-struct TestFunctionDescription {
-  TestTargetType function;
-  const char* function_name;
-};
-
-bool IsStringUTF8(const std::string& str) {
-  return base::IsStringUTF8(base::StringPiece(str));
-}
-
-// IsString7Bit is intentionally placed last so it can be excluded easily.
-const TestFunctionDescription kTestFunctions[] = {
-    {&StreamingUtf8Validator::Validate, "StreamingUtf8Validator"},
-    {&IsStringUTF8, "IsStringUTF8"}, {&IsString7Bit, "IsString7Bit"}};
-
-// Construct a test string from |construct_test_string| for each of the lengths
-// in |kTestLengths| in turn. For each string, run each test in |test_functions|
-// for a number of iterations such that the total number of bytes validated
-// is around 16MB.
-void RunSomeTests(
-    const char format[],
-    base::Callback<std::string(size_t length)> construct_test_string,
-    const TestFunctionDescription* test_functions,
-    size_t test_count) {
-  for (size_t i = 0; i < arraysize(kTestLengths); ++i) {
-    const size_t length = kTestLengths[i];
-    const std::string test_string = construct_test_string.Run(length);
-    const int real_length = static_cast<int>(test_string.length());
-    const int times = (1 << 24) / real_length;
-    for (size_t test_index = 0; test_index < test_count; ++test_index) {
-      EXPECT_TRUE(RunTest(StringPrintf(format,
-                                       test_functions[test_index].function_name,
-                                       real_length,
-                                       times),
-                          test_functions[test_index].function,
-                          test_string,
-                          times));
-    }
-  }
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, OneByteRepeated) {
-  RunSomeTests("%s: bytes=1 repeated length=%d repeat=%d",
-               base::Bind(ConstructRepeatedTestString, kOneByteSeqRangeStart),
-               kTestFunctions,
-               3);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, OneByteRange) {
-  RunSomeTests("%s: bytes=1 ranged length=%d repeat=%d",
-               base::Bind(ConstructRangedTestString,
-                          kOneByteSeqRangeStart,
-                          kOneByteSeqRangeEnd),
-               kTestFunctions,
-               3);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, TwoByteRepeated) {
-  RunSomeTests("%s: bytes=2 repeated length=%d repeat=%d",
-               base::Bind(ConstructRepeatedTestString, kTwoByteSeqRangeStart),
-               kTestFunctions,
-               2);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, TwoByteRange) {
-  RunSomeTests("%s: bytes=2 ranged length=%d repeat=%d",
-               base::Bind(ConstructRangedTestString,
-                          kTwoByteSeqRangeStart,
-                          kTwoByteSeqRangeEnd),
-               kTestFunctions,
-               2);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, ThreeByteRepeated) {
-  RunSomeTests(
-      "%s: bytes=3 repeated length=%d repeat=%d",
-      base::Bind(ConstructRepeatedTestString, kThreeByteSeqRangeStart),
-      kTestFunctions,
-      2);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, ThreeByteRange) {
-  RunSomeTests("%s: bytes=3 ranged length=%d repeat=%d",
-               base::Bind(ConstructRangedTestString,
-                          kThreeByteSeqRangeStart,
-                          kThreeByteSeqRangeEnd),
-               kTestFunctions,
-               2);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, FourByteRepeated) {
-  RunSomeTests("%s: bytes=4 repeated length=%d repeat=%d",
-               base::Bind(ConstructRepeatedTestString, kFourByteSeqRangeStart),
-               kTestFunctions,
-               2);
-}
-
-TEST(StreamingUtf8ValidatorPerfTest, FourByteRange) {
-  RunSomeTests("%s: bytes=4 ranged length=%d repeat=%d",
-               base::Bind(ConstructRangedTestString,
-                          kFourByteSeqRangeStart,
-                          kFourByteSeqRangeEnd),
-               kTestFunctions,
-               2);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/i18n/string_compare.cc b/base/i18n/string_compare.cc
deleted file mode 100644
index 649c281..0000000
--- a/base/i18n/string_compare.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/string_compare.h"
-
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "third_party/icu/source/common/unicode/unistr.h"
-
-namespace base {
-namespace i18n {
-
-// Compares the character data stored in two different string16 strings by
-// specified Collator instance.
-UCollationResult CompareString16WithCollator(const icu::Collator& collator,
-                                             const string16& lhs,
-                                             const string16& rhs) {
-  UErrorCode error = U_ZERO_ERROR;
-  UCollationResult result = collator.compare(
-      icu::UnicodeString(FALSE, lhs.c_str(), static_cast<int>(lhs.length())),
-      icu::UnicodeString(FALSE, rhs.c_str(), static_cast<int>(rhs.length())),
-      error);
-  DCHECK(U_SUCCESS(error));
-  return result;
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/string_compare.h b/base/i18n/string_compare.h
deleted file mode 100644
index 5fcc5fe..0000000
--- a/base/i18n/string_compare.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_STRING_COMPARE_H_
-#define BASE_I18N_STRING_COMPARE_H_
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-#include "third_party/icu/source/i18n/unicode/coll.h"
-
-namespace base {
-namespace i18n {
-
-// Compares the two strings using the specified collator.
-BASE_I18N_EXPORT UCollationResult
-CompareString16WithCollator(const icu::Collator& collator,
-                            const string16& lhs,
-                            const string16& rhs);
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_STRING_COMPARE_H_
diff --git a/base/i18n/string_search.cc b/base/i18n/string_search.cc
deleted file mode 100644
index 2f6fee4..0000000
--- a/base/i18n/string_search.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "base/i18n/string_search.h"
-#include "base/logging.h"
-
-#include "third_party/icu/source/i18n/unicode/usearch.h"
-
-namespace base {
-namespace i18n {
-
-FixedPatternStringSearchIgnoringCaseAndAccents::
-FixedPatternStringSearchIgnoringCaseAndAccents(const string16& find_this)
-    : find_this_(find_this) {
-  // usearch_open requires a valid string argument to be searched, even if we
-  // want to set it by usearch_setText afterwards. So, supplying a dummy text.
-  const string16& dummy = find_this_;
-
-  UErrorCode status = U_ZERO_ERROR;
-  search_ = usearch_open(find_this_.data(), find_this_.size(), dummy.data(),
-                         dummy.size(), uloc_getDefault(),
-                         nullptr,  // breakiter
-                         &status);
-  if (U_SUCCESS(status)) {
-    UCollator* collator = usearch_getCollator(search_);
-    ucol_setStrength(collator, UCOL_PRIMARY);
-    usearch_reset(search_);
-  }
-}
-
-FixedPatternStringSearchIgnoringCaseAndAccents::
-~FixedPatternStringSearchIgnoringCaseAndAccents() {
-  if (search_)
-    usearch_close(search_);
-}
-
-bool FixedPatternStringSearchIgnoringCaseAndAccents::Search(
-    const string16& in_this, size_t* match_index, size_t* match_length) {
-  UErrorCode status = U_ZERO_ERROR;
-  usearch_setText(search_, in_this.data(), in_this.size(), &status);
-
-  // Default to basic substring search if usearch fails. According to
-  // http://icu-project.org/apiref/icu4c/usearch_8h.html, usearch_open will fail
-  // if either |find_this| or |in_this| are empty. In either case basic
-  // substring search will give the correct return value.
-  if (!U_SUCCESS(status)) {
-    size_t index = in_this.find(find_this_);
-    if (index == string16::npos) {
-      return false;
-    } else {
-      if (match_index)
-        *match_index = index;
-      if (match_length)
-        *match_length = find_this_.size();
-      return true;
-    }
-  }
-
-  int32_t index = usearch_first(search_, &status);
-  if (!U_SUCCESS(status) || index == USEARCH_DONE)
-    return false;
-  if (match_index)
-    *match_index = static_cast<size_t>(index);
-  if (match_length)
-    *match_length = static_cast<size_t>(usearch_getMatchedLength(search_));
-  return true;
-}
-
-bool StringSearchIgnoringCaseAndAccents(const string16& find_this,
-                                        const string16& in_this,
-                                        size_t* match_index,
-                                        size_t* match_length) {
-  return FixedPatternStringSearchIgnoringCaseAndAccents(find_this).Search(
-      in_this, match_index, match_length);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/string_search.h b/base/i18n/string_search.h
deleted file mode 100644
index 07a29c1..0000000
--- a/base/i18n/string_search.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_STRING_SEARCH_H_
-#define BASE_I18N_STRING_SEARCH_H_
-
-#include <stddef.h>
-
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-
-struct UStringSearch;
-
-namespace base {
-namespace i18n {
-
-// Returns true if |in_this| contains |find_this|. If |match_index| or
-// |match_length| are non-NULL, they are assigned the start position and total
-// length of the match.
-//
-// Only differences between base letters are taken into consideration. Case and
-// accent differences are ignored. Please refer to 'primary level' in
-// http://userguide.icu-project.org/collation/concepts for additional details.
-BASE_I18N_EXPORT
-    bool StringSearchIgnoringCaseAndAccents(const string16& find_this,
-                                            const string16& in_this,
-                                            size_t* match_index,
-                                            size_t* match_length);
-
-// This class is for speeding up multiple StringSearchIgnoringCaseAndAccents()
-// with the same |find_this| argument. |find_this| is passed as the constructor
-// argument, and precomputation for searching is done only at that timing.
-class BASE_I18N_EXPORT FixedPatternStringSearchIgnoringCaseAndAccents {
- public:
-  explicit FixedPatternStringSearchIgnoringCaseAndAccents(
-      const string16& find_this);
-  ~FixedPatternStringSearchIgnoringCaseAndAccents();
-
-  // Returns true if |in_this| contains |find_this|. If |match_index| or
-  // |match_length| are non-NULL, they are assigned the start position and total
-  // length of the match.
-  bool Search(const string16& in_this,
-              size_t* match_index,
-              size_t* match_length);
-
- private:
-  string16 find_this_;
-  UStringSearch* search_;
-};
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_I18N_STRING_SEARCH_H_
diff --git a/base/i18n/time_formatting.cc b/base/i18n/time_formatting.cc
deleted file mode 100644
index 3a5394a..0000000
--- a/base/i18n/time_formatting.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/time_formatting.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/i18n/unicodestring.h"
-#include "base/logging.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "third_party/icu/source/common/unicode/utypes.h"
-#include "third_party/icu/source/i18n/unicode/datefmt.h"
-#include "third_party/icu/source/i18n/unicode/dtitvfmt.h"
-#include "third_party/icu/source/i18n/unicode/dtptngen.h"
-#include "third_party/icu/source/i18n/unicode/fmtable.h"
-#include "third_party/icu/source/i18n/unicode/measfmt.h"
-#include "third_party/icu/source/i18n/unicode/smpdtfmt.h"
-
-namespace base {
-namespace {
-
-string16 TimeFormat(const icu::DateFormat* formatter,
-                    const Time& time) {
-  DCHECK(formatter);
-  icu::UnicodeString date_string;
-
-  formatter->format(static_cast<UDate>(time.ToDoubleT() * 1000), date_string);
-  return i18n::UnicodeStringToString16(date_string);
-}
-
-string16 TimeFormatWithoutAmPm(const icu::DateFormat* formatter,
-                               const Time& time) {
-  DCHECK(formatter);
-  icu::UnicodeString time_string;
-
-  icu::FieldPosition ampm_field(icu::DateFormat::kAmPmField);
-  formatter->format(
-      static_cast<UDate>(time.ToDoubleT() * 1000), time_string, ampm_field);
-  int ampm_length = ampm_field.getEndIndex() - ampm_field.getBeginIndex();
-  if (ampm_length) {
-    int begin = ampm_field.getBeginIndex();
-    // Doesn't include any spacing before the field.
-    if (begin)
-      begin--;
-    time_string.removeBetween(begin, ampm_field.getEndIndex());
-  }
-  return i18n::UnicodeStringToString16(time_string);
-}
-
-icu::SimpleDateFormat CreateSimpleDateFormatter(const char* pattern) {
-  // Generate a locale-dependent format pattern. The generator will take
-  // care of locale-dependent formatting issues like which separator to
-  // use (some locales use '.' instead of ':'), and where to put the am/pm
-  // marker.
-  UErrorCode status = U_ZERO_ERROR;
-  std::unique_ptr<icu::DateTimePatternGenerator> generator(
-      icu::DateTimePatternGenerator::createInstance(status));
-  DCHECK(U_SUCCESS(status));
-  icu::UnicodeString generated_pattern =
-      generator->getBestPattern(icu::UnicodeString(pattern), status);
-  DCHECK(U_SUCCESS(status));
-
-  // Then, format the time using the generated pattern.
-  icu::SimpleDateFormat formatter(generated_pattern, status);
-  DCHECK(U_SUCCESS(status));
-
-  return formatter;
-}
-
-UMeasureFormatWidth DurationWidthToMeasureWidth(DurationFormatWidth width) {
-  switch (width) {
-    case DURATION_WIDTH_WIDE: return UMEASFMT_WIDTH_WIDE;
-    case DURATION_WIDTH_SHORT: return UMEASFMT_WIDTH_SHORT;
-    case DURATION_WIDTH_NARROW: return UMEASFMT_WIDTH_NARROW;
-    case DURATION_WIDTH_NUMERIC: return UMEASFMT_WIDTH_NUMERIC;
-  }
-  NOTREACHED();
-  return UMEASFMT_WIDTH_COUNT;
-}
-
-const char* DateFormatToString(DateFormat format) {
-  switch (format) {
-    case DATE_FORMAT_YEAR_MONTH:
-      return UDAT_YEAR_MONTH;
-    case DATE_FORMAT_MONTH_WEEKDAY_DAY:
-      return UDAT_MONTH_WEEKDAY_DAY;
-  }
-  NOTREACHED();
-  return UDAT_YEAR_MONTH_DAY;
-}
-
-}  // namespace
-
-string16 TimeFormatTimeOfDay(const Time& time) {
-  // We can omit the locale parameter because the default should match
-  // Chrome's application locale.
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createTimeInstance(icu::DateFormat::kShort));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatTimeOfDayWithMilliseconds(const Time& time) {
-  icu::SimpleDateFormat formatter = CreateSimpleDateFormatter("HmsSSS");
-  return TimeFormatWithoutAmPm(&formatter, time);
-}
-
-string16 TimeFormatTimeOfDayWithHourClockType(const Time& time,
-                                              HourClockType type,
-                                              AmPmClockType ampm) {
-  // Just redirect to the normal function if the default type matches the
-  // given type.
-  HourClockType default_type = GetHourClockType();
-  if (default_type == type && (type == k24HourClock || ampm == kKeepAmPm)) {
-    return TimeFormatTimeOfDay(time);
-  }
-
-  const char* base_pattern = (type == k12HourClock ? "ahm" : "Hm");
-  icu::SimpleDateFormat formatter = CreateSimpleDateFormatter(base_pattern);
-
-  if (ampm == kKeepAmPm) {
-    return TimeFormat(&formatter, time);
-  } else {
-    return TimeFormatWithoutAmPm(&formatter, time);
-  }
-}
-
-string16 TimeFormatShortDate(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateInstance(icu::DateFormat::kMedium));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatShortDateNumeric(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateInstance(icu::DateFormat::kShort));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatShortDateAndTime(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateTimeInstance(icu::DateFormat::kShort));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatShortDateAndTimeWithTimeZone(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateTimeInstance(icu::DateFormat::kShort,
-                                              icu::DateFormat::kLong));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatMonthAndYear(const Time& time) {
-  icu::SimpleDateFormat formatter =
-      CreateSimpleDateFormatter(DateFormatToString(DATE_FORMAT_YEAR_MONTH));
-  return TimeFormat(&formatter, time);
-}
-
-string16 TimeFormatFriendlyDateAndTime(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateTimeInstance(icu::DateFormat::kFull));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatFriendlyDate(const Time& time) {
-  std::unique_ptr<icu::DateFormat> formatter(
-      icu::DateFormat::createDateInstance(icu::DateFormat::kFull));
-  return TimeFormat(formatter.get(), time);
-}
-
-string16 TimeFormatWithPattern(const Time& time, const char* pattern) {
-  icu::SimpleDateFormat formatter = CreateSimpleDateFormatter(pattern);
-  return TimeFormat(&formatter, time);
-}
-
-bool TimeDurationFormat(const TimeDelta time,
-                        const DurationFormatWidth width,
-                        string16* out) {
-  DCHECK(out);
-  UErrorCode status = U_ZERO_ERROR;
-  const int total_minutes = static_cast<int>(time.InSecondsF() / 60 + 0.5);
-  const int hours = total_minutes / 60;
-  const int minutes = total_minutes % 60;
-  UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width);
-
-  // TODO(derat): Delete the |status| checks and LOG(ERROR) calls throughout
-  // this function once the cause of http://crbug.com/677043 is tracked down.
-  const icu::Measure measures[] = {
-      icu::Measure(hours, icu::MeasureUnit::createHour(status), status),
-      icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status)};
-  if (U_FAILURE(status)) {
-    LOG(ERROR) << "Creating MeasureUnit or Measure for " << hours << "h"
-               << minutes << "m failed: " << u_errorName(status);
-    return false;
-  }
-
-  icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status);
-  if (U_FAILURE(status)) {
-    LOG(ERROR) << "Creating MeasureFormat for "
-               << icu::Locale::getDefault().getName()
-               << " failed: " << u_errorName(status);
-    return false;
-  }
-
-  icu::UnicodeString formatted;
-  icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
-  measure_format.formatMeasures(measures, 2, formatted, ignore, status);
-  if (U_FAILURE(status)) {
-    LOG(ERROR) << "formatMeasures failed: " << u_errorName(status);
-    return false;
-  }
-
-  *out = i18n::UnicodeStringToString16(formatted);
-  return true;
-}
-
-bool TimeDurationFormatWithSeconds(const TimeDelta time,
-                                   const DurationFormatWidth width,
-                                   string16* out) {
-  DCHECK(out);
-  UErrorCode status = U_ZERO_ERROR;
-  const int64_t total_seconds = static_cast<int>(time.InSecondsF() + 0.5);
-  const int hours = total_seconds / 3600;
-  const int minutes = (total_seconds - hours * 3600) / 60;
-  const int seconds = total_seconds % 60;
-  UMeasureFormatWidth u_width = DurationWidthToMeasureWidth(width);
-
-  const icu::Measure measures[] = {
-      icu::Measure(hours, icu::MeasureUnit::createHour(status), status),
-      icu::Measure(minutes, icu::MeasureUnit::createMinute(status), status),
-      icu::Measure(seconds, icu::MeasureUnit::createSecond(status), status)};
-  icu::MeasureFormat measure_format(icu::Locale::getDefault(), u_width, status);
-  icu::UnicodeString formatted;
-  icu::FieldPosition ignore(icu::FieldPosition::DONT_CARE);
-  measure_format.formatMeasures(measures, 3, formatted, ignore, status);
-  *out = i18n::UnicodeStringToString16(formatted);
-  return U_SUCCESS(status) == TRUE;
-}
-
-string16 DateIntervalFormat(const Time& begin_time,
-                            const Time& end_time,
-                            DateFormat format) {
-  UErrorCode status = U_ZERO_ERROR;
-
-  std::unique_ptr<icu::DateIntervalFormat> formatter(
-      icu::DateIntervalFormat::createInstance(DateFormatToString(format),
-                                              status));
-
-  icu::FieldPosition pos = 0;
-  UDate start_date = static_cast<UDate>(begin_time.ToDoubleT() * 1000);
-  UDate end_date = static_cast<UDate>(end_time.ToDoubleT() * 1000);
-  icu::DateInterval interval(start_date, end_date);
-  icu::UnicodeString formatted;
-  formatter->format(&interval, formatted, pos, status);
-  return i18n::UnicodeStringToString16(formatted);
-}
-
-HourClockType GetHourClockType() {
-  // TODO(satorux,jshin): Rework this with ures_getByKeyWithFallback()
-  // once it becomes public. The short time format can be found at
-  // "calendar/gregorian/DateTimePatterns/3" in the resources.
-  std::unique_ptr<icu::SimpleDateFormat> formatter(
-      static_cast<icu::SimpleDateFormat*>(
-          icu::DateFormat::createTimeInstance(icu::DateFormat::kShort)));
-  // Retrieve the short time format.
-  icu::UnicodeString pattern_unicode;
-  formatter->toPattern(pattern_unicode);
-
-  // Determine what hour clock type the current locale uses, by checking
-  // "a" (am/pm marker) in the short time format. This is reliable as "a"
-  // is used by all of 12-hour clock formats, but not any of 24-hour clock
-  // formats, as shown below.
-  //
-  // % grep -A4 DateTimePatterns third_party/icu/source/data/locales/*.txt |
-  //   grep -B1 -- -- |grep -v -- '--' |
-  //   perl -nle 'print $1 if /^\S+\s+"(.*)"/' |sort -u
-  //
-  // H.mm
-  // H:mm
-  // HH.mm
-  // HH:mm
-  // a h:mm
-  // ah:mm
-  // ahh:mm
-  // h-mm a
-  // h:mm a
-  // hh:mm a
-  //
-  // See http://userguide.icu-project.org/formatparse/datetime for details
-  // about the date/time format syntax.
-  if (pattern_unicode.indexOf('a') == -1) {
-    return k24HourClock;
-  } else {
-    return k12HourClock;
-  }
-}
-
-}  // namespace base
diff --git a/base/i18n/time_formatting.h b/base/i18n/time_formatting.h
deleted file mode 100644
index 41793b3..0000000
--- a/base/i18n/time_formatting.h
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Basic time formatting methods.  These methods use the current locale
-// formatting for displaying the time.
-
-#ifndef BASE_I18N_TIME_FORMATTING_H_
-#define BASE_I18N_TIME_FORMATTING_H_
-
-#include "base/compiler_specific.h"
-#include "base/i18n/base_i18n_export.h"
-#include "base/strings/string16.h"
-
-namespace base {
-
-class Time;
-class TimeDelta;
-
-// Argument type used to specify the hour clock type.
-enum HourClockType {
-  k12HourClock,  // Uses 1-12. e.g., "3:07 PM"
-  k24HourClock,  // Uses 0-23. e.g., "15:07"
-};
-
-// Argument type used to specify whether or not to include AM/PM sign.
-enum AmPmClockType {
-  kDropAmPm,  // Drops AM/PM sign. e.g., "3:07"
-  kKeepAmPm,  // Keeps AM/PM sign. e.g., "3:07 PM"
-};
-
-// Should match UMeasureFormatWidth in measfmt.h; replicated here to avoid
-// requiring third_party/icu dependencies with this file.
-enum DurationFormatWidth {
-  DURATION_WIDTH_WIDE,    // "3 hours, 7 minutes"
-  DURATION_WIDTH_SHORT,   // "3 hr, 7 min"
-  DURATION_WIDTH_NARROW,  // "3h 7m"
-  DURATION_WIDTH_NUMERIC  // "3:07"
-};
-
-// Date formats from third_party/icu/source/i18n/unicode/udat.h. Add more as
-// necessary.
-enum DateFormat {
-  // November 2007
-  DATE_FORMAT_YEAR_MONTH,
-  // Tuesday, 7 November
-  DATE_FORMAT_MONTH_WEEKDAY_DAY,
-};
-
-// TODO(derat@chromium.org): Update all of these functions to return boolean
-// "success" values and use out-params for formatted strings:
-// http://crbug.com/698802
-
-// Returns the time of day, e.g., "3:07 PM".
-BASE_I18N_EXPORT string16 TimeFormatTimeOfDay(const Time& time);
-
-// Returns the time of day in 24-hour clock format with millisecond accuracy,
-// e.g., "15:07:30.568"
-BASE_I18N_EXPORT string16 TimeFormatTimeOfDayWithMilliseconds(const Time& time);
-
-// Returns the time of day in the specified hour clock type. e.g.
-// "3:07 PM" (type == k12HourClock, ampm == kKeepAmPm).
-// "3:07"    (type == k12HourClock, ampm == kDropAmPm).
-// "15:07"   (type == k24HourClock).
-BASE_I18N_EXPORT string16 TimeFormatTimeOfDayWithHourClockType(
-    const Time& time,
-    HourClockType type,
-    AmPmClockType ampm);
-
-// Returns a shortened date, e.g. "Nov 7, 2007"
-BASE_I18N_EXPORT string16 TimeFormatShortDate(const Time& time);
-
-// Returns a numeric date such as 12/13/52.
-BASE_I18N_EXPORT string16 TimeFormatShortDateNumeric(const Time& time);
-
-// Returns a numeric date and time such as "12/13/52 2:44:30 PM".
-BASE_I18N_EXPORT string16 TimeFormatShortDateAndTime(const Time& time);
-
-// Returns a month and year, e.g. "November 2007"
-BASE_I18N_EXPORT string16 TimeFormatMonthAndYear(const Time& time);
-
-// Returns a numeric date and time with time zone such as
-// "12/13/52 2:44:30 PM PST".
-BASE_I18N_EXPORT string16
-TimeFormatShortDateAndTimeWithTimeZone(const Time& time);
-
-// Formats a time in a friendly sentence format, e.g.
-// "Monday, March 6, 2008 2:44:30 PM".
-BASE_I18N_EXPORT string16 TimeFormatFriendlyDateAndTime(const Time& time);
-
-// Formats a time in a friendly sentence format, e.g.
-// "Monday, March 6, 2008".
-BASE_I18N_EXPORT string16 TimeFormatFriendlyDate(const Time& time);
-
-// Formats a time using a skeleton to produce a format for different locales
-// when an unusual time format is needed, e.g. "Feb. 2, 18:00".
-//
-// See http://userguide.icu-project.org/formatparse/datetime for details.
-BASE_I18N_EXPORT string16 TimeFormatWithPattern(const Time& time,
-                                                const char* pattern);
-
-// Formats a time duration of hours and minutes into various formats, e.g.,
-// "3:07" or "3 hours, 7 minutes", and returns true on success. See
-// DurationFormatWidth for details.
-//
-// Please don't use width = DURATION_WIDTH_NUMERIC when the time duration
-// can possibly be larger than 24h, as the hour value will be cut below 24
-// after formatting.
-// TODO(chengx): fix function output when width = DURATION_WIDTH_NUMERIC
-// (http://crbug.com/675791)
-BASE_I18N_EXPORT bool TimeDurationFormat(const TimeDelta time,
-                                         const DurationFormatWidth width,
-                                         string16* out) WARN_UNUSED_RESULT;
-
-// Formats a time duration of hours, minutes and seconds into various formats,
-// e.g., "3:07:30" or "3 hours, 7 minutes, 30 seconds", and returns true on
-// success. See DurationFormatWidth for details.
-//
-// Please don't use width = DURATION_WIDTH_NUMERIC when the time duration
-// can possibly be larger than 24h, as the hour value will be cut below 24
-// after formatting.
-// TODO(chengx): fix function output when width = DURATION_WIDTH_NUMERIC
-// (http://crbug.com/675791)
-BASE_I18N_EXPORT bool TimeDurationFormatWithSeconds(
-    const TimeDelta time,
-    const DurationFormatWidth width,
-    string16* out) WARN_UNUSED_RESULT;
-
-// Formats a date interval into various formats, e.g. "2 December - 4 December"
-// or "March 2016 - December 2016". See DateFormat for details.
-BASE_I18N_EXPORT string16 DateIntervalFormat(const Time& begin_time,
-                                             const Time& end_time,
-                                             DateFormat format);
-
-// Gets the hour clock type of the current locale. e.g.
-// k12HourClock (en-US).
-// k24HourClock (en-GB).
-BASE_I18N_EXPORT HourClockType GetHourClockType();
-
-}  // namespace base
-
-#endif  // BASE_I18N_TIME_FORMATTING_H_
diff --git a/base/i18n/timezone.cc b/base/i18n/timezone.cc
deleted file mode 100644
index 8624e07..0000000
--- a/base/i18n/timezone.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/timezone.h"
-
-#include <memory>
-#include <string>
-
-#include "third_party/icu/source/common/unicode/unistr.h"
-#include "third_party/icu/source/i18n/unicode/timezone.h"
-
-namespace base {
-
-std::string CountryCodeForCurrentTimezone() {
-  std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
-  icu::UnicodeString id;
-  // ICU returns '001' (world) for Etc/GMT. Preserve the old behavior
-  // only for Etc/GMT while returning an empty string for Etc/UTC and
-  // Etc/UCT because they're less likely to be chosen by mistake in UK in
-  // place of Europe/London (Briitish Time).
-  if (zone->getID(id) == UNICODE_STRING_SIMPLE("Etc/GMT"))
-    return "GB";
-  char region_code[4];
-  UErrorCode status = U_ZERO_ERROR;
-  int length = zone->getRegion(id, region_code, 4, status);
-  // Return an empty string if region_code is a 3-digit numeric code such
-  // as 001 (World) for Etc/UTC, Etc/UCT.
-  return (U_SUCCESS(status) && length == 2)
-             ? std::string(region_code, static_cast<size_t>(length))
-             : std::string();
-}
-
-}  // namespace base
diff --git a/base/i18n/timezone.h b/base/i18n/timezone.h
deleted file mode 100644
index 7557d44..0000000
--- a/base/i18n/timezone.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_I18N_TIMEZONE_H_
-#define BASE_I18N_TIMEZONE_H_
-
-#include <string>
-
-#include "base/i18n/base_i18n_export.h"
-
-namespace base {
-
-// Checks the system timezone and turns it into a two-character ISO 3166 country
-// code. This may fail (for example, it used to always fail on Android), in
-// which case it will return an empty string. It'll also return an empty string
-// when the timezone is Etc/UTC or Etc/UCT, but will return 'GB" for Etc/GMT
-// because people in the UK tends to select Etc/GMT by mistake instead of
-// Europe/London (British Time).
-BASE_I18N_EXPORT std::string CountryCodeForCurrentTimezone();
-
-}  // namespace base
-
-#endif  // BASE_I18N_TIMEZONE_H_
diff --git a/base/i18n/unicodestring.h b/base/i18n/unicodestring.h
deleted file mode 100644
index b62c526..0000000
--- a/base/i18n/unicodestring.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 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.
-
-#ifndef BASE_I18N_UNICODESTRING_H_
-#define BASE_I18N_UNICODESTRING_H_
-
-#include "base/strings/string16.h"
-#include "third_party/icu/source/common/unicode/unistr.h"
-#include "third_party/icu/source/common/unicode/uvernum.h"
-
-#if U_ICU_VERSION_MAJOR_NUM >= 59
-#include "third_party/icu/source/common/unicode/char16ptr.h"
-#endif
-
-namespace base {
-namespace i18n {
-
-inline string16 UnicodeStringToString16(const icu::UnicodeString& unistr) {
-#if U_ICU_VERSION_MAJOR_NUM >= 59
-  return base::string16(icu::toUCharPtr(unistr.getBuffer()),
-                        static_cast<size_t>(unistr.length()));
-#else
-  return base::string16(unistr.getBuffer(),
-                        static_cast<size_t>(unistr.length()));
-#endif
-}
-
-}  // namespace i18n
-}  // namespace base
-
-#endif  // BASE_UNICODESTRING_H_
diff --git a/base/i18n/utf8_validator_tables.cc b/base/i18n/utf8_validator_tables.cc
deleted file mode 100644
index 913afc7..0000000
--- a/base/i18n/utf8_validator_tables.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file is auto-generated by build_utf8_validator_tables.
-// DO NOT EDIT.
-
-#include "base/i18n/utf8_validator_tables.h"
-
-namespace base {
-namespace internal {
-
-const uint8_t kUtf8ValidatorTables[] = {
-    // State 0, offset 0x00
-    0x00, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x08
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x10
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x18
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x20
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x28
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x30
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x38
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x40
-    0x81, 0x81, 0x81, 0x83, 0x83, 0x83, 0x83, 0x83,  // 0x48
-    0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,  // 0x50
-    0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,  // 0x58
-    0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83,  // 0x60
-    0x83, 0x86, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b,  // 0x68
-    0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x8e, 0x8b,  // 0x70
-    0x8b, 0x93, 0x9c, 0x9c, 0x9c, 0x9f, 0x81, 0x81,  // 0x78
-    0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0x80
-    0x81,                                            // 0x81
-    // State 1, offset 0x81
-    0x07, 0x81,                                      // 0x83
-    // State 2, offset 0x83
-    0x06, 0x00, 0x81,                                // 0x86
-    // State 3, offset 0x86
-    0x05, 0x81, 0x83, 0x81, 0x81,                    // 0x8b
-    // State 4, offset 0x8b
-    0x06, 0x83, 0x81,                                // 0x8e
-    // State 5, offset 0x8e
-    0x05, 0x83, 0x81, 0x81, 0x81,                    // 0x93
-    // State 6, offset 0x93
-    0x04, 0x81, 0x8b, 0x8b, 0x8b, 0x81, 0x81, 0x81,  // 0x9b
-    0x81,                                            // 0x9c
-    // State 7, offset 0x9c
-    0x06, 0x8b, 0x81,                                // 0x9f
-    // State 8, offset 0x9f
-    0x04, 0x8b, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81,  // 0xa7
-    0x81,                                            // 0xa8
-};
-
-const size_t kUtf8ValidatorTablesSize = arraysize(kUtf8ValidatorTables);
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/i18n/utf8_validator_tables.h b/base/i18n/utf8_validator_tables.h
deleted file mode 100644
index 939616b..0000000
--- a/base/i18n/utf8_validator_tables.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 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_I18N_UTF8_VALIDATOR_TABLES_H_
-#define BASE_I18N_UTF8_VALIDATOR_TABLES_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/macros.h"
-
-namespace base {
-namespace internal {
-
-// The tables for all states; a list of entries of the form (right_shift,
-// next_state, next_state, ....). The right_shifts are used to reduce the
-// overall size of the table. The table only covers bytes in the range
-// [0x80, 0xFF] to save space.
-extern const uint8_t kUtf8ValidatorTables[];
-
-extern const size_t kUtf8ValidatorTablesSize;
-
-// The offset of the INVALID state in kUtf8ValidatorTables.
-enum {
-  I18N_UTF8_VALIDATOR_INVALID_INDEX = 129
-};
-
-}  // namespace internal
-}  // namespace base
-
-#endif  // BASE_I18N_UTF8_VALIDATOR_TABLES_H_
diff --git a/base/win/i18n.cc b/base/win/i18n.cc
deleted file mode 100644
index d7017e3..0000000
--- a/base/win/i18n.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2010 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/win/i18n.h"
-
-#include <windows.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-
-namespace {
-
-// Keep this enum in sync with kLanguageFunctionNames.
-enum LanguageFunction {
-  SYSTEM_LANGUAGES,
-  USER_LANGUAGES,
-  PROCESS_LANGUAGES,
-  THREAD_LANGUAGES,
-  NUM_FUNCTIONS
-};
-
-const char kSystemLanguagesFunctionName[] = "GetSystemPreferredUILanguages";
-const char kUserLanguagesFunctionName[] = "GetUserPreferredUILanguages";
-const char kProcessLanguagesFunctionName[] = "GetProcessPreferredUILanguages";
-const char kThreadLanguagesFunctionName[] = "GetThreadPreferredUILanguages";
-
-// Keep this array in sync with enum LanguageFunction.
-const char *const kLanguageFunctionNames[] = {
-  &kSystemLanguagesFunctionName[0],
-  &kUserLanguagesFunctionName[0],
-  &kProcessLanguagesFunctionName[0],
-  &kThreadLanguagesFunctionName[0]
-};
-
-static_assert(NUM_FUNCTIONS == arraysize(kLanguageFunctionNames),
-              "LanguageFunction enum and kLanguageFunctionNames array must be "
-              "kept in sync");
-
-// Calls one of the MUI Get*PreferredUILanguages functions, placing the result
-// in |languages|.  |function| identifies the function to call and |flags| is
-// the function-specific flags (callers must not specify MUI_LANGUAGE_ID or
-// MUI_LANGUAGE_NAME).  Returns true if at least one language is placed in
-// |languages|.
-bool GetMUIPreferredUILanguageList(LanguageFunction function, ULONG flags,
-                                   std::vector<wchar_t>* languages) {
-  DCHECK(0 <= function && NUM_FUNCTIONS > function);
-  DCHECK_EQ(0U, (flags & (MUI_LANGUAGE_ID | MUI_LANGUAGE_NAME)));
-  DCHECK(languages);
-
-  HMODULE kernel32 = GetModuleHandle(L"kernel32.dll");
-  if (NULL != kernel32) {
-    typedef BOOL (WINAPI* GetPreferredUILanguages_Fn)(
-        DWORD, PULONG, PZZWSTR, PULONG);
-    GetPreferredUILanguages_Fn get_preferred_ui_languages =
-        reinterpret_cast<GetPreferredUILanguages_Fn>(
-            GetProcAddress(kernel32, kLanguageFunctionNames[function]));
-    if (NULL != get_preferred_ui_languages) {
-      const ULONG call_flags = flags | MUI_LANGUAGE_NAME;
-      ULONG language_count = 0;
-      ULONG buffer_length = 0;
-      if (get_preferred_ui_languages(call_flags, &language_count, NULL,
-                                     &buffer_length) &&
-          0 != buffer_length) {
-        languages->resize(buffer_length);
-        if (get_preferred_ui_languages(call_flags, &language_count,
-                                       &(*languages)[0], &buffer_length) &&
-            0 != language_count) {
-          DCHECK(languages->size() == buffer_length);
-          return true;
-        } else {
-          DPCHECK(0 == language_count)
-              << "Failed getting preferred UI languages.";
-        }
-      } else {
-        DPCHECK(0 == buffer_length)
-            << "Failed getting size of preferred UI languages.";
-      }
-    } else {
-      DVLOG(2) << "MUI not available.";
-    }
-  } else {
-    NOTREACHED() << "kernel32.dll not found.";
-  }
-
-  return false;
-}
-
-bool GetUserDefaultUILanguage(std::wstring* language, std::wstring* region) {
-  DCHECK(language);
-
-  LANGID lang_id = ::GetUserDefaultUILanguage();
-  if (LOCALE_CUSTOM_UI_DEFAULT != lang_id) {
-    const LCID locale_id = MAKELCID(lang_id, SORT_DEFAULT);
-    // max size for LOCALE_SISO639LANGNAME and LOCALE_SISO3166CTRYNAME is 9
-    wchar_t result_buffer[9];
-    int result_length =
-        GetLocaleInfo(locale_id, LOCALE_SISO639LANGNAME, &result_buffer[0],
-                      arraysize(result_buffer));
-    DPCHECK(0 != result_length) << "Failed getting language id";
-    if (1 < result_length) {
-      language->assign(&result_buffer[0], result_length - 1);
-      region->clear();
-      if (SUBLANG_NEUTRAL != SUBLANGID(lang_id)) {
-        result_length =
-            GetLocaleInfo(locale_id, LOCALE_SISO3166CTRYNAME, &result_buffer[0],
-                          arraysize(result_buffer));
-        DPCHECK(0 != result_length) << "Failed getting region id";
-        if (1 < result_length)
-          region->assign(&result_buffer[0], result_length - 1);
-      }
-      return true;
-    }
-  } else {
-    // This is entirely unexpected on pre-Vista, which is the only time we
-    // should try GetUserDefaultUILanguage anyway.
-    NOTREACHED() << "Cannot determine language for a supplemental locale.";
-  }
-  return false;
-}
-
-bool GetPreferredUILanguageList(LanguageFunction function, ULONG flags,
-                                std::vector<std::wstring>* languages) {
-  std::vector<wchar_t> buffer;
-  std::wstring language;
-  std::wstring region;
-
-  if (GetMUIPreferredUILanguageList(function, flags, &buffer)) {
-    std::vector<wchar_t>::const_iterator scan = buffer.begin();
-    language.assign(&*scan);
-    while (!language.empty()) {
-      languages->push_back(language);
-      scan += language.size() + 1;
-      language.assign(&*scan);
-    }
-  } else if (GetUserDefaultUILanguage(&language, &region)) {
-    // Mimic the MUI behavior of putting the neutral version of the lang after
-    // the regional one (e.g., "fr-CA, fr").
-    if (!region.empty())
-      languages->push_back(std::wstring(language)
-                               .append(1, L'-')
-                               .append(region));
-    languages->push_back(language);
-  } else {
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace
-
-namespace base {
-namespace win {
-namespace i18n {
-
-bool GetUserPreferredUILanguageList(std::vector<std::wstring>* languages) {
-  DCHECK(languages);
-  return GetPreferredUILanguageList(USER_LANGUAGES, 0, languages);
-}
-
-bool GetThreadPreferredUILanguageList(std::vector<std::wstring>* languages) {
-  DCHECK(languages);
-  return GetPreferredUILanguageList(
-      THREAD_LANGUAGES, MUI_MERGE_SYSTEM_FALLBACK | MUI_MERGE_USER_FALLBACK,
-      languages);
-}
-
-}  // namespace i18n
-}  // namespace win
-}  // namespace base
diff --git a/base/win/i18n.h b/base/win/i18n.h
deleted file mode 100644
index 9e74d3f..0000000
--- a/base/win/i18n.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_WIN_I18N_H_
-#define BASE_WIN_I18N_H_
-
-#include <string>
-#include <vector>
-
-#include "base/base_export.h"
-
-namespace base {
-namespace win {
-namespace i18n {
-
-// Adds to |languages| the list of user preferred UI languages from MUI, if
-// available, falling-back on the user default UI language otherwise.  Returns
-// true if at least one language is added.
-BASE_EXPORT bool GetUserPreferredUILanguageList(
-    std::vector<std::wstring>* languages);
-
-// Adds to |languages| the list of thread, process, user, and system preferred
-// UI languages from MUI, if available, falling-back on the user default UI
-// language otherwise.  Returns true if at least one language is added.
-BASE_EXPORT bool GetThreadPreferredUILanguageList(
-    std::vector<std::wstring>* languages);
-
-}  // namespace i18n
-}  // namespace win
-}  // namespace base
-
-#endif  // BASE_WIN_I18N_H_
diff --git a/build/gen.py b/build/gen.py
index 37592d4..9cca4e9 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -756,7 +756,6 @@
         'base/win/enum_variant.cc',
         'base/win/event_trace_controller.cc',
         'base/win/event_trace_provider.cc',
-        'base/win/i18n.cc',
         'base/win/iat_patch_function.cc',
         'base/win/iunknown_impl.cc',
         'base/win/message_window.cc',
